共计 2638 个字符,预计需要花费 7 分钟才能阅读完成。
背景介绍
BDD100K 是伯克利大学发布的全球最大规模自动驾驶开源数据集之一,包含 10 万段高清驾驶场景视频(Subset 为精选的静态图像子集)。其核心价值在于:

- 覆盖多样化的天气(晴天 / 雨天 / 雪天)和光照条件(白天 / 夜晚)
- 包含 100+ 物体类别标注(车辆、行人、交通标志等)
- 提供精确的边界框(Bounding Box)和可行驶区域标注
Subset 版本特别适合快速验证算法原型,相比完整数据集:
- 体积更小(约 20GB vs 原始 1.8TB)
- 包含 10,000 张精选图像
- 保持原始数据分布的平衡性
数据解析
目录结构
解压后的数据集通常包含以下关键目录:
bdd100k/
├── images/ # 图像文件夹
│ ├── train/ # 训练集(7000 张)│ ├── val/ # 验证集(2000 张)│ └── test/ # 测试集(1000 张)└── labels/ # 标注文件夹(JSON 格式)├── train/
└── val/
标注格式示例
标注文件采用 JSON 格式,每个对象包含以下关键字段:
{
"name": "car",
"bbox": [x1, y1, x2, y2], # 左上和右下坐标
"attributes": {
"occluded": false,
"truncated": true
}
}
可视化方法
使用 OpenCV 快速查看标注效果:
import cv2
import json
img = cv2.imread("bdd100k/images/train/0a0a0b1a-7c39d841.jpg")
with open("bdd100k/labels/train/0a0a0b1a-7c39d841.json") as f:
anns = json.load(f)
for obj in anns:
x1, y1, x2, y2 = obj["bbox"]
cv2.rectangle(img, (x1, y1), (x2, y2), (0,255,0), 2)
cv2.putText(img, obj["name"], (x1, y1-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,0,255), 1)
cv2.imshow("Preview", img)
cv2.waitKey(0)
预处理实战
数据加载
建议使用 PyTorch 的 Dataset 类规范加载流程:
from torch.utils.data import Dataset
import albumentations as A
class BDD100K(Dataset):
def __init__(self, img_dir, label_dir, transform=None):
self.img_paths = sorted(glob(f"{img_dir}/*.jpg"))
self.label_paths = sorted(glob(f"{label_dir}/*.json"))
self.transform = transform
def __getitem__(self, idx):
img = cv2.cvtColor(cv2.imread(self.img_paths[idx]), cv2.COLOR_BGR2RGB)
with open(self.label_paths[idx]) as f:
anns = json.load(f)
# 转换为 Albumentations 需要的格式
bboxes = [obj["bbox"] for obj in anns]
class_ids = [CLASS_DICT[obj["name"]] for obj in anns]
if self.transform:
transformed = self.transform(image=img, bboxes=bboxes, class_ids=class_ids)
img = transformed["image"]
bboxes = transformed["bboxes"]
return img, {"boxes": bboxes, "labels": class_ids}
数据增强
推荐使用 Albumentations 库进行高效增强:
train_transform = A.Compose([A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.2),
A.RandomSizedBBoxSafeCrop(640, 640, p=0.5),
], bbox_params=A.BboxParams(format='pascal_voc'))
模型训练
YOLOv5 快速启动
使用官方仓库进行训练(需提前安装依赖):
# 克隆仓库
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
# 准备 YOLO 格式的标注(需先转换 JSON 到 TXT)python convert_bdd_to_yolo.py
# 开始训练
python train.py --img 640 --batch 16 --epochs 50 --data bdd.yaml --weights yolov5s.pt
自定义数据集配置
创建 bdd.yaml 配置文件:
train: ../bdd100k/images/train/
val: ../bdd100k/images/val/
nc: 10 # 根据实际类别数调整
names: ['car', 'person', 'traffic light', ...]
避坑指南
数据不平衡问题
常见解决方案:
- 过采样少数类:使用
WeightedRandomSampler - 损失函数加权:
Focal Loss或Class-Balanced Loss - 人工补充罕见场景数据
标注错误修正
推荐工具:
- CVAT:开源标注工具,支持导入 BDD100K 格式
- LabelImg:快速修正边界框
性能优化
数据加载加速
关键技巧:
- 使用
torch.utils.data.DataLoader的num_workers=4(根据 CPU 核心数调整) - 启用
pin_memory=True加速 GPU 传输 - 预先把小尺寸图像存储为
.npy格式
训练效率提升
- 混合精度训练:添加
--fp16参数 - 梯度累积:
--accumulate 2(显存不足时) - 使用更大的 batch size:
--batch-size 64
延伸学习
推荐下一步
- 尝试更多模型:Faster R-CNN、DETR 等
- 扩展到视频分析:利用时间连续性
- 部署到边缘设备:TensorRT 加速
挑战任务
- 实现雨天场景的专项优化
- 将检测结果与高精地图匹配
- 开发简单的碰撞预警 demo
正文完
