基于深度学习的车牌识别系统开发研究

2019-04-03 01:39陈强吴锴柏云涛
现代计算机 2019年35期
关键词:字符识别车牌卷积

陈强,吴锴,柏云涛

(温州大学计算机与人工智能学院,温州325035)

0 引言

在现代化的交通系统中,快速发展的图像识别技术能帮助交警快速地处理交通事故,例如近年来出现的车牌识别系统能帮助交警快速扫描识别车牌,读取并记录车牌信息。

但是传统车牌识别系统,如基于机器学习车牌识别技术的系统由于本身识别技术依赖手工提取车牌和车牌字符的特征[1],在雨天或夜里,由于光线条件并不好,难以对车牌进行正确识别甚至难以定位。这时只能由交警手动抄写车牌内容,然而交警记录罚单等车辆信息的表格时,往往不仅要记录车牌号码,同时还要记录车牌颜色、车辆类型、车辆颜色等数据,大量的记录内容对交通处理效率造成一定的影响。

深度学习是人工智能研究领域中的一个比较新技术[2]。通过深度学习的方法能不需要人为地进行提取目标特征,而让其自己训练迭代得到目标的从浅层到非常深层的具体特征,是一种计算机视觉领域的一项重大突破[3]。因此,使用基于深度学习技术的车牌识别系统能很好地解决传统技术鲁棒性不够好,在复杂多变的场景中车牌难以检测的问题。

本文将针对传统车牌识别的局限性问题,使用YOLO 和CRNN 两大深度学习技术[4-5],设计开发一套准确性高、鲁棒性强的车牌识别软件。

1 整体设计

将车牌识别功能分成了两部分模块,首先是将车牌从照片中定位出来,然后对定位后的车牌图片进行字符识别。如图1 所示。

图1 车牌识别程序主要逻辑图

车牌定位模块定位我们使用了最新的图片对象识别定位算法之一YOLO 算法,使用公开车辆数据集CCPD 中的三十万张图片经过两千次迭代,收敛后生成了我们的单纯针对车牌对象的识别权重[6]。YOLO 算法是一种运行效率极高的算法,其运行速度约一百倍于Fast R-CNN,这个运行速度可以为我们以后的视频动态识别定位做好准备。

字符识别模块我们使用的是循环卷积神经网络CRNN 对车牌进行不定长字符串识别,CRNN 并不像传统的字符识别算法那样对整行的字符串进行分割后单字识别,而是直接整行循环卷积识别。这样就能避免了在字符分割时产生的误差,大大提高了识别正确率。我们在原有的CRNN 网络模型上精简了两个卷积层,使其加快了迭代速度,并加大了Learning rate,重做了字典。

图形界面模块我们使用Python 的Tkinter 框架搭建了一个桌面端的车牌识别系统,使其能调用以上两个神经网络模块,让程序能在图片中快速定位图中的车牌并识别车牌中的文字,并显示原图、定位截图和识别结果。

2 技术实现

2.1 车牌定位

从摄像头获取照片之后我们先进行车牌的识别定位,我们使用的是YOLOv3 技术[4],将车牌从原图中定位并截取出来。

图2 YOLO算法的识别流程

YOLO 是一个使用了75 个卷积层的完全卷积网络。该技术首先采用了2 个步幅的卷积层在特征图上进行下采样,这样可以防止过拟合导致的低级特征丢失。其次YOLO 采用3 种不同尺度进行预测,其步幅分别为32,16,8。先采用步幅为32 的层的特征图进行检测,然后使用步幅16 和8,依次进行检测。检测层的上采样系数都为2,也都保存了前一层特征图尺寸相近的特征图连接。再其次YOLO 就将输出特征图作为结果。如图2 所示,YOLO 将图像分割成边长为S 的网络单元格,然后对每个单元格的边框的坐标、类标签等信息进行预测,其网络输出为一个有(B*(5+C))个参数的特征图。表示每一个单元格可以预测B 个边框数,并显示5+C 个属性,分别为每个边框的中心坐标、维度、目标值和置信值[7]。预测出的边界框中心点坐标可利用sigmoid 函数来精确,而边界框的尺寸需要通过对输出应用对数空间转换,与锚点进行关系转化得到。

YOLO 权重的训练使用了国内的大型数据集CCPD[6]数据集,它包含了多种复杂场景下的车牌图像,我们编写了Python 文件处理脚本将其放于图片名中的数据信息提取成YOLO 格式转存之后,修改YOLO 网络的参数,包括CFG 文件中的Classes 从原本的80 个对象调整为1 个,并相应的调整Filters 参数与之相匹配。降低了网络的学习率和batch_size 使其能更好地适应我们电脑的配置,让其更充分的利用GPU 性能。然后开始调用YOLO 的网络进行迭代训练,生成可继续迭代的.pt 后缀的权重文件,经过长时间的反复resume 训练,权重文件的准确率,日渐上升并达到我们的要求水平。最后我们将ArgumentParser 模块的命令行参数全部整理封装,使其能配合图形界面窗口的接口的调用修改。

2.2 车牌字符识别

在完成对车牌的识别定位后开始对车牌中的字符串进行识别,这里我们使用了循环卷积神经网络(CRNN)[5]。其结构如图3 所示。

图3 CRNN网络结构图

如图3 所示,首先将车牌图片的大小重设成同一高度并将其输入卷积层,经过卷积层得到特征向量序列,在特征图上从左到右生成这些特征向量,且对应于原始图像的一个感受野,然后将这些特征向量的序列输入循环层。在循环层里我们使用一个向前的LSTM和一个向后的LSTM 组合成一个双向LSTM,并且可以在网络中添加多个双向LSTM 组件,这使得模型的鲁棒性大大提高。在使用循环层来预测每一帧的标签分布之后,再使用转录层将预测变为实际的标签序列,在这里我们基于词典模式,并预测具有概率最高的标签序列[4]。

CRNN 的数据集我们采用中科大开源数据集CCPD 外,我们还使用了自制的数据集,但是这两个数据集中“皖”与“苏”的车牌占比过多而其他省份的车牌很少,所以我们还使用了模拟车牌的开源程序额外生成了一些包含各省份的模拟车牌图像以增强模型对其他省份车牌的识别效果,数据集如图4 所示。我们整理了所有图片数据的车牌名称,生成数据集标签文件train.txt(image_name palte_number),将数据集制作成LMDB 格式的数据库,并创建字典。

表1 车牌字典集

做好以上数据准备之后,调用CRNN 模块进行训练,网络会自动编码/解码字典,经过5 万多次的迭代之后生成的权重文件识别准确率达到了预期要求,现在字符识别准确率暂时为98.06%(3138/3200)。

2.3 用户界面设计

此模块在项目功能完成后消除了控制台下的用户不友好的弊端,使用Python 的Tkinter 库实现了基本的操作界面,调用以上YOLO 和CRNN 两大算法对图片中车牌进行识别定位的软件,软件首先在本地选中图片显示在程序中,点击“车牌定位”按钮调用YOLO 神经网络对原图进行车牌识别定位,并将定位好的车牌图片以及在原图中的坐标和车牌尺寸显示在程序中,再接着点击“车牌识别”按钮进行CRNN 不定长字符识别,并将识别结果显示在程序中。

图5 车牌识别程序界面图

3 实验结果

图4 CRNN数据集

车牌识别软件效果如图6 所示,基本能识别所有复杂环境下的车牌,并准确识别车牌上的字符。能适应的环境包括:环境黑暗、镜头内有强光、车身反光、车身上有影子、车牌距离很远或很近、车牌歪斜、雪天、雨天,等等。现在YOLO 定位准确率暂时为98%(588/600),而字符识别准确率暂时为98.06%(3138/3200)。

4 结语

本文给出了YOLO 算法、CRNN 算法的核心思路以及基于该两种算法的桌面端车牌识别软件的程序。该程序对两深度学习算法的应用有助于帮助读者对深度学习算法的理解与应用,同时该程序能辅助识别定位图片中的车牌位置和车牌文本内容,具有一定的实际意义。

图6 软件识别结果图

猜你喜欢
字符识别车牌卷积
基于3D-Winograd的快速卷积算法设计及FPGA实现
一种并行不对称空洞卷积模块①
车牌颜色里的秘密
从滤波器理解卷积
基于傅里叶域卷积表示的目标跟踪算法
第一张车牌
一种侧向插装型车牌架
融合字符及字符排列特征的铭牌识别方法
一种基于OpenCV的车牌识别方法
基于MATLAB的图片中字符的分割与识别