ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

DOTAv2.0遥感航拍数据集实战:从VOC/YOLO格式转换到YOLO训练全流程

2026/8/27 6:30:12 拓冰建站 浏览量
DOTAv2.0遥感航拍数据集实战:从VOC/YOLO格式转换到YOLO训练全流程 简介目标检测在遥感航拍场景中面临视角、尺度与目标密度的多重挑战常规自然图像数据集难以覆盖这些特性。DOTAv2.0作为遥感目标检测领域的权威基准提供16类4840张航拍图像成为算法研究与工程落地的重要参考。该数据集原生采用四边形四点标注实践中常需转换为VOC或YOLO格式但转换过程会丢失方向信息影响斜置目标与密集目标的检测效果。理解格式原理、坐标归一化逻辑以及切图策略是高效训练的前提。基于YOLO框架搭建训练流程时输入分辨率、类别不均衡处理、小目标漏检优化都是关键调优点若业务对方向性敏感可进一步采用MMRotate旋转框检测路线最大化利用原始标注价值。本文从数据构成、格式转换到训练配置与典型坑位系统梳理遥感航拍目标检测的完整实践路径。 拿到DOTAv2.0遥感航拍目标检测数据集这份VOCYOLO双格式的4840张、16类别压缩包时我的第一反应是终于有人把格式收拾好了不用再自己写脚本转一天。但真开始用问题一个接一个DOTA原始标注里用的是四边形四点坐标转成VOC和YOLO之后角度信息全没了直接训练出来的模型对斜着停的飞机、靠在一起的船漏检率比预想高不少。这篇文章就是我完整处理这套数据的过程记录从格式原理到训练配置再到遥感场景下特有的坑把能踩的雷都提前给你标出来。适合刚接触遥感目标检测、准备拿DOTA系列做实验或者做工程落地的同学。1. 遥感目标检测为什么绕不开DOTA-v2.01.1 航拍俯视图带来的三个质变用过COCO或者VOC这类自然图像数据集的人第一眼看到DOTA的图基本都会不适应。普通照片是平视视角目标是正的、大的、稀疏的而遥感航拍图是从高空往下俯拍带来三个非常明显的变化第一是尺度极端。一张原始DOTA图像分辨率可能到几千乘几千像素但一架飞机在里面只占三四十个像素人眼都要仔细找。小目标问题在遥感里不是偶尔出现而是普遍现象。第二是目标极度密集。港口里的船一艘挨一艘停车场的车一排一排目标之间几乎没有间隙这对NMS后处理和回归精度都是挑战。第三是方向任意。自然图像里的车通常头朝上但航拍图像里的车辆朝向四面八方同一个目标在不同图像里旋转角度完全不一样。这三点叠加起来决定了遥感目标检测不能简单套用自然图像那套方法论必须有专门的数据集来支撑研究。DOTA就是在这样的背景下被广泛使用的。1.2 从学术基准到工程参考DOTADataset of Object deTection in Aerial images是遥感目标检测领域引用率最高的公开基准之一。原始版本由武汉大学团队在2018年提出后续逐步迭代v1.0有14个类别、2806张图v1.5新增集装箱起重机这一类别并重新修正了大量标注v2.0进一步加入游泳池类别类别数来到16个实例数量和图像规模也大幅扩充。这套数据集的覆盖面很广从飞机、船舶到桥梁、环岛几乎把所有遥感影像里常见的人造目标都收了进去。正因为类目全、标注相对规范现在遥感目标检测相关的论文基本都在DOTA上做对比MMRotate等主流旋转检测框架也把DOTA作为内置数据集。对做工程的人来说DOTA还有一个价值它的类别定义和真实业务场景高度重合比如违章建筑检测、港口船舶统计、机场目标识别都能在DOTA里找到对应的类别做迁移预训练。1.3 双格式数据包的真正价值说回到这份整理版资源。VOC和YOLO格式并存省掉的最大一件事就是格式转换。DOTA官方发布的标注格式是每张图对应一个txt文本每一行是一个目标的四个角点坐标加类别名这种格式对水平框检测器来说不能直接使用必须先转成VOC或者YOLO。很多第一次接触DOTA的人浪费大量时间在写转换脚本和排查坐标问题上而不是真正关注模型效果。这份压缩包把VOC和YOLO都准备好了至少能让你在拿到数据的第一时间就开始训练。不过我要提醒一句格式转好了不代表问题消失。DOTA的四点坐标转成水平外接矩形后方向信息丢失这对某些类别的影响很大。后面我会专门讲这个它关系到你最后实验结果的可靠性。2. 数据构成剖析16个类别与4840张图像里的检测难题2.1 16个类别覆盖的人造目标全景这份整理版数据集的16个类别分类清晰和DOTA官方定义一致类别ID类别名典型形态检测难点0plane停机坪上的飞机小目标、方向任意1ship海上或港口的船只密集排列船与船相连2storage tank圆形储油罐成片分布尺度不一3baseball diamond棒球场大目标边缘不清晰4tennis court网球场和篮球场外观接近5basketball court篮球场标线细微易混检6ground track field田径场目标大易漏检7harbor港口与水域和船只混杂8bridge桥梁长条形跨水域9large vehicle大型车辆和small vehicle边界模糊10small vehicle小型车辆极端小目标、高密集11helicopter直升机样本量少12roundabout环岛形状特殊背景干扰13soccer ball field足球场与田径场部分相似14container crane集装箱起重机结构高瘦被遮挡多15swimming pool游泳池和屋顶、水面混淆从检测难度上分plane、ship、small vehicle、storage tank这类属于中小目标高密度是模型最容易漏检的而baseball diamond、ground track field这类属于超大目标结构复杂模型容易检测出来但定位不准。这两类问题对应的是完全不同的调优思路后面会展开讲。2.2 类别长尾分布与图像分辨率问题虽然标题里写了16个类别、4840张图但16个类别的实例数量绝对不是均匀的。small vehicle和ship在数据里占了相当大的比例helicopter、container crane这类目标样本量则少得多。这种天然的类别不均衡会让模型训练产生明显偏向常见类别AP值很高罕见类别可能只有个位数。图像分辨率也是个关键问题。DOTA原始图像尺寸从几百像素到几千像素不等分辨率差异大。训练时一般不能把整张大图直接塞进网络否则显存直接爆炸且目标被严重缩放。所以切图crop成了遥感目标检测训练前的固定动作通常用1024x1024或800x800的滑动窗口重叠率设置在100到200像素之间。这份整理版是原图还是没有切过的小图你需要先确认这直接决定你能不能直接开训。提示拿到压缩包先看两个东西——一是图像尺寸分布二是每张图的目标数量。如果原始图像是4000x4000以上的大图训练前必须切图如果某张图只有一两百个目标说明密度极高训练时需要关注小目标分支的效果。2.3 拿到压缩包后的第一件事核验数据我个人的习惯是任何数据集到手不急着写训练代码先花半小时做三个核验动作解压后确认目录结构看看数据是否已经划分出train和val。随机抽20张图把标注框画出来肉眼看一遍。这一步能发现绝大多数标注错位、类别id映射错误、坐标超出图像边界的问题。统计每张图的标注框数量和类别分布心里有个底。这个习惯帮我避过很多坑。有一次我在转换后的VOC文件里发现所有bbox的xmin和xmax写反了画出来全是乱框如果不是早检查训练跑一天后才发现浪费的时间远超这几分钟。3. 从DOTA原生标注到VOC/YOLO格式的转换链路3.1 三种标注格式的本质差异DOTA原生标注、VOC和YOLO格式三者的坐标体系和存储结构差异很大先看看DOTA原生的txt长什么样imagesource: GoogleEarth gsd: 0.3 100.000000 200.000000 150.000000 200.000000 150.000000 250.000000 100.000000 250.000000 plane 0前面两行是元信息第三行开始每个目标占一行。前8个数字是四个角点的x、y坐标按顺序组成一个任意方向的四边形第9个字段是类别名最后的0是difficult标记。这种格式最大的优势是能表达任意朝向的目标但也意味着解析时不能像读普通框一样简单粗暴。VOC格式则是标准的XML文件bndbox里存放xmin、ymin、xmax、ymax四个整数值只能描述水平矩形。YOLO格式走的是txt文本每行五个数class_id cx cy w h其中cx、cy是中心点坐标w和h是宽高这四个值全部归一化到0到1之间。3.2 四点框转水平框信息取舍与适用边界DOTA转VOC或YOLO本质上是把任意方向的四边形转换成一个外接水平矩形。操作很直接取四个点的x坐标最小值作为xmin、最大值作为xmaxy坐标同理。这样转换本身没有难度难在你要清楚这种转换丢掉了什么。举个例子一艘船斜停在港口它的外接水平矩形会包含大量水域背景两辆车并排斜放外接矩形可能重叠。这些重叠和背景会在训练时给模型带来额外噪声直接表现就是precision上不去、NMS把相邻目标误杀。所以如果你的模型只支持水平框比如普通YOLO检测器那就接受这个限制如果你要检测的目标方向性很强比如船、飞机、车辆建议直接走旋转框路线用MMRotate这类支持任意方向框的框架数据上保留DOTA原生四点标注不要用这份转换后的水平格式。这两条路线各有适用场景没有绝对好坏取决于你的业务需求。3.3 转换脚本核心逻辑与细节如果你拿到的是DOTA原生txt需要自己转YOLO核心代码逻辑可以这样写import os from PIL import Image def dota2yolo(txt_path, img_path, id_map, out_path): img Image.open(img_path) im_w, im_h img.size out_lines [] with open(txt_path, r) as f: lines f.readlines() for line in lines: parts line.strip().split() if len(parts) 9: continue xs [float(parts[i]) for i in range(0, 8, 2)] ys [float(parts[i1]) for i in range(0, 8, 2)] name parts[8] xmin, xmax min(xs), max(xs) ymin, ymax min(ys), max(ys) cls_id id_map.get(name) if cls_id is None: continue cx ((xmin xmax) / 2) / im_w cy ((ymin ymax) / 2) / im_h w (xmax - xmin) / im_w h (ymax - ymin) / im_h out_lines.append(f{cls_id} {cx:.6f} {cy:.6f} {w:.6f} {h:.6f}) with open(out_path, w) as f: f.write(\n.join(out_lines))细节上有三点要注意一是xs和ys的取值因为DOTA每行是x1 y1 x2 y2 ...所以x坐标在偶数位y坐标在奇数位不要取错二是读取图片宽高时必须用PIL或cv2读原始尺寸不要拿某个固定值去归一化否则不同分辨率的图像坐标全乱三是difficult字段要不要保留正常训练可以忽略但如果目标被严重遮挡或极小可以考虑用这个标记做样本过滤。3.4 切图与格式转换的先后顺序切图和转换的先后顺序是有讲究的。如果你拿到的是原始DOTA大图必须先切图、再转格式不能反过来。因为切图时标注框的坐标会变化一个横跨多个切图窗口的目标会在每个窗口里保留不同的部分。如果用DOTA原始txt直接按整图转换切图后标注就失效了。切图的一般做法是滑动窗口。窗口大小通常是训练输入尺寸的整数倍我用的是1024x1024重叠200像素。每切出一块窗口就要遍历原图标注框判断哪些框和窗口有交集保留交集部分转换成新图上的坐标。如果某个目标在窗口内只剩很小一部分比如面积不足原来的30%通常直接丢弃避免给模型带来残缺目标的误导。需要注意这份整理版如果已经切好图并转换好格式那就不存在这个问题直接检查标注是否落在图像范围内即可但如果是大图未切你得自己补上切图这一环。4. 用YOLO把这份数据跑起来的完整实操4.1 环境准备与目录组织不管你这套数据集是VOC还是YOLO格式最终训练推荐统一转成YOLO格式因为生态成熟、加载快。环境方面PyTorch、Ultralytics YOLOv8/v11或者YOLOv5都行。7z压缩包解压时Windows直接用7-Zip或BandizipLinux装p7zipsudo apt-get install p7zip-full 7za x DOTAv2.0_*.7z解压后建议按这个目录组织dataset/ images/ train/ img_001.png val/ img_002.png labels/ train/ img_001.txt val/ img_002.txt data.yaml classes.txt4.2 data.yaml配置与类别映射YOLO训练不直接读类别名而是读class id所以必须保证data.yaml里的类别顺序和labels里文本文件第一列的数字一一对应。我采用的顺序和MMRotate保持一致path: /path/to/dataset train: images/train val: images/val nc: 16 names: 0: plane 1: ship 2: storage tank 3: baseball diamond 4: tennis court 5: basketball court 6: ground track field 7: harbor 8: bridge 9: large vehicle 10: small vehicle 11: helicopter 12: roundabout 13: soccer ball field 14: container crane 15: swimming pool这里最容易出现的问题是转换脚本里的类别映射顺序和data.yaml不一致。很多整理版数据集的labels里已经是0,1,2...的数字但类别名顺序可能和官方有差异最好画框验证一遍确保0真的是plane而不是ship。4.3 训练参数设置原则遥感目标检测训练里最影响效果的参数是输入分辨率。普通目标检测用640x640但遥感图里目标太小640分辨率会丢掉大量细节。我建议至少用1024x1024显存不够就调小batch不要轻易降分辨率。用Ultralytics YOLOv8训练示例yolo detect train \ datadota_v2.yaml \ modelyolov8s.pt \ imgsz1024 \ batch8 \ epochs100 \ workers4 \ device0如果显存不足batch从4开始加梯度累积YOLO里是cache和batch组合调整如果显存充足可以尝试YOLOv8m或YOLOv8l模型容量越大对中小目标的拟合能力越强但训练时间也成倍增长。预训练权重建议直接用模型自带的COCO权重。虽然COCO和遥感领域差异大但预训练带来的底层特征迁移仍然能明显加快收敛mAP也能高几个点。实测下来用yolov8s在1024分辨率下训练100轮mAP50大概能到0.55到0.7具体数值受切图策略、类别均衡程度影响很大不必拿官方paper上的数字来衡量但至少能跑通整个流程。4.4 评估指标与预测可视化训练结束后yolo detect val会自动输出mAP50、mAP50-95、precision、recall等核心指标还会生成混淆矩阵、PR曲线和F1曲线。只看mAP是不够的要重点看混淆矩阵哪两类在互相误检、哪个类别的recall特别低这会直接告诉你调优方向。预测可视化同样重要。挑几张验证集图像跑推理用结果图对比GT框你会发现很多问题在指标上看不出来比如预测框位置偏移、目标被漏检后模型输出低置信度框等。我通常的做法是把验证集所有图像跑一遍推理保存结果图按类别抽几张看尤其是small vehicle和helicopter这种难例看得比数值更直观。5. 遥感航拍目标检测的实战坑位与调优方向5.1 小目标漏检的典型解法用YOLO跑DOTA这类遥感数据最常见的问题就是小目标漏检。原因有两个一是下采样倍数太高小目标的特征在深层网络里已经消失二是锚框或标签分配对小目标不够友好。处理思路分几层。最直接的是提高输入分辨率从1024加到1280甚至1536小目标像素数变多特征提取更容易代价是显存和训练时间上升。第二是开启多尺度训练YOLO里设置scale0.5到1.5让模型见到不同尺度的目标增强尺度鲁棒性。第三是推理阶段用SAHI这类切片辅助推理工具把大图切成多个带重叠的小图分别推理再合并结果能显著提升小目标mAP但推理时间也会成倍增加。5.2 密集与方向性目标水平框的上限前面提到DOTA四点坐标转成水平框会丢失方向信息。这个问题在你检测船、车这类方向性强的目标时会被放大水平框会把周围的环境框进来形成大量背景噪声密集场景下相邻目标的水平框互相重叠NMS会误删正确目标。如果检测业务里方向性目标是主体真心建议上旋转框。MMRotate是OpenMMLab里专门做旋转目标检测的工具箱支持DOTA原生四点标注。它的数据准备方式不同于YOLO直接读取DOTA格式的txt按DOTA_devkit的方式做切图生成trainval.txt和labelTxt目录然后选择Rotated RetinaNet、Oriented R-CNN或基于SOTA的旋转检测模型。虽然配置门槛比YOLO高一些但是针对遥感场景的检测精度会明显提升。5.3 类别不均衡的几个处理思路16个类别的长尾分布会让模型对helicopter、container crane这类罕见类的学习非常弱。改进方向有几个数据层面对少数类做复制粘贴增强Copy-Paste把罕见类目标贴到其他图像上同时拷贝标注框能有效增加样本多样性。损失层面为罕见类别设置更高的loss权重或者使用focal loss缓解类别不平衡带来的梯度主导问题。采样层面对数据集的train部分做类别加权采样确保每个batch里罕见类都有出现而不会因为随机采样导致罕见类长期缺席训练。这些策略可以组合使用但要控制幅度防止模型对少数类过拟合、反而拉低常见类精度。5.4 要不要上旋转框检测MMRotate路线很多人拿到这套VOCYOLO格式的数据后问既然人家都转好水平框了我是不是直接用YOLO就行我的看法是如果你目标是跑通流程、快速出结果水平框YOLO完全够如果你目标是论文实验或者工程精度最大化且检测目标方向性明显建议直接走旋转框路线数据上回到DOTA原生格式。MMRotate用起来虽然比YOLO复杂但它内置了完整的DOTA评测流程。配置要点包括数据路径改成DOTA格式的labelTxt目录、旋转框模型配置文件、数据预处理阶段同样需要切图。上手建议先用官方提供的rotated_retinanet_r50_fpn跑一遍baseline确认数据集路径无误后再换更强的模型比如oriented_rcnn或roi_transformer。注意旋转框模型的mAP评测标准是旋转IoU和水平框mAP不能直接对比数值看起来低一些是正常的不代表模型更差。我在实际处理这份数据集时最深的体会是格式转换永远是最容易出错但又最不值得花时间的环节。VOC和YOLO双格式给了你便利但不要无脑信任训练前画框验证这一步无论如何不能省。如果你在做旋转检测记得保留DOTA原生的四点坐标那才是这套数据真正的价值所在。祝各位训出好模型。本文还有配套的精品资源点击获取