基于SVM与ANN技术的车牌识别1

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

基于SVM与ANN技术的车牌识别贾文其参考博客及书籍:•1、Raby❤Draby~-博客频道-CSDN.NET•2、《MasteringOpenCVwithPracticalComputerVisionProjects》通过车牌的自动检测与识别,向大家介绍一下图像的分割和特征提取即模式识别与图像处理的基础内容,以及两个重要的模式识别算法:支持向量机和人工神经网络。主要目的主要内容•车牌检测•车牌字符的识别•车牌检测就是检测车牌在整个图像帧中的位置。当一个图像中的车牌用支持向量机算法检测到时,接着我们对车牌的字符进行识别。在车牌识别中,我们用人工神经网络算法来识别出车牌上的字母数字的字符。车牌检测与车牌字符的识别车牌样本选取环境•离车前方2-3米左右,在白天正常的光线下,并且不是平行与地面而是与车牌的有个小角度的倾斜情况下(因为很难做到拍摄出的车牌没有倾斜)拍摄车牌照片。车牌样本摄像机的选用•如果我们使用一个带有红外线投影结构和滤波的摄像机重新获取,将得到一个非常高质量的照片以用来分割和随后的检测和识别车牌数字。也即照片不依赖于任何光线环境,如下图所示:由于硬件限制,我们没有使用红外线摄像,而是使用常规的摄像。这样做,以至于很难得到一个最好的结果,其最终车牌的检测错误率和字符的识别错误率很相对高一些,但是无论何种摄像机,对车牌的处理过程是一样的。车牌规格•我们使用西班牙最普通(使用最多)的车牌,其大小是520*110mm。两种字符(数字和字母)的间距是41mm。数字和数字之前(或者字母和字母之间)距离是14mm。第一组字符含有四个数字。另外一组含有三个字母,其中不包括元音字母:A,E,I,O,U和N,Q。所有的字符大小为45*77。这些数据对于字符分割很重要,以这些尺寸为依据来大致确定区域是否是车牌或者字符区域,如下是一个车牌图。车牌检测与车牌字符识别车牌检测——检测出一个图像帧中的车牌。•第一步(分割),应用不同的滤波器,形态学操作,轮廓算法,获取所有可能的车牌部分。•第二步(分类),我们采用支持向量机(SVM)分类得出我们所需要的车牌部分。(一)车牌图像分割•分割是把一幅图像分割成许多部分的过程。这个过程可以简化图像分析,使特征提取更容易。•车牌部分的一个重要特征是在车牌中有高数量的垂直边缘(也就是垂直边缘比较多),假定照片是从前面拍的,车牌没有旋转,并且没有视觉上的扭曲。我们将sobel滤波得到垂直边缘特征可以作为分割的第一步,来排除那些没有垂直边缘的区域。•在寻找垂直边缘之前,我们需要把彩色图像转换为灰度图像,因为彩色图像在我们的任务中没有帮助,并且用线性滤波的方法来移除来自相机或者外界对图像的噪声。如果我们不应用去噪方法,我们将得不到许多的垂直边缘,将会产生检测失败。灰度化及线性滤波后效果Sobel滤波后效果•Sobel滤波后,我们应用一个阈值滤波器来获得一个二值图像,阈值通过Otsu方法获得。Otsu算法又称大津算法,需要一个8位图像作为输入,该方法自动的获取图像最佳的阈值。二值化后效果•接下来,通过应用一个闭操作(先膨胀,再腐蚀),我们能够去掉每个垂直边缘线的空白黑色部分。并且连接含有边缘数量很多的所有区域。在这一步,我们得到可能的含有车牌的区域。闭操作后效果连通域轮廓最小外接矩形•我们基于面积和宽高比,对于检查到的所有外接矩形区域做一下确认。如果宽高比大于为520/110=4.727272(车牌宽除以车牌高)(允许带有40%的误差)和边界在15像素到125像素高的区域,我们才认为可能是一个车牌区域。这些值可以根据图像的大小和相机的位置进行估算。去除干扰区域后剩余6块外接矩形•对仅剩下的6块区域,我们利用车牌的白色背景属性可以进一步改善。所有的车牌都有统一的背景颜色。我们可以使用漫水填充算法来获得这些剩余旋转矩阵的精确筛选。•所谓漫水填充,简单来说,就是自动选中了和种子点相连的区域,接着将该区域替换成指定的颜色,这是个非常有用的功能,经常用来标记或者分离图像的一部分进行处理或分析.漫水填充也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或者只处理掩码指定的像素点.寻找种子点随机选取每个区域十个种子点•为了下一步轮廓寻找、最小外接矩形的获取以及筛选合适大小的轮廓做准备,我们对图像漫水填充时,只对黑色背景的二值掩码区域进行填充,不对原彩色图进行填充,填充颜色为白色。掩码填充效果掩码填充效果掩码填充效果掩码填充效果掩码填充效果掩码填充效果•因为使用车牌,车牌有边界,漫水填充不会超过车牌的边界,而对于其他区域(检查出来的矩形)漫水填充会占据很多区域,形成的矩形也很大,再对矩形进行大小判别时,可能就会被丢弃,得到更可能是车牌的区域。•因此我们在原图上标记出仅剩的三块可能车牌区域。仅剩3块可能的车牌区域•将这三块区域提取出来后,先进行适当的旋转,然后把所有的图像调整为统一的大小,对其采用直方图均衡化最终效果如下。车牌分类•我们预处理和分割图像的所有可能部分之后,我们现在需要判别每一个分割部分是不是一个车牌。为这样做,我们使用SVM算法。•支持向量机是一个模式识别算法,它是监督学习算法的一份子,最初创建是为了二值分类的。有监督的学习是一种机器学习算法,它通过标签数据的使用进行学习。我们需要一些带有标签的数据来训练这个算法。每一个数据集需要有一个类别。•SVM创建一个或多个超平面,用来区分每类数据。•一个典型的例子是2维点集,它定义了两个类。SVM寻找最优线来区分每个类。•训练SVM分类器,简单来说在二维空间里就是求解这样一个线性函数,g(x)=wx+b,x是输入的特征,g(x)是输出的分类的类别,我们已知了输入特征与输出类别,来训练求解w和b的最优的值,获得这两个值后也就获得了这个分类的数学模型,接着就可对新样本进行预测。寻找训练分类器所需特征•在任一分类之前的第一个任务是训练我们的分类器。•我们用大小为144*33的75张车牌和35非车牌来训练我们的系统。我们在下面的图中能看到数据的一些样本。•为机器学习的SVM算法训练的数据存储在一个N*M的矩阵中,N表示样本数,M表示特征数。•类别存储在另外一个大小为N*1的矩阵中。用0或者1表示无车牌和有车牌类别。•我们将以上存储了已经处理好和准备好的所有图像的数据,写成xml文件保存起来输入到分类器中进行训练。创建和训练分类器•Opencv为支持向量机算法定义了CvSVM类。我们用训练的数据、类别和参数数据来初始化它并用CvSVM类中的train()函数训练我们的分类器。•CvSVMsvmClassifier(SVM_TrainingData,SVM_Classes,Mat(),Mat(),SVM_params);•boolCvSVM::train(constCvMat*trainData,constCvMat*responses,constCvMat*varIdx=0,constCvMat*sampleIdx=0,CvSVMParamsparams=CvSVMParams())预测分类•分类器准备好了,我们可以使用CvSVM类的predict函数来预测一个可能的修剪图像。这个函数返回类别i。在我们的实例中,我们标记每一个车牌类别为1,非车牌类别标记为0。对于每个检测到的区域,我们使用SVM来分出它是车牌还是非车牌。•floatCvSVM::predict(constCvMat*samples,CvMat*results)const车牌字符的识别•车牌识别目标的第二步即要获取车牌上的字符。对于每个检测到的车牌,我开始分割车牌得到每个字符,并且使用人工神经网络机器学习算法来识别字符。OCR分割(字符分割)•我们将第一步检测到的车牌作为输入的图像•然后对其进行二值化,因为我们需要获取字符的轮廓,而轮廓的算法寻找的是白色像素。所以通过改变二值化函数的参数来把白色值变为黑色,黑色值变为白色。•最后我们检测到所有白色区域的轮廓,并且找到它们的最小外接矩形。•对于每一个检测到的轮廓,我们核实一下大小,去除那些规格太小的或者宽高比不正确的区域。字符是45/77的宽高比。我们允许用于选择或者扭曲带来的百分之35的误差。如果一个区域面积高于80%(就是像素大于0的超过80%),则我们认为这个区域是一个黑色块,不是字符。提取每个字符的特征•不像车牌检测特征提取的是图像的所有像素。我们使用一个更加通用的特征在字符识别中,其中包括水平和垂直累加直方图,一个低分辨率样本。一旦我们拥有了特征,我们创建一个M列的矩阵,矩阵的每一行中的每一列都是特征值。OCR分类(字符分类)•在分类这一步,我们使用人工神经网络机器学习算法。更具体一点,多层感知器(MLP),一个广泛使用的人工神经网络算法。•MLP神经网络有一个输入层,输出层和一个或多个隐层。每一层有一个或多个神经元连接着前向和后向层。•下面的例子表示一个3层感知器(它是一个二值分类器,它映射输入的是一个实值向量,输出单一的二值),它带有三个输入,两个输出和一个含有5个神经元的隐层。每个神经元用带有权重的输入和加上一个偏移量再经过一个选择的激活函数转换后得到输出结果。•一个训练人工神经网络的输入是一个特征矢量。它传输值到隐层。用权重和激活函数来计算结果。它进一步的把输出结果往下传输直到到达含有一定数量的神经元类别时整个过程结束。•每一层的权重,通过训练神经网络算法来计算和学习。简单的神经网络学习过程•在图中,Xl,X2,…,Xn,是输入样本信号,W1,W2,…,Wn是权系数。输入样本信号通过权系数作用,在u产生输出结果∑WiXi,即有u=∑WiXi=W1X1+W2X2+…+WnXn,再把期望输出信号Y(t)和u进行比较,从而产生误差信号e。即权值调整机构根据误差e去对学习系统的权系数进行修改,修改方向应使误差e变小,不断进行下去,一直到误差e为零,这时实际输出值u和期望输出值Y(t)完全一样,则学习过程结束。训练所需特征和类别•charOCR::strCharacters[]={'0','1','2','3','4','5','6','7','8','9','B','C','D','F','G','H','J','K','L','M','N','P','R','S','T','V','W','X','Y','Z'};•intOCR::numCharacters=30;•由于最终我们的分类器分类出30个类别,所以我们获取这30个类别的大量样本,提取每个类别每个样本的特征作为分类器的输入来训练我们的分类器。•为机器学习的ANN算法训练的数据存储在一个N*M的矩阵中,N表示样本数,M表示特征数。•而和SVM分类器类别存储在一个大小为N*1的矩阵中不同的是,必须创建一个N*30大小的矩阵来存储类别,这里的N是训练的样本,30是类别(因为我们的车牌中是10个数字和20个字母)。如果某一行假定第i行属于j(j=0-29)类,则我们将位置(i,j)的设置为1.•我们将以上存储了已经处理好和准备好的所有图像的数据,写成xml文件创建并训练分类器•我们用训练的特征数据,隐含层所含神经元的数目,类的数目及激活函数参数等来初始化分类器。OpenCV也为我们提供了ANN算法的类。•layers.atint(0)=TrainData.cols;•layers.atint(1)=nlayers;•layers.atint(2)=numCharacters;•voidCvANN_MLP::create(constCvMat*layerSizes,intactivateFunc=CvANN_MLP::SIGMOID_SYM,doublefparam1=0,doublefparam2=0)•我们用CvANN_MLP类中的train函数来训练我们的分类器•CvANN_MLP::train(constCvMat*inputs,constCvMat*outputs,

1 / 63
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功