从DOTA到COCO:面向车辆检测的遥感数据集格式转换实战
1. 为什么需要从DOTA格式转换到COCO格式在遥感图像车辆检测任务中数据标注格式的选择直接影响模型训练效果和工程实现效率。DOTA数据集采用旋转矩形框Rotated Bounding Box标注这种格式能够精确框选任意角度的车辆目标特别适合遥感图像中车辆方向多变的特点。而COCO数据集使用水平矩形框Horizontal Bounding Box标注虽然会包含更多背景区域但兼容性更好主流检测框架如MMDetection、Detectron2都原生支持。我做过一个对比实验使用相同YOLOv5模型在DOTA格式数据上训练能达到78.3% mAP但部署到实际业务系统时发现团队现有的标注工具和推理服务都只支持COCO格式。这就是为什么我们需要掌握格式转换技术——既保留DOTA数据集的训练优势又能适配通用检测框架。2. 两种标注格式的核心差异解析2.1 DOTA格式的独特优势DOTA的标注文件是txt格式每行包含8个坐标点和类别信息例如597.0 429.0 614.0 432.0 608.0 473.0 591.0 470.0 small-vehicle 1这8个数字代表四边形顶点坐标最后两位分别是类别和是否遮挡标志。这种表示法对斜向停放的车辆特别友好我在处理机场遥感图时旋转框能减少30%以上的背景干扰。2.2 COCO格式的工程便利性COCO使用JSON文件统一存储标注关键结构包括{ images: [{file_name: 1.jpg, id: 0}], annotations: [{ bbox: [x,y,width,height], category_id: 1, id: 0 }] }虽然水平框会多包含20%-40%的背景像素但实测发现这对车辆检测影响有限。更重要的是COCO格式可以直接用pycocotools计算评估指标省去大量适配工作。3. 格式转换的完整实现方案3.1 核心转换逻辑拆解转换的本质是将旋转框转化为外接水平矩形。具体步骤读取DOTA标注的8个坐标点计算所有点的最小外接矩形Min Area Rectangle转换为COCO要求的[x,y,width,height]格式这里有个细节坑DOTA的坐标原点在图像左上角而部分遥感库使用左下角原点。我在处理UAVDT数据集时就遇到过Y轴翻转问题建议先用matplotlib可视化确认plt.scatter([x1,x2,x3,x4], [y1,y2,y3,y4]) plt.gca().invert_yaxis() # 匹配OpenCV坐标系3.2 完整代码实现基于原始代码优化后的增强版def dota_to_coco(data_root, class_names): # 初始化COCO结构 coco_output { images: [], annotations: [], categories: [{id: i1, name: name} for i, name in enumerate(class_names)] } # 遍历所有标注文件 for txt_file in Path(f{data_root}/annfiles).glob(*.txt): img_id int(txt_file.stem) img_path f{data_root}/images/{txt_file.stem}.png # 处理图像元信息 with Image.open(img_path) as img: coco_output[images].append({ file_name: img_path, height: img.height, width: img.width, id: img_id }) # 解析DOTA标注 with open(txt_file) as f: for line in f.readlines(): parts line.strip().split() points list(map(float, parts[:8])) cls_name parts[8] # 计算最小外接矩形 x_coords points[::2] y_coords points[1::2] x1, y1 min(x_coords), min(y_coords) x2, y2 max(x_coords), max(y_coords) # 生成COCO标注 coco_output[annotations].append({ bbox: [x1, y1, x2-x1, y2-y1], category_id: class_names.index(cls_name)1, image_id: img_id, id: len(coco_output[annotations]), area: (x2-x1)*(y2-y1) }) return coco_output4. 转换后的效果验证与调优4.1 精度对比测试在DOTA-v1.5车辆子集上的实验结果评估指标原始DOTA格式转换后COCO格式mAP0.578.376.1Recall82.780.9推理速度23 FPS28 FPS虽然mAP下降约2个百分点但推理速度提升20%。实际项目中可以通过以下技巧弥补精度损失数据增强时增加旋转增强Rotate/RandomRotate90在COCO标注基础上用分割掩码细化目标轮廓调整NMS的iou_threshold从0.5到0.64.2 常见问题排查问题1转换后出现大量重叠框解决方案检查DOTA标注是否包含difficult标记过滤iscrowd1的样本问题2COCO评估时报错Invalid bbox调试方法确保width/height为正数可用以下校验代码assert bbox[2] 0 and bbox[3] 0, fInvalid bbox {bbox} in {ann}问题3类别ID不匹配预防措施建立class_names到id的映射表建议用枚举类管理class VehicleClasses(Enum): SMALL_VEHICLE 1 LARGE_VEHICLE 2处理过的一个真实案例某次转换后发现检测结果中卡车全被误识别为轿车最终发现是DOTA标注中存在大小写不一致Large-vehicle vs large-vehicle。建议在转换前统一做大小写转换处理。