从零到一:基于YOLOv5s的BDD100K自动驾驶目标检测实战指南

📅 2026/7/4 20:56:05
从零到一:基于YOLOv5s的BDD100K自动驾驶目标检测实战指南
1. 认识BDD100K数据集与YOLOv5s第一次接触自动驾驶目标检测时我被各种数据集和算法搞得晕头转向。直到遇到BDD100K这个全能选手才发现它简直是新手练级的完美选择。这个由伯克利大学发布的数据集包含10万段驾驶视频覆盖了城市街道、高速公路、隧道等多样化场景甚至连雨雪天气和夜间行驶的情况都考虑到了。最让我惊喜的是它标注了13类常见交通对象——从行人、车辆到不同颜色的交通灯完全就是现实道路的微缩版。YOLOv5s作为目标检测界的轻量级拳王特别适合我们这些刚入门的开发者。相比前代版本它的训练速度更快模型体积更小但精度却毫不逊色。我实测下来用普通游戏本RTX 3060显卡训练模型一天就能跑完基础实验。这里要特别说明下YOLOv5系列其实有多个版本YOLOv5s最小最快的版本适合快速验证YOLOv5m平衡型选手YOLOv5l精度优先YOLOv5x巨无霸模型对于初次尝试我强烈建议从YOLOv5s开始。它的模型文件只有14MB左右但检测速度能达到140FPS完全能满足实时性要求。记得第一次看到自己的模型在视频里框出车辆和行人时那种成就感简直爆棚2. 数据预处理实战技巧原始数据就像刚挖出来的矿石需要精心打磨才能用。BDD100K的标注文件是JSON格式而YOLOv5需要特定的TXT格式这个转换过程我踩过不少坑。这里分享一个完整解决方案首先需要安装转换工具包pip install pycocotools labelme2coco关键步骤1JSON转COCO格式我修改了官方提供的转换脚本特别处理了交通灯颜色分类问题。核心逻辑是遍历每个标注对象提取box坐标和类别信息。遇到交通灯时会额外读取颜色属性for label in img_data[labels]: if label[category] traffic light: color label[attributes][trafficLightColor] new_category ftl_{color} # 后续处理逻辑...关键步骤2COCO转YOLO格式这里要注意坐标系的转换。COCO用的是左上角坐标宽高而YOLO需要中心点坐标归一化值。我写了个转换函数def coco2yolo(bbox, img_w, img_h): x_center (bbox[0] bbox[2]/2) / img_w y_center (bbox[1] bbox[3]/2) / img_h width bbox[2] / img_w height bbox[3] / img_h return [x_center, y_center, width, height]注意一定要检查转换后的标签文件是否与图像对齐。我常用OpenCV画框验证cv2.rectangle(img, (x1,y1), (x2,y2), (0,255,0), 2)3. 环境配置避坑指南配环境就像搭积木少一块都不行。经过多次实践我总结出最稳定的配置方案基础环境Python 3.83.7都可以PyTorch 1.10 CUDA 11.3Ubuntu 20.04Windows也可但建议WSL2这是我的requirements.txt精华版torch1.10.0cu113 torchvision0.11.1cu113 opencv-python4.5.4 matplotlib3.3.0 pycocotools2.0 tqdm4.64.0安装时有个小技巧先装PyTorch再装其他依赖能避免版本冲突pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/cu113 pip install -r requirements.txt数据集配置文件在data目录下新建bdd100k.yaml内容要特别注意路径设置train: ../bdd100k/images/train val: ../bdd100k/images/val nc: 13 names: [person,rider,car,...,tl_none]遇到过最头疼的问题是路径错误建议使用绝对路径更稳妥在Python中打印当前路径确认import os print(os.path.abspath(.))4. 模型定制与调优策略直接套用默认模型就像穿别人的衣服总有不合适的地方。我们需要量体裁衣模型结构调整修改models/yolov5s.yaml重点调整两个参数nc: 13 # 类别数 anchors: # 建议使用autoanchor自动计算 - [10,13, 16,30, 33,23] - [30,61, 62,45, 59,119] - [116,90, 156,198, 373,326]超参数优化在data/hyps/hyp.scratch-low.yaml中我调整了这些关键参数lr0: 0.01 # 初始学习率 lrf: 0.1 # 最终学习率 momentum: 0.937 weight_decay: 0.0005 fl_gamma: 0.5 # 焦点损失gamma训练技巧预热训练前3个epoch用小学习率自动锚框--autoanchor参数混合精度--half参数节省显存完整训练命令示例python train.py --img 640 --batch 32 --epochs 100 \ --data bdd100k.yaml --cfg yolov5s.yaml \ --weights yolov5s.pt --cache --device 05. 训练过程监控与分析训练不是设好参数就完事要像教练盯着运动员一样关注模型表现。关键指标解读mAP0.5IoU阈值0.5时的平均精度mAP0.5:0.95综合精度指标Precision/Recall精确率与召回率我用TensorBoard监控训练过程tensorboard --logdir runs/train常见问题解决方案现象可能原因解决方法损失不下降学习率太高减小lr0mAP波动大batch size太小增大batch过拟合数据量不足数据增强我的调参记录初始阶段发现val_loss震荡将lr0从0.01降到0.005中期阶段增加--cos-lr参数使用余弦退火后期阶段启用--label-smoothing 0.1防止过拟合6. 模型评估与部署实战训练完成不是终点如何用好模型才是关键。评估命令python val.py --weights runs/train/exp/weights/best.pt \ --data bdd100k.yaml --img 640 --task test部署方案对比方案优点缺点PyTorch原生简单直接依赖环境ONNX Runtime跨平台需要转换TensorRT极致性能配置复杂我常用的ONNX转换命令python export.py --weights best.pt --include onnx \ --img 640 --simplify --dynamic实际应用示例import torch model torch.hub.load(ultralytics/yolov5, custom, best.pt) results model(test.jpg) results.show() # 显示检测结果7. 性能优化进阶技巧当基础模型跑通后我开始追求更极致的性能。数据增强策略在data/hyps/hyp.scratch-low.yaml中添加hsv_h: 0.015 # 色相增强 hsv_s: 0.7 # 饱和度增强 hsv_v: 0.4 # 明度增强 flipud: 0.5 # 上下翻转概率模型剪枝使用TorchPruner进行通道剪枝from torchpruner import SparsePruner pruner SparsePruner(model, sparsity0.3) pruner.step()量化部署将模型转为INT8提升推理速度python export.py --weights best.pt --include engine \ --img 640 --device 0 --half经过这些优化我的模型在Jetson Xavier上达到了58FPS完全满足实时性要求。记得第一次看到优化后的模型在车载设备上流畅运行时真切感受到了AI技术的魅力。