1. 项目概述
交通标志检测与识别系统是智能交通和自动驾驶领域的关键技术之一。基于YOLOv5的目标检测框架,我们构建了一个高效准确的交通标志识别系统,该系统能够实时检测并分类道路上的各种交通标志。与传统的计算机视觉方法相比,YOLOv5凭借其单阶段检测架构和优秀的特征提取能力,在速度和精度之间取得了良好平衡。
这个项目特别适合希望入门计算机视觉的开发者,或者需要在实际应用中部署交通标志识别系统的工程师。系统提供了完整的实现方案,包括预处理、模型训练、推理部署等全流程,并附带了经过标注的训练数据集,大大降低了复现门槛。
2. 核心架构设计
2.1 YOLOv5网络结构解析
YOLOv5采用经典的Backbone-Neck-Head结构:
- Backbone:CSPDarknet53结构,包含Focus模块和CSP模块,有效提取多尺度特征
- Neck:PANet结构,实现特征金字塔融合,增强多尺度检测能力
- Head:三个检测头分别对应不同尺度的特征图
针对交通标志检测的特殊需求,我们对原始网络进行了以下改进:
- 在Neck部分添加了CBAM注意力模块,增强对小目标的关注
- 调整了Anchor尺寸,适配交通标志的典型尺寸比例
- 在预测头增加了专门针对小目标的检测层
2.2 数据处理流程
系统采用完整的数据处理流水线:
原始图像 → 数据增强 → 标注转换 → 数据加载 → 模型输入关键数据增强策略:
- Mosaic增强:四图拼接,提升小目标检测能力
- 随机仿射变换:平移、旋转、缩放
- 色彩空间调整:HSV空间随机扰动
- 马赛克遮挡:模拟部分遮挡情况
3. 环境配置与安装
3.1 基础环境要求
推荐配置:
- Ubuntu 18.04/20.04
- Python 3.8+
- CUDA 11.1
- cuDNN 8.0.5
- PyTorch 1.8.0+
3.2 依赖安装步骤
# 克隆项目仓库 git clone https://github.com/ultralytics/yolov5 cd yolov5 # 安装依赖 pip install -r requirements.txt # 验证安装 python detect.py --weights yolov5s.pt --source data/images/注意:如果使用GPU加速,请确保正确配置CUDA环境变量
4. 数据集准备与标注
4.1 数据集结构
推荐使用TT100K交通标志数据集,目录结构如下:
TT100K/ ├── annotations/ # 标注文件 ├── data/ # 图像数据 ├── train.txt # 训练集列表 └── test.txt # 测试集列表4.2 标注格式转换
将原始标注转换为YOLO格式:
def convert_annotation(xml_path, txt_path): # 解析XML标注文件 # 转换为YOLO格式:class x_center y_center width height # 写入txt文件 pass关键参数说明:
- 坐标值需要归一化到[0,1]区间
- 类别ID从0开始连续编号
- 每个图像对应一个同名的txt标注文件
5. 模型训练与调优
5.1 训练参数配置
修改data/traffic.yaml配置文件:
train: ../TT100K/train.txt val: ../TT100K/test.txt nc: 45 # 类别数 names: ['i2','i4','i5',...] # 类别名称5.2 启动训练
python train.py --img 640 --batch 16 --epochs 100 --data traffic.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt关键训练参数:
--img 640: 输入图像尺寸--batch 16: 批次大小--epochs 100: 训练轮次--weights: 预训练权重
5.3 训练监控
使用TensorBoard监控训练过程:
tensorboard --logdir runs/train重点关注指标:
- mAP@0.5: 交并比阈值为0.5时的平均精度
- Precision: 精确率
- Recall: 召回率
- 各类别AP值
6. 模型评估与测试
6.1 评估指标计算
python val.py --weights runs/train/exp/weights/best.pt --data traffic.yaml --img 640输出包括:
- 混淆矩阵
- PR曲线
- 各类别统计结果
6.2 测试推理
单张图像测试:
python detect.py --weights best.pt --source test.jpg视频流测试:
python detect.py --weights best.pt --source 0 # 摄像头7. 模型优化技巧
7.1 小目标检测优化
- 增加高分辨率检测头
- 使用更密集的Anchor设置
- 添加注意力机制模块
- 调整损失函数权重
7.2 模型量化与加速
- TensorRT加速:
python export.py --weights best.pt --include engine --device 0- ONNX导出:
python export.py --weights best.pt --include onnx- 模型剪枝:
# 基于通道重要性的剪枝 from torch.nn.utils import prune prune.l1_unstructured(module, name='weight', amount=0.3)8. 部署方案
8.1 Python API部署
创建检测接口:
import torch class TrafficSignDetector: def __init__(self, model_path): self.model = torch.hub.load('ultralytics/yolov5', 'custom', path=model_path) def detect(self, img): results = self.model(img) return results.pandas().xyxy[0].to_dict('records')8.2 Web服务部署
使用Flask构建REST API:
from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/detect', methods=['POST']) def detect_api(): file = request.files['image'] img = Image.open(file.stream) results = detector.detect(img) return jsonify(results)9. 常见问题解决
9.1 训练问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 损失不下降 | 学习率过高/低 | 调整lr0参数 |
| mAP波动大 | 批次大小不足 | 增加batch size |
| 过拟合 | 数据量不足 | 增加数据增强 |
9.2 推理性能优化
- 使用半精度推理:
model.half() # FP16推理启用TensorRT加速
调整输入分辨率:
model.conf = 0.25 # 置信度阈值 model.iou = 0.45 # NMS阈值10. 扩展应用方向
- 车载实时检测系统
- 道路巡检无人机应用
- 交通监控视频分析
- 自动驾驶感知模块
实际部署中发现,在复杂光照条件下,系统的鲁棒性仍有提升空间。后续可以考虑:
- 增加更多恶劣天气的训练数据
- 引入红外图像的多模态检测
- 优化模型对模糊目标的识别能力