数据集基础:什么是目标检测数据集、常见格式与结构解析
做目标检测,说白了就是教计算机「看」东西。但计算机不像人,它看不懂一张图里有什么。你得给它喂数据——这就是数据集的作用。
我刚开始接触这个领域时,以为数据集就是一堆图片加个标签文件。后来踩了不少坑才明白,数据集的格式、结构、标注方式,直接决定了你模型能学到什么程度。今天咱们就把这块彻底聊透。
什么是目标检测数据集?
目标检测数据集,就是「图片 + 标注」的集合。图片告诉模型「这是什么场景」,标注告诉模型「目标在哪里、是什么类别」。
举个例子:一张街景图里,有行人、汽车、红绿灯。标注文件会记录每个目标的类别(比如「car」)和它在图片中的位置(比如左上角坐标和宽高)。
一个完整的目标检测数据集,通常包含三部分:
- 图片文件:JPEG、PNG 等格式,分辨率尽量统一
- 标注文件:记录每个目标的类别和位置信息
- 类别映射表:比如 class 0 对应「person」、class 1 对应「car」
三大主流数据集格式
目前业界用得最多的就三种:COCO、VOC、YOLO。我当年在这三种格式之间来回转换,差点被搞疯。今天帮你一次性理清楚。
| 格式 | 全称 | 标注方式 | 存储形式 | 适用场景 |
|---|---|---|---|---|
| COCO | Common Objects in Context | 多边形分割 + 边界框 | JSON | 通用检测、实例分割 |
| VOC | PASCAL VOC | 边界框 | XML | 分类、检测、分割 |
| YOLO | You Only Look Once | 归一化边界框 | TXT | YOLO 系列模型 |
COCO 格式详解
COCO 是目前最流行的数据集格式之一。它的标注文件是一个 JSON,结构清晰但层级较多。
核心字段就这几个:
- images:图片信息列表,包含 id、文件名、宽高
- annotations:标注信息列表,包含目标 id、图片 id、类别 id、边界框坐标、分割多边形
- categories:类别列表,包含类别 id 和名称
边界框的格式是 [x, y, width, height],其中 x、y 是左上角坐标。注意,这是像素值,不是归一化的。
{
"images": [
{"id": 1, "file_name": "000001.jpg", "width": 640, "height": 480}
],
"annotations": [
{
"id": 1,
"image_id": 1,
"category_id": 1,
"bbox": [100, 150, 200, 300],
"segmentation": [[100,150, 300,150, 300,450, 100,450]]
}
],
"categories": [
{"id": 1, "name": "person"}
]
}
VOC 格式详解
VOC 格式来自 PASCAL VOC 挑战赛,结构更直观。每张图片对应一个 XML 文件,文件名和图片名一致。
XML 里主要包含:
- folder:图片所在文件夹
- filename:图片文件名
- size:图片宽高和通道数
- object:每个目标的信息,包括 name、pose、truncated、difficult、bndbox
bndbox 的格式是 [xmin, ymin, xmax, ymax],也就是左上角和右下角的坐标。
<annotation>
<folder>VOC2007</folder>
<filename>000001.jpg</filename>
<size>
<width>640</width>
<height>480</height>
<depth>3</depth>
</size>
<object>
<name>person</name>
<bndbox>
<xmin>100</xmin>
<ymin>150</ymin>
<xmax>300</xmax>
<ymax>450</ymax>
</bndbox>
</object>
</annotation>
YOLO 格式详解
YOLO 格式是专为 YOLO 系列模型设计的。它用 TXT 文件存储标注,每张图片对应一个同名的 TXT 文件。
每行代表一个目标,格式是:
<class_id> <x_center> <y_center> <width> <height>
注意,这里的坐标都是归一化的,范围在 0 到 1 之间。计算公式是:
- x_center = (xmin + xmax) / 2 / image_width
- y_center = (ymin + ymax) / 2 / image_height
- width = (xmax - xmin) / image_width
- height = (ymax - ymin) / image_height
0 0.3125 0.625 0.3125 0.625
这个例子表示:类别 0(person),中心点在图片的 31.25% 宽度和 62.5% 高度位置,宽高分别占图片的 31.25% 和 62.5%。
三种格式的对比与转换
你想想看,实际项目中很少只用一种格式。比如你从网上下载的数据集是 COCO 格式,但你要用 YOLOv8 训练,就得转成 YOLO 格式。
我整理了一个对比表,方便你快速理解:
| 对比维度 | COCO | VOC | YOLO |
|---|---|---|---|
| 文件格式 | JSON | XML | TXT |
| 坐标类型 | 像素 | 像素 | 归一化 |
| 坐标格式 | [x, y, w, h] | [xmin, ymin, xmax, ymax] | [x_center, y_center, w, h] |
| 文件数量 | 1 个 JSON | 每图 1 个 XML | 每图 1 个 TXT |
| 可读性 | 中等 | 高 | 低 |
| 适用模型 | 通用 | 通用 | YOLO 系列 |
数据集结构解析
一个规范的目标检测数据集,目录结构通常长这样:
dataset/
├── images/
│ ├── train/
│ │ ├── 000001.jpg
│ │ ├── 000002.jpg
│ │ └── ...
│ └── val/
│ ├── 000100.jpg
│ ├── 000101.jpg
│ └── ...
├── labels/
│ ├── train/
│ │ ├── 000001.txt
│ │ ├── 000002.txt
│ │ └── ...
│ └── val/
│ ├── 000100.txt
│ ├── 000101.txt
│ └── ...
└── data.yaml
这个结构是 YOLO 系列的标准组织方式。data.yaml 文件定义了数据集的基本信息:
train: ./images/train
val: ./images/val
nc: 2
names: ['person', 'car']
其中 nc 是类别数量,names 是类别名称列表。注意,类别索引从 0 开始。
知识结构图
下面这张图帮你把三种格式的核心差异和转换关系理清楚:
格式转换实战要点
在实际项目中,格式转换是家常便饭。我分享几个关键点:
- 坐标转换要小心:不同格式的坐标定义不同,转换时一定要画图验证
- 类别索引对齐:COCO 的类别索引从 1 开始,YOLO 从 0 开始,差一个数模型就废了
- 图片路径要正确:YOLO 训练时要求图片和标注文件名一一对应,大小写也要一致
- 验证集不能少:我见过有人只分训练集,结果模型过拟合了都不知道
核心总结:数据集是目标检测的基石。COCO 适合大规模通用场景,VOC 适合小项目手动检查,YOLO 是训练 YOLO 系列模型的标配。不管用哪种格式,规范的结构和准确的标注才是王道。