数据集介绍与准备: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图帮你理清关系:
在实际项目中,我建议你统一使用一种内部格式。我个人偏好YOLO格式——[class_id, x_center, y_center, width, height],所有值归一化到0~1。这样不管从哪个数据集来,都能快速适配。
4.6 避坑指南
最后分享几个我踩过的坑:
- 路径问题: 数据集路径不要包含中文和空格。我曾经因为文件夹名叫「数据集(2024)」,结果OpenCV死活读不了图片。
- 类别索引: COCO的类别ID从1开始,VOC从0开始?不对,VOC的XML里类别是字符串,你需要自己建一个映射表。我建议统一从0开始编号。
- 图片损坏: 下载的数据集里偶尔会有损坏的图片。写个脚本检查一下,别等到训练到一半才报错。
- 标注缺失: KITTI的测试集没有标注,只有训练集有。别傻乎乎地拿测试集去训练。
一句话总结: 数据集准备不是体力活,而是技术活。搞清楚格式、做好转换、检查数据质量,后面训练才能顺风顺水。