车牌识别(License Plate Recognition, LPR)作为智能交通与安防系统的核心模块,对算法精度、推理速度及部署灵活性提出了极高要求。LPRNet 是由 Xiang Bai 团队于 2018 年提出的一种轻量级、端到端、无需字符分割的车牌识别网络,因其结构简洁、推理高效而被广泛应用于工业场景。
本文基于开源项目 LPRNet_Pytorch 进行深度改造与功能扩展,构建了一套全流程、可复现、支持中文特殊车牌的车牌识别系统。该系统不仅保留了原始 LPRNet 的高效特性,还新增了多数据集兼容处理、ONNX 导出、单图测试、自动旋转校正、中文路径支持等关键能力,显著提升了工程实用性与部署友好性。
尤为关键的是,针对 PyTorch 的 nn.MaxPool3d 在 ONNX 导出时存在的兼容性问题,设计并实现了自定义的 maxpool_3d 模块,从根本上解决了模型在边缘设备和工业推理引擎中的部署障碍。
原始项目仅支持基础省份+字母数字,无法识别“学”、“警”、“挂”、“港”、“澳”等特殊车牌。
在 load_data.py 中重新定义字符集:
CHARS = [
'京', '沪', '津', '渝', ..., '新', # 31 省份
'学', '警', '挂', # 新增特殊类型
'0', '1', ..., '9',
'A', 'B', ..., 'Z', '-', # 注意:剔除易混淆 I/O
]
支持中国主流民用车牌、武警车牌、教练车、临时号牌等,覆盖更全面。
为解决训练数据获取难题,开发了两套专用脚本,支持主流公开数据集:

关键增强:
自动跳过含非法字符的车牌;
- 支持中文路径读写(使用 np.fromfile + cv2.imdecode);
- 图像统一缩放至 94×24(LPRNet 标准输入尺寸);
- 文件名直接设为车牌号(如 京A12345.jpg),简化标签管理。
在 train_LPRNet.py 和 test_LPRNet.py 中,完善了以下功能:
- 动态学习率调度:按 [4,8,12,14,16] 轮次阶梯式衰减;
- CTC Loss 正确实现:使用 nn.CTCLoss(blank=len(CHARS)-1);
- Greedy Decode 解码器:去除重复字符与空白符(blank);
- 批量测试评估:输出准确率、成功/失败样本统计;
- 实验表明:在 24 万张混合车牌上训练 15 轮后,测试集(105 张)准确率达 90.4%
- 支持动态 batch(可选);
- 兼容 ONNX Runtime / TensorRT / OpenVINO。
- 支持 .pth(PyTorch)和 .onnx 双模型加载;
- 内置 Hough 直线检测 + 自动旋转校正(auto_rotate_image):
- test_lprnet :总 105 张
- val_lprnet:总 690 张
- train_lprnet:总 254703 张
https://blog.csdn.net/u011425939/article/details/157730256?spm=1011.2415.3001.5331



