技术:车牌识别系统原理与代码

27
发表时间:2019-08-06 18:00作者:kdacctv

车牌识别系统能够自动检测和识别图像中的车牌。该算法主要包括车牌定位、车牌分割和字符识别等步骤。本文提出了一种基于深度学习的车牌识别系统方案。


车牌识别系统.jpg


由于车牌信息可以从视频图像中自动提取,因此车牌识别系统可以应用于以下行业:

  • 公共安全:用于检测被盗车辆,并将车牌与被盗车辆数据库记录进行比较。

  • 停车场管理停车场入口自动停车,出口自动计费。

  • 道路安全与雷达测试结合使用,识别超速车辆并记录违章行为。

我们的项目包括以下三个步骤:车辆牌照检测、牌照字符分割、牌照字符识别。


一、车辆牌照检测


我们使用Yolo(You Only Look One)算法来检测车辆牌照。Yolo是一个基于卷积神经网络的深度学习目标检测架构。该架构由 Joseph Redmon , Ali Farhadi, Ross Girshick和Santosh Divvala引入,2015年推出第一个版本,然后逐渐升级至版本3:

  • Yolo v1:论文

  • Yolo v2:论文

  • Yolo v3:论文

Yolo是一个端到端训练的单一网络,可以用来预测目标的类别与边界框。Yolo网络速度极快,可以每秒45帧的速度实时处理图像。其中一个较小规模的网络,被称为Fast YOLO,甚至达到了令人咂舌的155帧/秒的处理速度。


下面我们来实现YOLO V3网络。首先,我们准备一个有700张包含土耳其车辆牌照的图片的数据集,对每一张图片,我们都使用一个桌面应用LabelImg标注出车牌位置并存入一个xml文件。数据下载及网络训练脚本如下:

# First download Darknet project
$ git clone https://github.com/pjreddie/darknet.git# in "darknet/Makefile" put affect 1 to OpenCV, CUDNN and GPU if you # want to train with you GPU then time thos two commands
$ cd darknet
$ make# Load convert.py to change labels (xml files) into the appropriate # format that darknet understand and past it under darknet/
https://github.com/KhazriAchraf/ANPR# Unzip the dataset
$ unzip dataset.zip# Create two folders, one for the images and the other for labels
$ mkdir darknet/images
$ mkdir darknet/labels# Convert labels format and create files with location of images
# for the test and the training
$ python convert.py# Create a folder under darknet/ that will contain your data
$ mkdir darknet/custom# Move files train.txt and test.txt that contains data path to
# custom folder
$ mv train.txt custom/
$ mv test.txt custom/# Create file to put licence plate class name "LP"
$ touch darknet/custom/classes.names
$ echo LP > classes.names# Create Backup folder to save weights
$ mkdir custom/weights# Create a file contains information about data and cfg
# files locations
$ touch darknet/custom/darknet.data# in darknet/custom/darknet.data file paste those informations
classes = 1
train = custom/train.txt
valid = custom/test.txt
names = custom/classes.names
backup = custom/weights/# Copy and paste yolo config file in "darknet/custom"
$ cp darknet/cfg/yolov3.cfg darknet/custom# Open yolov3.cfg and change :
# " filters=(classes + 5)*3" just the ones before "Yolo"
# in our case classes=1, so filters=18
# change classes=... to classes=1# Download pretrained model
$ wget https://pjreddie.com/media/files/darknet53.conv.74 -O ~/darknet/darknet53.conv.74# Let's train our model !!!!!!!!!!!!!!!!!!!!!
$ ./darknet detector train custom/darknet.data custom/yolov3.cfg darknet53.conv.74

在网络训练完之后,为了识别图像中的车辆牌照,我们从darknet/custom/weights中选择最新的模型并在文件object_detection_yolo.py中写入其路径名称,我们也将使用yolov3.cfg文件,注释掉训练部分,然后执行:

python object-detection_yolo.py --image= image.jpg


二、车牌字符分割


现在我们必须把车牌号码分开。这个步骤的输入是车牌图像,我们必须能够提取单个字符的图像。由于该步骤的输出将用于识别步骤,因此车牌分割步骤对于车牌识别系统非常重要。为了尽可能准确地分割车牌字符,我们需要进行必要的预处理。


车牌字符分割.jpg


像素投影直方图用于查找字符区域左右的上下限。我们用水平投影来求字符的上下位置,用垂直投影来求字符的左右位置:


车牌识别 .jpg


另一种从车牌中提取数字的方法是使用形态学的开/闭操作来生成一些连接区域,然后使用连接跟踪算法提取这些连接区域。


三、车牌字符识别


识别阶段是车牌自动检测与识别系统的最后一步。识别是基于前一个链接获得的单个字符图像。我们的模型将预测这些图像得到最终的车牌号码。


为了最大限度地利用训练数据,我们将每个字符单独切割,得到一个包含11个类(数字0-9和阿拉伯单词)的车牌字符数据集,每个类包含30到40个字符。图像是28X28 PNG格式。


然后,我们对多层感知器MLP和k近邻分类器KNN进行了比较研究。结果表明,对于多层感知器,如果隐藏层中的神经元数量增加,分类器的性能就会提高。同样,对于KNN,性能随着邻居数量的增加而增加。但是,由于KNN的可调电位远小于MLP,我们最终选择使用多层感知器MLP网络来识别这一阶段分割的车牌字符:


车牌字符识别.jpg

website qrcode
关注我们: