基于OpenCV的人工神经网络字符识别研究
2017-04-14刘智辉陈洪立江先志
刘智辉,陈洪立,江先志
(浙江理工大学 机械与自动控制学院,浙江 杭州 310018)
基于OpenCV的人工神经网络字符识别研究
刘智辉,陈洪立,江先志
(浙江理工大学 机械与自动控制学院,浙江 杭州 310018)
为克服传统模板匹配方式识别字符存在的缺陷,采用BP神经网络技术,有效识别字符特征,快速识别字符.运用C++编程以及OpenCV计算机视觉库,降低系统实现的复杂程度,实现了字符的快速准确识别.
字符识别;OpenCV;BP神经网络;智能系统
随着人们物质生活水平的不断提高,车辆数量持续增长,车辆监控和行车安全已经成为人们关注的焦点.除了维持现有交通基础设施投入之外,要科学使用交通设备,加强智能化应用水平,使得人们的出行更加安全、便捷[1-2].通过实时监控设备,对过往车辆进行拍照,识别车牌的字符号码,可以完善安保系统和城市道路交通安全系统.车辆上安装的相关智能设备,不依赖地图更新就能够自主快速识别道路指示标识(如限速标识)上的字符,提醒驾驶员了解道路行车状况,进而保障驾驶员以及乘客的生命财产安全.这种自主导航方式同时能够为今后的车辆自动驾驶提供良好的技术支撑.
基于OpenCV的人工神经网络的字符识别库能够有效地解决图像上文字及符号的识别问题,对城市的交通监控以及实时路况指导提供有效的参考,具有良好的应用前景[3-4].传统上,模板匹配识别字符的方法较为复杂,容错能力较差,对需要识别字符的图像质量要求较高,识别的速率较慢,正确率较低.神经网路识别算法能够有效地解决上述问题,对有残缺或者不清晰的一些字符图像也能够进行识别.但是,使用神经网络识别字符算法的样本训练时间较长.由于样本的训练是在识别之前就可以完成的,因此在实际使用中只需要将训练好的权值加载到神经网络中,即样本的训练不会占用识别时需要的各项系统资源.本文算法在实际应用过程中能够体现出优越性.
1 OpenCV开源计算机视觉库
OpenCV(Open Source Computer Vision Library)是基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上.它由一系列C函数和少量C++类构成,包含了大量的数字图像处理算法以及计算机视觉方面的算法.其功能模块有CORE、IMGPRO、HIGHUI、ML、FRATURES2D等[5-6].
2 BP神经网络
BP神经网络是一种具有3层或3层以上结构的无反馈、层内无互联结构的前向网络(图1).其首尾两层分别为输入层和输出层,中间各层称为隐含层(也称中间层).BP神经网络中各层之间的神经元为全连接关系,而层内的各神经元之间无连接.
图1 3层BP神经网络结构
BP神经网络采用有指导的学习方式进行训练和学习,即当一对学习模式提供给BP神经网络后,神经元的激活值从输入层经各个隐含层向输出层传播,在输出层的各个神经元获得网络的实际输出响应.通过比较输出层各个神经元的实际输出与期望输出,获得二者间的误差,然后按照误差减小的方向,从输出层经各个隐含层并逐渐修正各个连接权值,最后回到输入层.这种“正向输出计算—反向传播误差”的过程不断重复进行,直至误差被降到可以接受的范围,BP神经网络的学习训练过程也就随之结束[7].
在图2所示的神经网络处理单元中,L1层的n个处理单元与L2层的p个处理单元全连接.其连接权向量为:
W={ωi j},i=1,2,…,n,j=1,2,…,p
(1)
L1层n个处理单元的输出构成了L2层各个处理单元的输入列向量.L2层各个处理单元的输入列向量为:
X=(x1,…,xi,…,xn)T
(2)
L2层各个处理单元的阈值为,θj(j=1,2,…,p).
因此,L2层各个处理单元接收的输入加权和为:
(3)
L2层各个处理单元的输出由转移函数决定.BP神经网络通常采用Sigmoid函数(图3)作为转移函数.Sigmoid函数的数学表达式为:
(4)
因此,L2层各个处理单元的输出为:
(5)
图2 BP神经网络的处理单元
图3 Sigmoid函数
Sigmoid函数的输出接近生物神经元的信号输出形式,能够模拟生物神经元的非线性特征.同时,Sigmoid函数具有的非线性特征能够增强神经网络的非线性映射能力[8].
3 字符识别系统实现
3.1 系统组成
字符识别系统首先基于数字图像处理算法提取图像的多种特征,得到字符的特征向量,然后通过模式识别算法识别特征向量,进而达到识别图像中字符的效果.系统组成关系如图4所示.
图4 系统组成关系
在系统组成中,分割后的字符图片部分包括大小写英文字母以及阿拉伯数字;特征提取部分包括字符图片的归一化处理和特征提取(灰度特征提取以及方向梯度特征提取);人工神经网络部分包括BP神经网络的创建、训练和识别.
3.2 字符特征提取
3.2.1 归一化处理
由于字符以及数字的数量较多,训练将会耗费大量的时间,因此本文只对“A”、“B”、“C”、“D”4个大写英文字母进行识别.每个字母均使用100个样本进行训练,共计400个训练样本.样本被命名为“sample(*)”,其中“*”代表样本序号.采用cvtColor函数以及resize函数,将RGB图像(三通道彩色图像,分别为红色通道Red、绿色通道Green、蓝色通道Blue)转换为灰度图像并归一化(图5)到指定的大小(8×16).
图5 图像归一化示意
图像归一化处理的核心代码如下:
cvtColor(sampleImage[i],sampleImage[i],CV_BGR2GRAY);//图像转化为灰度图像
resize(sampleImage[i],sampleImage[i],Size(8,16));//图像归一化到指定大小.
3.2.2 提取灰度特征
将归一化后图像展开成一行,将每个像素的值存放到一个float型的向量容器中,组成行数为1,列数为8×16=128的灰度特征向量.
提取灰度特征的核心代码如下:
for (inti= 0;i< image.rows;i++)
{const uchar* linePtr = image.ptr
for (intj= 0;j { feat.push_back((float)linePtr[j]);} }. 3.2.3 提取方向梯度特征 为了得到图像水平方向和竖直方向的梯度图像,需要使用式(6)所示的Sobel算子. (6) 首先定义Sobel水平检测算子x_mask和y_mask,其中y_mask为x_mask的转置;然后分别用mask_x和mask_y进行图像滤波,得到sobelX和sobelY;再计算滤波后图像总的像素,划分网格,计算每个网格内像素值的总和;最后将每个网络内总灰度值占整个图像的百分比统计在一起,写入一个向量,将两个方向各自得到的向量合并在一起,组成行数为1,列数为8×16/8=16的梯度特征向量. 提取方向梯度特征的核心代码如下: for(inti=0;i< image.rows;i=i+4) //合并两方向向量组成特征向量; { for(intj=0;j< image.cols;j=j+4) { Mat subImageX= sobelX(Rect(j,i,4,4)); feat.push_back(sumMatValue(subImageX)/totleValueX); Mat subImageY= sobelY(Rect(j,i,4,4)); feat.push_back(sumMatValue(subImageY)/totleValueY);}}. 最后将单幅字符图像的灰度特征和梯度特征合并,组成行数为1,列数为128+16=144的单幅字符图像的特征向量.其核心代码如下: inputv1.insert(inputv1.end(),inputv2.begin(),inputv2.end()); return inputv1. 本文共使用400个样本图像进行训练,通过合并单幅字符图像的特征向量,最终得到了行数为400,列数为144的特征矩阵. 3.3 构建神经网络 3.3.1 定义神经网络期望输出矩阵 由于本文只需要识别4个字符,共使用400个样本对BP神经网络进行训练,因此神经网络的期望输出矩阵可以定义为400行4列的矩阵,每个字符的期望输出矩阵各占100行,用数字“0”和“1”表示.4个字符期望输出的特征向量定义如表1所示. 表1 字符的期望输出向量 3.3.2 神经网络参数设定 新建一个名为bp的神经网络.网络的层次结构为3层,包括一个144节点的输入层、一个144节点的隐含层、一个4节点的输出层.传递函数使用Sigmoid函数.其核心代码如下: CvANN_MLP bp;//定义名为bp的人工神经网络; int ar[]={144,18,4};//输入层节点144,隐含层节点144,输出层节点4; Mat layerSizes(1,3,CV_32S,ar);//3层神经网络; bp.create(layerSizes,CvANN_MLP::SIGMOID_SYM, 1.0, 1.0);//创建人工神经网络. 3.4 神经网络训练 设置bp神经网络的训练参数,将神经网络的迭代次数设置为2 000次,当误差小于0.01时停止迭代,认为网络已经完成收敛,至此神经网络已经全部训练完毕.将训练好的权值保存为xml文件,以便直接调用.其核心代码如下: CvANN_MLP_TrainParams param;//设置人工神经网络训练; param.term_crit=cvTermCriteria(1,2 000,0.01);//迭代2 000次,误差0.01; param.train_method=CvANN_MLP_TrainParams::BACKPROP; //定义为BP神经网络; param.bp_dw_scale=0.1; param.bp_moment_scale=0.1; bp.train(inputs,outputs,Mat(),Mat(),param,0);//人工神经网络的训练接口准备; bp.save("bp.xml");//保存bp网络的权值. 3.5 神经网络识别 神经网络识别使用的是未经训练的测试样本,“A”“B”“C”“D”各字符样本均为20个,共计80个.样本被命名为“test(*)”,其中“*”代表样本序号. 对测试样本进行归一化操作,提取测试字符图像的特征向量,然后将测试所用的特征向量送入已经完成训练的神经网络中进行识别.其核心代码如下: bp.predict(testFeat[i],rus[i]) 通过字符的特征向量进行人工神经网络的识别,可得到表2所示的识别结果.测试样本01-03为字符“A”20个样本中前3个的识别结果;测试样本21-23为字符“B”20个样本中前3个的识别结果;测试样本41-43为字符“C”20个样本中前3个的识别结果;测试样本61-63为字符“D”20个样本中前3个的识别结果.将各字符的实际输出向量与表1中各字符的期望输出向量对比,显然,对应字符的实际输出向量与期望输出向量的数值非常相似.因此,可以认为字符是被识别出来了,该识别方法是有效的. 表2 部分识别结果 测试平台使用的是台式计算机、ARM开发板(STM32F103ZET6)、USB摄像头.计算机对摄像头采集回来的图像进行数字图像处理,同时对字符用人工神经网络算法识别.按照计算机对字符的识别结果,以串口通讯的方式将指令发送给下位机(ARM开发板),下位机会反馈一条相同的指令给上位机(计算机),以完成对整个应用过程的测试. 对捕获的字符标识(图6a)进行数字图像分割,得到图6(b)的字符分割结果,再将分割的结果送入已训练好的神经网络进行识别,得到识别结果.计算机按照事先设置的指令(字符“B”对应指令“0X02”),通过串口发送给下位机,下位机回发相同的指令给上位机(图7).至此测试完成.这说明本实验所研究的算法在实际应用过程中是可行的. (a)摄像头捕获字符标识 (b)字符分割结果图6 小车拍摄图像及字符分割结果 图7 结果的指令发送界面 本文采用基于OpenCV的人工神经网络算法识别图像字符,通过有效提取图像的多种特征来准确识别图像中的字符,避免了单特征所带来的误差.采用现阶段应用较为广泛的BP神经网络算法,避免了采用模板匹配算法时识别不准确、识别速度慢等问题,使得识别算法具有良好的鲁棒性以及非线性映射能力. 本文算法配合高清摄像机和嵌入式系统等智能设备以及图像分割技术,使得行驶车辆能够自主快速识别道路指示标识(如限速标识)上的字符,实时提醒驾驶员道路情况,有利于驾驶员及时了解道路行车状况,减少伤亡事故的发生,进而保障驾驶员及乘客的生命财产安全.它也为今后的车辆自动驾驶提供了一定的技术支撑. [1] 刘雄飞,朱盛春.车牌字符多特征提取与BP神经网络的识别算法[J].计算机仿真,2014,31(10):161-164,290. [2] 张三友,姜代红.基于OPENCV的智能车牌识别系统[J].软件导刊,2016,15(5):87-89. [3] 欧阳俊,刘 平.基于BP神经网络的车牌字符识别算法研究[J].光学与光电技术,2012,10(5):67-71. [4] 卢雅文.基于人工神经网络的图像识别[J].电子技术与软件工程,2016(12):103. [5] Kaehler A,Bradski G.Learning openCV:Computer vision in C++with the OpenCV library[J]. O′reilly Media,2016,34(5):1681-1682. [6] 毛星云.OpenCV3编程入门[M].北京:电子工业出版社,2015. [7] 吴岸城.神经网络与深度学习[M].北京:电子工业出版社,2016. [8] 马 锐.人工神经网络原理[M].北京:机械工业出版社,2010. Research on Character Recognition of Artificial Neural Network Based on OpenCV LIU Zhi-hui,CHEN Hong-li,JIANG Xian-zhi (School of Mechanical Engineering and Automation,Zhejiang Sci-Tech University,Hangzhou 310018,China) This paper uses BP neural network technology which can effectively identify the feature of characters to achieve the ability to recognize characters. Through the use of C++programming and OpenCV computer vision library, the complexity of the system to achieve a fast and accurate recognition of characters can be greatly reduced. character recognition; OpenCV; BP neural network; intelligent system 2016-12-02 刘智辉(1992-),男,湖北宜昌人,硕士研究生,研究方向为计算机视觉和图像处理. 1006-3269(2017)01-0053-05 TP27 A 10.3969/j.issn.1006-3269.2017.01.0114 字符识别系统测试
5 结束语