XM-基于深度学习的车牌识别(视频、PyQt、OpenCV、TensorFlow、CNN)

前 言

1、写在前面

首先明确态度,这是一篇以自己为第一目标人写的文章,请理解!然后。这是一篇学习性的项目,鉴于我目前的专业知识积累量,本文中仅有少量的调试、改进方面的思考。这些方面的思考是极其重要的,相信我随着知识量的积累会有越来越多的创新和改进。在文章末,我会提出一些我自己的思考和对某些参数的改进(现阶段用“调整”一词更为贴切)想法。我把这个项目人为划分为战略和战术两个层面,本文我着重阐述战略层次的总结,战术层次我在具体代码中做了详细的论述。

编程软件中,我使用VS Code

2、项目概况

通过Qt Designer 构建UI窗口并转化为python文件;
输入视频文件,按周期截取图片
将截取图片进行图像处理
处理后的图像作为CNN的输入进行预测
将成功预测的结果在UI窗口展示

一、UI窗口的构建(menu.py)

通过 Qt Designer,以拖拽的方式生成MainWindow窗口,并以UI文件进行保存。在VS Code中,将.UI文件转为.py文件,窗口样式如下图所示:左下角为选择视频按钮;左上角为视频展示窗口;右上角为运算结果;右下角为反向寻车功能

二、CNN的构建

1、车牌识别网络(plateNeuralNet.py)

首先是一些超参数的设置,输入shape、batch_size、learn_rate。

然后是卷积神经网络的结构。这里我定义了3层卷积和3层全连接共六层的网络。并且为抑制过拟合,我在每层中都加入了dropout(dropout中的参数值可以做进一步的研究)。虽训练时某些节点按照dropout比例进行删除,但测试时要使dropout置1,即不删除神经元。输出运用softmax函数,将是否为车牌及其对应概率两种结果进行输出。
载入训练数据,并将数据按照80%和20%的比例划分为训练数据和测试数据(训练数据意在降低loss,测试数据意在对模型精度进行测试以挑选出指定精度的模型。区别于该脚本中的推理函数test(),该函数使用另外的数据验证当前模型是否能得到正确的推理结果,类似于carplateidentity.py中得到的疑似车牌进行推理。),各数据的内容为输入x_input,数据文件名为标签y。损失函数使用交叉熵函数,梯度计算使用Adam优化算法。(文中的输入数据及标签dropout参数我均是以feed后续赋值)。训练时,在划分的20%测试数据中随机选取数据对训练得到的模型精度进行测试并储存。在该脚本中还含有推理函数可推理验证。该网络的学习和推理两个部分可通过标志位(flag)的人为改变而转换。

2、字符识别网络(charNeuralNet.py)

处理步骤同上只是输入形状和输出形状的变化。

三、车辆图像处理及车牌识别CNN推理(carPlateIdentity.py)

1、导入视频文件(menu.py)

以connect指令作为UI窗口中的按钮空间和文件中函数的连接点,调用choose_pic()函数,执行导入视频文件的操作。

2、获取车辆截图(menu.py)

在视频展示窗口,画出三个指定形状、位置的矩形区域。设置死循环,按照一定周期从视频中取出一帧图片,并用上述矩形切割为三部分作为待预处理处理车辆图像。

3、图片预处理(pre_process())

此部分看起来复杂,步骤多,但实际运用OpenCV处理,一步可能就是一两行代码。
(1)、图片灰度化
灰度化是OpenCV图像处理的基础,后续许多操作都是基于灰度图片的。
(2)、图片滤波
可去除一下噪声点。滤波方法还有高斯滤波等。
(3)、边缘检测
用sobel算子对车辆的垂直方向上进行检测(因车牌的垂直形状)。并注意数据类型的转换。
(4)、提取蓝色区域
该项目进针对蓝色底纹的车牌进行识别,通过转换为hsv图像,并给一个粗略的(宽一些)蓝色区间,剔除掉绝对非车牌的区域。
(5)、混合图片
将(3)(4)步骤的图片混合
(6)、二值化
二值化是部分OpenCV的处理基础,也便于CNN的输入。
(7)、闭运算
先膨胀后腐蚀,排除某些黑点、角,目的是使二值化后的图片白色区域流畅。

4、定位车牌候选区(locate_carPlate())

首先需要明白的是,以下所说的白区的位置信息都存储在一个矩阵中,以便将区域和原图建立联系。
(1)、获取白区轮廓
获取白区轮廓,并得到各个轮廓的最小外接矩形,目的是为了对接车牌形状。
(2)、依据车牌形状排除部分白区
依据车牌宽和高必须分别大于0,车牌面积、宽高比、左右起伏角必须在指定范围排除部分轮廓对应的白区。
(3)、依据背景色进一步排除部分白区
运用满水填充算法对白区进行进一步排除
(4)、仿射变换对疑似车牌区域矫正
获得标准的车牌白色区域,并进一步把白色区域信息注入原图(BGR),并将疑似区域进行图像的尺寸变化,以适应接下来的CNN输入形状。获取标准疑似车牌列表carPlate_list。

5、CNN车牌推理

将上步得到的carPlate_list和训练得到的model输出到CNN中,得到对疑似区域的推理结果,获得标志位和真实车牌。此处理并不调用carplatenet.py中的train()、test()函数,仅调用模型和CNN结构。

四、车牌图像处理及字符识别CNN推理(carPlateIdentity.py)

1、字符图片提取(extract_char())

(1)、上下切割(get_chars())
对车牌区域做水平投影至y轴,对字符边边的白线及蓝色横线进行剔除,并选取目标连续白色区域占整个车牌高度比例大于50%的区域。
(2)、左右切割(horizontal_cut_chars())
通过判断列方向是否有白色像素来对字符图片进行切割,若无白色像素,则可切割。经过单个字符图片的尺寸重置,得到符合字符的CNN检测的输入。

2、CNN字符推理

将上步得到的char_img_list和训练得到的model输出到CNN中,得到对单张字符区域的推理结果,获得字符串文本。

五、UI窗口显示结果(menu.py)

将上步得到的字符串文本,通过menu.py中的choose_pic()函数,在UI窗口进行显示。本项目还有反向寻车功能,即输入车牌号,可得到该车停到几号车位的信息。
(后续在此处插入结果图)

六、改进的思考

dropout值的设置

神经网络训练的不同的权重初始值的设置(std0.01的高斯分布、He初始值、Xavier初始值)

图像预处理的不同滤波方法:均值、高斯等的比较

边缘检测的sobel算子和caddy

七、总结

好吧,这确实是一次有效的梳理。在今天总结的时候发现有好多逻辑上的东西我忘记了,后续会补充和修改(2020.4.28完成补充)。希望自己能再接再厉,把这个项目作为一个范本,把它吃透弄懂,以点带面,希望它能像病毒一般扩散!做这个之前,我恰在看一些哲学方面的书,这个项目完成时,我也产生了一些哲学方面的思考(这个以后写吧,以后做了有意义的事情不能仅仅梳理事情本身,更应该把它提高的生命意义上)!到最后了,说一句祝福的话,今天刚好是我的23岁生日,祝自己生日快乐。写下这篇文章还是很有意义的!当事情按照我的预期发展时,我感到开心!(第一次完稿2020.04.27)(第一次修订2020.4.28)
(第三次修订2020.5.5)

  • 8
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 23
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毋小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值