BDD100K Subset 自动驾驶检测数据集入门指南:从数据解析到模型训练实战

1次阅读
没有评论

共计 2638 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

背景介绍

BDD100K 是伯克利大学发布的全球最大规模自动驾驶开源数据集之一,包含 10 万段高清驾驶场景视频(Subset 为精选的静态图像子集)。其核心价值在于:

BDD100K Subset 自动驾驶检测数据集入门指南:从数据解析到模型训练实战

  • 覆盖多样化的天气(晴天 / 雨天 / 雪天)和光照条件(白天 / 夜晚)
  • 包含 100+ 物体类别标注(车辆、行人、交通标志等)
  • 提供精确的边界框(Bounding Box)和可行驶区域标注

Subset 版本特别适合快速验证算法原型,相比完整数据集:

  1. 体积更小(约 20GB vs 原始 1.8TB)
  2. 包含 10,000 张精选图像
  3. 保持原始数据分布的平衡性

数据解析

目录结构

解压后的数据集通常包含以下关键目录:

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', ...]

避坑指南

数据不平衡问题

常见解决方案:

  1. 过采样少数类:使用WeightedRandomSampler
  2. 损失函数加权:Focal LossClass-Balanced Loss
  3. 人工补充罕见场景数据

标注错误修正

推荐工具:

  • CVAT:开源标注工具,支持导入 BDD100K 格式
  • LabelImg:快速修正边界框

性能优化

数据加载加速

关键技巧:

  1. 使用 torch.utils.data.DataLoadernum_workers=4(根据 CPU 核心数调整)
  2. 启用 pin_memory=True 加速 GPU 传输
  3. 预先把小尺寸图像存储为 .npy 格式

训练效率提升

  • 混合精度训练:添加 --fp16 参数
  • 梯度累积:--accumulate 2(显存不足时)
  • 使用更大的 batch size:--batch-size 64

延伸学习

推荐下一步

  1. 尝试更多模型:Faster R-CNN、DETR 等
  2. 扩展到视频分析:利用时间连续性
  3. 部署到边缘设备:TensorRT 加速

挑战任务

  • 实现雨天场景的专项优化
  • 将检测结果与高精地图匹配
  • 开发简单的碰撞预警 demo
正文完
 0
评论(没有评论)