APP下载

基于LeNet-5的试卷手写分数无分割识别方法

2023-03-29王洪申李昌德

计算机仿真 2023年2期
关键词:手写字符轮廓

王洪申,李昌德

(兰州理工大学机电工程学院,甘肃 兰州 730050)

1 引言

手写字符的计算机自动识别具有良好的应用价值,如邮件自动分拣[1]和银行票据自动识别[2]等。从上个世纪60、70年代开始,外国学者就已经对字符识别展开了研究[3],从模板匹配到机器学习,从打印字符到手写字符,字符识别领域理论方法不断进步,识别场景愈发复杂[4]。手写数字识别是字符识别中重要的内容之一,其识别有其自身的特点:首先10个阿拉伯数字在实际手写过程中千变万化,有些阿拉伯数字形态还很相似,在世界各国不同地方书写笔迹也有许多差异。其次,数字之间缺少上下文语意环境,无法根据已经识别的数字识别下一个数字,输入的可用信息较少,多位数的识别也有一定的困难,随着位数的增加识别困难也逐步升高。

随着计算机硬件性能不断提高,深度学习理论不断发展,卷积神经网络应用在字符识别领域取得较大成功,主要有两大算法:基于分割的识别和基于无分割的识别[5]。基于分割的识别主要有准确分割和过分割的方法[6]。前者最大问题是对于粘连的数字无法准确分割。过分割的基本思想是多次分割,找到最佳分割点,这种方法计算量大,算法不够稳定。LeNet-5是一种用于手写体字符识别的非常高效的卷积神经网络,商业上最典型的应用就是识别支票上的手写数字。从上个世纪90年代开始,美国大多数银行都使用这种技术识别支票上的手写数字[7]。本文以试卷计分栏手写分数的计算机自动识别为应用背景,采用无分割方法,将一位数或两位数的手写数字作为一个整体输入LeNet-5神经网络识别试卷计分栏手写分数。通过对该神经网络的训练和参数调整,获得较好的手写分数识别效果,为计算机辅助阅卷和试卷分析系统提供核心算法。

试卷计分栏手写分数识别方法的主要步骤:对试卷计分栏中的手写分数图像提取和预处理;利用数据集训练LeNet-5网络;运用训练好的神经网络,辅助问题的先验信息,对手写数字进行识别。本文算法流程图如图1所示。提取手写分数图像这一步骤称为图像预处理,主要方法有图像ROI检测与选择、色彩空间转换、二值化、轮廓检测与筛选、形态学处理等。利用数据集训练LeNet-5网络,主要的工作是以csv格式创建包括来自网络的图像数据集和自采集图片的数据集,训练和改进该神经网络,并完成对其的测试。将试卷计分栏各题的理论总分输入训练好的LeNet-5网络,这些先验信息使LeNet-5网络识别手写分数的正确率得到了提高。图1表示本文算法设计思路的一个流程图。

图1 算法整体框架

图2 高拍仪采集到的图片

2 图像提取和预处理

对于在普通环境下采集到的图片来说,图像预处理是手写字符完整提取的重要前提。完整的字符输入神经网络将会提高字符识别准确率。本文处理对象为试卷上的手写体数字,为试卷上每道题的得分和总分数,包括一位数和两位数(暂不考虑100分的情况)。试卷的计分栏图像通过高拍仪(可以实现固定时间自动拍摄,并可保证试卷与拍摄相机的距离固定)获得,如图2所示。对所获得的图像预处理主要步骤包括:ROI区域选择、手写数字轮廓检测、轮廓排序和手写数字图片获取。

2.1 ROI区域的选择

首先,需要对采集到的图片进行去噪。由于实际中试卷卷面的污点和采集图像时光照等因素的影响,图片的噪声类似于椒盐噪声,所以使用中值滤波器去噪[8]。其次,将采集的图片进行直方图均衡化,使图片中红色更加鲜艳以便后续区域提取。最后,利用红色信息将手写分数提取出来。ROI(region of interest)是指图像中感兴趣的区域,在OpenCV中设置图像 ROI 区域,实现只对 ROI 区域的操作。使用inRange()函数,设置红色在HSV色彩空间的范围值,实现对红色区域(在这种情况下,该区域就称为ROI区域)的提取。试卷计分栏的手写分数是红色,它和周围的颜色差异较大。利用红色信息能够产生基本完整且只包含手写分数的图片。下图3显示了选择出来的ROI区域。

图3 ROI区域

2.2 手写数字轮廓检测

ROI区域选择完成后,就需要把每一个题号下的分数分割出来。有两种常用方法:垂直投影法和连通域法[9]。垂直投影法在分割规则字符时,效果较好,如车牌识别[10]。但手写字符通常不整齐,甚至两个数字字符交错和粘连情况也时有出现。本文主要考虑两位数字粘连的情况。采用垂直投影法,会导致分割不完整或分割错误。连通域的方法是将每个不相连的图像区域标记成一个单独的块,然后对块进行提取,完成手写字符分割。在计分栏中,两个题号距离较远,其下方的手写分数通常是分别写入,不会出现粘连的情况,这就保证了经过连通域计算必然能够将不同的题号下的手写分数提取出来。对于两位数的手写分数,通过对图像膨胀处理,将其作为一个整体提取出来。本文采用的一种连通域算法是轮廓提取算法,在OpenCV中通过函数findContours()实现轮廓检测,在这里只需要检测手写数字字符的外轮廓,因为在后续过程中,利用外轮廓的外接矩形截取出包含手写字符的图片。图4是为检测轮廓而进行膨胀的图片。

图4 膨胀处理后的图片

2.3 轮廓排序

利用python接口的OpenCV库中findContours()函数检测字符轮廓,识别出来的轮廓都存储在一个列表中。但列表中的轮廓排列顺序是混乱的,它和试卷题号不能对应,这导致后续步骤识别出来的结果无法对应到相应的题目。因此,需要对检测出来的轮廓按原来顺序从左到右排序。由于这些图片上的分数在X轴方向差异特别大,因此考虑使用字符轮廓质心坐标对轮廓进行排序。通过使用函数moments()求出每个轮廓的质心坐标,根据质心X坐标从小到大进行排序。在轮廓排序前,其实也需要对轮廓进行筛选,在实际书写中,笔画断开是常有的情况,这时断裂的笔画会被检测成一个轮廓,这样的轮廓是不需要的,而且会对轮廓排序产生严重干扰,因此必须对轮廓进行筛选。通过对检测出来的轮廓面积大小设定一个阈值,从而将所需轮廓筛选出来。图5是待排序轮廓质心x坐标值。

图5 轮廓质心x坐标值

2.4 手写数字图片获取

正确的轮廓已经检测并且筛选出来了,需要根据轮廓外接矩形坐标将包含手写数字的图片截取出来。OpenCV提供了函数boundingRect(),该函数能够获取轮廓外接矩形左上角的坐标值以及该外接矩形的宽和高。根据这些信息,包含完整手写数字的图片就被截取出来了。至此,每个题号下的分数便被收集好了,后续只需要将这些图片转换格式便可以输入LeNet-5网络中进行训练识别了。图6是截取出来的图片。

图6 截取出来的图片

3 LeNet-5神经网络识别

LeNet-5 是Yann LeCun设计出来专门用于识别手写字符的神经网络[11],是一种典型的卷积神经网络模型,该网络包含输入层在内共有八层,每一层都包含多个参数(权重)。C层代表的是卷积层,通过卷积操作,可以使原信号特征增强,并降低噪音。S层是一个下采样层,利用图像局部相关性的原理,对图像进行子抽样,可以减少数据处理量,同时也可保留一定的有用信息。图7为 LeNet-5 的网络结构示意图。

图7 LeNet-5网络结构

本文对LeNet-5做了一些参数调整以提高手写字符的识别准确率,主要的调整有修改batch的大小、learning rate的大小、epoch的值、卷积核的大小和数量、权重数量、神经元数量、激活函数和全连接层神经元数量等。本文需要对0到99做100个分类,故需要将全连接层神经元数量设置为100。

3.1 训练与测试数据集

训练和测试LeNet-5网络需要大量图像数据。本文采用的图像数据集包括来自网络数据集和自建数据集,其中来自网络的数据集大部分用于训练,小部分用于测试,自建数据集全部用于测试。为了将图像数据输入神经网络,都需要将图像格式进行转化,本文使用的图片采用csv(Comma-Separated Values)数据格式[12],该数据文件是一个字符序列,可以由任意数目的记录组成,记录间以某种换行符分割。每条记录由字段组成,字段间的分隔符是其它字符或者字符串。所有的记录都有完全相同的字段序列,相当于一个结构化表的纯文本形式。图8是图像的csv文件格式。

图8 csv文件

3.1.1 自建数据集

自建数据集即从手写分数计分栏中截取出来的图像制作成的数据集。这些截取的图像有一个普遍的问题是图像的尺寸大小不一,这会导致LeNet-5网络难以搭建,尺寸过大的图像过多会导致神经网络计算量巨大[13],因此需要在不损失图片主要信息的条件下将图片处理成相同且较小的大小。本文中将图像尺寸归一为28×28像素。图9为归一化后的图片。

图9 归一化后的图片

3.1.2 来自网络的数据集

从网络上下载的数据集有MNIST database 和Touching Digit (TP) database[14-15]。MNIST手写数字数据库由一个60000个示例的训练集和一个10000个示例的测试集组成,所有图像数据均是手写的1位阿拉伯数字。它是NIST提供的一个更大集合的子集。图片已经被归一化,图像尺寸固定并且图像中的数字居中,图像大小为 28×28像素,均为黑底白字,图10为部分MNIST数据集。由于MNIST数据集只有0-9这样的个位数,而本文还要识别两位数,所以这个数据集还不够。另一个数据集是Touching Digit(TP)数据集,最初由奥利维拉等人创建[16],它包含 2 位、3 位和 4 位粘连字符串的合成数据。图11是数字间粘连的形式[17]。Touching Digit(TP)数据集是一个粘连手写数字字符串数据集,此数据集专门用于训练和测试无分割手写数字识别算法。将TP数据集中2位粘连字符串归一化并且转化为csv格式。图12是归一化的2位粘连字符串TP数据集。

图10 MNIST数据集

图11 数字间粘连形式

图12 归一化的2位粘连字符串TP数据集

最后,将本文所用的数据集分为一个训练数据集和一个测试数据集,其中训练数据集有302793条,测试数据集有81003条。

3.2 参数选取

与LeNet-5网络相关的主要参数有batch、learning rate、epoch。这些参数的不同取值对神经网络的识别效果有显著影响[18].

本文算法测试平台配置为64位Windows 10操作系统,core i7处理器,16GB内存的计算机,爱国者高拍仪,使用Python3编程语言并在 Python 中配置了TensorFlow,OpenCV.

3.2.1 每个参数不同取值的正确率

1)batch的取值

一个batch即为一个数据集批次,每次输入LeNet-5网络的数据个数。训练数据集和测试数据集的数据量很大,如果一次性载入所有样本,计算机内存将会溢出导致死机。将数据集分成一个一个batch便于训练,也可以通过改变batch的大小,提高神经网络的正确识别率。在其它参数不变的情况下,batch取不同的值,所出现的正确识别率和运行时间如表1所示。

表1 不同batch下的训练结果

根据上面数据可知,随着训练集中每批样本数量增多,识别正确率降低,识别时间减少,综合考虑两个因素,本文决定将batch取值为200,这样会使LeNet-5网络在正确率和识别时间之间找到一个平衡点。

2)learning rate(学习率)取值

学习率即神经网络对数据进行学习的速率。在使用梯度下降优化算法时,学习率可以控制梯度下降的速度或者步长,从而为误差函数找到一个最优解。学习率太大会难以找到误差函数的最优解,太小会使误差函数收敛过慢,寻找最优解的过程将十分漫长。

图13 试验效果

在batch=200,其它参数不变的情况下进行算法测试如下表2所示

表2 不同学习率的取值对正确识别率的影响

由上表可知,当学习率为0.01时,训练模型无法收敛。综合考虑学习率应该取0.001。

3)epoch(世代)取值

在训练集上每完整的训练一次称为一个世代,多次训练会提高正确识别率,但是过多的训练会导致神经网络过拟合。

在batch=200,learning rate=0.001,其它参数不变的情况下进行算法测试,结果如下表3所示。

表3 不同epoch的取值对正确识别率的影响

选择在测试集中正确识别率最高的epoch,即epoch=30。

综上所述,当batch=200,learning rate=0.001,epoch=30时LeNet-5网络对测试样本集可以到达最佳识别性能。

3.3 先验信息的辅助识别

LeNet-5网络需要分100个类,为了进一步提高正确识别率,需要给神经网络输入更多信息。对于具体阅卷,一套卷子每个题目的理论总分或者说满分固定,而该题得分不可能超过满分,所以该题识别出来的数字应该有一个范围,这样对于每个题目识别出来的分数的正确率会提高。下面通过具体试验给出说明。

使用500张实际采集的图片进行试验,试验结果如表4所示。

表4 试验结果

由上表可知使用每个题目满分的信息可以提高LeNet-5网络的正确识别率,因此题目满分这一信息可以利用。

3.4 试验效果展示

以下为部分测试结果效果图,正确识别率为 93.20%,如图13 效果图所示。

4 结论

手写数字的计算机自动识别技术有巨大的应用价值,本文以计算机辅助阅卷系统为应用背景,研究了识别试卷计分栏手写分数的算法。本文采用的识别算法是运用LeNet-5神经网络,使用无分割手写字符识别算法。图像预处理环节,本文结合处理对象的特点,通过计算连通域将每个题号下的手写数字作为一个整体提取出来,无需将两位数分割成一位数,从而避免了字符分割效果对识别结果的影响,较好地解决了数字粘连的问题。在字符识别环节,结合本文问题的特点,通过分析和实验的方法,研究了LeNet-5网络中参数值的选取,并根据问题的特点辅助一些先验信息,有效地提高了手写分数的识别准确率,使正确识别率达到 93.20%。

本文算法正确识别率还有待进一步提高,对于满分100的识别还未考虑,对于有错误涂改的情况也未考虑,这些都是今后需要改进的方向。

猜你喜欢

手写字符轮廓
寻找更强的字符映射管理器
我手写我心
OPENCV轮廓识别研究与实践
抓住身边事吾手写吾心
基于实时轮廓误差估算的数控系统轮廓控制
字符代表几
一种USB接口字符液晶控制器设计
消失的殖民村庄和神秘字符
基于集成学习的MINIST手写数字识别
深度学习在手写汉字识别中的应用综述