如何在对象检测任务中将水平边界框转换为定向边界框



很长一段时间以来,我一直试图用更快的rcnn检测定向边界框,但我没能做到。我的目标是检测DOTA数据集中的对象。我在pytorch中使用了内置的更快的rcnn模型,但意识到它不支持OBB。然后我发现了另一个名为detectron2的库,它是建立在pytorch框架上的。detectron2中内置的更快的rcnn网络实际上与OBB兼容,但我无法使该模型与DOTA一起工作。因为我无法将DOTA框注释转换为(cx, cy, w, h, a)。在DOTA中,对象由(x1,y1,x2,y2,x3,y3,x4,y4)的4个角的坐标进行注释。

我无法想出将这4个坐标转换为(cx, cy, w, h, a)的解决方案,其中cx和cy是OBB的中心点,w、h和a分别是宽度、高度和角度。

有什么建议吗?

如果您在Nx8张量/数组中有方框,您可以通过以下操作将它们转换为(cx, cy, w, h, a)(假设第一点在左上角,第二点在左下角,然后在右下角,再在右上角…(:

def DOTA_2_OBB(boxes):
#calculate the angle of the box using arctan (degrees here)
angle = (torch.atan((boxes[:,7] - boxes[:,5])/(boxes[:,6] - boxes[:,4]))*180/np.pi).float()
#centrepoint is the mean of adjacent points
cx = boxes[:,[4,0]].mean(1)
cy = boxes[:,[7,3]].mean(1)
#calculate w and h based on the distance between adjacent points
w = ((boxes[:,7] - boxes[:,1])**2+(boxes[:,6] - boxes[:,0])**2)**0.5
h = ((boxes[:,1] - boxes[:,3])**2+(boxes[:,0] - boxes[:,2])**2)**0.5
return torch.stack([cx,cy,w,h,angle]).T   

然后进行测试。。。

In [40]: boxes = torch.tensor([[0,2,1,0,2,2,1,3],[4,12,8,2,12,12,8,22]]).float()    

In [43]: DOTA_2_OBB(boxes)                                                                                            
Out[43]: 
tensor([[  1.0000,   1.5000,   1.4142,   2.2361, -45.0000],
[  8.0000,  12.0000,  10.7703,  10.7703, -68.1986]])

相关内容

  • 没有找到相关文章

最新更新