Ultralytics DOTA8 数据集详解:面向旋转框(OBB)检测的 8 图调试数据集与 YOLO26 训练实战
本文以 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.py与tests/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", ...) 后,仓库内部的调用链如下:
YOLO对象根据任务路由到 OBB 任务模块,构造 OBBTrainer;OBBTrainer.__init__强制覆写overrides["task"] = "obb",再委托给父类DetectionTrainer完成通用训练初始化(见 train.py#L33-L46);get_model创建OBBModel并加载yolo26n-obb.pt权重,类别数由dota8.yaml的names推导;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.py:
OBBTrainer/OBBValidator/OBBPredictor三件套的集成测试使用dota8.yaml与yolo26n-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=100、imgsz=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.md 与 docs/en/datasets/obb/dota-v2.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 StartedRust0622
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