基于BP神经网络的手写数字识别系统
2020-02-25黄一格张炎生
黄一格,张炎生
(广东海洋大学电子与信息工程学院,广东湛江 524088)
0 引言
随着我国人口逐年递增,公民在填写报表时产生的数据量也在同步上涨,其中大量数据由阿拉伯数字组成。因此,需要采取必要手段将手写数字转化成存在计算机里的文字。传统的做法采用手工录入,这种做法效率低且劳动力成本高。目前,主流的数据录入方法采用光学字符识别(Optical Character Recognition,OCR)技术[1],OCR技术是指将采集得到带有字符的数字图像输入计算机后经过处理,在输出端得到存储在计算机的字符的技术,手写数字识别技术作为OCR技术的一个分支,其研究目的是将人书写在纸上的阿拉伯数字转换为计算机里的数字。由于数据信息主要由阿拉伯数字组成,如:邮政编码、银行票据等,因此处理此类信息的关键技术是手写数字识别技术,所以对该技术的深入研究蕴含着巨大的应用价值和现实意义[2-3]。
本文在此背景下,提出了一种基于BP神经网络的手写数字分类识别模型。该模型在Matlab开发环境下实现[4],训练时间较短,对手写数字的识别精度较高。
1 BP神经网络
BP神经网络是一种采用了BP算法的多层前馈神经网络模型,具备高度的非线性映射能力并且克服了简单感知机的局限性,其拓扑结构如图1所示[5]。隐含层是一个宽泛的概念,它指代了所有介于输入层和输出层之间的中间层,因此其数目可以是一或多个。
BP神经网络的学习过程包括两个阶段:正向传播和反向传播。正向传播时,输入向量从输入层输入,输入数据经过线性组合成为隐含层神经元的输入值,隐含层内包括对输入值的线性组合和非线性映射,随后得到隐含层的输出值,输出层又对隐含层输出值作出类似的运算,最后得到实际输出。反向传播采用BP算法,也称为误差反向传播算法,BP算法实际上是一种根据求导链式法则计算梯度的算法。描述输出误差的数学表达式不统一,通常采用均方误差描述。输出误差反向逐层传递,根据隐含层神经元的误差对连接权值和偏置进行调整,经过一步步迭代后,最终输出误差降至可接受的区间内[6]。
图1 BP神经网络的拓扑结构
2 结合BP网络技术对手写数字识别
手写数字识别系统的总流程如图2所示,该系统由图像处理、特征提取和分类识别3个模块组成[7]。系统的输入端为通过摄像头或其他方式采集得到的原始RGB数字图像,输出端则是对这个原始图像上手写数字的识别结果。
图2 系统流程图
2.1 图像处理
该模块对输入的原始图像进行必要的预处理后进行字符分割[8],以采集得到的原始图像(图3)为例,其经过图像处理模块后效果如图4所示。
图3 原图
图4 图像处理后效果图
2.1.1 灰度转换和二值化
采集的图像通常是RGB彩色图像,也就是说,一幅彩色图像是由红色(R)、绿色(G)、蓝色(B)3种单色图像组成的,需要将RGB图像转化为灰度图像以确保后续操作成功,得到的灰度图每一个像素像在每一个R、G、B分量上具有同等值,将RGB图像进行灰度转化通常采用如下公式:
图像的灰度转换调用gray=rgb2gray(I)函数实现,其中I为彩色图像,gray为灰度图像。其次对灰度图像进行二值化,通过调用函数im2bw()实现。本文采用固定阈值法,阈值的给定要根据底色的灰度值来确定,一般情况下,图像底色灰度值约为120~180,本文将阈值设定为120。
2.1.2 平滑去噪
在非理想情况下,采集的原始数字图像可能掺杂了噪声,此时需要将噪声去除或者削弱其影响,以免对后续步骤造成较大的负面影响。最常见的噪声是椒盐噪声,它在二值图像中表现为在白色的背景中有若干孤立的黑点,或是在黑色的数字中包含白色的孤立点。常用的滤波方法有均值滤波、中值滤波、最大最小值滤波等,但这些方法不能够很好地去除孤立点而且有可能破坏数字的轮廓。本文采用8邻域滤波法,此方法不仅能有效去除孤立点,还能够对字符内空缺白点进行填充,其原理如下:
(1)当二值图像(i,j)处灰度值f(i,j)=0时,而(i,j)位置相邻的8个邻域的灰度值为1时,则令f(i,j)=1。
(2)当二值图像(i,j)处灰度值f(i,j)=1时,而(i,j)位置相邻的8个邻域的灰度值为0时,则令f(i,j)=0。
2.1.3 图像分割
由于分类识别是对每个数字的特征信息逐一识别的,所以要将每一个字符独立分割出来。本文采用如下方法:首先对二值图像进行水平投影,统计出每列白像素点之和,如图5所示。可见,字符之间的缝隙产生了波谷,字符所在列产生了波峰,波峰的区间就是每个字符的左右边界。同理,可以确定每个字符的上下边界,于是便能从二值图像中分割出独立的字符。
图5 各列白像素点之和
2.1.4 归一化
由于分割后每个字符图像的分辨率不同,而后续特征提取步骤要求输出特征向量具有相同的维数,则需要对字符图像进行归一化处理。本文采用大小归一化,就是将实际提取的字符图像通过横纵坐标的比例放缩,得到指定大小的图像。此步骤通过调用函数BW=imresize(I,a×b),在本文中a=14,b=10。调用后可将字符图像变为14×10的规格,采用最近邻插值法。
2.2 特征提取
本文采用逐像素点特征提取法,即直接将图像送入分类器进行分类识别,这种特征提取方法相对简单而且不会因缺少数据而丧失其他特征。逐像素点特征提取法在Matlab中表现为对字符图像进行逐行逐列扫描,将14×10的字符图像矩阵重新排列成140×1的特征向量矩阵,通过调用指令feature=reshape(I,140,[])实现。
2.3 分类识别
2.3.1 初始参数的选取
连接权值的初始值通常选取大小介于[-1,+1]的伪随机数,调用randn()实现;初始偏置设为全0;训练次数为1 000;学习速率η为0.05。
2.3.2 各层神经元数目的确定
本文采用3层BP神经网络,即中间层数为1。输入节点数目取决于特征向量,由于本文训练样本采用14×10的点阵,采用逐像素点特征提取法,因此可以确定输入层神经节点数为140。输出节点数取决于目标向量,由于输出模式有10种可能,本文采用10位数对输出模式编码,所以输出节点数为10。对于隐含层节点数的确定,目前尚无确切的理论依据。节点数太少会导致“欠拟合”现象,识别精度不够;节点数过多会造成“过拟合”现象,虽然拟合精度足够高,但是模型的泛化能力不足。本文选择如下经验公式[9]:
式中:m为隐藏层节点;n为输入层节点;I为输出层节点;α为1~10之间的整数。已知n=140,I=10,令α=1,计算得m≈13。
2.3.3 BP神经网络的学习算法
由于Sigmoid具有单调可微等优良特性,本文的选取Sigmoid函数作为神经元的激活函数,下面给出学习算法步骤[10]。
(1)将连接权值ωji初始化-1~+1之间的伪随机数,偏置值θj初始化为0。
(2)输入训练样本Xk(k=1,2,…,P),期望输出为dk(k=1,2,…,P),对每个训练样本进行步骤(3)到步骤(5)的迭代。
(3)计算神经元的状态和实际输出:
(4)计算输出误差:
(5)修正连接权值和偏置值:
(6)当迭代次数满足要求时,结束。
式中:ωji为前一层第i个神经元到本层第j个神经元的连接权值;okj为实际输出;θj为本层第j个神经元的偏置值;f(·)为激活函数;η为学习率。需要说明,式(4)适用于输出层,式(5)适用于隐含层。
3 实验结果分析
本次实验在Windows10 64bit intel(R) Core(TM)i7-8750H 2.20Ghz CPU 8GB RAM环境下使用Maltab2016a完成。使用100个训练样本对神经网络进行训练,训练时间约为7.5 s,对验证集的识别准确率约为92.5%,再对另外10张手写数字图片进行识别,识别结果如表1所示。
表1 识别结果
可见,对于书写较为简单的数字,如0、1等识别正确率为100%。而较为复杂的数字,如8、6等识别正确率较低。此外,由于不同笔者的书写风格具有差异性,数字的倾斜度也不同;也有笔者书写的数字5、6差别微乎其微。针对上述种种情况,可以考虑采用倾斜度矫正、图像细化的方法以提高识别精度。
4 结束语
本文主要对手写数字识别结合神经网络方法的实现进行了探讨与研究,并且采用MATLAB为开发环境,编写了系统各个模块。本文在BP神经网络基础上结合逐像素点特征提取法设计了手写数字识别系统,该系统主要由图像处理和分类识别两大部分组成。对原始图片进行图像处理是分类识别的前期工作,特征提取是连接图像与神经网络的桥梁。分类识别是整个系统的核心,本文采用具有代表性的三层BP神经网络,在保证识别精度前提下又能保证简短的训练过程,性能较好。手写体数字识别是近年来的研究热点并且应用广泛,特别是脱机手写体数字识别在银行票据认证、成绩自动录入等方面均有用途。