APP下载

基于BP神经网络的字符识别设计与实现

2020-11-05朱婷婷

科教导刊·电子版 2020年27期
关键词:英文字母字符识别二值

朱婷婷

(洛阳师范学院 河南·洛阳 471000)

0 引言

随着科技的日新月异,字符识别需求越来越高,尤其是对英文字母和数字的识别要求。目前,字符识别的方法通常可以分为:统计特征字符识别技术、结构字符识别技术和神经网络字符识别技术3种,统计特征字符识别技术相对来说选择的是比较稳定一些位置特征、投影特征、字符变换的其他形状等,结构特征字符识别技术更多的情况是用于相近字符或者手写字符等一些字型变化较大的字符识别,神经网络字符识别技术是目前应用较广的识别技术尤其是BP神经网络,作为应用最广泛的一种多层前馈神经网络模型,主要用于函数逼近、模式识别、数据压缩等方面,具有很强的学习性、自适应性和容错性。

本文的字符识别原理是提取英文字母和数字的一部分统计特征作为BP神经网络的特征向量,并在在visual studio的基础上采用C#编码语言实现BP神经网络的生成、训练和仿真,将训练好的神经网络用于英文字母和数字的识别。

1 字符图像预处理

本文采用的样本集是对彩超和CT图像中的英文字母和数字通过分割、去噪等一系列处理后得到的统一尺寸的二值图像,如图1所示。

1.1 字符转为二维矩阵

采用函数public static int[,]BwImageToBinaryMat(Bitmap bits)用于实现将二值图像转化为二维矩阵,其函数返回值为二维矩阵bwMax。对二值图像进行遍历,若bits.GetPixel(row,col).R==255,则设置该像素点为1,否则为0。

1.2 字符特征提取

本特征提取算法采用的是轮廓特征提取法和投影特征提取法相结合的方法。轮廓特征提取法指的是选取二值图像中每行(列)第一个白点到最后一个白点的距离作为特征向量值,若是某一行(列)没有白点则设该特征向量值为0,若只有一个白点则该特征向量值为1;投影特征提取法指的是提取每行(列)中白点的个数作为特征向量值。

采用函数public static double[]FeatureExtraction(int[,]bwMat)用于实现英文字母和数字特征提取,其中bwMat是由函数BwImageToBinaryMat(Bitmapbits)得到的二维矩阵,函数返回值为矩阵FeatureMat(double[]featureMat=new double[2*bwMat.GetLength(0)+2*bwMat.GetLength(1)])。分别用一维矩阵 projectionRow、projectionColumn、outlineRow、outline-Col来表示行投影特征、列投影特征、行轮廓特征和列轮廓特征。采用featureMat[i]=featureMat[i]/maxValue(matValue为特征矩阵FeatureMat中的最大值)语句将特征向量矩阵归一化到[0,1]之间。

1.3 字符特征向量集

对BP神经网络进行训练和测试时采用的是英文字母和数字样本集,分别包括训练样本集和测试样本集,因此采用函数public static double[,]BwToFSets(string address)实现将需要测试和训练的多个英文字母和数字二值图像转为特征向量集,其中参数address为样本集的存放位置,函数返回值为InputSet(double[,]InputSet=new double[featureMax.GetLength(0),strs.GetLength(0)]),该矩阵的行数表示一个二值图像的特征向量个数,列数表示样本集中英文字母和数字图像的个数。该函数采用语句int[,]bwMat=BwImageToBinaryMat(bits)实现英文字母和数字二值图像转化为二维矩阵,采用语句double[]featureMax=FeatureExtraction(bwMat)得到每个二维矩阵的特征向量。

2 字符识别

本文采用BP神经网络对英文字母和数字图像进行识别。其中BP神经网络是通过设置类库BPNerualNetwork来实现的,在该类库下有三个类:BPNewNN类、BPTrain类、BPSim类,分别用于生成网络,训练网络、仿真网络。

2.1 BP神经网络

图1:二值图像

图2:实验结果

通过训练后的BP神经网络才可以直接识别英文字母和数字。在字符识别前首先要做的是生成网络、训练网络。在生成网络前先通过第二章提到的函数将准备好的字符图像样本训练集转为特征向量集,通过语句double[,]inputSets=BwImageToFeatureSets.BwToFSets(inputAddress)实现,并声明一个与样本训练集相对应的目标向量集double[,]targetsSets用于BP神经网络的训练,其中也要将目标向量集targetsSets的数据进行归一化。

设置输入神经元个数int numInput=inputSets.GetLength(0)、隐层神经元个数int numHidden=15、输出神经元个数int numOutput=targetsSets.GetLength(0),采用语句BPNewNN net=new BPNewNN(numInput,numHidden,numOutput)生成BP神经网络的实例net,BPTrain bpNet=new BPTrain(inputS-ets,targetsSets,numHidden)生成训练实例bpNet。

对实例 bpNet进行训练前,首先设置迭代次数 bpNet.Epochs=2500,设置学习率bpNet.LearnRate=0.01,设置期望误差bpNet.ExpectError=0.0001,使用语句bpNet.Train()进行训练。由此得到训练后的输入层和隐层间的权值double[,]input

ToHiddenWeight=bpNet.InputToHiddenWeight,隐层和输出层间的权值double[,]hiddenToOutputWeight=bpNet.HiddenToOutputWeight,隐层阈值(偏置项)double[]hiddenBias=bpNet.HiddenBias,输出层阈值(偏置项)double[]outputBias=bpNet.OutputBias,由此BP神经网络已完成生成和训练。

2.2 字符识别

把需要识别的英文字母和数字图像即测试集通过语句double[,]testSets=BwImageToFeatureSets.BwToFSets(testAddress)转化为特征向量集,为了测试仿真结果,可以设置与测试集相对应的测试结果集double[,]testTargetsSets。

现对训练后的网络进行仿真,首先语句BPSim simBPNet=new BPSim()生成实例simBPNet,然后使用语句double[,]outputSets=simBPNet.Sim(testSets,inputToHiddenWeight,hiddenToOutputWeight,hiddenBias,outputBias)得到输出特征向量集outputSets,然后将outputSets转化为对应的二值图像集binaryOutputSets(double[,]binaryOutputSets=new double[outputSets.GetLength(0),outputSets.Get Length(1)])。

为了测试BP神经网络的识别率,可以将得到的数据集binaryOutputSets与期望数据集testTargetsSets相对比,经过多次实验测试可得到数字和字母识别率较高,实验结果如图2所示。

3 结论

本文在visual studio的上采用C#语言实现了BP神经网络用于识别英文字母和数字,经过多次实验证明,本设计实用价值高、稳定性也较高。但也有一定的局限性:0和o的识别率不高,如何更好的提取二值图像的特征用于提高0和o的识别率也将是接下来的研究重点。

猜你喜欢

英文字母字符识别二值
混沌伪随机二值序列的性能分析方法研究综述
支持CNN与LSTM的二值权重神经网络芯片
基于二值形态学算子的轨道图像分割新算法
英文字母,你们看上去萌萌哒
一种改进深度学习网络结构的英文字符识别
基于曲率局部二值模式的深度图像手势特征提取
仪表字符识别中的图像处理算法研究
捋顺绳子
基于CUDA和深度置信网络的手写字符识别
机加工件点阵字符识别研究