基于YOLOv5与CRNN的车牌识别系统设计与优化
1. 项目背景与核心价值
车牌识别作为智能交通系统的核心技术之一,在停车场管理、违章抓拍、高速公路收费等场景有着广泛应用。传统基于图像处理的车牌识别方法在复杂环境下的准确率往往难以突破85%,而基于深度学习的方案在实测中普遍能达到95%以上的识别率。
这个毕业设计项目采用YOLOv5实现车牌检测,结合CRNN(卷积循环神经网络)完成字符识别,整套系统在Python环境下开发,使用PyTorch框架。相比传统方案,具有三大优势:
- 对倾斜、模糊车牌的鲁棒性更强
- 支持多车牌同时识别
- 识别速度可达15FPS(GTX1060显卡)
2. 技术架构解析
2.1 整体处理流程
- 图像采集:支持USB摄像头/视频文件/RTSP流输入
- 车牌检测:YOLOv5定位车牌区域
- 图像预处理:灰度化+二值化+形态学处理
- 字符分割:垂直投影法分割单个字符
- 字符识别:CRNN网络序列识别
- 结果输出:JSON格式结构化数据
2.2 关键模型选型
车牌检测模块:
- 选用YOLOv5s(2.4M参数)而非更大的YOLOv5m,在保持92%mAP的同时,推理速度提升40%
- 自定义数据集包含2000张涵盖不同光照、角度的车牌图片
- 数据增强策略:随机旋转(±15°)、HSV色彩扰动、高斯模糊
字符识别模块:
- CRNN网络结构:
- CNN部分:4层卷积+2层LSTM
- 使用CTC损失函数解决不定长序列对齐问题
- 字符集包含34类(数字+字母+汉字省份简称)
- 训练技巧:
- 采用动态学习率(初始0.001,每10epoch衰减0.5)
- 使用Label Smoothing缓解过拟合
3. 环境搭建与源码解析
3.1 开发环境配置
# 创建conda环境 conda create -n plate_rec python=3.8 conda activate plate_rec # 安装PyTorch(CUDA11.3版本) pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 -f https://download.pytorch.org/whl/torch_stable.html # 安装其他依赖 pip install opencv-python scikit-image matplotlib pandas3.2 核心代码结构
├── configs/ # 模型配置文件 ├── datasets/ # 训练数据 ├── models/ # YOLOv5+CRNN模型定义 ├── utils/ # 工具函数 │ ├── augmentation.py # 数据增强 │ ├── logger.py # 训练日志 ├── detect.py # 检测入口脚本 ├── train.py # 训练脚本3.3 关键代码片段
# 车牌检测推理示例 def detect_plate(img): model = torch.hub.load('ultralytics/yolov5', 'custom', path='weights/plate_det.pt') results = model(img) return results.pandas().xyxy[0] # 返回DataFrame格式的检测结果 # CRNN字符识别 def recognize_characters(cropped_plate): transformer = transforms.Compose([ transforms.Resize((32, 100)), transforms.ToTensor(), transforms.Normalize(0.5, 0.5) ]) image = transformer(cropped_plate).unsqueeze(0) output = crnn_model(image) pred_text = ctc_decode(output) return pred_text4. 训练优化与调参技巧
4.1 数据准备要点
- 车牌检测数据集标注要求:
<annotation> <object> <name>license_plate</name> <bndbox> <xmin>256</xmin> <ymin>128</ymin> <xmax>420</xmax> <ymax>180</ymax> </bndbox> </object> </annotation> - 字符识别数据增强策略:
- 添加椒盐噪声(概率0.3)
- 随机调整对比度(0.8-1.2倍)
- 模拟运动模糊(最大kernel_size=3)
4.2 超参数设置
| 参数项 | 车牌检测模型 | 字符识别模型 |
|---|---|---|
| 初始学习率 | 0.01 | 0.001 |
| Batch Size | 16 | 64 |
| Epochs | 100 | 50 |
| 优化器 | SGD | Adam |
| 学习率衰减策略 | Cosine | Step |
4.3 模型压缩方案
- 知识蒸馏:用大模型(YOLOv5x)指导小模型训练
- 量化部署:
# 模型动态量化 quantized_model = torch.quantization.quantize_dynamic( model, {torch.nn.Linear}, dtype=torch.qint8 ) - TensorRT加速:FP16精度下推理速度提升2-3倍
5. 常见问题与解决方案
5.1 检测阶段典型问题
问题1:小尺寸车牌漏检
- 解决方案:
- 修改YOLOv5的anchor box尺寸
- 训练时添加更多小车牌样本
- 测试时使用多尺度检测(--img-size 640,1280)
问题2:相邻车牌误合并
- 解决方案:
- 调整NMS的iou_threshold至0.3
- 后处理中添加最小间距判断(如<20px则视为不同车牌)
5.2 识别阶段典型问题
问题1:相似字符混淆(如'0'与'D')
- 解决方案:
- 数据集中增加困难样本
- 在CRNN后添加字符级置信度过滤
问题2:汉字识别错误率高
- 解决方案:
- 单独训练汉字识别模块
- 引入注意力机制强化局部特征
实测建议:夜间场景建议增加红外补光,避免因光照不足导致识别率下降超过15%
6. 扩展应用与优化方向
6.1 工程化改进
- 使用ONNX Runtime实现跨平台部署
- 添加DBnet替代传统字符分割方法
- 开发Flask/Vue.js可视化管理系统
6.2 学术优化方向
- 引入Transformer改进CRNN的序列建模能力
- 尝试YOLOv8的RT-DETR架构
- 研究无监督域适应应对不同国家车牌
我在实际部署中发现三个关键经验:
- 车牌检测模型输入分辨率保持640×640可获得最佳性价比
- LSTM层数超过3层时识别准确率反而下降1-2%
- 使用混合精度训练可使训练时间缩短40%