EasyPR是一个中文的开源车牌识别系统,其目标是成为一个简单、高效、准确的车牌识别引擎。相比于其他的车牌识别系统,EasyPR有如下特点:它基于openCV这个开源库。这意味着你可以获取全部源代码,并且移植到java等平台。它能够识别中文。例如车牌为苏EUK722的图片,它可以准确地输出std:string类型的"苏EUK722"的结果。它的识别率较高。图片清晰情况下,车牌检测与字符识别可以达到80%以上的精度。
具体说来,EasyPR中PlateDetect与CharsRecognize各包括三个模块。
PlateDetect包括的是车牌定位,SVM训练,车牌判断三个过程,见下图。
PlateDetect过程我们获得了许多可能是车牌的图块,将这些图块进行手工分类,聚集一定数量后,放入SVM模型中训练,得到SVM的一个判断模型,在实际的车牌过程中,我们再把所有可能是车牌的图块输入SVM判断模型,通过SVM模型自动的选择出实际上真正是车牌的图块。
PlateDetect过程结束后,我们获得一个图片中我们真正关心的部分--车牌。那么下一步该如何处理呢。下一步就是根据这个车牌图片,生成一个车牌号字符串的过程,也就是CharsRecognisze的过程。
CharsRecognise包括的是字符分割,ANN训练,字符识别三个过程,具体见下图。
在CharsRecognise过程中,一副车牌图块首先会进行灰度化,二值化,然后使用一系列算法获取到车牌的每个字符的分割图块。获得海量的这些字符图块后,进行手工分类(这个步骤非常耗时间,后面会介绍如何加速这个处理的方法),然后喂入神经网络(ANN)的MLP模型中,进行训练。在实际的车牌识别过程中,将得到7个字符图块放入训练好的神经网络模型,通过模型来预测每个图块所表示的具体字符,例如图片中就输出了“苏EUK722”,(这个车牌只是示例,切勿以为这个车牌有什么特定选取目标。车主既不是作者,也不是什么深仇大恨,仅仅为学术说明选择而已)。
配置实验环境:
准备工作
解压放在output下。
├─mrcnn_20180212T2143
└─whether_car_20180210T1049
demo测试
运行结果
输入图片:
结果输出:
并生成图片两张
功能测试
结果输出
批量测试(data目录下需要有general_test目录)
结果输出:
win10、anaconda4.8.3 、python3.8
(1)实际上只需要 hyperlpr_py3 、Font 、model 三个文件夹。单独拿出来建个文件夹,再建个car,把测试图片放里面。
(2)cmd后创建一个新环境 conda create -n hyperlpr36 python=3.6,然后查看自己的环境 conda info -e
(删除某个环境是 conda remove -n hyperlpr --all)
(3)然后激活它 activate hyperlpr36,使用 conda list 查看里面安装的包。安装需要的包,也可以选择其他的源:
(4)把hyperlpr_py3复制到你的目录\Anaconda3\envs\hyperlpr36\Lib下,并改名为hyperlpr。
(5)可以在 pycharm 测试,也可以用 jupyter notebook 测试。
在hyperlpr36环境下进入jupyter notebook
找到你的源目录,new一个python3的test文件,代码一样
点击kernel中的change kernel,选择你的虚拟环境
这里也许只有python 3选项,因为还没导入虚拟环境。步骤如下:
1.在cmd中激活hyperlpr36环境
2.在hyperlpr36环境中中安装好ipykernel
3.在你的C:\ProgramData\jupyter\kernels路径下生成hyperlpr36文件
现在重新打开jupyter notebook,里面就会显示有这个虚拟环境了
输入图片:
打印结果:
Q:Android识别率没有所传demo apk的识别率高?
Q:训练代码的提供?
LPRNet全称就叫做License Plate Recognition via Deep Neural Networks(基于深层神经网络的车牌识别)。LPRNet由轻量级的卷积神经网络组成,所以它可以采用端到端的方法来进行训练。据我们所知,LPRNet是第一个没有采用RNNs的实时车牌识别系统。因此,LPRNet算法可以为LPR创建嵌入式部署的解决方案,即便是在具有较高挑战性的中文车牌识别上。
实时、高精度、支持车牌字符变长、无需字符分割、对不同国家支持从零开始end-to-end的训练;第一个不需要使用RNN的足够轻量级的网络,可以运行在各种平台,包括嵌入式设备;鲁棒,LPRNet已经应用于真实的交通监控场景,事实证明它可以鲁棒地应对各种困难情况,包括透视变换、镜头畸变带来的成像失真、强光、视点变换等。
骨干网络的结构在表[3]中进行了描述。骨干网络获取原始的RGB图片作为输入,并且计算出大量特征的空间分布。宽卷积(1*13的卷积核)利用本地字符的上下文从而取代了基于LSTM的RNN网络。骨干子网络的输出可以被认为是一个代表对应字符可能性的序列,它的长度刚到等于输入图像的宽度。由于解码器的输出与目标字符序列的长度是不一致的,因此采用了CTC损失函数,无需分割的端到端训练。CTC 损失函数是一种广泛地用于处理输入和输出序列不对齐的方法。
为了进一步地提升模型的表现,增强解码器所得的中间特征图,采用用全局上下文关系进行嵌入[12]。它是通过全连接层对骨干网络的输出层进行计算,随后将其平铺到所需的大小最后再与骨干网络的输出进行拼接 , 加入GAP思想源于Parsenet,parsenet主要图:,右侧部分为加入GAP拼接到feature map上进行识别的表示。
对测试集1000张图片的实验结果如下:
识别结果打印:
随着深度学习的兴起,最先进的ALPR技术开始向另一个方向发展,现在许多作品都采用CNN,因为它在通用物体检测和识别的精度很高。与ALPR相关的是场景文本定位(Scene Text Spotting,STS)和户外数字读取问题,目标是在自然场景中找到并读取文本/数字。尽管ALPR可以被视为STS的一个特例,但这两个问题具有特殊的特征:在ALPR中,需要学习没有相关语义信息的字符和数字(没有太多字体变化),而STS则专注于字体可变性高的文本信息,并探索词汇和语义信息。数字读取任务比ALPR的内容简单,因为它避免了常见的数字/字母混淆,例如B-8,D-0,1-I,5-S。
由于车辆是许多经典目标检测和识别数据集(如Pascal-VOC、ImageNet和Coco)中存在的潜在目标之一,因此作者决定不从头开始训练检测器,而是选择一个已知模型来执行车辆检测,并考虑一些标准。一方面,要求较高的召回率,因为任何具有可见LP的漏检车辆将直接导致整个LP漏检。另一方面,由于每个错误检测到的车辆必须通过WPOD-NET进行验证,因此精度过高也可能导致运行时间过长。基于这些考虑,决定使用yolov2网络,因为它执行速度快(大约70 fps),精度和召回率折衷性好(pascal-voc数据集上有76.8%的mAP)。作者没有对yolov2进行任何更改或修改,只是将网络当作黑盒,合并与车辆(比如汽车和公共汽车)相关的输出,忽略其他类。
检测结果(车辆)在被送入wpod-net之前需要调整大小。根据经验,较大的输入图像允许检测较小的目标,但会增加计算成本。在大致的前/后视图中,车牌尺寸和车辆边界框(BB)之间的比率很高。然而,对于斜视/侧视而言,此比率往往要小得多,因为倾斜车辆的边界框往往更大、更长。因此,倾斜视图的大小应比正面视图大,以保持LP区域的可识别性。虽然可以使用三维姿态估计方法来确定调整比例,但本论文提出了一个基于车辆边界框高宽比的简单快速的过程。当它接近1时,可以使用较小的尺寸,并且必须随着长宽比的增大而增大。
该数据集在合肥市的停车场采集得来,采集时间早上7:30到晚上10:00。停车场采集人员手持Android POS机对停车场的车辆拍照并手工标注车牌位置。拍摄的车牌照片涉及多种复杂环境,包括模糊、倾斜、阴雨天、雪天等等。CCPD数据集一共包含将近30万张图片,每种图片大小720x1160x3。一共包含8项,具体如下:
部分照片示例如下:
CCPD数据集没有专门的标注文件,每张图像的文件名就是对应的数据标注(label)。
由分隔符'-'分为几个部分:
1) 025为区域,
2) 95_113 对应两个角度, 水平95°, 竖直113°
3) 154&383_386&473对应边界框坐标:左上(154, 383), 右下(386, 473)
4) 386&473_177&454_154&383_363&402对应四个角点坐标
5) 0_0_22_27_27_33_16为车牌号码 映射关系如下: 第一个为省份0 对应省份字典皖, 后面的为字母和文字, 查看ads字典.如0为A, 22为Y....