【问题标题】:How to convert horizontal bounding box to oriented bounding box in object detection task如何在对象检测任务中将水平边界框转换为定向边界框
【发布时间】:2025-12-05 02:35:01
【问题描述】:

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

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

有什么建议吗?

【问题讨论】:

    标签: python pytorch object-detection faster-rcnn detectron


    【解决方案1】:

    如果你的盒子在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]])
            
    

    【讨论】:

    • 非常感谢。有用。但我唯一不明白的是 [:,7] 语法中逗号的含义。通过在 Torch 张量中加上逗号可以实现什么?
    • 实际上,解决方案并不难,但在一个问题上挣扎太多会导致简单的解决方案被忽略。我要吸取的教训...
    • 好吧,如果矩形坐标的起点并不总是从左上角开始,而是从随机角开始,我总是想计算矩形 w.r.t x 轴的正角怎么办?如何选择合适的坐标来计算角度?
    • 由于框的形状为[N,8],如果您使用[:,[1,2]] 索引您的数组,那么您将获得所有N 框的第二和第三列,返回一个数组/张量形状[N,2]。如果盒子不是从左上角开始,那么你只需要调整盒子索引。我假设左上 xy - (0,1)、左下 (2,3)、右下 (4,5)、右上 (6,7)。如果您需要匹配您的盒子布局,只需切换它们即可。