1. 项目概述:基于YOLOv5的交通标志识别系统
去年在参与一个智能驾驶辅助项目时,我遇到了交通标志识别的难题。经过多轮技术选型,最终选择了YOLOv5作为基础框架,开发了一套能识别45种中国交通标志的检测系统。这个系统在实测中达到了92.3%的mAP(mean Average Precision),在NVIDIA Jetson Xavier NX边缘设备上能保持25FPS的实时性能。
交通标志识别看似简单,实则面临三大技术挑战:
- 小目标检测问题(如远处的限速标志可能只占图像的20×20像素)
- 复杂环境干扰(雨雪天气、遮挡、光照变化等)
- 类间相似度高(如不同方向的转弯箭头)
YOLOv5之所以能出色应对这些挑战,主要得益于其多尺度检测架构和高效的训练策略。我们选择的YOLOv5s版本,在保持较高精度的同时,模型大小仅27MB,非常适合嵌入式部署。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 系统架构设计
2.1 技术栈选型
整个系统采用模块化设计,主要组件包括:
| 模块 | 技术选型 | 选型理由 |
|---|---|---|
| 检测模型 | YOLOv5s | 轻量级、支持ONNX导出 |
| 推理框架 | PyTorch 1.8 | 动态图易调试 |
| 图像处理 | OpenCV 4.5 | 硬件加速支持 |
| 部署方案 | TorchScript | 跨平台兼容性好 |
注意:如果需要在移动端部署,建议转换为ONNX格式后再使用TensorRT加速,实测在骁龙865上推理速度可提升3倍
2.2 数据处理流程
系统的完整处理流程如下:
- 图像采集:支持USB摄像头/Rtsp视频流/本地视频文件
- 预处理:自适应直方图均衡化(CLAHE) + 高斯模糊
- 推理:YOLOv5多尺度特征融合
- 后处理:改进的加权NMS(非极大值抑制)
- 输出:带置信度的检测框 + 语音提示
对于预处理环节,我们发现传统BGR转RGB的操作在雨天场景效果不佳,改用以下处理链:
python复制def enhance_image(img):
# 对比度受限的自适应直方图均衡化
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
l, a, b = cv2.split(lab)
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
limg = clahe.apply(l)
enhanced = cv2.merge((limg,a,b))
return cv2.cvtColor(enhanced, cv2.COLOR_LAB2BGR)
3. 模型训练关键细节
3.1 数据集构建
我们自建的数据集包含45类标志,数据分布如下:
| 类别 | 训练集 | 验证集 | 测试集 | 采集场景 |
|---|---|---|---|---|
| 禁令标志 | 12,345 | 1,382 | 1,500 | 城市道路 |
| 指示标志 | 8,762 | 978 | 1,000 |
