目标检测中如何将DOTA四点标注转换为OBB的(cx, cy, w, h, a)格式
DOTA四顶点标注转OBB格式解决方案
核心转换逻辑
DOTA提供的4角点坐标可通过最小外接矩形计算直接转换为需要的(cx, cy, w, h, a)格式,最便捷的实现方式是调用OpenCV的cv2.minAreaRect接口,无需手动实现坐标计算。
代码实现示例
import cv2 import numpy as np def dota_to_obb(dota_points: list) -> list: """ 输入DOTA标注的4点坐标 [x1,y1,x2,y2,x3,y3,x4,y4] 输出OBB格式坐标 [cx, cy, w, h, angle] """ # 将一维坐标列表转为4*2的点坐标数组 pts = np.array(dota_points, dtype=np.float32).reshape(4, 2) # 计算最小外接矩形 rect = cv2.minAreaRect(pts) (cx, cy), (w, h), angle = rect # -------------------------- # 按需调整角度和宽高适配detectron2 # detectron2的RotatedBoxes默认角度范围为[-90, 0),无需调整可直接返回 # 若你使用的OBB实现要求角度∈[0, 90),可打开下方注释调整 # if angle < -45: # angle += 90 # w, h = h, w # -------------------------- return [cx, cy, w, h, angle]
数据集适配注意事项
- 转换后的OBB坐标需要和预处理后的图像坐标对齐,若你对图像做了缩放、裁剪、翻转等操作,需要同步对原始四点坐标做对应变换后再做OBB转换
- DOTA标注中的
difficult、occlusion等属性要同步映射到detectron2数据集的is_crowd、difficult字段,避免无效标注影响训练效果 - 可提前批量转换所有DOTA标注为OBB格式后存储为自定义的JSON/COCO格式文件,避免训练时动态转换浪费算力
常见问题排查
- 若出现训练时loss为NaN,优先检查OBB的宽高是否为正、角度是否符合你使用的detectron2分支的要求,部分第三方OBB扩展的角度定义和官方默认不一致
- 若出现检测框偏移,检查坐标转换是否和图像预处理逻辑同步,是否存在图像缩放时坐标未对应缩放的问题
内容的提问来源于stack exchange,提问作者Arda Tümay
相关产品推荐
相关产品推荐

