Skip to content

puhuangyi/Blue-plate-recognition

Repository files navigation

基于深度学习的蓝色车牌识别软件(MATLAB)


一.说明与用法:

  • 说明:可进行车牌识别,检测车牌字符。所有文件均含有详细的注释。

  • 用法:test2是主函数文件,在MATLAB中运行它之后导入要检测的图片即可。


二.基本原理:

车牌识别大致分为3个步骤:车牌区域检测,车牌字符提取,字符识别。

1.车牌区域检测

本次车牌检测采用的是基于阈值的检测方法,利用统计蓝色像素点的多少来确定车牌区域。此方法的弊端在于如果图像中除了车牌外的蓝色区域过多的话将直接导致识别的成功率降低,所以此方法适用于除车牌外蓝色区域较少的图片(车牌区域较大)。

2.车牌字符提取

将车牌区域提取出来后就进入到字符提取的工作,我采用的方法是按照字符顺序一个接一个的单独裁剪。先将提取出第一个字符(汉字),在此步骤前先把车牌区域转为二值图像,然后从左上方开始裁剪直到裁剪到白色像素,也就是让照片的左上角紧贴字符。接着进入到一个字符(汉字)的提取:由于一般情况下,字符与字符之间是不存在连接的,所以利用这一特点我们将每个y方向的白色像素统计累加,那么两个字符之间的白色像素和会是0(正常情况下由于噪声的存在是会大于0但趋近于0,所以在此次会设定一个阈值来分离两个字符),以此来得到第一个字符(汉字)。当然了,在第一个字符中由于是汉字,所以有些会有偏旁与部首,与本体间无连接,所以还要设置一个阈值(车牌一共是7个字符,但我设置的阈值是车牌区域的长的十分之一),确保第一个字符长度要大于此才行。

接着进行中值滤波。为何中值滤波放在此处而不是在前面?因为汉字有些偏旁由于噪声的原因,已经收到干扰,加上偏旁本身像素占比非常小,那么再中值滤波就会导致偏旁部分严重失真,因为系数过大将导致偏旁被抹去,过小则导致全图的滤波无效果,所以这会增大后续的字符识别的失败率。在进行滤波后把小于1/150的车牌区域的不连通区域去除,这其实也是一种变相的去噪声,只是去除大型噪声,杂点以及前两个字符与第三个字符中间的间隔符(·)。剩下的再根据提取第一个字符的方法依次提取出剩下的字符。

3.字符识别

正常情况下经过字符提取后会得到七个字符,接着利用深度学习去识别这七个字符。我本次采用的深度学习是训练网络是由输入层(通道是20201),两个卷积层和两个最大池化层交替连接后再接一个卷积层,全连接层,softmax层,分类层组成(卷积层后都有ReLU)。建立好网络后,我找到了一共16152张数据,包含数字1-9,字母A-Z和所有省份的简称汉字。因为汉字的数据集不好收集,所以有些汉字因为出现的次数少,难以收集,例如“藏”,所以数据集会较小,但都保持20张以上。接着利用MATLAB的imageDatastore函数,加载数字样本数据作为图像数据存储,此方法可以在卷积神经网络的训练过程中高效分批读取图像。加载好的数据分为训练数据与验证数据两部分,其中我的训练数据占总数据的70%。接着指定训练选项,其中参数包含使用具有动量的随机梯度下降 (SGDM) 训练网络,初始学习率,最大训练轮数等等。结合自己设置的网络进行调参即可。设置好训练选项后使用训练数据训练网络。训练好后可以自行验证一下,然后到处训练好的网络模型。我的训练好的网络为 cnn_net.mat 文件,在MATLAB中导入此网络即可使用。

将训练好的网络导入工作区,再将其与从车牌区域提取出来的字符一一识别得出结果。

三.注意:

1.文件说明

每个文件都有具体的注释与说明,此处只简要概括
测试样例中含有多张照片可进行测试。
test2.m :主函数文件,运行即可。
cnn_net.mat :训练好的网络
test_cnn : 建立网络并训练网络
License_plate_recognition.mlapp : 车牌识别app。有完整的GUI界面。
其余文件可自行阅览各文件开头注释。

2.缺点

车牌照片必须良好:除车牌外蓝色像素少,或者车牌区域占比较大,亮度适中。车牌无倾斜或微倾斜且区域内没有极大的噪声。




四.PS

About

利用MATLAB实现蓝色车牌的识别

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages