数据集基础:什么是目标检测数据集、常见格式与结构解析

做目标检测,说白了就是教计算机「看」东西。但计算机不像人,它看不懂一张图里有什么。你得给它喂数据——这就是数据集的作用。

我刚开始接触这个领域时,以为数据集就是一堆图片加个标签文件。后来踩了不少坑才明白,数据集的格式、结构、标注方式,直接决定了你模型能学到什么程度。今天咱们就把这块彻底聊透。

什么是目标检测数据集?

目标检测数据集,就是「图片 + 标注」的集合。图片告诉模型「这是什么场景」,标注告诉模型「目标在哪里、是什么类别」。

举个例子:一张街景图里,有行人、汽车、红绿灯。标注文件会记录每个目标的类别(比如「car」)和它在图片中的位置(比如左上角坐标和宽高)。

一个完整的目标检测数据集,通常包含三部分:

  • 图片文件:JPEG、PNG 等格式,分辨率尽量统一
  • 标注文件:记录每个目标的类别和位置信息
  • 类别映射表:比如 class 0 对应「person」、class 1 对应「car」
我的经验:刚开始做项目时,我总想着数据集越大越好。后来发现,质量比数量重要得多。500 张高质量、多样性好的图片,效果往往好过 5000 张重复、模糊的图片。

三大主流数据集格式

目前业界用得最多的就三种: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"}
  ]
}
我曾经踩过的坑:COCO 的 bbox 格式是 [x, y, width, height],但有些工具导出的是 [x1, y1, x2, y2]。转换时一定要确认清楚,否则模型训练出来全是错的。

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>
我的习惯:VOC 格式适合小项目,因为 XML 可读性强,手动检查也方便。但如果你有上万张图片,JSON 格式的 COCO 会更高效。

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%。

注意:YOLO 格式的坐标是归一化的,而且中心点坐标。很多新手直接拿像素坐标往里填,结果模型训练出来完全不对。转换时一定要除以图片宽高。

三种格式的对比与转换

你想想看,实际项目中很少只用一种格式。比如你从网上下载的数据集是 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 格式 JSON / [x,y,w,h] VOC 格式 XML / [xmin,ymin,xmax,ymax] YOLO 格式 TXT / [x_center,y_center,w,h] 格式转换要点 1. COCO → YOLO:将 [x,y,w,h] 转为 [x_center,y_center,w,h],并除以图片宽高归一化 2. VOC → YOLO:将 [xmin,ymin,xmax,ymax] 转为中心点坐标,再归一化 3. 所有转换都要注意类别索引是否一致,从 0 开始还是从 1 开始 数据集目录结构(YOLO 标准) dataset/ ├── images/train/ ├── images/val/ ├── labels/train/ ├── labels/val/ └── data.yaml data.yaml 包含:train/val 路径、类别数量 nc、类别名称列表 names

格式转换实战要点

在实际项目中,格式转换是家常便饭。我分享几个关键点:

  1. 坐标转换要小心:不同格式的坐标定义不同,转换时一定要画图验证
  2. 类别索引对齐:COCO 的类别索引从 1 开始,YOLO 从 0 开始,差一个数模型就废了
  3. 图片路径要正确:YOLO 训练时要求图片和标注文件名一一对应,大小写也要一致
  4. 验证集不能少:我见过有人只分训练集,结果模型过拟合了都不知道

核心总结:数据集是目标检测的基石。COCO 适合大规模通用场景,VOC 适合小项目手动检查,YOLO 是训练 YOLO 系列模型的标配。不管用哪种格式,规范的结构和准确的标注才是王道。