3. 数据集准备:车辆行人数据集介绍、公开数据集下载与目录结构解析
做目标检测,算法模型是引擎,数据集就是燃料。没有高质量的数据,再牛的YOLO也跑不起来。这一章,我就带你搞定车辆行人检测的数据集准备。
说实话,很多初学者喜欢一上来就调模型,结果训练完发现检测效果一塌糊涂。我当年也踩过这个坑——花了两周调参,最后发现是数据集没选对。嗯,咱们先把地基打牢。
3.1 车辆行人检测常用数据集概览
目前工业界和学术界用得最多的,主要是下面这几个。我按推荐程度排了个序:
| 数据集名称 | 规模(图片数) | 标注类别 | 适用场景 | 我的推荐指数 |
|---|---|---|---|---|
| BDD100K | 10万张 | 10类(含car、pedestrian、rider等) | 自动驾驶、城市道路 | ⭐⭐⭐⭐⭐ |
| Cityscapes | 2.5万张(精细标注5000张) | 30类(含vehicle、person、rider等) | 城市街景、语义分割 | ⭐⭐⭐⭐ |
| KITTI | 1.5万张 | 8类(含Car、Pedestrian、Cyclist等) | 自动驾驶、立体视觉 | ⭐⭐⭐⭐ |
| Waymo Open Dataset | 约20万张 | 4类(含Vehicle、Pedestrian、Cyclist等) | 自动驾驶、多传感器 | ⭐⭐⭐ |
我的建议:如果你刚入门,优先选BDD100K。它场景丰富、标注质量高,而且标注格式直接支持YOLO。Cityscapes虽然精细,但标注格式偏语义分割,转YOLO格式要多一步预处理。
3.2 BDD100K数据集详解
BDD100K是伯克利大学发布的,专门为自动驾驶场景设计。我个人特别喜欢这个数据集,原因有三:
- 场景多样:包含晴天、雨天、夜晚、黄昏等各种光照条件
- 标注全面:不仅有目标检测框,还有车道线、可行驶区域、全景分割
- 格式友好:标注文件是JSON格式,转YOLO的txt标注很方便
3.2.1 下载BDD100K
下载方式有两种,我推荐第二种:
- 官网下载:访问bdd-data.berkeley.edu,需要注册账号,速度较慢
- 学术镜像下载:用以下命令直接拉取(我在项目中一直用这个方式)
# 下载BDD100K检测数据集(约5GB)
wget https://dl.cv.ethz.ch/bdd100k/data/bdd100k_det_20_labels.zip
# 下载图片(约1.8TB,建议只下载需要的子集)
# 这里我通常只下载10K子集做快速验证
wget https://dl.cv.ethz.ch/bdd100k/data/bdd100k_images_10k.zip
注意:BDD100K完整图片集有100K张,约1.8TB。我建议你先下载10K子集做实验,等模型调通了再下载全量数据。别一上来就下全量,硬盘容易爆。
3.2.2 BDD100K目录结构
下载解压后,目录结构是这样的:
bdd100k/
├── images/ # 图片文件夹
│ ├── train/ # 训练集(70K张)
│ ├── val/ # 验证集(10K张)
│ └── test/ # 测试集(20K张,无标注)
├── labels/ # 标注文件夹
│ ├── bdd100k_labels_images_train.json # 训练集标注
│ └── bdd100k_labels_images_val.json # 验证集标注
└── info/ # 数据集信息
└── categories.json # 类别定义文件
这里有个坑,我当年踩过——BDD100K的标注JSON文件里,框的坐标是归一化的,但格式是[x1, y1, x2, y2](左上角和右下角),而YOLO需要的是[x_center, y_center, width, height]。 所以转换时一定要做坐标变换。
3.3 Cityscapes数据集详解
Cityscapes是奔驰联合多所大学发布的,专注于城市街景理解。它的标注精度非常高,但代价是标注量少——精细标注只有5000张。
3.3.1 下载Cityscapes
Cityscapes需要注册下载,不能直接wget。流程如下:
- 访问
www.cityscapes-dataset.com注册账号 - 同意协议后,下载
gtFine和leftImg8bit两个压缩包 - 解压到本地目录
小技巧:Cityscapes的标注是像素级语义分割,如果你只想做目标检测,可以用我写的一个脚本自动提取边界框。脚本我会在后面的章节提供。
3.3.2 Cityscapes目录结构
cityscapes/
├── leftImg8bit/ # 原始图片
│ ├── train/ # 训练集(2975张)
│ │ ├── aachen/ # 按城市分文件夹
│ │ ├── bochum/
│ │ └── ...
│ ├── val/ # 验证集(500张)
│ └── test/ # 测试集(1525张)
└── gtFine/ # 精细标注
├── train/
├── val/
└── test/
├── aachen/
│ ├── aachen_000000_000019_gtFine_color.png # 彩色标注图
│ ├── aachen_000000_000019_gtFine_instanceIds.png # 实例ID图
│ ├── aachen_000000_000019_gtFine_labelIds.png # 类别ID图
│ ├── aachen_000000_000019_gtFine_polygons.json # 多边形标注
│ └── aachen_000000_000019_gtFine.json # 完整标注信息
└── ...
你看,Cityscapes每个场景有5个标注文件。做目标检测时,我们主要用 instanceIds.png 和 polygons.json。前者可以直接提取实例边界框,后者包含多边形坐标。
3.4 数据集目录结构对比
| 对比维度 | BDD100K | Cityscapes |
|---|---|---|
| 标注格式 | JSON(边界框) | JSON + PNG(语义/实例分割) |
| 转YOLO难度 | 低(直接解析JSON) | 高(需从分割图提取框) |
| 场景多样性 | 高(多天气、多时段) | 中(主要是白天、好天气) |
| 标注精度 | 中(边界框) | 高(像素级) |
| 推荐用途 | 目标检测模型训练 | 语义分割、高精度检测 |
3.5 数据集准备流程(SVG流程图)
下面这张图,是我在实际项目中总结的数据集准备流程。你照着走,基本不会出错:
3.6 避坑指南:我踩过的三个坑
做数据集准备这几年,我踩过不少坑。挑三个最典型的分享给你:
坑一:标注格式不匹配
我曾经直接用BDD100K的JSON标注训练YOLOv5,结果loss死活不收敛。查了两天才发现——BDD100K的框坐标是[x1,y1,x2,y2],而YOLO需要[x_center,y_center,width,height]。坐标变换公式很简单:
x_center = (x1 + x2) / 2 / image_width
y_center = (y1 + y2) / 2 / image_height
width = (x2 - x1) / image_width
height = (y2 - y1) / image_height
坑二:类别ID不一致
BDD100K的类别ID从0开始,但Cityscapes的类别ID是连续的但有空缺。比如Cityscapes的"person"类ID是24,"rider"是25。如果你混用数据集,一定要先统一类别映射表。我习惯自己写一个映射文件:
# 自定义类别映射(YOLO格式)
0: car
1: pedestrian
2: rider
3: truck
4: bus
坑三:图片路径问题
BDD100K的图片路径是相对路径,比如 images/train/xxx.jpg。如果你移动了数据集位置,记得更新标注文件里的路径。我一般用软链接来解决:
ln -s /data/bdd100k/images ./images
3.7 本章小结
这一章我们聊了三个核心点:
- 数据集选型:BDD100K适合快速上手,Cityscapes适合高精度场景
- 下载与目录结构:两个数据集的目录组织方式不同,但核心都是images + labels
- 格式转换:从JSON或分割图提取YOLO格式标注,注意坐标变换和类别映射