Ultralytics 中的 DOTA 数据集实战:面向航空影像的 OBB 旋转框检测、数据集切分与 YOLO26-obb 训练
本篇技术指南围绕 Ultralytics 仓库中维护的 DOTA(Dataset for Object deTectiOn in Aerial images)数据集文档展开,覆盖 DOTA v1.0 / v1.5 / v2.0 三个版本的规模与差异、官方数据集 YAML 配置、高分辨率影像切分(ultralytics.data.split_dota)的完整工作流,以及基于 YOLO OBB 模型的训练命令。读完本文后,你将能够独立完成 DOTA 数据的下载、切瓦片(tiling)、编写数据集 YAML、并启动一个面向航空影像的旋转边界框(Oriented Bounding Box, OBB)检测训练任务。
一、DOTA 数据集概览:18 类、170 万个旋转框的航空影像基准
DOTA 是面向航空影像目标检测的大规模基准数据集,由武汉大学团队发布,共有 v1.0、v1.5、v2.0 三个版本,累计提供最多约 170 万个 OBB 标注,覆盖 18 个常见类别,影像来自多种传感器与平台(Google Earth、GF-2 卫星等)。
其核心特性包括:
- 多传感器、多平台采集:影像尺寸跨度极大,从 800 × 800 到 20,000 × 20,000 像素不等;
- 大规模旋转标注:18 个类别共 170 万+ 个定向边界框(OBB);
- 多尺度检测特性:单张影像中目标尺寸分布极广,天然覆盖多尺度检测场景;
- 专家级任意四边形标注:实例由专家以 8 自由度(8 d.o.f.)任意四边形方式标注,能够捕获不同尺度、朝向与形状的目标。
OBB 以旋转矩形形式包裹目标(无论其朝向),因此特别契合航空影像中飞机、船舶、建筑物等具有明显方向性的目标,这也是 DOTA 与普通水平框(HBB)检测数据集最大的区别。
二、DOTA 三个版本的差异
DOTA-v1.0
- 包含 15 个常见类别;
- 共 2,806 张图像、188,282 个实例;
- 划分比例约 1/2 训练(1,411 张)、1/6 验证(458 张)、1/3 测试(937 张)。
DOTA-v1.5
- 图像与 DOTA-v1.0 完全相同;
- 补充标注了极小实例(小于 10 像素的目标);
- 新增一个类别:container crane(集装箱起重机);
- 实例总数达到 403,318 个;
- 最初为 DOAI 2019 航空影像目标检测挑战赛发布。
DOTA-v2.0
- 在 v1 基础上引入 Google Earth、GF-2 卫星及其他航空影像;
- 包含 18 个类别,新增 airport(机场)与 helipad(直升机坪)两个类别;
- 共 11,268 张图像、1,793,658 个实例;
- 图像划分为四个子集:
| 子集 | 图像数 | 实例数 |
|---|---|---|
| Training | 1,830 | 268,627 |
| Validation | 593 | 81,048 |
| Test-dev | 2,792 | 353,346 |
| Test-challenge | 6,053 | 1,090,637 |
三、数据集结构与标注形式
DOTA 的目录结构是为 OBB 检测任务量身设计的:
- Images:大量高分辨率航空影像,覆盖多样的地形与地物;
- 标注:以旋转矩形(OBB)包裹目标,不限制目标朝向,适合飞机、船舶、建筑物等具有方向特征的对象。
在 Ultralytics 工作流中,标注以 YOLO OBB 格式存储为 .txt 文件:每行一个目标,格式为 class_id x1 y1 x2 y2 x3 y3 x4 y4(归一化坐标的四点四边形),与水平框格式相比多出一个顶点。切分工具 ultralytics.data.split_dota 输出的标签正是这一格式(见下文 crop_and_save 的写盘逻辑)。
四、数据集 YAML:Ultralytics 官方配置
数据集 YAML 用于指定图像/标签根目录、类别名等元数据。Ultralytics 在仓库中为最常用的两个发布版本维护了官方 YAML:
请以你实际下载的发布版本为准选择对应 YAML;如果使用的是 DOTA-v2 或派生数据,可自行编写一份自定义 YAML。这两个官方 YAML 均支持自动下载(约 2 GB),首次训练时会自动从 Ultralytics 资产仓库拉取。
DOTAv1.yaml 完整内容
# DOTA 1.0 dataset https://captain-whu.github.io/DOTA/index.html for object detection in aerial images by Wuhan University
# Example usage: yolo train model=yolov8n-obb.pt data=DOTAv1.yaml
# parent
# ├── ultralytics
# └── datasets
# └── DOTAv1 ← downloads here (2 GB)
# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: DOTAv1 # dataset root dir
train: images/train # train images (relative to 'path') 1411 images
val: images/val # val images (relative to 'path') 458 images
test: images/test # test images (optional) 937 images
# Classes for DOTA 1.0
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: swimming pool
# Download script/URL (optional)
download: https://github.com/ultralytics/assets/releases/download/v0.0.0/DOTAv1.zip
对照 DOTAv1.5.yaml,两者差异仅有两点:类别表在第 15 号新增了 container crane,以及 path 与 download 指向 v1.5 的数据根目录与压缩包。15 个 v1.0 类别为:plane、ship、storage tank、baseball diamond、tennis court、basketball court、ground track field、harbor、bridge、large vehicle、small vehicle、helicopter、roundabout、soccer ball field、swimming pool。
要点说明:
train/val/test支持三种写法:目录、imgs.txt文件、路径列表;DOTA 官方数据使用的是目录形式;- 末尾的
download字段是关键——只要本地不存在path指定的数据目录,Ultralytics 会按该 URL 自动下载并解压; - 若使用自己切分(split)后的目录,需将
train/val指向切分输出目录(见下节的输出布局约定)。
五、切分高分辨率 DOTA 影像:split_dota 源码级解析
DOTA 原始影像单边动辄超过 10,000 像素,无法直接喂给 YOLO,必须先切片(tiling)。仓库内置的 split_dota 模块可把原始影像切成 1024 × 1024 的重叠瓦片,并支持多尺度,同时保证标注同步切分。
5.1 官方调用示例
from ultralytics.data.split_dota import split_test, split_trainval
# Split train and val set, with labels.
split_trainval(
data_root="path/to/DOTAv1.0/",
save_dir="path/to/DOTAv1.0-split/",
rates=[0.5, 1.0, 1.5], # multiscale
gap=500,
)
# Split test set, without labels.
split_test(
data_root="path/to/DOTAv1.0/",
save_dir="path/to/DOTAv1.0-split/",
rates=[0.5, 1.0, 1.5], # multiscale
gap=500,
)
5.2 参数语义(结合源码)
对照 split_dota.py 中 split_trainval 与 split_test 的函数签名(默认值 crop_size=1024, gap=200, rates=(1.0,)),各参数的实际含义为:
data_root:DOTA 数据根目录,需满足标准布局——images/train、images/val(test 则只读images/test)以及对应的labels/train、labels/val;save_dir:切分结果输出目录;rates:多尺度比例。源码中对每个r执行crop_sizes.append(int(crop_size / r))、gaps.append(int(gap / r)),即 r = 0.5 时瓦片放大到 2048,r = 1.5 时缩小到约 683——比例越大瓦片越小,从而让模型同时看到大目标与小目标;gap:瓦片之间的重叠像素数(overlap),保证跨瓦片目标不被切断丢失。源码要求crop_size > gap,且以step = crop_size - gap作为滑窗步长;crop_size:基础瓦片尺寸,默认 1024,对应文档推荐的 1024 × 1024 切块。
5.3 内部流水线
从源码结构看,split_trainval 的处理链分为三步(split_images_and_labels → 逐图执行):
load_yolo_dota:读取每张图的尺寸(经exif_size处理 EXIF 旋转),并把对应.txt标签解析为float32数组;get_windows:按滑窗策略计算切块坐标,过滤掉图像内容占比低于im_rate_thr(默认 0.6)的边缘残窗;get_window_obj+crop_and_save:基于bbox_iof(Intersection over Foreground,依赖shapely>=2.0.0)计算目标四边形与瓦片的 IoF,默认阈值iof_thr=0.7——只有 70% 以上面积落入某瓦片的目标才会写入该瓦片标签;随后裁剪图像并写标签。
细节值得注意:
- 输出瓦片的命名规则为
{原图名}__{宽}__{x起点}___{y起点}(如P0000__1024__4896___0),其中宽高字段用于推理时反向定位大影像中的全局坐标; - 标签写入时执行了坐标平移(减去瓦片起点)与归一化(除以瓦片宽高),输出即为 YOLO OBB 格式;
allow_background_images(默认 True)控制是否保留不含目标的纯背景瓦片;- 输出目录遵循标准 YOLO 布局:
save_dir/images/{train,val,test}与save_dir/labels/{train,val},因此可直接被数据集 YAML 引用; - 模块底部的
__main__入口给出了 DOTAv2 的默认用法:split_trainval(data_root="DOTAv2", save_dir="DOTAv2-split")与split_test(...)。
经验提示:保持输出目录为标准 YOLO 布局(images/train、labels/train 等),即可直接在自定义 YAML 中引用;split_test 只输出图像(无标签),因为测试集标签不对外公布。
六、使用 DOTA 训练 OBB 模型
6.1 训练示例
在 DOTA v1 上从零训练一个 YOLO26n-OBB 模型:
from ultralytics import YOLO
# Create a new YOLO26n-OBB model from scratch
model = YOLO("yolo26n-obb.yaml")
# Train the model on the DOTAv1 dataset
results = model.train(data="DOTAv1.yaml", epochs=100, imgsz=1024)
CLI 等价形式:
# Train a new YOLO26n-OBB model on the DOTAv1 dataset
yolo obb train data=DOTAv1.yaml model=yolo26n-obb.pt epochs=100 imgsz=1024
注意两点:
- 必须走
obb任务(yolo obb train ...),OBB 头输出的正是旋转框参数; - OBB 模型结构 YAML 由仓库统一维护,例如 yolo26-obb.yaml(v8/v11/v12 系列亦有对应 OBB 结构文件)。
yolo26n-obb.yaml这类"带尺寸后缀"的名字在调用时由模型注册机制解析到对应规模的结构。
6.2 快速验证管道:DOTA8
正式投入 DOTA 大训练前,建议先用 DOTA8 数据集 跑通流程。DOTA8 取自切分后 DOTAv1 的前 8 张图像(4 训练 / 4 验证),约 1 MB,首次训练会自动下载,继承 DOTAv1 的 15 个类别,其配置见 dota8.yaml。
from ultralytics import YOLO
model = YOLO("yolo26n-obb.pt") # 加载预训练权重(推荐)
results = model.train(data="dota8.yaml", epochs=100, imgsz=640)
yolo obb train data=dota8.yaml model=yolo26n-obb.pt epochs=100 imgsz=640
训练参数(epochs、imgsz、batch 等)的完整清单请参考仓库中的训练模式文档与 default.yaml 默认值。
6.3 许可证注意事项
DOTAv1 的全部图像与标注仅可用于学术目的,禁止商业用途,请遵守数据创建方的授权约定。DOTA 各版本整体遵循 Research-Only 许可,商用前请自行核实官方许可条款。
七、应用场景
DOTA 是训练与评估"航空影像专用"模型的基准。OBB 标注带来的独特挑战,促使发展出针对航空影像特性的专用检测模型。典型落地方向包括:
- 遥感监测(港口、机场、农田基础设施盘点);
- 安防与区域监视(车辆、直升机、船只动向跟踪);
- 环境监测与灾害管理(受灾区域目标普查)。
得益于 170 万级标注与 18 类覆盖,DOTA-v2.0 在遥感与航空监视项目中尤为常用。
八、样例数据与标注
DOTA 的样例影像直观体现了航空场景的复杂度与旋转框标注的必要性:目标以其自然朝向(任意角度)出现,用水平框会引入大量冗余背景;OBB 则精确贴合飞机、船舶、车辆的几何形状。这种标注方式是 DOTA 区别于通用检测数据集的核心价值。
九、引用信息
若在你的研究中使用了 DOTA,请引用其论文:
@article{9560031,
author={Ding, Jian and Xue, Nan and Xia, Gui-Song and Bai, Xiang and Yang, Wen and Yang, Michael and Belongie, Serge and Luo, Jiebo and Datcu, Mihai and Pelillo, Marcello and Zhang, Liangpei},
journal={IEEE Transactions on Pattern Analysis and Machine Intelligence},
title={Object Detection in Aerial Images: A Large-Scale Benchmark and Challenges},
year={2022},
volume={44},
number={11},
pages={7778-7796},
doi={10.1109/TPAMI.2021.3117983}
}
致谢:感谢 DOTA 数据团队在数据整理上的贡献。关于数据集的完整说明(类别定义、划分、下载入口)可查阅 DOTA 官方网站(captain-whu.github.io/DOTA)。
十、常见问题(FAQ)
Q1:DOTA 数据集是什么?为什么对航空影像目标检测重要? DOTA 是专注于航空影像目标检测的专用数据集,使用 OBB 旋转框标注。其 170 万条标注与 18 个类别在目标朝向、尺度、形状上的多样性,使其成为开发和评估航空影像专用模型(监视、环境监测、灾害管理等场景)的理想基准。
Q2:DOTA 如何处理不同尺度和朝向的目标?
标注采用 OBB,以旋转矩形包裹目标,与目标朝向无关,小目标与任意角度的目标都能被精确捕获;加上影像尺寸横跨 800 × 800 到 20,000 × 20,000 像素的多尺度场景,可同时对大小目标做出有效检测。配合 split_dota 的 rates 多尺度切分,训练时还能显式覆盖不同瓦片尺度。
Q3:如何用 DOTA 训练模型?
使用上文"六、使用 DOTA 训练 OBB 模型"中的 Python/CLI 示例:data=DOTAv1.yaml、imgsz=1024(与切分瓦片尺寸一致),走 obb 任务。切分与预处理细节见本文第五节。
Q4:DOTA-v1.0、v1.5、v2.0 有何区别?
- v1.0:15 类、2,806 张图、188,282 实例,按约 1/2、1/6、1/3 划分训练/验证/测试;
- v1.5:图像不变,补充 <10 像素极小实例标注并新增 container crane 类,实例达 403,318;
- v2.0:引入 Google Earth 与 GF-2 卫星影像,扩展至 18 类(新增 airport、helipad),11,268 张图、1,793,658 实例。
Q5:如何为训练准备高分辨率 DOTA 影像?
使用 split_dota 中的 split_trainval / split_test:以 rates=[0.5, 1.0, 1.5]、gap=500 多尺度切出重叠瓦片,标签同步切分并归一化,输出为标准 YOLO 目录结构,再在数据集 YAML 中指向切分目录即可。
十一、延伸阅读(仓库内相关路径)
- 切分工具源码:ultralytics/data/split_dota.py
- 官方数据集 YAML:DOTAv1.yaml、DOTAv1.5.yaml、dota8.yaml
- OBB 模型结构:yolo26-obb.yaml
- DOTA8 快速验证数据集文档:docs/en/datasets/obb/dota8.md
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00