Ultralytics YOLO 目标检测数据集指南:YOLO 格式、NDJSON 格式与 COCO 等标注格式转换
本文围绕 Ultralytics YOLO 项目官方文档 Object Detection Datasets Overview 展开,完整讲解训练目标检测模型所需的两种数据集定义格式(Ultralytics YOLO 格式与 NDJSON 格式)、仓库内置的 27 个受支持数据集、自定义数据集的接入方式,以及 COCO 标注到 YOLO 格式的转换工具。读完本文,你可以直接编写合规的 data.yaml 与标注文件、用 NDJSON 单文件数据集启动训练,并理解参数校验与格式转换在源码中的实际实现位置。
一、YOLO 检测任务支持的数据集格式
训练一个健壮、准确的目标检测模型需要一个结构完整的数据集。Ultralytics YOLO 目前提供两条等价的入口路径:
- Ultralytics YOLO 格式:
data.yaml定义数据集根目录与各个 split 的图像/标签路径,标注以"每图一个*.txt"方式存放在labels/目录中; - Ultralytics NDJSON 格式:数据集元信息与所有标注压缩在单个
.ndjson文件中,每行一个 JSON 对象,可携带远程图片 URL。
两种格式在训练时都通过 model.train(data=...) / yolo detect train data=... 传入,框架在 check_det_dataset 中完成下载、解压、YAML 解析与路径校验;若传入的是 .ndjson 文件,则由 convert_ndjson_to_yolo_if_needed 自动触发 NDJSON 到 YOLO 目录结构的转换(见第四节)。
二、Ultralytics YOLO 格式
2.1 数据集 YAML 配置
Ultralytics YOLO 格式是一个数据集配置格式:定义数据集根目录、训练/验证/测试图像目录(或列出图像路径的 *.txt 文件)以及类别名字典。仓库中的 coco8.yaml 是最完整的参考样例:
# 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: coco8 # dataset root dir
train: images/train # train images (relative to 'path') 4 images
val: images/val # val images (relative to 'path') 4 images
test: # test images (optional)
# Classes
names:
0: person
1: bicycle
2: car
# ... COCO 全部 80 个类别
# Download script/URL (optional)
download: https://github.com/ultralytics/assets/releases/download/v0.0.0/coco8.zip
各字段的实际含义与约束如下(这些约束由 check_det_dataset 在运行时强制校验):
| 字段 | 必填 | 说明 |
|---|---|---|
path |
否 | 数据集根目录。相对路径会先按相对自身解析,找不到时回退到 datasets/(DATASETS_DIR)目录下 |
train / val |
是 | 可取目录、目录列表、或逐行列出图像路径的 *.txt 文件;缺失任一项会直接抛出 SyntaxError |
test / minival |
否 | 可选的测试集(minival 用于评估时快速抽检) |
names 或 nc |
二者必有其一 | names 为 {类别 ID: 名称} 字典(或列表);若只给 nc,框架自动生成 class_0 ... class_{n-1} 名称,且 names 长度必须与 nc 一致 |
download |
否 | 支持 .zip 直链、bash ... 脚本或以 yaml 为参数的 Python 脚本,图像缺失且 autodownload 开启时自动执行 |
channels |
否 | 图像通道数,默认 3 |
关于 *.txt 列表文件:以 ./ 开头的路径按该 .txt 文件所在目录解析,也可以混用绝对路径。列表文件适合只用某个目录的子集训练、跳过未标注图像、或将多个来源的图像合并进同一个 split。文档给出的示例如下:
# dataset.yaml
path: datasets/coco8 # dataset root
train: train.txt # a directory, a list e.g. [images/a, images/b], or a *.txt file
val: val.txt
names:
0: person
# train.txt
./images/im0.jpg
./images/im1.jpg
/data/shared/im2.jpg
2.2 标签文件格式(每图一个 *.txt)
标签必须导出为 YOLO 文本格式:每张图像对应一个 *.txt 文件;若图中没有目标,则不需要生成该 *.txt 文件。每个文件每行一个目标,格式为:
class x_center y_center width height
关键规则:
- 归一化 xywh:框坐标必须是 0~1 的归一化值。若框以像素为单位,需将
x_center、width除以图像宽度,y_center、height除以图像高度; - 零起索引:类别编号从 0 开始,与
names的 key 对应; - 检测之外的任务(segment/pose/obb)在 5 列基础上追加多边形顶点、关键点或 4 个角点坐标,同样归一化。
标签路径的推导规则可以直接从 img2label_paths 的源码看出:框架把图像路径中的 /images/ 子串替换为 /labels/,并把扩展名换成 .txt。因此目录必须严格按下述结构组织(与 COCO8 数据集页 的示例一致):
datasets
└── coco8
├── images
│ ├── train # 4 张训练图
│ │ └── 000000000009.jpg
│ └── val # 4 张验证图
│ └── 000000000009.jpg
└── labels
├── train # 与图像同名(.txt)的标签
│ └── 000000000009.txt
└── val
└── 000000000009.txt
例如一张包含 2 个人(class 0)和 1 条领带(class 27)的图,其标签文件内容为:
0 0.471429 0.637500 0.304762 0.646875
0 0.670357 0.561875 0.240476 0.740625
27 0.638393 0.639688 0.017024 0.054375
2.3 训练使用示例
# Python
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # 加载预训练模型(训练推荐)
results = model.train(data="coco8.yaml", epochs=100, imgsz=640)
# CLI:从预训练 *.pt 模型开始训练
yolo detect train data=coco8.yaml model=yolo26n.pt epochs=100 imgsz=640
数据流方面,check_det_dataset 会在 train/val 图像缺失时:先打印缺失路径;若 YAML 中有 download 字段且 autodownload=True,则执行 .zip 下载或 bash/Python 脚本,把数据集落到 DATASETS_DIR(默认 datasets/,可通过 settings 文件修改)——这解释了为什么 coco8.yaml 只需一份 YAML 即可让框架"自举"出完整数据集。
三、Ultralytics NDJSON 格式
NDJSON(Newline Delimited JSON)格式为数据集定义提供了另一种方式:数据集元数据与标注全部存储在单个文件中,每一行是一个独立的 JSON 对象。文件由两类记录组成:
- Dataset record(第 1 行):数据集元信息,包括任务类型、类别名等;
- Image records(后续各行):单张图像的记录,包括尺寸、标注与文件路径/URL。
3.1 记录结构
数据集记录示例:
{
"type": "dataset",
"task": "detect",
"name": "Example",
"description": "COCO NDJSON example dataset",
"url": "https://app.ultralytics.com/user/datasets/example",
"class_names": { "0": "person", "1": "bicycle", "2": "car" },
"bytes": 426342,
"version": 0,
"created_at": "2024-01-01T00:00:00Z",
"updated_at": "2025-01-01T00:00:00Z"
}
图像记录示例(detect 任务),annotations.boxes 中每条为 [class_id, x_center, y_center, width, height],坐标归一化:
{
"type": "image",
"file": "image1.jpg",
"url": "https://www.url.com/path/to/image1.jpg",
"width": 640,
"height": 480,
"split": "train",
"annotations": {
"boxes": [
[0, 0.525, 0.376, 0.284, 0.418],
[1, 0.735, 0.298, 0.193, 0.337]
]
}
}
3.2 六类任务的标注字段
annotations 对象中的键随任务类型变化,文档列出了全部 6 种:
| 任务 | 键 | 元素格式 |
|---|---|---|
| detect | boxes |
[class_id, x_center, y_center, width, height] |
| segment | segments |
[class_id, x1, y1, x2, y2, x3, y3, ...] 多边形顶点 |
| pose | pose |
[class_id, x_center, y_center, width, height, x1, y1, v1, x2, y2, v2, ...],关键点为 bbox 后重复的 (x, y, v) 三元组,v 为可见性:0=未标注、1=被遮挡、2=可见;关键点数量由数据集决定(如 COCO pose 为 17 个关键点 = bbox 后 51 个值) |
| obb | obb |
[class_id, x1, y1, x2, y2, x3, y3, x4, y4],四个角点按从左上角开始的顺时针顺序定义旋转框,全部归一化 |
| classify | classification |
[class_id] |
| depth | 数据集记录声明 depth_scale(如 { "type": "dataset", "task": "depth", "depth_scale": 1000 }),图像记录另附 "depth": { "url": "..." } 指向配对的 uint16 深度 PNG |
pose 与 depth 的两个细节在源码中有对应实现:pose 数据集若未声明 kpt_shape,转换时 _infer_ndjson_kpt_shape 会扫描最多 50 条标注自动推断关键点形状(先按 dims=3 校验可见性值,再回退 dims=2);depth_scale 默认 1000 且必须为正有限数,深度 PNG 必须是 2 通道 uint16(校验见 check_depth_scale 相关逻辑,深度图格式说明见 Depth 数据集文档)。
3.3 自定义图像 metadata
每条 image record 可携带一个 metadata JSON 对象,存放拍摄条件、设备标识、审核状态等业务上下文,支持嵌套:
{
"type": "image",
"file": "airbus-wing.jpg",
"url": "https://example.com/airbus-wing.jpg",
"split": "train",
"metadata": {
"aircraft": { "family": "A350", "section": "wing" },
"inspectionStatus": "reviewed"
}
}
导入 Ultralytics Platform 后 metadata 与图像一起存储,可在图像全屏信息面板中查看或编辑。平台侧限制:顶层 metadata key 不超过 128 字符、单图序列化 metadata 不超过 500,000 字符、单次 NDJSON 导入的有效 metadata 总量不超过 500,000 字符。
3.4 训练使用示例
# Python
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.train(data="path/to/dataset.ndjson", epochs=100, imgsz=640)
# CLI
yolo detect train data=path/to/dataset.ndjson model=yolo26n.pt epochs=100 imgsz=640
3.5 NDJSON 格式的优势
- 单文件:全部数据集信息集中在一个文件中;
- 可流式处理:逐行解析即可处理超大数据集,无需整体载入内存;
- 云集成:图像记录支持远程 URL,天然适配云端训练;
- 可扩展:可随意添加自定义 metadata 字段;
- 版本友好:单文件格式非常适合 git 等版本控制系统。
从源码结构看,NDJSON 训练并不要求本地已经存在 YOLO 目录结构:convert_ndjson_to_yolo 会逐行读取记录(首行必须是 dataset record),生成以内容哈希命名的数据集目录 {stem}-{hash} 与 data.yaml,并用 aiohttp 以最多 128 并发、失败重试 3 次的方式下载图像(本地 path 字段则可指向已落盘的 images/{split}/ 结构直接拷贝);若数据集缺少 val split,会固定种子从 train 中自动切出约 10% 作为验证集;转换完成后写入 hash/complete 标记,下次训练直接复用缓存,无需重复下载。相关行为在 tests/test_ndjson_converter.py 中有针对深度数据下载、depth_scale 传递与缓存复用的测试覆盖。
四、受支持的数据集
以下数据集均可通过 data=<数据集名>.yaml 直接引用(YAML 位于 ultralytics/cfg/datasets/ 目录,缺失时框架自动下载)。每个数据集的详细结构说明见各自文档页:
- African-wildlife:非洲野生动物图像数据集,包含水牛、大象、犀牛、斑马等;
- Argoverse:城市环境下的 3D 跟踪与运动预测数据,标注丰富;
- Brain-tumor:脑肿瘤检测数据集,含肿瘤存在性、位置与特征的 MRI/CT 图像;
- COCO:Common Objects in Context,80 类的大规模检测、分割与字幕数据集;
- COCO8:COCO train 与 val 各前 4 张图的小子集(约 1 MB),适合快速验证流程;
- COCO8-Grayscale:由 RGB 转灰度得到的单通道 COCO8,适合单通道模型评估;
- COCO8-Multispectral:通过 RGB 波长插值得到的 10 通道多光谱 COCO8,适合谱感知模型评估(插值实现可参考 convert_to_multispectral);
- COCO12-Formats:12 张图像覆盖 12 种图像格式(AVIF、BMP、DNG、HEIC、JP2、JPEG、JPG、MPO、PNG、TIF、TIFF、WebP),用于验证图像加载管线;
- COCO16 / COCO32 / COCO64:COCO train2017 前 16/32/64 张图(8+8 / 16+16 / 32+32 划分)的快速测试子集,随官方资源包提供;
- COCO128:COCO train2017 前 128 张图,适合中等规模测试;
- Construction-PPE:工地工人安全装备标注(头盔、背心、手套、靴子、护目镜),含 no_helmet、no_goggle 等缺失装备类别,用于合规监测;
- Global Wheat 2020:Global Wheat Challenge 2020 的小麦穗图像数据集;
- HomeObjects-3K:床、椅、电视等家居物品数据集,适合智能家居、机器人、AR 与房间布局分析;
- KITTI:真实驾驶场景(立体视觉、LiDAR、GPS/IMU),此处用于城市/乡村/高速公路场景下汽车、行人、骑行者的 2D 检测;
- LVIS:1203 类的大规模检测、分割与字幕数据集;
- Medical-pills:药片图像数据集,适用于制药质检、药片分拣与合规审查;
- Objects365:365 类、60 万+ 标注图像的高质量检测数据集;
- OpenImagesV7:Google 出品,1.7M 训练图 + 42k 验证图;
- Roboflow 100:跨 7 个成像领域的 100 个数据集组成的检测评测基准;
- Signature:文档签名标注数据集,支持文档真伪核验与欺诈检测研究;
- SKU-110K:零售场景稠密目标检测,1.1 万+ 图像、170 万边界框;
- TT100K:清华大学-腾讯 100K 交通标志数据集,16,817 张街景图像、221 个标志类别;
- VisDrone:无人机视角检测与多目标跟踪数据,1 万+ 图像与视频序列;
- VOC:Pascal VOC,20 类、1.1 万+ 图像的经典检测/分割数据集;
- xView:俯视影像目标检测数据集,60 类、100 万+ 标注目标。
五、添加你自己的数据集
使用 Ultralytics YOLO 格式接入自有序列的步骤:
- 转换标注:将现有标注(VOC XML、COCO JSON、掩码图等)转为 YOLO 文本格式,坐标归一化、类别零起索引;
- 组织目录:按
images/{train,val}+labels/{train,val}结构存放,标签文件名与图像同名; - 编写 YAML:在数据集中创建
data.yaml,写清path、train、val、names(必要时附download); - 启动训练:
model.train(data="path/to/data.yaml")或 CLI 方式传入即可。
若你的数据集是掩码图(像素值 = 类别),仓库还提供了 convert_segment_masks_to_yolo_seg,可将二值掩码目录批量转为 YOLO-seg 轮廓标注(背景像素 0 跳过,轮廓至少 3 个点)。
六、标注格式转换:COCO → YOLO
对于 COCO 及其衍生格式(包括 LVIS),可以直接使用内置转换函数 convert_coco:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="path/to/coco/annotations/")
该函数把基于 JSON 的 COCO 标注转换为更简洁的文本 YOLO 格式,使数据集可被 Ultralytics YOLO 模型直接消费。从源码看其核心行为:
- 类别映射:
category_id经 coco91_to_coco80_class 从 91 类索引映射到 80 类索引(cls91to80参数控制,默认开启); - 框格式变换:COCO 的
[x, y, w, h](左上角)先平移为中心点再分别除以宽高归一化,w<=0或h<=0的框与iscrowd标注会被丢弃; - 可选扩展:
use_segments=True输出分割多边形(缺失/非法多边形时退化为 bbox 矩形并给出警告,RLE 掩码无法转为点列),use_keypoints=True追加归一化关键点; - LVIS 支持:
lvis=True时按 train2017/val2017 分目录预建标签目录并生成图像列表 txt(因为 LVIS val 含 COCO train2017 中的图像)。
LVIS 的转换示例:
convert_coco("lvis/annotations/", use_segments=True, use_keypoints=False, cls91to80=False, lvis=True)
完整的 COCO→YOLO 工作流(类别 ID 映射、目录布局、分割与关键点标注处理)见 Convert COCO Annotations to YOLO 与 converter API 参考。
七、常见问题(FAQ)
Q1:Ultralytics YOLO 数据集格式是什么、如何组织?
它是一套数据集配置:data.yaml 中定义 path、train、val(可选 test)路径与 names 类别字典(如 coco8.yaml);标签为每图一个 *.txt,每行 class x_center y_center width height(归一化坐标)。详见 COCO8 数据集示例。
Q2:如何把 COCO 数据集转成 YOLO 格式? 用 Ultralytics 转换工具:
from ultralytics.data.converter import convert_coco
convert_coco(labels_dir="path/to/coco/annotations/")
Q3:Ultralytics YOLO 支持哪些目标检测数据集? 覆盖面很广,包括 Argoverse、COCO、LVIS、COCO8、Global Wheat 2020、Objects365、OpenImagesV7 等,完整清单见上文"受支持的数据集"一节。
Q4:如何用我的数据集开始训练 YOLO26? 先确保数据集格式正确且路径已在 YAML 中定义,然后:
from ultralytics import YOLO
model = YOLO("yolo26n.pt") # 加载预训练模型
results = model.train(data="path/to/your_dataset.yaml", epochs=100, imgsz=640)
yolo detect train data=path/to/your_dataset.yaml model=yolo26n.pt epochs=100 imgsz=640
Q5:在哪里可以找到更多 Ultralytics YOLO 目标检测的实战示例? 文档仓库提供了预测、训练等使用入口:predict 模式文档 与 train 模式文档,以及 YOLO26 模型族 的规格对比,可结合数据集文档按任务选型。
八、小结
- YOLO 格式:
data.yaml(path/train/val/names)+images/、labels/镜像目录 + 归一化 xywh 文本标签;train/val/test支持目录、目录列表与*.txt图像清单三种写法; - NDJSON 格式:单文件、每行一个 JSON 对象,覆盖 detect/segment/pose/obb/classify/depth 六类标注,支持远程 URL 与自定义 metadata,转换管线带哈希缓存与断点复用;
- 格式转换:
convert_coco一行代码打通 COCO/LVIS → YOLO,掩码数据集可用convert_segment_masks_to_yolo_seg; - 接入自有序列:按目录结构整理 + YAML 声明路径与类别即可训练,
check_det_dataset会对缺键、类别数不一致等常见错误提前报错,配合 27 个内置数据集 YAML 可快速起步验证。
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