一、介绍
LPRNet的Pytorch实现,一种高性能和轻量级的车牌识别框架。完全适用于中国车牌识别(Chinese License Plate Recognition)及国外车牌识别!
目前仅支持同时识别蓝牌和绿牌,即新能源车牌等中国车牌,但可通过扩展训练数据或微调支持其他类型车牌及提高识别准确率!
该网络的特点:
1、不需要对字符进行预分割,是一个端到端的轻量化字符识别模型,速度快,精度还不错;这里主要是因为仿照squeezenet和inception的思想设计了一个轻量化的卷积模块。
2、仿照的还是经典的CRNN+CTC的思路,不过LPRNet首次将RNN删除了,整个网络只有CNN+CTC Loss。但是也不是说不要上下文信息,只是舍弃了BiLSTM那样的RNN提取上下文,而是在backbone的末尾使用了一个13x1的卷积模块提取序列方向(w)的上下文信息。而且在backbone外还额外使用一个全连接层进行全局上下文特征提取,提取之后再和backbone进行concat特征融合,再输入head。
3、损失使用的CTC Loss、推理应用了贪心算法,搜索取每个位置上类概率的最大值。
二、环境
1、开发板:CPU
2、系统:buildroot
3、训练环境:Autodl
三、训练和测试
1、训练测试环境搭建
1、创建虚拟环境
conda create -n LRPNet_env python=3.8
2、激活
conda activate LRPNet_env
3、下载代码
git clone https://github.com/sirius-ai/LPRNet_Pytorch.git
注意,使用git克隆方式,不要自己下载解压,经测试自己下载解压文本格式会不同,运行会出错
4、安装依赖项
pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 torchaudio==0.8.1 -f https://download.pytorch.org/whl/torch_stable.html
pip install imutils
pip install opencv-python
安装后执行测试命令
python test_LPRNet.py
在测试过程中出错了下面的错误:
出错1:
ValueError: num_samples should be a positive integer value, but got num_samples=0
pytorch报错:ValueError: num_samples should be a positive integer value, but got num_samp=0-CSDN博客
shuffle的参数设置错误导致,因为已经有batch_sample了,就不需要shuffle来进行随机的sample了,所以在这里的shuffle应该设置为FALSE才对。
修改:
train_LPRNET.py的208行,TRUE改成False
batch_iterator = iter(DataLoader(datasets, args.test_batch_size, shuffle=False, num_workers=args.num_workers, collate_fn=collate_fn))
出错2:
python 代码遇到 float division by zero 怎么解决?-CSDN博客
File "train_LPRNet.py", line 261, in Greedy_Decode_Eval Acc = Tp * 1.0 / (Tp + Tn_1 + Tn_2) ZeroDivisionError: float division by zero
处理:
if Tp + Tn_1 + Tn_2 == 0:
Acc = 0 # 或者 Acc = 1,根据实际需求设置
else:
Acc = Tp * 1.0 / (Tp + Tn_1 + Tn_2)
出错3:
File "train_LPRNet.py", line 268, in Greedy_Decode_Eval print("[Info] Test Speed: {}s 1/{}]".format((t2 - t1) / len(datasets), len(datasets))) ZeroDivisionError: float division by zero
处理:
if len(datasets) == 0:
print("[Info] 数据集为空,无法计算测试速度")
else:
print("[Info] Test Speed: {}s 1/{}".format((t2 - t1) / len(datasets), len(datasets)))
出错4:
AttributeError: module 'numpy' has no attribute 'int'. np.int was a deprecated alias for the builtin int. To avoid this error in existing code, use int by itself. Doing this will not modify any behavior and is safe. When replacing np.int, you may wish to use e.g. np.int64 or np.int32 to specify the precision. If you wish to review your current use, check the release note link for additional information.
处理:
pip install numpy==1.19.0
```再次执行上面命令
运行正常
#2、训练
训练按readme执行下面命令:
python train_LPRNet.py
但执行后会出错
![image.png](https://ucc.alicdn.com/pic/developer-ecology/63dzqivu2t45o_cfe3aafa284b421ea4b0492f8d7fea4a.png)
原因是没有训练的数据集,为了测试,使用的是自带的测试数据集
python train_LPRNet.py --train_img_dirs ./data/test/
默认训练只有15轮,数据集也不对,所以测试结果无法作准。
![image.png](https://ucc.alicdn.com/pic/developer-ecology/63dzqivu2t45o_140c5614645f441b8191da6ce3986928.png)
#3、测试
自带的show显示不能使用,原因是没有插件,修改了显示的内容
修改test_LPRNet.py文件下的show函数
def show(img, label, target):
img = np.transpose(img, (1, 2, 0))
img *= 128.
img += 127.5
img = img.astype(np.uint8)
lb = ""
for i in label:
lb += CHARS[i]
tg = ""
for j in target.tolist():
tg += CHARS[int(j)]
flag = "F"
if lb == tg:
flag = "T"
# img = cv2.putText(img, lb, (0,16), cv2.FONT_HERSHEY_COMPLEX_SMALL, 0.6, (0, 0, 255), 1)
img = cv2ImgAddText(img, lb, (0, 0))
#cv2.imshow("test", img)
cv2.imwrite("test.jpg", img)
print("target: ", tg, " ### {} ### ".format(flag), "predict: ", lb)
#cv2.waitKey()
#cv2.destroyAllWindows()
执行下面命令,执行是正常的,但模型不对,原因是数据集太少。
python test_LPRNet.py --show 1
```
使用官方给的模型,识别率还是挺好的。
官方训练集2W多张,自行训练测试。测试增加到1000轮,有部分可以识别了。