MCG-NJU / AdaMixer

[CVPR 2022 Oral] AdaMixer: A Fast-Converging Query-Based Object Detector
MIT License
236 stars 24 forks source link

The Conversion between (x, y, z, r) and (c, c, w, h) in code is not same with the paper? #10

Closed xaigogo closed 2 years ago

xaigogo commented 2 years ago

Tanks for your great job and code!

    def refine_xyzr(self, xyzr, xyzr_delta, return_bbox=True):
        ##  z==(h*w).sqrt().log2()
        z = xyzr[..., 2:3]
        new_xy = xyzr[..., 0:2] + xyzr_delta[..., 0:2] * (2 ** z)
        new_zr = xyzr[..., 2:4] + xyzr_delta[..., 2:4]
        xyzr = torch.cat([new_xy, new_zr], dim=-1)
        if return_bbox:
            return xyzr, decode_box(xyzr)
        else:
            return xyzr

请问下论文中的公式4和公式5中都是 z+r 和 z-r 进行计算,为啥这里没有z±r了,直接用z进行计算? 按论文公式可以理解xyzr_delta的预测意义,但按代码中的写法该如何理解学到的xyzr_delta的意义? 按代码看,是否可以这样理解预测变量xyzr_delta的意义 xyzr_delta[..., 0:2]=((dx/dy).sqrt(), (dy/dx).sqrt()) ?

def _decode_init_proposals(self, imgs, img_metas):
      ............
      xy = 0.5 * (proposals[..., 0:2] + proposals[..., 2:4])
      wh = proposals[..., 2:4] - proposals[..., 0:2]
      z = (wh).prod(-1, keepdim=True).sqrt().log2()
      r = (wh[..., 1:2]/wh[..., 0:1]).log2()
      ..............

另外在编码 xyzr的时候,为啥 r不直接编码成 r = (wh[..., 1:2]/wh[..., 0:1]).sqrt().log2(), 这样2(z-r)=w, 2(z+r)=h,感觉跟论文描述直观上更一致一点,解码也更省事。

多谢 多谢!

sebgao commented 2 years ago

同学你好,非常感谢对我们工作的兴趣。

第一个问题 “为啥这里没有z±r了,直接用z进行计算”:我们这里更新xyzr的时候以简单起见,没有加上框的长宽比r这个因素,在截稿后我们试了z±r的形式,实际达到的结果差不多;

第二个问题 “如何理解学到的xyzr_delta的意义”:其实可以把(x/z,y/z,z,r)理解为一个欧式空间,所有更新都是在这欧式空间中直接进行的,在这种理解下,xyzr_delta[..., 0:2]=[d(x/z), d(y/z)],这里的z理解的时候不建议展开形式;

第三个问题 “为啥 r不直接编码成 r = (wh[..., 1:2]/wh[..., 0:1]).sqrt().log2()”:同学你的理解是对的,严格来说应该有个sqrt();但没有sqrt()的话与论文中也是一致的,在学习dz时只差了0.5的倍数关系,没有本质的差异。

xaigogo commented 2 years ago

多谢 多谢 ~~