首页
/ Ultralytics DOTA8 数据集详解:面向旋转框(OBB)检测的 8 图调试数据集与 YOLO26 训练实战

Ultralytics DOTA8 数据集详解:面向旋转框(OBB)检测的 8 图调试数据集与 YOLO26 训练实战

2026-09-04 10:46:28作者:郦嵘贵Just

本文以 Ultralytics 官方文档中的 DOTA8 数据集说明为主体,结合仓库内 dota8.yaml 配置、OBB 训练/验证器源码与测试用例,讲解这个 8 张航拍图的旋转框检测数据集的结构、标注格式、自动下载机制,以及如何用 YOLO26n-obb 在其上完成训练、验证与流水线调试。读完本文,你可以直接复制其中的 Python/CLI 命令跑通一次 OBB 训练,并理解训练底层调用链与数据集 YAML 各字段的作用。

1. DOTA8 是什么:定位与适用场景

DOTA8 是一个小而实用的有向边界框(oriented bounding box,OBB)检测数据集,由 DOTAv1 划分集的前 8 张图像组成,其中 4 张用于训练、4 张用于验证。它的主要用途是:

  • 测试与调试检测模型:8 张图足够小,可以在几分钟内(甚至 CPU 上)跑完一轮训练-验证循环,快速暴露数据加载、标注格式、损失计算等环节的错误;
  • 新检测方案的快速实验:验证新网络结构或新训练技巧时,先在小数据集上确认流程无异常,再迁移到完整 DOTA 数据集;
  • CI/流水线校验:仓库的 OBB 任务回归测试直接使用该数据集,从 tests/test_engine.pytests/test_cli.py 的测试参数中可以看到,OBB 任务的 Trainer/Validator/Predictor 集成测试均以 dota8.yaml 作为标准测试数据。

继承自 DOTAv1 的完整类别体系意味着这 8 张图中出现了 plane(飞机)、ship(船舶)、large vehicle(大型车辆)等 15 个类别中的典型航拍目标,具备足够的多样性用于训练管线的健全性检查(sanity check)。

2. 数据集结构与标注格式

DOTA8 的组织方式与 Ultralytics 其他数据集保持一致:

  • 图像:8 张航拍图块(4 张 train、4 张 val),来源于 DOTAv1 划分集;
  • 类别:继承 DOTAv1 的 15 个类别,包括 plane、ship、storage tank 等;
  • 标签:YOLO 格式的旋转框标注,以 .txt 文件保存在每张图像同级的 labels/ 目录下,与图像路径一一对应;
  • 下载:约 1 MB,首次训练时自动从 Ultralytics GitHub 资产源下载并解压,无需手动操作;
  • 推荐目录布局
datasets/dota8/
├── images/
│   ├── train/
│   └── val/
└── labels/
    ├── train/
    └── val/

需要注意 OBB 任务与普通 detect 任务的标注差异:每张图对应的 .txt 标签文件中,每行是一个旋转框(中心点 + 宽高 + 旋转角的 5 个归一化值)加类别 id,而不是普通检测的 4 值轴对齐框。这正是该数据集专门服务于 OBB 模型的原因。

3. 数据集 YAML:dota8.yaml 逐字段解读

Ultralytics 用 YAML 文件描述数据集的路径、类别与下载源。DOTA8 对应的配置文件维护在 ultralytics/cfg/datasets/dota8.yaml,其完整内容为:

# DOTA8 dataset (8 images from the DOTAv1 split) by Ultralytics
# parent
# ├── ultralytics
# └── datasets
#     └── dota8 ← downloads here (1 MB)

# 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: dota8 # dataset root dir
train: images/train # train images (relative to 'path') 4 images
val: images/val # val images (relative to 'path') 4 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/dota8.zip

各字段的作用如下:

字段 取值 说明
path dota8 数据集根目录(相对当前工作目录)。首次使用时框架会自动下载并解压到该目录
train images/train 训练图像目录,相对 path,共 4 张
val images/val 验证图像目录,相对 path,共 4 张
names 0–14 共 15 类 完整继承 DOTAv1 类别表。OBB 训练器会从该字段自动推导出类别数 nc 与通道数 channels
download GitHub release 的 zip 地址 可选字段。存在时训练启动会自动下载解压;注释中已标明目标位置为 datasets/dota8,体积约 1 MB

从源码结构看,训练器在构建模型时会读取数据集配置中的类别与通道信息:OBBTrainer.get_model 在初始化 OBBModel 时传入 nc=self.data["nc"]ch=self.data["channels"],即模型结构中的类别输出数直接来自 YAML 的 names 字段——这也是为什么 nc 在模型 YAML(如 yolo26-obb.yaml)里只是一个默认值,实际以数据集配置为准。

4. 使用 DOTA8 训练 YOLO26n-obb

官方给出的标准用法是:加载预训练的 yolo26n-obb.pt,在 dota8.yaml 上训练 100 个 epoch、图像尺寸 640。完整参数列表可参考训练模式文档 docs/en/modes/train.md

Python

from ultralytics import YOLO

# Load a model
model = YOLO("yolo26n-obb.pt")  # load a pretrained model (recommended for training)

# Train the model
results = model.train(data="dota8.yaml", epochs=100, imgsz=640)

CLI

# Start training from a pretrained *.pt model
yolo obb train data=dota8.yaml model=yolo26n-obb.pt epochs=100 imgsz=640

两种写法的差异仅在于调用入口:Python API 中任务由模型文件名中的 -obb 后缀自动识别;CLI 中则显式以 obb 子命令声明任务类型。

训练链路:从 model.train 到 OBBTrainer

调用 model.train(data="dota8.yaml", ...) 后,仓库内部的调用链如下:

  1. YOLO 对象根据任务路由到 OBB 任务模块,构造 OBBTrainer
  2. OBBTrainer.__init__ 强制覆写 overrides["task"] = "obb",再委托给父类 DetectionTrainer 完成通用训练初始化(见 train.py#L33-L46);
  3. get_model 创建 OBBModel 并加载 yolo26n-obb.pt 权重,类别数由 dota8.yamlnames 推导;
  4. get_validator 返回 OBBValidator,用于每轮验证。

模型侧,yolo26n-obb.pt 对应 ultralytics/cfg/models/26/yolo26-obb.yaml,其 backbone/head 采用 P3/8、P4/16、P5/32 三级特征,末端是 OBB26 旋转框头。该配置文件同时给出了 n/s/m/l/x 五种尺度的参数量与 GFLOPs 概要(如 n 档约 271.6 万参数、16.9 GFLOPs),在 DOTA8 这类小数据调试场景下,n 档是速度最优的选择。

验证环节值得注意的一点:OBBValidator.init_metrics 会检查验证路径中是否包含 "DOTA" 字符串并设置 is_dota 标志,同时把 confusion_matrix.task 设为 "obb",评估指标使用专门的 OBBMetrics(旋转框 IoU)。由于 DOTA8 正是从 DOTAv1 划分而来,其验证结果会正确走旋转框评估路径。

训练中的 Mosaic 增强

原数据集文档特别展示了 DOTA8 的mosaic 拼接训练批次:多张航拍图被拼成一张图构成一个训练样本,用于提升 batch 内目标尺寸、长宽比与上下文场景的多样性,帮助模型泛化到不同尺度与朝向的物体。

ultralytics/cfg/default.yaml 可以看到,mosaic: 1.0 是默认增强概率,即 OBB 训练中默认全程启用 mosaic;如调试时想关闭该增强以便观察单图样本,可显式传 mosaic=0.0

验证(val)

训练完成后可直接验证,训练时保存的数据集与超参会被记住,无需重复传参:

from ultralytics import YOLO

model = YOLO("best.pt")  # 训练产出的权重
metrics = model.val(data="dota8.yaml")
yolo obb val model=best.pt data=dota8.yaml

更完整的训练/验证/推理示例可参见 OBB 任务文档 docs/en/tasks/obb.md,其中还给出了 .yaml 从零构建、.pt 预训练加载、pretrained= 权重迁移三种 CLI 组合方式。

5. 在测试体系中的角色

DOTA8 不只是文档示例数据,它也是仓库回归测试的标准 OBB 数据集。以下几处测试参数可以印证其"CI 标准数据"的定位:

  • tests/test_engine.pyOBBTrainer/OBBValidator/OBBPredictor 三件套的集成测试使用 dota8.yamlyolo26n-obb.yaml
  • tests/test_cli.py:OBB 任务 CLI 测试以 dota8.yaml 训练并以 yolo26s-obb.pt 权重做后续验证;
  • tests/test_python.py:Python API 与云端集成测试同样选用 dota8.yaml,注释中说明理由是"类别更少,可减少推理耗时"。

如果你的自定义 OBB 数据集训练流水线出现问题,先在 DOTA8 上跑通同一条命令是最快的定位手段:DOTA8 上成功说明问题在数据(标注、路径、格式),失败则说明问题在代码或环境本身。

6. 引用与致谢

在研究或开发工作中使用 DOTA 系列数据集(含 DOTA8)时,请引用 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}
}

文档中对该数据集的许可证标注为 Research-Only(仅限研究用途),商用前请自行确认 DOTA 官方许可条款。

7. 常见问题(FAQ)

DOTA8 由哪些图像组成,适合做什么? DOTA8 由 DOTAv1 划分集的前 8 张图像组成(4 训练 + 4 验证),体量小但类别覆盖 DOTAv1 全部 15 类,适合测试与调试 OBB 检测模型、暴露训练管线错误,以及在训练更大数据集之前做健全性检查。

如何用 DOTA8 训练 YOLO26 模型? 按第 4 节的 Python 或 CLI 示例执行即可:data="dota8.yaml"epochs=100imgsz=640,推荐使用 yolo26n-obb.pt 预训练权重。更多参数见 docs/en/modes/train.md

Mosaic 增强对 DOTA8 训练有什么帮助? Mosaic 在训练时将多张图像拼合成一张,增加每个 batch 内物体尺寸、长宽比与场景上下文的多样性,提升模型对不同朝向与尺度的泛化能力;DOTA8 的航拍目标尺寸差异明显,该增强收益直观。默认概率为 1.0(见 default.yaml)。

DOTA8 与其他 DOTA 子集如何取舍? 仓库同时提供 DOTA128(128 图)与 DOTAv2(完整大规模版本)等数据集配置:DOTA8 用于最快速度验证流程,DOTA128 适合小规模实验,正式训练则使用完整 DOTA。相关文档见 docs/en/datasets/obb/dota128.mddocs/en/datasets/obb/dota-v2.md

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

项目优选

收起
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
590
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
904
1.82 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
889
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.52 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
982
503
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384