作者 | Achraf KHAZRI
来源 | Medium
编辑 | 代码医生团队
介绍
在现代世界的不同方面,信息技术的大规模整合导致将车辆视为信息系统中的概念资源。由于自主信息系统在没有任何数据的情况下没有意义,因此需要在现实和信息系统之间改变车辆信息。这可以通过人工代理或通过特殊的智能设备来实现,这些设备将允许通过其登记板识别车辆。在智能设备中,提到了车辆号牌的检测和识别系统。
指挥部队:该系统用于检测被盗和搜查的车辆。将检测到的板与报告的车辆的板进行比较。
停车管理:汽车出入口管理。
道路安全:该系统用于检测超过一定速度的牌照,将板读取系统与道路雷达耦合,穿越野火......
项目将分为3个步骤:
第一步:车牌检测
为了检测许可证,将使用基于卷积神经网络的Yolo(You Only Look One)深度学习对象检测架构。
这个架构由Joseph Redmon,Ali Farhadi,Ross Girshick和Santosh Divvala在2015年及之后的版本2和3中引入。
Yolo v1:
https://arxiv.org/pdf/1506.02640.pdf
Yolo v2:
https://arxiv.org/pdf/1612.08242.pdf
Yolo v3:
https://arxiv.org/pdf/1804.02767.pdf
Yolo是一个经过网络训练的单一端到端,用于执行预测对象边界框和对象类的回归任务。
该网络速度极快,可以每秒45帧的速度实时处理图像。较小版本的网络Fast YOLO每秒处理惊人的155帧。
实施YOLO V3:
首先,准备了一个由700个汽车图像组成的数据集,其中包含突尼斯牌照,对于每个图像,制作一个xml文件(之后更改为包含与Darknet配置文件输入兼容的坐标的文本文件.Darknet:用于重新训练的项目YOLO预训模型)使用名为LabelImg的桌面应用程序。
https://github.com/tzutalin/labelImg
# 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
完成训练后,从图像中检测到你的盘子,从暗网/自定义/权重中选择最新的模型,并将其路径或名称放在文件object_detection_yolo.py中,也将使用yolov3.cfg文件,就在这个文件中在训练之前把#放到训练所以可以训练然后运行:
python object-detection_yolo.py --image = image.jpg
这就是结果:
第二步:车牌分割
现在必须分段牌号。输入是板的图像,必须能够提取单字图像。该步骤的结果用作识别阶段的输入,非常重要。在自动读取车牌的系统中。
分段是自动识别牌照的最重要的过程之一,因为任何其他步骤都是基于它的。如果分割失败,则识别阶段将不正确。为了确保正确分割,必须执行初步处理。
像素投影的直方图包括找到每个字符的左上角和下限。执行水平投影以找到角色的顶部和底部位置。一组直方图的值是沿水平方向上的特定线的白色像素的总和。当计算沿水平方向的所有线的所有值时,获得水平投影直方图。然后将直方图的平均值用作阈值以确定上限和下限。其直方图的片段大于阈值的中心区域被记录为由上限和下限界定的区域。然后以相同的方式计算垂直投影直方图,但是通过图像的列更改行以具有每个字符的两个限制(左和右)。
从车牌中提取数字的另一种方法是使用开/关形态学来制作某些连通区域,然后使用连通分量算法来提取连通区域。
第3步:车牌识别
识别阶段是自动车牌阅读器系统开发的最后一步。因此,它关闭所有通过图像采集的过程,然后是板的位置直到分割。识别必须来自在分割阶段结束时获得的图像字符。将用于此识别的学习模型必须能够读取图像并呈现相应的字符。
为了充分利用可用于学习的数据,在应用在牌照分割之前使用的相同图像处理步骤之后,通过在正方形中调整大小来单独地剪切每个角色。结果,获得了由11个类组成的一组数据,对于每个类,我们有30-40个28X28像素尺寸PNG格式的图像; 从0到9的数字和阿拉伯语(突尼斯)中的单词。
然后,基于比较多层感知器(MLP)和分类器K最近邻(KNN)的科学文章进行了一些研究。结果发现:如果使用MLP分类器时隐藏层神经元的数量也增加,并且使用KNN时最近的邻居数也增加,则性能会提高。调整k-NN分类器性能的能力在这里非常有限。但是可调节数量的隐藏层和可调节的MLP连接权重提供了更好的机会来细化决策区域。因此,将为此阶段选择多层感知器。
在github和kaggle中找到所有代码和数据集:
https://github.com/KhazriAchraf/ANPR
https://www.kaggle.com/achrafkhazri/anpr-dataset-tunisian-plates-and-digits