如何在目标检测任务中将水平边界框转换为定向边界框
How to convert horizontal bounding box to oriented bounding box in object detection task
我一直在尝试使用更快的 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分别是宽度、高度和角度。
有什么建议吗?
如果你的方框在 Nx8
tensor/array 中,你可以将它们转换为 (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]])
我一直在尝试使用更快的 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分别是宽度、高度和角度。
有什么建议吗?
如果你的方框在 Nx8
tensor/array 中,你可以将它们转换为 (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]])