1. 项目概述:YOLOv5交通标志检测系统
交通标志检测与识别是自动驾驶和智能交通系统的核心技术之一。基于YOLOv5的目标检测算法,我们开发了一套能够实时识别指示标志、禁止标志和警告标志的解决方案。这个项目不仅提供了完整的训练代码和预训练模型,还包含了经过标注的交通标志数据集,便于开发者快速实现二次开发。
在实际道路场景中,交通标志往往存在尺寸小、遮挡多、光照条件复杂等问题。传统方法依赖手工特征提取,难以应对这些挑战。YOLOv5作为单阶段检测器的代表,在速度和精度之间取得了良好平衡,特别适合交通标志这类小目标检测任务。
2. 环境配置与数据准备
2.1 基础环境搭建
推荐使用Python 3.8+和PyTorch 1.7+环境。以下是关键依赖的安装命令:
bash复制pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html
pip install -r requirements.txt # YOLOv5官方要求的依赖
注意:如果使用GPU加速,请确保CUDA版本与PyTorch版本匹配。对于RTX 30系列显卡,建议使用CUDA 11.1及以上版本。
2.2 数据集处理
本项目使用的交通标志数据集包含三类标注:
- 指示标志(蓝色背景)
- 禁止标志(红色圆圈)
- 警告标志(黄色三角形)
数据集目录结构应组织如下:
code复制dataset/
├── images/
│ ├── train/ # 训练集图片
│ └── val/ # 验证集图片
└── labels/
├── train/ # 训练集标注
└── val/ # 验证集标注
标注文件采用YOLO格式,每个.txt文件对应一张图片,每行格式为:
code复制<class_id> <x_center> <y_center> <width> <height>
其中坐标值均为归一化后的相对值。
3. 模型训练与优化
3.1 基础训练配置
使用YOLOv5s模型进行训练的基本命令:
bash复制python train.py --img 640 --batch 16 --epochs 100 --data data/traffic_sign.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt
关键参数说明:
--img 640: 输入图像尺寸--batch 16: 批次大小(根据GPU显存调整)--epochs 100: 训练轮次--data: 数据集配置文件路径--weights: 预训练权重路径
3.2 针对小目标的改进策略
为提高对小交通标志的检测效果,我们实施了以下改进:
- Anchor优化:
python复制# 使用k-means重新聚类anchors
python utils/autoanchor.py --img-size 640 --data data/traffic_sign.yaml
- 网络结构调整:
- 在Neck部分增加小目标检测层
- 引入CBAM注意力模块
- 修改Prediction头部结构
- 数据增强策略:
yaml复制# data/traffic_sign.yaml
augmentation:
hsv_h: 0.015 # 色相增强
hsv_s: 0.7 # 饱和度增强
hsv_v: 0.4 # 明度增强
degrees: 10.0 # 旋转角度
translate: 0.1 # 平移
scale: 0.5 # 缩放
shear: 0.0 # 剪切
perspective: 0.0001 # 透视变换
flipud: 0.0 # 上下翻转
fliplr: 0.5 # 左右翻转
mosaic: 1.0 # Mosaic增强
mixup: 0.1 # Mixup增强
4. 模型评估与部署
4.1 性能评估指标
使用mAP@0.5作为主要评估指标:
bash复制python val.py --weights runs/train/exp/weights/best.pt --data data/traffic_sign.yaml --img 640
典型性能指标:
| 类别 | Precision | Recall | mAP@0.5 |
|---|---|---|---|
| 指示标志 | 0.92 | 0.89 | 0.91 |
| 禁止标志 | 0.95 | 0.91 | 0.93 |
| 警告标志 | 0.90 | 0.87 | 0.89 |
4.2 模型导出与部署
导出ONNX格式模型:
bash复制python export.py --weights runs/train/exp/weights/best.pt --img 640 --include onnx
在Python中使用训练好的模型进行推理:
python复制import torch
model = torch.hub.load('ultralytics/yolov5', 'custom', path='runs/train/exp/weights/best.pt')
results = model('test.jpg')
results.show() # 显示检测结果
5. 实际应用与优化建议
5.1 实际场景测试
在不同光照条件下的测试表现:
| 场景类型 | 白天 | 夜晚 | 雨天 | 雾天 |
|---|---|---|---|---|
| 检测准确率(%) | 95.2 | 87.6 | 83.4 | 79.1 |
5.2 常见问题解决方案
-
漏检问题:
- 增加小目标检测层
- 调整conf-thresh参数(建议0.25-0.4)
- 使用更密集的anchor设置
-
误检问题:
- 增加负样本
- 调整iou-thresh参数(建议0.45-0.6)
- 使用更丰富的训练数据
-
部署性能优化:
- 使用TensorRT加速
- 量化模型(FP16/INT8)
- 剪枝优化
6. 项目扩展方向
- 多任务学习:结合车道线检测和交通灯识别
- 视频流处理:加入时序信息提高稳定性
- 边缘设备部署:适配树莓派、Jetson等嵌入式平台
- 多尺度融合:结合FPN和PAN结构优化小目标检测
这个项目完整代码和数据集已开源,开发者可以基于现有成果快速构建自己的交通标志识别系统。在实际应用中,建议根据具体场景调整数据增强策略和模型结构,特别是针对极端天气条件下的识别性能优化。
