您好, 访客   登录/注册

基于OpenCV与深度学习的车牌识别软件的设计与开发

来源:用户上传      作者:吴林辉 杨晨耀 张文龙 蒋卫祥

  摘要:车牌识别系统在生活中的使用越发广泛,占据重要地位。车牌识别一共分为图像处理和字符识别两部分。本文首先使用OpenCV技术定位车牌、分割车牌,接着应用Tensorflow识别车牌字符。每个环节都是独立出来的,能够降低各层之间的耦合度,提高系统可维护性。其中车牌定位是一步非常关键的步骤,能够精准地定位出清晰的车牌能减少后续环节的误差。系统具有较高的识别率,能够精确地识别出彩色图像中的车牌字符,具有一定实用价值。
  关键词:车牌识别;OpenCV;Tensorflow深度学习;人工智能
  中图分类号:TP311 文献标识码:A
  文章编号:1009-3044(2020)01-0203-02
  随着科技的进步和人民生活水平的提高,道路上的汽车随之增多,汽车管理问题也引起了人们的重视。每辆车的车牌号都是唯一的,准确识别出车牌号就能知道车主信息,降低了汽车管理难度。车牌识别的系统被大量运用在道路上、车库门禁、小区门口等。当汽车经过时,就识别出车牌号,如果是登记在册或被允许通过的车辆,门杆就会自动升起。运用在道路上,就能记录车辆实时动态信息,方便交通管理。本文的车牌识别系统是通过OpenCV实现图像处理和Tensorflow实现字符识别,编程语言采用Java,具有运行环境简单、软件结构清晰、识别效率高等特点。
  1车牌识别系统的组成
  车牌识别系统一般可分为车牌定位、车牌矫正、字符分割和字符识别四个部分,如图1所示。
  1.1车牌定位
  车牌定位它主要是将车牌从复杂的背景中分割出来。车牌图像容易受各种环境因素的影响,比如不同光照、不同天气、不同角度、不同距离、车牌老旧褪色等都对准确性造成了较大的影响。据我所知,现在有四种比较成熟的定位技术,如采用颜色特性的定位算法、基于灰度边缘的定位算法、基于小波的定位算法、基于监督的车牌定位算法。这些算法都各有利弊,基本上都或多或少的受环境所影响,特别是受光照环境所影响。
  本文所使用的是颜色定位算法,颜色定位法利用车牌的基本颜色特征,将原图像在HSV颜色空间处理得到的二值图像,在使用闭操作将二值图像先膨胀再腐蚀,使得二值图像更好处理,然后使用findContours方法检测二值图的轮廓,最后将截取下来的轮廓进行分析,将高宽比合理的车牌进行车牌矫正。
  不同光照:为了减少背景和光线对定位产生的干扰,在进行定位之前会将原图像的像素缩小,加快图像处理速度,并使用灰度世界法,改善图像发蓝发红情况,能够提高定位准确率。
  不同距离:为了实现远距离定位需求,算法中会在缩小像素的缩略图中找出车牌的坐标,然后在原图中切割车牌,这样就能得到清晰的车牌。
  不同角度:由于我們使用的是颜色定位,角度不同依然能定位出车牌,并进行下一步的车牌矫正。
  1.2车牌矫正
  车牌矫正一共有六步。利用二值化图像的感兴趣区域计算车牌水平的偏斜角和垂直偏斜角,再将原彩车牌通过刚才计算的角度矫正。
  stepl:判断颜色匹配的旋转矩形区域倾斜角度是否在60。之内,是则进入下一步,否则不予考虑。(因为假设了拍摄的图像倾斜不是特别大)
  step2:计算安全矩阵,看矩阵是否超过图像边界,没超过则进行下一步,否则,该矩形块不予考虑(拍摄的车牌不完全)
  step3:再判断颜色匹配的矩形区域倾斜角度是否在5。之内,是则直接输出,不矫正,否则进行下一步;
  step4:进行矩形角度旋转矫正;
  step5:对矩形中“车牌”(白色)区域进行偏斜判断,是正视角,则直接输出,否则进行下一步仿射变换;
  step6:对上一步的矩形进行仿射变换,扭正“车牌”。
  车牌校正步骤如图2所示。
  1.3字符分割
  第一步:先把矫正好的车牌先进行灰度化处理和二值化处理。
  第二步:寻找轮廓分割字符。
  第三步:将切割出的图片不符合尺寸的过滤掉,然后将剩余的图片按横坐标从左到右排序。
  第四步:将符合条件的字符左上角坐标加入数组,去掉最大值最小值计算平均值,找出x值最小的坐标,计算字符的总长度和平均宽度,利用坐标和宽高,将车牌的二值图分割,能较好地将边框干扰去除。
  第五步:继续将去边框的车牌寻找轮廓,切割字符。
  最后,获得指示城市的特定Rect,如苏A的“A”,来反推出省份的中文字符。将所有字符放人数组中。字符分割如图3所示。
  1.4字符识别
  1.4.1卷积神经网络的基本概念
  卷积层:卷积是卷积神经网络中最核心的概念,也是其名称的由来。卷积用来提取图像的局部特征,它是一个数学计算方法。左图绿色矩阵是输入图像,黄色矩阵是卷积核,粉色矩阵是计算得到的卷积特征。卷积操作实际上用卷积核在图像矩阵上滑动,对卷积核矩阵与图像矩阵中对应位置做以下计算:对应元素相乘后求和。卷积层如图4所示。
  池化层:池化就是将特征矩阵划分为若干小块,从每个子矩阵中选取一个值替代该子矩阵,这样做的目的是压缩特征矩阵,简化接下来的计算,如图5所示。池化有两种方式:MaxPooling(最大值池化)和Average Pooling(平均值池化),前者是从子矩阵中取最大值,后者是取平均值,如图6所示,本项目中采用最大池化。
  激活函数的引入是为了解决深度神经网络中的梯度消失问题,常用的激活函数有Sigmoid、tanh和ReLU,前两个激活函数在训练网络时收敛极慢,因此深度网络模型中通常使用Re-LU。暂时看不懂没关系,这个ReLU激活函数比池化更容易理解,它将矩阵中所有的负数全部变为0,正数保持原样,激活函数通常出现在卷积操作和池化操作之间。   本项目使用Tensorflow框架进行cnn模型训练,所使用的图片类型为二值化后的图片,宽为32高为40,位深度为8,训练集的总样本数为17896,百分之十的图片用于作为验证集,训练一个模型用时为40个小时左右。
  1.4.2训练模型
  将32*40的单通道图片导入到gpu中,得到图片总数和每批样本数,bachsize为100,最后一批样本数为96。对数据结集:第一次遍历图片获取图片的总数,第二次遍历生成图片的数据和标签并且通过img.getPixel(w,h)函数是数字的线条变细提高识别准确率。对验证集遍历与对数据集遍历一样。
  1.4.3对处理好的数据集和标签进行卷积神经运算
  读取数据保证每张图片shape相同,不然输入有错。设置每次训练的输入个数和迭代次数,为了支持图片总数,定义了一个余数。设置每批的读入个数为100。初始化session,然后开始执行训练迭代输入时要将图片数组装化为np.array。每训练5次则进行准确率判断是否到达百分百,到达则退出。
  卷积层:用tf.Variable定义变量权重w和偏置量b,w定义为大小是输入尺寸x输出尺寸的矩阵,初始化为随机正态分布。b定义为大小是1x输出尺寸的矩阵,初始化为0.1,主要是用来提取图像特征。
  激活函数将卷积之后的现行图像转为非线性。池化层:每次滑动2步提取重要特征,图片将会缩小到原图的四分之一。全连接层将输入神经元和输出神经元连接起来,通过reshape将图片转换成4维的数据格式。然后进行线性处理并且激活结构,使用dropout将每次输出舍去百分之50相当于随机删除50%的神经元,这样就避免了过拟合的问题相当于分别训练,然后通过梯度下降的方法进行优化,此处定义一个输出结点,用于调用模型时返回输出。
  1.4.4 Java调用模型进行字符识别
  获取Javacv处理好的Mat类型的图片,将其转换成Buffere-dImage类型,通过Raster中的getPixels方法将图片转化成一个float类型的一维数组,必须保持与训练时输入的张量相同,也要将一维数组进行线条处理,保存为1和0组成的图片,调用graph的operation方法输入模型训练时的输出结点results,并将处理好的二维数组的图片创建成一个Tensor类型的数据,并且创建dropout的参数,因为在训练输入时加入了防止过拟合的方法。然后通过seeion.RunnerO.feedO.fetchO.getO的方法开始识别字符图片,结果返回为一个float类型的二维数组的值为字符的正确率,通过正确率判断是哪个字符(python中的数据精度和Java中不同,在Java中都为负数,只需取最大的那个参数)。由于车牌的第一个数只能是汉字第二个数只是字母后几个数只能是数字加字母,所以我们做了一个判断语句这样可以使识别结果更加精确。最后将结果返回保存到Resuh对象中。
  2系统实现
  2.1系统界面
  本系统功能功能:图片识别、实时车牌识别、视频识别和查看识别记录,运行界面如图7所示。
  2.2功能详解
  2.2.1图片识别
  首先进入图片识别,图片识别分为图片批量识别和单个图片识别。还包含了正确率结果打印,指定图片文件夹和结果集文本后会自动输出识别结果,用于测试识别率。图片识别只需点击文件按钮,指定某个图片,便可识别,图片批量识别需要指定文件夹以及输出文件夹。
  2.2.2实时识别
  实时识别需要摄像头,将摄像头的USB接口插入电脑端口,可以选择分别率,点击打开摄像头按钮,软件自动识别电脑摄像头并给出选项选择,软件会播放摄像头画面,框出车牌位置,并且会将识别结果显示在表格中,此外,这些记录会做本地化保存,可进入查看记录功能进行查看。
  2.2.3视频识别
  可以对已有车辆视频进行识别,选择视频识别功能,点击文件夹选择视频文件,选择需要的分辨率,可以选择是否框出视频中车牌,识别过程中同样会储存识别记录,便于查看。
  2.2.4查看記录
  如果需要查看以往的记录,点击查看记录功能,软件会将所有以往记录文本显示在表格中,右击表格中的行,点击查看该记录即可在右边表格中显示所有信息。本系统提供记录检索功能,通过填写车牌出现识别,或者地点或者明确的车牌号即可查询到是否存在记录。
  3结束语
  高速公路、城市交通、停车场等基础设施建设水平的不断发展和车辆管理体制的不断完善,为以计算机视觉为基础的智能交通管理系统的实际应用提供了契机。车牌自动识别系统应用愈发广泛,能够减轻交通压力和减少人工成本,有很重要的使用价值。
转载注明来源:https://www.xzbu.com/8/view-15143830.htm