数据集介绍与准备:COCO、VOC、KITTI

做障碍物检测,第一步不是调模型,而是搞定数据。

我见过太多同学,模型结构背得滚瓜烂熟,结果一跑训练就报错——不是路径不对,就是标注格式解析失败。说白了,数据准备这个环节,决定了你后面90%的调试时间。

今天咱们就把三个主流数据集——COCO、VOC、KITTI——彻底讲透。包括它们的目录结构、标注格式、下载方式,以及我踩过的坑。

核心观点: 数据集不是越多越好,而是越「对齐」越好。你的任务场景跟哪个数据集最像,就用哪个做预训练或迁移学习。

4.1 三大数据集概览

先给个全景图,让你心里有个数。

数据集 全称 主要场景 标注格式 典型规模
COCO Common Objects in Context 通用物体检测、分割 JSON 33万张图,80类
VOC PASCAL VOC 通用物体检测、分类 XML 约1.1万张图,20类
KITTI Karlsruhe Institute of Technology and Toyota Technological Institute 自动驾驶、障碍物检测 自定义TXT 约1.5万张图,8类

你可能会问:「为什么障碍物检测要用COCO?它不是通用数据集吗?」

嗯,这里有个关键点:COCO虽然包含80类,但其中「car」「truck」「bus」「person」这些类别,正好是自动驾驶障碍物检测的核心目标。所以很多团队直接用COCO做预训练,再在自己的场景上微调。

4.2 COCO数据集详解

4.2.1 下载与目录结构

COCO的下载方式我建议直接用官方脚本,别手动去网页点。我当年第一次下载时,手动点了十几个链接,结果发现版本不对……

# 下载2017年训练集和验证集
wget http://images.cocodataset.org/zips/train2017.zip
wget http://images.cocodataset.org/zips/val2017.zip
wget http://images.cocodataset.org/annotations/annotations_trainval2017.zip

解压后的目录结构长这样:

coco/
├── images/
│   ├── train2017/        # 训练集图片
│   └── val2017/          # 验证集图片
└── annotations/
    ├── instances_train2017.json   # 训练集标注
    ├── instances_val2017.json     # 验证集标注
    └── stuff_train2017.json       # 语义分割标注(可选)

我个人习惯把数据集放在一个独立的硬盘分区里,因为COCO解压后将近25GB,频繁读写会拖慢系统。

4.2.2 标注格式:JSON

COCO的标注格式是JSON,结构清晰但嵌套较深。我第一次解析时,差点被它的字典套列表、列表套字典搞晕。

核心结构如下:

{
  "images": [
    {
      "id": 1,
      "file_name": "000000000001.jpg",
      "width": 640,
      "height": 480
    },
    ...
  ],
  "annotations": [
    {
      "id": 1,
      "image_id": 1,
      "category_id": 3,
      "bbox": [100, 150, 200, 300],  // [x, y, width, height]
      "area": 60000,
      "iscrowd": 0
    },
    ...
  ],
  "categories": [
    {
      "id": 1,
      "name": "person",
      "supercategory": "person"
    },
    ...
  ]
}

这里有个坑:bbox的格式是[x, y, width, height],不是[x1, y1, x2, y2]。很多新手直接拿[x, y, w, h]去画框,结果画出来是歪的。我曾经在项目里因为这个bug排查了整整一个下午……

小技巧: 如果你习惯用[x1, y1, x2, y2]格式,可以用下面这个转换函数:

def coco_bbox_to_xyxy(bbox):
    x, y, w, h = bbox
    return [x, y, x + w, y + h]

4.3 VOC数据集详解

4.3.1 下载与目录结构

VOC数据集相对轻量,适合快速验证算法。下载命令:

wget http://host.robots.ox.ac.uk/pascal/VOC/voc2012/VOCtrainval_11-May-2012.tar
tar -xvf VOCtrainval_11-May-2012.tar

目录结构:

VOCdevkit/
└── VOC2012/
    ├── JPEGImages/        # 所有图片
    ├── Annotations/       # XML标注文件
    ├── ImageSets/
    │   └── Main/          # 训练/验证/测试的图片列表
    │       ├── train.txt
    │       ├── val.txt
    │       └── trainval.txt
    └── SegmentationClass/ # 语义分割标注(可选)

注意看,VOC的标注文件和图片是分开存放的。图片在JPEGImages,标注在Annotations。两者通过文件名关联——比如图片叫000001.jpg,标注就叫000001.xml。

4.3.2 标注格式:XML

VOC的XML标注格式非常直观,我当年第一次看就懂了:

<annotation>
  <folder>VOC2012</folder>
  <filename>000001.jpg</filename>
  <size>
    <width>500</width>
    <height>375</height>
    <depth>3</depth>
  </size>
  <object>
    <name>car</name>
    <bndbox>
      <xmin>100</xmin>
      <ymin>150</ymin>
      <xmax>300</xmax>
      <ymax>450</ymax>
    </bndbox>
  </object>
  <object>
    <name>person</name>
    <bndbox>
      <xmin>50</xmin>
      <ymin>50</ymin>
      <xmax>120</xmax>
      <ymax>200</ymax>
    </bndbox>
  </object>
</annotation>

你看,VOC的bbox格式是[xmin, ymin, xmax, ymax],跟COCO不一样。所以如果你要在两个数据集之间切换,记得做格式转换。

注意: VOC的类别只有20类,而且没有「traffic light」「stop sign」这类交通标志。如果你做的是城市道路障碍物检测,可能需要自己补充标注。

4.4 KITTI数据集详解

4.4.1 下载与目录结构

KITTI是自动驾驶领域最经典的数据集之一。下载方式稍微麻烦点,需要从官网注册获取链接。不过你可以用这个镜像:

wget https://s3.eu-central-1.amazonaws.com/avg-kitti/data_object_image_2.zip
wget https://s3.eu-central-1.amazonaws.com/avg-kitti/data_object_label_2.zip

目录结构:

KITTI/
├── training/
│   ├── image_2/          # 左目彩色图像
│   ├── label_2/          # 标注文件(TXT格式)
│   └── calib/            # 相机标定参数
└── testing/
    ├── image_2/
    └── calib/

KITTI的标注文件是TXT格式,每行一个目标。我刚开始看的时候觉得有点简陋,但用久了发现其实很高效。

4.4.2 标注格式:TXT

每行格式如下:

Car 0.00 0 0.00 387.63 181.54 423.17 203.09 1.52 1.57 3.48 -1.56 1.63 46.69 1.65

各字段含义:

字段 含义 示例值
1 类别 Car
2 截断程度(0~1) 0.00
3 遮挡程度(0~3) 0
4 观测角度(alpha) 0.00
5-8 2D边界框 [x1, y1, x2, y2] 387.63 181.54 423.17 203.09
9-11 3D物体尺寸 [h, w, l] 1.52 1.57 3.48
12-14 3D物体中心位置 [x, y, z] -1.56 1.63 46.69
15 绕Y轴旋转角(ry) 1.65

这里有个关键点:KITTI不仅提供2D框,还提供3D框信息。如果你要做3D障碍物检测,KITTI几乎是必选数据集。

我的经验: KITTI的标注中,截断和遮挡信息非常有用。在训练时,我通常会过滤掉遮挡程度大于2的目标,因为这些目标往往标注质量较差,会影响模型收敛。

4.5 标注格式对比与转换

三个数据集的标注格式各不相同,但核心信息是一样的:类别 + 位置。下面这张SVG图帮你理清关系:

三大数据集标注格式对比 COCO JSON格式 VOC XML格式 KITTI TXT格式 核心信息:类别 + 边界框位置 bbox: [x, y, w, h] bbox: [xmin, ymin, xmax, ymax] bbox: [x1, y1, x2, y2] + 3D信息 转换关键:统一bbox格式 + 类别映射 建议统一为 [x_center, y_center, width, height] 归一化格式

在实际项目中,我建议你统一使用一种内部格式。我个人偏好YOLO格式——[class_id, x_center, y_center, width, height],所有值归一化到0~1。这样不管从哪个数据集来,都能快速适配。

4.6 避坑指南

最后分享几个我踩过的坑:

  • 路径问题: 数据集路径不要包含中文和空格。我曾经因为文件夹名叫「数据集(2024)」,结果OpenCV死活读不了图片。
  • 类别索引: COCO的类别ID从1开始,VOC从0开始?不对,VOC的XML里类别是字符串,你需要自己建一个映射表。我建议统一从0开始编号。
  • 图片损坏: 下载的数据集里偶尔会有损坏的图片。写个脚本检查一下,别等到训练到一半才报错。
  • 标注缺失: KITTI的测试集没有标注,只有训练集有。别傻乎乎地拿测试集去训练。

一句话总结: 数据集准备不是体力活,而是技术活。搞清楚格式、做好转换、检查数据质量,后面训练才能顺风顺水。

可可精品资料库