首页
/ Ultralytics 中的 DOTA 数据集实战:面向航空影像的 OBB 旋转框检测、数据集切分与 YOLO26-obb 训练

Ultralytics 中的 DOTA 数据集实战:面向航空影像的 OBB 旋转框检测、数据集切分与 YOLO26-obb 训练

2026-09-04 10:57:17作者:宗隆裙

本篇技术指南围绕 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,以及 pathdownload 指向 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.pysplit_trainvalsplit_test 的函数签名(默认值 crop_size=1024, gap=200, rates=(1.0,)),各参数的实际含义为:

  • data_root:DOTA 数据根目录,需满足标准布局——images/trainimages/val(test 则只读 images/test)以及对应的 labels/trainlabels/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 → 逐图执行):

  1. load_yolo_dota:读取每张图的尺寸(经 exif_size 处理 EXIF 旋转),并把对应 .txt 标签解析为 float32 数组;
  2. get_windows:按滑窗策略计算切块坐标,过滤掉图像内容占比低于 im_rate_thr(默认 0.6)的边缘残窗;
  3. 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/trainlabels/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

训练参数(epochsimgszbatch 等)的完整清单请参考仓库中的训练模式文档与 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_dotarates 多尺度切分,训练时还能显式覆盖不同瓦片尺度。

Q3:如何用 DOTA 训练模型? 使用上文"六、使用 DOTA 训练 OBB 模型"中的 Python/CLI 示例:data=DOTAv1.yamlimgsz=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 中指向切分目录即可。

十一、延伸阅读(仓库内相关路径)

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
528
588
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
906
1.82 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
891
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.53 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.34 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
987
504
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384