基于深度学习的手写汉字识别算法设计与实现

摘 要
上世纪 60 年代开始,美国 IBM 公司就开始了对印刷体汉字的模式识别研究
工作, 1996 Casey Nag 用模板匹配法成功识别出 1000 个印刷体汉字,掀起
了全球范围内对于手写汉字识别研究的高潮,我国的手写汉字识别研究始于上世
80 年代。近年来随着深度学习新技术的出现,基于深度学习的手写汉字识别
在准确率和性能上都有了突破性的进展,成为手写汉字识别研究的重要手段。本
文基于深度学习框架对中国科学院自动化研究所 (CASIA) 提供的 3755 种脱机手
写体汉字进行识别研究。本文研究的主要内容有:
(1) 深入分析深度学习技术在手写汉字识别领域的应用价值、研究现状以及
面临的主要困难。对目前几个常用的深度学习框架做详细的对比分析,
熟悉并掌握各个框架的优缺点。
(2) 基于 Tensorflow 框架,采用 AlexNet 卷积神经网络,利用中科院自动化
研究所提供的数据集进行卷积神经网络训练,分析训练结果,最终达到
99.42% 的准确率。
(3) 在上述研究的基础上,利用训练得到的卷积神经网络做简单的手写汉字
识别应用,分析其应用结果。
1
绪论
本章主要阐述了手写汉字识别领域的研究背景意义以及面临的困难,并对本
文的内容做了章节安排。
研究的背景和意义
汉字识别的研究是由日本在上世纪 60 年代率先开始,而在上世纪 80 年代国
内也开始了相关研究,因为我国对汉字使用广泛,并且对汉字的理解更加深入,
因此国内对手写汉字的研究更为深刻 [1] 。从采集需要识别的汉字信息来看,识别
方式可以划分为脱机汉字识别和联机汉字识别。联机识别因为有书写的顺序信息
所以更容易识别。脱机识别没有书写的笔画顺序,只能提取汉字的特征信息,因
此更加困难一些。脱机识别 [2] 的方法主要有三类:模板匹配法,特征值提取法和
深度学习法。最早的识别方法是模板匹配法,它是根据将被识别的对象和模板进
行集中匹配,识别出的结果最终取相似度最高的汉字;特征值提取的方法现在相
对使用较为广泛,由提取特征和分类两个部分组成,特征提取是使用某种算法提
取文字图像特征,分类是使用分类器 ( 如支持向量机、 k 近邻算法、贝叶斯分类器
) 对获得的特征值进行分类。深度学习的方法是目前主流也是最有效的方法,
因为深度学习在图像识别邻域中的巨大成就使得它逐渐被应用于更多的图像分
类的工作中,而且也获得了极为良好的表现。脱机手写汉字识别的领域因为有了
深度学习这个方法的加入使其有了更大的发展空间,具有十分重要的意义 [3]
国内外研究现状
80 年代之后,手写汉字识别在我国逐渐兴起,汉字非常特殊,例如种类繁
多,字体极具变化,书写不规范,因为存在这些问题导致手写汉字识别是个非常
有难度的机器学习问题。在中国众多科研工作者的多年努力下,手写汉字识别领
域得到了质的飞跃,尤其是对于单字和单行的汉字识别准确率已经有了极大的提
高,已经达到了 99.90% 的准确率 [4] 。但是近几年来,由于模板匹配法和特征值提
取法的发展空间不足,手写汉字识别获得了深度学习这样一个全新的解决办法,
其中随着卷积神经网络 (Convolutional Neural Network,CNN) ,循环神经网络
(Recurrent Neural Network,RNN) 和深度置信网络 (Deep Belief Network,DBN) 的出
现,手写汉字识别有了很大的提升空间,但是也带来了一些别的问题,例如所需
图像太大,网络层数太深,需要很长的训练时间,所以这方面还需要进一步的研
[5] 。近些年来,传统的字符识别提升空间有限,因此催生出深度学习这个新的
解决办法,大量的实验也证明了,在深度学习技术的支持下,手写汉字的识别率
提升显著,在这样的大环境下,图像识别领域的研究者们使用了各种方式来提高
手写体识别的准确率 [6] 。文献 [7] 采用了弹性网格方向像素的概率分布特征从而获
得样本的特征,获取到的样本特征可以当作极限学习分类器的输入,并且在分类
器的设计上也采用了基于最优投票机制的极限学习机优化算法,利用 OAO(One
Against-One) 或者 OAA(One-Against-All) 的思想降低准确率,即把一个多分类问
题降为多个二分类问题,作者在文献中用少量的样本进行了实验,识别率达到了
94.20% [7] 。文献 [8] 利用粒子群算法找出最优参数,向量机参数选择的困难就可以
解决,最终使用这个方法得到的识别率为 88.66% [8] 。文献 [9] 所提出的一种基于
重要抽样的大规模分类任务判别学习方法,根据贝叶斯分类规则的样本重要性权
重函数对不同权重函数的样本进行了赋值,并且多次计算改进二次判别函数
(MQDF) 的样本重要性权重,这种方法允许二次判别函数在保持较低运算复杂性
的同时也能得到比较高的准确性,并且作者也在三种脱机手写体汉字数据集上进
行了验证,验证了该方法的可行性。文献 [10] 提出了一种基于重要性差异来进行
不同的判别算法,同样由贝叶斯决策规则,从基于距离的识别结果中得到样本重
要性函数,对样本进行加权的依据是扩展识别的可信度,对加权样本进行重新估
计平均向量和协方差矩阵,识别结果为 88.29% 。文献 [11] 提出基于深度卷积神经
网络算法对预处理后的手写体字符图像进行识别研究,采用了弹性形变以及滑动
窗口的方法进行数据集的扩充以便提高模型的泛化能力,防止深度网络过拟合,
作者使用了三种网络融合的方法对五个 CNN 模型进行了融合,结果最好的融合
模型错误率是 5.09% 。文献 [12] 对脱机手写体汉字识别提出了一种基于深度置信
网络融合的网络模型,把文字分为较复杂的汉字字符和较简单的汉字字符,对于
较复杂的字符来说使用深度置信网络模型进行处理,对于较简单的字符使用
softmax 函数分类器进行识别,最终识别率为 90.21% 2011 年由清华大学和中科
院自动化研究所合办的第十一届文档分析与识别国际会议的手写体汉字识别比
赛中,离线汉字手写体识别最高的识别率为 93.01% ,而在 2013 年文档分析与识
别国际会议中富士通团队获得 93.58% 的识别率所使用的就是卷积神经网络的方
法。基于以上对比分析,本论文将采用卷积神经网络的方法来实现手写体汉字识
别。
研究面临的困难
因为有了深度学习的方法,手写汉字的识别率近些年显著提升,但是也带来
了一些问题,例如由于所需图像过大,网络层数过多等原因导致所需的训练时间
过长这类问题,本文对此进行了研究,看能否找出一些比较优秀的解决办法来解
决当前面临的问题。手写汉字识别的主要困难可总结为以下几点 [13]
(1) 书写随意不规范。
(2) 汉字字符比较复杂,极具变换。
(3) 许多汉字在外形上相似度很高,极易混淆。
(4) 原始数据的采集和处理工作量巨大,费时费力。
在手写汉字识别半个世纪的发展历程来看,其发展前景巨大,虽然单个字符
识别已经基本解决,一些深度学习的识别方法的识别率已经可以和人眼媲美,但
是依然有很多方向值得继续提高 [14]
(1) 手写文本行识别问题:例如书写的汉字存在堆叠的情况,使得机器无法
正常识别分割字符,光线的明暗交界处的字符识别困难。
(2) 超大类手写汉字识别问题:汉字的字符种类非常多,需要训练的数据非
常庞大,使得采集大量数据变的困难。
(3) 无约束的手写汉字识别问题:汉字的历史源远流长,毛笔字、钢笔字、
铅笔字等都会表现出不同的效果,笔画的形变、连笔、简写等都会使得
识别起来比较困难。
(4) 不断涌现出新的学习模型在应用中的问题:在深度学习的不断发展的今
天,随时都会有新的深度学习模型出现,人们最常用的模型就有二十八
个,这么多模型的情况下,哪些模型更适合,在应用的时候需要注意哪
些问题,这些都是在应用中的困难。
(5) 在生产生活中的字符识别:工业自动化,车牌识别,图像搜索等,在这
些复杂多样的干扰下正确识别依然十分困难。
主要内容和章节安排
1 章:介绍了深度学习在手写汉字识别领域的应用价值,国内外研究现状
和当前研究面临的困难。
2 章:对深度学习框架进行简单介绍,对比几种框架的优缺点,选择合适
的框架。
3 章:对卷积神经网络做理论方面分析,对其优化理论进行阐述。最后介
绍三个相关的卷积神经网络模型。
4 章:介绍数据集的来源,收集方法,解压方法,并对该数据集进行解析
和归一化处理。基于 AlexNet 模型搭建卷积神经网络,用准备好的数据集进行训
练,对实验成果进行展示,对实验结果进行分析,并且利用训练好的模型进行简
单的汉字识别应用。
5 章:对本文的工作进行简单的总结,对未来值得研究的方向进行展望。
2
深度学习框架介绍
深度学习,就是用多层次的分析和计算手段,得到结果的一种方法,从统计
学的角度来说,就是在预测数据的分布,从数据中学到一个模型,然后再通过这
个模型去预测新的数据,这就要求测试数据和训练数据是同分布,从概念的角度
看,深度学习是在模拟人脑的工作机制,虽然目前还无法得知人脑工作的准确方
式,但是也不妨碍人们模拟人脑的工作方式进行网络设计。深度学习的“深度”
是指从输入层到输出层经历的层次的数目,即隐藏层的数目,层数越多,深度越
深,就可以解决越复杂的问题。深度学习的主流框架有, Pytorch Caffe Tensorflow
Keras ,统计情况如下:
表 2-1 深度学习框架在 GitHub 上的统计
框架
机构
支持语言
Stars
Forks
Contributors
Pytorch
Cal
Python.c++
18165
8865
381
Caffe
BVLC
Python.c++
14956
9282
221
Tensorflow
Google
Python.c++
41628
19339
568
Keras
Fchollet
Python
10727
3575
322
Pytorch 作为最新开发的网络框架,其社区和共享的资源还不是很丰富,对
初学者不是特别友好; Caffe 作为最早出现的深度学习框架,具有清晰高效、训
练速度快、上手容易的特点,但是 Tensorflow 在语音识别,数据预测方面更具优
势。而且 Keras 现在已经和 Tensorflow 合并,成为 Tensorflow 的一个高阶应用程
序编程接口,因此本文主要使用 Tensorflow Keras 进行手写汉字识别的研究。
框架 - Pytorch
Pytorch 2017 年由 Facebook 推出,是一个开源的机器学习库,可以处理
自然语言,具有 GPU 加速的张量计算和自动求导系统。 Pytorch 的优点如下:
(1) Pytorch 的简便性在于,输入某一行代码,系统就只执行那行代码,执行
简单,增加可读性,提高 debug 能力,这样使得 debug 变得很方便。
(2) Pytorch 可以任意改变神经网络,并且是所有框架里最快的。
(3) Pytorch 的代码要简单的多,低层的源代码更易读懂,深入 API 更易理解
低层架构的框架。
局限性:由于开发时间较晚,很多代码开发人员没有从 Tensorflow Caffe
的环境转变过来,因此其社区的人数活跃度和共享代码不是很丰富,因此不太适
合初学者的学习。
框架 -Caffe
Caffe 全称 Convolutional Architecture for Fast Feature Embedding ,是由加利
福尼亚大学伯克利分校的贾扬清博士开发,它是一个 CNN 相关算法的框架,可
以用 C++ Python 实现。 Caffe 由五个组件构成,分别是 Blob Solver Net
Layer Proto
优点:
(1) 清晰、可读性高、快速。
(2) 专精于图像处理。
(3) 给出了模型的定义,训练的权重,方便操作者立即上手。
(4) 代码和参考模型是公开的,这样有利于初学者快速实现模型再现。
局限性:
(1) 不支持网络和语言建模。
(2) 扩展性很差,手动增加网络层较为困难。
框架 - Tensorflow
Tensorflow 支持的语言有, Python C++ Java ,等等,可以处理语言、图
像等数据,其代码模块图如下:
图 2-1 Tensorflow 代码模块图
该图表示了数据的计算过程,每一个运算操作称为一个节点,流动的多维
数组称为张量。此外, Tensorflow 能实现异构设备的分布式计算,在 64 位的
windows Mac os Linux 以及移动平台 iOS Android 上使用。
Tensorflow 的特点在于
(1) 它高度的灵活性,可以自己构建内部循环,定义顺手好用的复合操作。
(2) 可移植性,可以在个人 PC 、台式计算机和各种移动终端上运行,或者想
要将自己训练好的模型应用于手机 APP 上也是可以的,甚至可以运行在
服务器上。
(3) 利用内置高级 API 使用 TensorBoard 进行可视化训练,有助于更快追踪
训练目标和更方便调试程序。
(4) 社区具有更丰富的开源文档,创作者们可以相互学习借鉴,省去了很多
contrib
stream_executor
tensorboard
python
contributor 开发目录
并行计算框架
可视化分析工具,模型可视
化/监控模型参数变化
pythonAPI 客户端脚本
client
common_runtime
Distributed_runtime
framework
graph
kemels
lib
ops
platform
protobuf
public
API 接口实现文件目录
公共运行库
分布执行模块
包含基础执行模块
计算流图相关操作
核心 Op
公共基础库
基本 ops 运算, ops 梯度运算, io
关的 ops ,控制流和数据流操作
OS 系统相关接口文件
.proto 文件,用于数据传输
时的结构序列变化
API 接口头文件目录,用于
外部接口调用的 API 定义
core
Tensorflow
Root
Third_party TF 第三方依赖库
eigen3
gpu
eigen 矩阵运算库, TF 基础 ops 调用
封装了 cuda/cudnn 编程
重复的工作。
框架 - Keras
Keras 最初是以 Theano 为后台,使用 Python 编写,在 2018 年正式成为
Tensorflow 的高阶应用程序编程接口。 Keras 支持的 Python 版本有 Python2.7-3.6
其安装也较为简单,只需要在安装前预装 Tensorflow ,利用
pip install Keras
conda install Keras 即可安装成功。 Keras 的模块功能如图 2-2 所示 。
Theano
Tensorflow
损失函数
优化器
激活函数
性能评估
初始化方法
正则项
约束项
回调函数
序列预处理
文本预处理
图片预处理
后端
网络配置
数据预处理
Keras
模型
序贯模型
函数式模型
常用层
卷积层
池化层
局部连接层
循环层
嵌入层
融合层
高级激活层
规范层
噪声层
包装器
自定义层
网络层
输出
设置参数
格式化输入
图 2-2 Keras 的代码模块图
Keras 的特点在于
(1) 易用性, Keras 高度整合了 Tensorflow ,在功能上更加统一化,操作上更
加简单,调试也更加便利,对程序开发人员十分友好。
(2) 模块性,开发常用的几个模块如:代价函数、优化器、激活函数、以独
立状态存在,开发者可以使用其中的一个或者多个来构建模块。
(3) 易扩展,可以将已有成熟的模板作为例子,加入新的扩展。
由于 Keras 已经成为了 Tensoflow 的一部分,二者不可分割,而 Pytorch
Tensorflow
相比 Tensorflow 在训练可视化方面更有优势。在 Pytorch 出现之前
Tensorflow
已经有了数年的发展,社区人数也更多,优质的资源共享更加丰富。
小结
本章通过对几种常用框架分析比较,可以看出 Tensorflow 的受欢迎程度相对
较高,这主要是由于 Tensorflow 的效率高,迭代更新快,有非常庞大的社区群体,
使得 Tensorflow 很有竞争力,而 Keras 配置环境方便,上手容易,并且由于 Keras
可以在多个不同框架下进行切换,有着更加简洁的 API ,能够大大提高工作效率,
本文将使用 Tensorflow Keras 框架进行手写体汉字识别。
3
卷积神经网络的介绍
本章对卷积神经网络进行介绍,并且对优化理论进行分析,最后举例描述典
型模型。
卷积神经网络的简介
卷积神经网络 (Convolutional Neural Networks CNN) 是一种具有卷积运算能
力,并且具有深度结构的前馈神经网络,是深度学习算法中的一种,主要被应用
于图像识别、物体识别、行为认知、姿态估计、神经风格迁移等 [16] 。卷积神经网
络是仿照人脑对于图像和声音的识别、学习机制所设计的,训练形式有监督学习
和非监督学习两种。 AlexNet 结构作为具有代表性的卷积神经网络结构,可以得
到卷积神经网络普遍具有的结构。
图 3-1 AlexNet 结构示意图
由上图可以看到,卷积神经网络的工作概况是,一张图片输入网络后进行多
层卷积运算,图片的尺寸由长和宽较大,厚度很薄的“薄片”变成厚度较厚,长
和宽较小的“长方体”,换算为许多神经元组成的平铺结构,最后由一个分类器
对这个“长方体”进行分类,得出识别结果 [17]
以文字识别举例来说,如果想让计算机可以准确判断常用的 3755 个汉字,
那么每个汉字要事先准备好上百个同样的汉字,都贴上标签,进行上万次的训练。
每一张图片输入到计算机中,计算机会根据得到的内容进行学习,从而得出一个
答案。这个答案和标签对比后可能是正确的,也可能错误,但是都有价值。尤其
识别错误的时候,计算机可以学习错误的经验,即对比识别出的错误答案和真实
答案,找出其中的差别。将这个差值反向传输到神经网络中,对其神经元进行微
调,这样在下次识别的时候准确率就会有所提升,这就是神经网络学习的精髓。
这样千万次训练神经元后,累加下去准确率就可以有大幅度的提升,接下来再输
入图像时就可以很轻松的识别出汉字了。
卷积神经网络的结构
神经网络结构包括输入层,隐藏层和输出层,其中输入层是指直接接收到信
息数据的层,数据可以是图像,声音等;隐藏层包括卷积层、池化层、全连接层,
其作用是将输入的信号进行处理;输出层是将数据处理之后所得出一些结论,并
且输出。下面对隐藏层的相关理论进行阐述。
( ) 卷积层
卷积层,卷积运算是在原始图像上覆盖一个卷积核,卷积核中相同位置的参
数和图像中对应位置的参数相乘最后累加起来作为新的图像,平移卷积核用来获
得图像上的特征。其中某层卷积层通常是由多个卷积核组成,卷积核中的参数是
由反向传播算法优化所得。卷积运算的目的就是为了提取特征值,为进一步的特
征提取做准备。
卷积层的相关参数 ( RGB 图像为例 )
下标字母所代表的意义: H 代表样本高度, W 代表样本宽度, C 代表样本的
通道数
f[l] :当前层滤波器的维数
p[l] :当前层的填充维数 (p=padding)
s[l] :当前层的卷积步长
n[l] :当前层的样本维数
注:输入样本通道数必须等于滤波器的通道数,即 f C =n C
输入维度: n n n H l W l C l [ 1] [ 1] [ 1]
    
输出维度:
滤波器维度:
[ ] [ ] [ ]
l l C l
f f n
 
[ ] [ ] [ ]
H l W l C l
n n n
 
输出图像的高、宽、通道数:
因为图像经过滤波器之后会变小,所以可以通过增加边缘维数来达到不损失
图像大小的作用,即:
经过推导得:
(3-1)
若不考虑图像大小的变化,则可将 p 设为 0
由以上公式可得,在数量上滤波器的数量和输出图像的通道数相等。
卷积运算起到了提取数据特征值的功能,从左到右,从上到下,每一步卷积
操作处理一小块样本,一张图片全部卷积完后得到新的特征图用来作为下一层的
输入,由输出图像和输入图像的代数关系可得,传输到下一层的图像是取决于当
前层的过滤器大小、个数、步长、是否使用填充来决定的。由公式 3-1 得,当填
充为 0 时,当前层输出图像的尺寸必然小于输入图像的尺寸,当填充为 1 时,输
出图像的尺寸和输入图像的尺寸相等。
图 3-2 padding=1
1
0
1
0
1
0
1
0
0
0
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
0
1
1
0
0
0
0
0
0
4
2
3
3
4
2
4
3
4
CONV
Image
Convolved Kernel
Convolved
Feature
图 3-3 padding=0
( ) 池化层
[ ] [ 1]
l l
n n
p f   ( 1) / 2
[ ] [ 1] [ ] [ ] [ ]
( 2 ) / 1
H l H l l l l
n n p f s
   
 
 
[ ] [ 1] [ ] [ ] [ ]
( 2 ) / 1
W l W l l l l
n n p f s
   
 
 
[ ] [ 1] [ ] [ ] [ ]
( 2 ) / 1
C l C l l l l
n n p f s
   
 
 
1
0
1
0
1
0
1
0
0
0
1
1
1
1
0
1
1
1
1
1
1
1
1
1
1
0
1
1
0
0
0
0
0
0
4
2
3
3
4
2
4
3
4
CONV
Image
Convolved Feature
Convolved Kernel
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
3
1
1
1
1
1
3
2
2
1
1
2
2
池化层的作用是在保持最显著的特征不变的情况下压缩数据量,去掉一些不
重要的样本,来减少计算量。通常采用的是最大池化。
池化的超参数:
f :过滤器大小
s :步长
常取 f=2 s=2 ,由于最大池化是取池化区域下方特征图像的最大参数,并且
步长为 2 ,使池化后新图像的尺寸其高度和宽度减半。此外一些参数的设置需要
考虑使用的是最大池化还是平均池化,需要通过手动设置。图 3-4 为最大池化示
例。
图 3-4 最大池化过程
( ) 全连接层
全连接层 (Full Connection FC) 在卷积神经网络中通常处于最后几层,其作
用可以看作分类器,简单来说就是将前面层换算为许多神经元组成的平铺结构,
在处理平铺结构的时候,将某一层中每一个神经元视为一个多项式,那么某一层
的全部神经元可以组合成为一个多项式函数,这个函数用来模拟光滑函数,这样
可以用来拟合数据。假设类别数为 n ,样本
a 经过卷积和池化运算提取特征后,
全连接层的输入为展平的
m 维向量
,输出为 n 维向量
1, 2, 3, ,
x x x xm
经过2×2的最大池化
1
5
7
2
4
3
3
3
7
6
2
2
4
5
6
6
7
4
7
6
特征图像
池化后的图像
1, 2, 3, ,
a a a an
图 3-5 全连接层
x 为输入, a 为输出:
写做向量形式为:
即:
(3-2)
卷积神经网络的优化理论
(一) Softmax 分类器
Softmax 分类器可以处理两个或两个以上的分类问题,尤其是在多分类或
超大分类问题如手写数字和汉字分类问题上具有很好的效果,也可以应用于姿态
识别、行为认知、物体识别等方向。假设有 f 类的不同取值,训练集为
{(x1,y1),(x2,y2),(x3,y3),…,(xm,ym) ,为 {0,1,2,…,f-1} x 为输入, y 为输出, p(y=j|x)
表示输入属于其中某一类的概率,对于特定的输入,需要估算出输入的每一种分
类结果出现的概率,那么可以假设函数输入一个 n 维向量,对应表征分类结果出
现的概率。假设函数形式如下:
x1
x2
x3
a1
a2
a3
.
.
.
.
.
.
xm
an
1 11 1 12 2 1 1
2 21 1 22 2 2 2
1 1 2 2
* * ... *
* * ... *
* * ... *
m m
m m
n n nm m n
a w x w x w x b
a w x w x w x b
an w x w x w x b
    
    
    
*
a w x b  
1 11 12 13 1m 1 1
2 21 21 22 2m 2 2
1 n2 n3 nm
w w ... w
w w ... w
*
... ... ... ... ... ... ... ...
w w ... w
n n m n
a w x b
a w x b
a w x b
       
       
       
 
       
       
       
(3-3)
为了简化公式,同时表示出预测函数,令
,则向量
变为
,预
测函数为:
( ) (i)
( )
( ) ( )
1 1
( )
( ) ( )
0 0
;
|
T
T
j
T
T
j
x i
j x i
f f
x i
j x i
j
i
j
e e
e e
p y j x
 
 
 
 
 
(3-4)
( ) 损失函数
损失函数也称为代价函数,是将一个随机事件或者随机变量的取值投影到一
个正实数上,用于表示这个随机事件或者随机变量出现的“风险”或“代价”。
损失函数和
损失函数来表征估计值和观测值的差异,
损失函数将预测
值和真实值之间做了绝对值,因此偏离的真实值不敏感,有利于模型的稳定。
损失函数将预测值和真实值之间做了差值的平方,这样对于偏离预测值的输出惩
罚很大。
(3-5)
(3-6)
( ) 激活函数
激活函数在卷积神经网络中的地位相当于极限在高等数学的地位,如果没有
激活函数,那么所有的网络节点都是线性组合,那么就无法拟合任意函数,相当
于没有隐藏层,网络几乎起不到训练的效果。当有了激活函数后,各个节点相对
于上层节点才有了非线性的输出,才可以用非线性网络无限逼近任意函数,这样
的网络才具有训练价值。激活函数有很多种类,例如 Sigmoid 函数、 tanh 函数、
Relu 函数等。
Sigmoid 函数:
函数表达式为:
i i
 
i
i
 
L 1
L 2
L 1
L 2
1
2
( )
( )
( ) (i)
( ) (i)
( )
( )
1
( ) (i)
( )
( 1) | x ;
( 2) | x ;
1
( )
...
...
( ) | x ;
T
T
i
T
j
T
f
x i
i
i
x i
x i
f
j
i
x i
e
p y
p y
e
h x
e
p y f
e
 
 
 
 
 
 
 
 
 
 
 
  
 
 
 
1
ˆ
ˆ
:
L loss L
(y,y
)=w( )|y-y|
2
ˆ
ˆ
:
L loss L
2
(y,y)=w( )(y-y)
(3-7)
x 为正无穷大时,输出 f 从小于 1 的地方无限接近 1 ,当 x 为负无穷大时,
输出 f 从大于 0 的地方无限接近 0 。将输出限制在 0-1 这个连续的范围内,这样
容易出现梯度爆炸和梯度消失的问题,并且解析式有指数运算时,计算机很难求
解,因此近些年这个函数已经不怎么使用了。
tanh 函数:
函数表达式为:
x
( )
x
x x
tanh x e e
e e
(3-8)
其函数图像如图 3-6
图 3-6 tanh 函数
tanh 函数是将输出限制在 1 1 之间的连续函数。
Relu 函数:
函数表达式为:
( )
0,
Relu max x
(3-9)
其函数图像如图 3-7
图 3-7 Relu 函数
-x
( ) 1
1+e
f z
1.0
0.7
0.5
0.2
5
10
-5
-10
-0.2
-0.5
-0.7
-1.0
tanh x
6
4
2
2
4
6
0
-2
-4
-6
Relu x
对于卷积神经网络,通常使用的激活函数为 Relu ,对于循环神经网络,通常
使用的激活函数为 Relu tanh
( ) 重叠池化 (Overlapping Pooling)
重叠池化和一般池化不同,一般池化的过滤器尺寸和步长相等,因此池化的
区域是不重叠的,如图 3-8 。但是重叠池化的步长小于过滤器的尺寸,例如过滤
器尺寸为 5*5 ,步长为 2 ,这样池化的时候就会出现池化重叠区域,这样做的好
处在于可以降低过拟合的概率。
图 3-8 普通池化
( ) 局部归一化 (Local Response Normalization)
归一化是将一个有量纲的表达式变换为一个无量纲的表达式,在于将数值绝
对值关系变换为相对值关系,可以简化计算,而局部归一化是指将临近的数据进
行归一化处理,同时可以利用被激活的函数来抑制相邻函数。局部归一化是一项
降低有效错误率的手段之一。
min( 1, /2)
2
, , ,
max(0, /2)
/ ( ( ) )
N i n
i i j
x y x y x y
j i n
b a k a
 
 
 
(3-10)
卷积神经网络模型举例
1
7
9
5
池化(取最大值或平均值)
LeNet-5 模型:
图 3-9 LeNet-5 手写数字识别
3-9 所示为一个
32*32*1 的图像,第一层为卷积层,其卷积核的尺寸为
5*5 ,步长为 1 ,在这样
6 个相同的卷积核进行特征提取运算下,由卷积核个数
和输出图片维数的关系可得,输出的图片的维数为 6 ,由卷积运算的特性可得输
出图像尺寸为 28*28 。这个图像经过平均池化,池化的超参数中过滤器尺寸为 2*2
步长为 2 ,相当于图像的长和宽都是之前的一半,得到 14*14*6 的图像。下一层
为卷积层,卷积核的尺寸为 5*5 ,步长为 1 ,输出的图像由卷积的相关性质得
10*10*16 。再经过一个平均池化,池化过滤器的超参数:过滤器尺寸 2*2 ,步长
2 ,图像的长度和宽度分别减半,输出为 5*5*16 。通过计算可以得到全连接层
的每一层由 400 个节点构成,取出部分节点作为一个全连接层,由分类器函数输
( 分为 0-9 10 ) ,看是十种类型中的哪一个。因为在卷积运算中没有使用“补
边”的方式,因此图像随着卷积算法过滤器的作用图像大小一直缩小 [18] 。现在深
度神经网络都是以 LeNet 模型为基础,在此基础上逐渐加深。
5×5
s=1
avg pool
f=2
s=2
5×5
s=1
32×32×1
28×28×6
14×14×6
10×10×16
f=2
s=2
avg pool
5×5×16
FC
FC
.
.
.
.
.
.
y
120
84
VGG-16 模型
图 3-10 VGG-16 识别模型
3-10 所示,输入为 227*227*3 的一张 RGB 图像,首先经过 64 个卷积核
进行两次卷积运算,由卷积核和输出通道数的关系得知,输出为 64 通道,其中
卷积核的尺寸为 3*3 ,步长为 1( 因为所有的卷积核尺寸都为 3*3 ,步长为 1 ,为
了描述简单,以后不详细说明尺寸和步长是多少 ) ,得到图像尺寸 224*224*64
接下来对图片进行池化操作,池化的超参数为:池化过滤器尺寸为 2*2 ,步长为
2( 因为所有的池化超参数都一样:池化过滤器尺寸为 2*2 ,步长为 2 ,为了描述
简单,以后不详细说明尺寸和步长是多少 ) ,得到长度和宽度都减半的图像即
112*112*64 。然后对此图像进行卷积运算,使用 128 个相同的卷积核,进行两次
卷积运算,采用有补边的方式,故图像长度和宽度没有减小,为 112*112*128
在这个基础上对图片使用池化运算,故长度和宽度都减半,尺寸为 56*56*128
然后使用
3 次同样的 256 个卷积核,并且使用补边的方式,则图像尺寸变为
CONV 64 ×2
pool
CONV 128 ×2
227×227×3
224×224×64
112×112×64
112×112×128
pool
56×56×128
56×56×256
Pool
28×28×512
CONV 512×3
pool
14×14×512
CONV = 3×3 s = 1
Max pool = 2×2 s = 2
CONV 256 ×3
28×28×256
CONV 512×3
14×14×512
pool
7×7×512
F
C
F
C
Softmax
1000
56*56*256 。后面跟着一个池化层,图片尺寸变为 28*28*256 ,这层结束后进入一
个卷积层,卷积核的个数为 512 个,图像尺寸变为 28*28*512 。后面跟着一个池
化层,图像尺寸为 14*14*512 。接下来重复进行卷积运算,跟着的池化层使得图
片尺寸变为 7*7*512 ,成为一条多个神经元组成的“平铺”结构,经过两个全连
接层,被 softmax 激活,从而实现分类 [19]
AlexNet 模型:
图 3-11 AlexNet 图像识别模型
3-11 所示,输入为一个 227*227*3 的三通道 RGB 图像,图像经过第一个
卷积层尺寸变为 55*55*96 ,此卷积层是由尺寸为 11*11 ,步长为 4 96 个卷积
核构成。接下来由尺寸为 3*3 ,步长为 2 构成的最大池化层,图像变为了 27*27*96
然后由卷积核的数量为 256 ,尺寸为 5*5 ,使用补边的方式构成一个卷积层,图
像变为 27*27*256 。后面跟着一个尺寸为 3*3 ,步长为 2 的最大池化层,使得图
片变成了 13*13*256 。然后再使用一个卷积层,其卷积核的数量为 384 ,采用补
边的方式,使得图像变为 12*12*384 。接下来卷积层中卷积核的数量为 256 ,接
着通过一个最大池化层,将图片变为 6*6*256 。最后通过三个全连接层,三层神
经元的数量分别为 9216 4096 4096 ,最后输出被一个 softmax 函数分类为 1000
11×11
S=4
Max pool
3×3
S=2
5×5
Same
227×227×3
55×55×96
27×27×96
27×27×256
f=3
S=2
Max pool
13×13×256
F
C
.
.
.
3×3
Same
13×13×384
13×13×384
13×13×256
3×3
Max pool
3×3
S=2
6×6×256
=
.
.
.
F
C
.
.
.
FC
FC
Soft max
1000
9216
4096
4096
[20]
小结
本章在训练模型前简单介绍了卷积神经网络的结构和优化理论,针对经典卷
积神经网络的几个模型进行了举例介绍,分别介绍其网络结构的构成方式。
4
基于 CNN 的手写汉字识别
本章对手写汉字数据集进行处理,对手写汉字识别的设计方法进行阐述,对
实验过程及结果进行分析,最后简单的汉字识别应用。
实验平台
本文脱机识别所用的设备是台式机,设备的主要配置如下表。
表 4-1 设备的主要配置
CPU
Core intel i9-7900
主板
华硕 X299-A (支持 4 块显卡)
显卡
影驰 1080Ti 10G 显存
内存
金士顿 16G 2400
硬盘
影驰 240G 固态 +WD 2T 硬盘
电源
长城 1250W (全模组电源)
系统环境
tensorflow2.0—GPU
本实验使用了 Tensorflow Keras 深度学习框架和 python 语言,使用 Pycharm
开发工具。
Tensorflow 的安装和环境的搭建
1.
安装 anaconda3
2.
安装 tensorflow-GPU
conda create –name tfx python==3.6.8
conda activate tfx
pip install tensorflow-GPU ==2.0 –i http://pypi.tuna.tsinghua.edu.cn./simple/
3. pycharm 配置环境:
新建项目→选择
conda environment →选择 python3.6.8 →添加 python interpreter
→确定
实验数据集
( ) 数据集的介绍
本文所使用的数据集是由中国科学院自动化研究所 (CASIA) 建立的离线手
写汉字识别数据集,数据集的统计数据如下表所示。
表 4-2 手写体字符统计
Dataset
Writers
Total
Symbol
Chinese/class
HWDB1.0
420
1,680,258
71,122
1,609,136/3,866
HWBD1.1
300
1,172,907
51,158
1,121,749/3,755
HWDB1.2
300
1,041,970
50,981
990,989/3,319
Total
1020
3,895,135
173,261
3,721,874/7,185
由表 4-2 可以看到 CASIA-HWDB1.1 的总量较小,有 1172907 个,分类数量
居中,有 3755 类。 CASIA-HWDB1.1 数据集总体的数据量较小,但是每个字依
然有 300 名书写者,这样有利于作为研究使用,其中测试集和训练集的比例为 1
4 ,平均每个字的测试集有照片 60 张,训练集有 240 张,总计训练集 940800 张,
测试集 235200 张。离线数据集的收集过程:不同书写者的书写同一个汉字库,
将这些汉字图片扫描成分辨率为 300DPI 的彩色图片,之后将每个字都独立分割
出来,每一个字都加上特定的注释标记并且进行编号。图像的背景像素为 255
前景像素为 0-254 的灰色等级,如果将这些图片的背景像素设为 1 ,前景像素设
0 ,就可以得到对应二值化后的图像,这就是采集原始图片后的处理方式。
( ) 数据集的解析
中科院自动化研究所提供的数据集是 trn_gnt.zip 格式,解压之后是 gnt.alz
格式,得到的文件夹里面包含了 3755 个常用汉字,每一个文件夹都有 300 张同
样的汉字,每个汉字都是由 300 名书写者书写。因为书写的汉字高度和宽度都不
同,后续对图片的处理和训练都会受到影响,而手动调节图片大小工作量太大,
因此可以利用 Python 直接将 gnt 格式解析为 png 格式,并且将所有图片的长度
和宽度都设为长宽一致,便于后续的训练,解析结果如图 4-1 4-2 4-3 4-4
4-5
图 4-1 解析前训练集的格式
图 4-2 解析前测试集的格式
图 4-3 解析后训练集的图片
图 4-4 解析后测试集的图片
图 4-5 长宽一致处理后的图片
网络设计
AlexNet 模型有 8 层,其中有 3 层为全连接层, 5 层为卷积层 ( 卷积层的概念
并不是只有卷积运算,而是每一个卷积层中都包含有卷积、池化、 Relu 和归一化
的操作 ) 。图像输入后先经过 5 层卷积,后经过 3 层全连接层,最后一层全连接
层输出传递给一个 softmax 函数,使其做出分类。
AlexNet 模型结构如图 4-6
图 4-6 AlexNet 模型
逐层解析如下。
第一层 ( 卷积层 ) 如图 4-7
处理流程为:卷积→ Relu →池化→归一化
图 4-7 卷积层
tf.keras.layers.Conv2D
(filters=48,kernel_size=(11, 11),strides=4,padding="valid",
activation=tf.keras.activations.relu,input_shape=(224, 224, 3))
tf.keras.layers.MaxPool2D
(pool_size=(5, 5),strides=2,padding="valid")
tf.keras.layers.BatchNormalization()
第二层 ( 卷积层 ) 如图 4-8
图 4-8 卷积层
处理流程为:卷积→ Relu →池化→归一化
tf.keras.layers.Conv2D
(filters=128,kernel_size=(5,5),strides=1,padding="same",activatio
n=tf.keras.activations.relu)
tf.keras.layers.MaxPool2D
(pool_size=(3, 3),strides=2,padding="same")
tf.keras.layers.BatchNormalization()
第三层 ( 卷积层 ) 如图 4-9
图 4-9 卷积层
处理流程为:卷积→ Relu
tf.keras.layers.Conv2D
(filters=192,kernel_size=(3, 3),strides=1,padding="same",
activation=tf.keras.activations.relu)
第四层 ( 卷积层 ) 如图 4-10
图 4-10 卷积层
处理流程为:卷积→ Relu
tf.keras.layers.Conv2D
(filters=192,kernel_size=(3, 3),strides=1,padding="same",
activation=tf.keras.activations.relu)
第五层 ( 卷积层 ) 如图 4-11
图 4-11 卷积层
处理流程为:卷积→ Relu →池化
tf.keras.layers.Conv2D
(filters=128,kernel_size=(3,3),strides=1,
padding="same",activation=tf.keras.activations.relu)
tf.keras.layers.MaxPool2D
(pool_size=(3,3),strides=2,padding="same")
tf.keras.layers.BatchNormalization()
第六层 ( 全连接层 ) 如图 4-12
图 4-12 全连接层
处理流程为:卷积 ( 全连接 ) Relu Dropout
tf.keras.layers.Flatten()
tf.keras.layers.Dense(units=2048,activation=tf.keras.activations.relu)
tf.keras.layers.Dropout(rate=0.2)
第七层 ( 全连接层 ) 如图 4-13
图 4-13 全连接层
处理流程为:全连接→ Relu Dropout
tf.keras.layers.Dense(units=2048,activation=tf.keras.activations.relu)
tf.keras.layers.Dropout(rate=0.2)
第八层 ( 全连接层 ) 如图 4-14
图 4-14 全连接层
处理流程为:全连接
tf.keras.layers.Dense
(units=NUM_CLASSES,activation=tf.keras.activations.softmax)
实验过程及结果
搭建模型完成后进行网络训练,其训练过程的损失指和准确率的变化过程通
Tensorboard 展示如下:
图 4-15 训练集的损失值和准确率图像
训练集的损失值随着步数的逐渐增加光滑减少,最终在步数为 29 步的时候
减少到 8.739% ,训练时间为 16h32m ;准确率均匀上升,在 29 步时达到了 97.64%
测试集的准确率和损失值如下图:
图 4-16 测试集的损失值和准确率图像
测试集的损失值在不停的波动,整体来看有一个向下降的趋势,但是到 20
步后会有一个明显的上升,最终在 29 步的时到 1.687 ,而准确率在波动中稳定上
升到 73.70% ,这表明训练中出现了过拟合。从这两幅图像中可以看到,测试集
的准确率最终为 73.70% 。在前期学习过程中发现采用经典 AlexNet 网络模型时
有些图像数据的输入太小会导致训练过程中的准确率大打折扣,因为输入图像经
过卷积运算后会损失掉一大部分数据,导致训练准确率不高,考虑到每次输入图
像数据的数量也会对训练结果造成影响,按照常规思维输入数据越少计算机处理
越快,见表 4-3
表 4-3 一次输入数据个数对准确率的影响
一次输入数据个数
训练时长
测试准确率
1000
/
/
200
9h16m
62.3%
100
4h11m
73.7%
32
5h39m
99.42%
10
8h44m
71.9%
可见并不是一次输入数据越少计算机处理越快,测试准确率越高,而是有一
个最佳的值,当一次输入数据为 1000 时直接溢出,程序无法运行,如果一次输
入数据太小会使得占用计算机 CPU 内存太多导致训练效率太低。因为训练后的
准确率较低,无法达到令人满意的结果,分析原因后进行调试与修改,由于第一
次的训练为了效率更高,人为的将轮数设置偏低,因此改进的时候轮数是第一个
想到要增加的,而查阅资料后发现通常输入数量为 2 的次方数,而且 64 这个数
字是被采用次数最多的,此外卷积层和池化层对于训练时长的影响是最大的,为
了做卷积运算的时候图像尽可能的不损信息,在卷积运算时采用补边的方法,为
了缩短训练时长,同时增加图像的尺寸,将最大池化的过滤器尺寸缩小为 2*2
步长设为 2 。改进的方法最终确定为:
(1) 将训练轮数设为 50 轮。
(2) 将单次输入数据的个数由 100 缩小为 32
(3) 将图片尺寸调整为 64*64*1
(4) 第一层卷积核的数量加倍,第二层卷积核的数量同样加倍,第三层的卷
积核个数减少为 256 ,在第五层卷积层后增加两个相同的卷积层。
得到新的训练和测试结果如下:
图 4-17 改进后的训练损失值和准确率图像
图 4-18 改进后的测试损失值和准确率
最终测试集的准确率为 99.42% ,相较于传统方法获得了一个比较令人满意
的结果,表明深度学习的方法在处理手写体识别领域具有很好的优势,虽然前
期实验使用的经典 AlexNet 模型得到了一个较为低的准确率,但是通过分析研
究得到了一个优化的 AlexNet 模型,并且得到了 99.42% 的准确率,前期实验使
用的卷积神经网络只有 8 层,属于轻度神经网络,改进之后的卷积神经网络有
10 层,并且对训练轮数进行了适当增加,减小单次输入的图像数量,卷积运算
的相关参数进行调整,增加池化层,同时使用了补边的方式使得卷积后的图像
没有损失,因此识别率就有了大幅度的提高。此外还获得了两幅很特别的图
像:
图 4-19 准确率、损失值和步数的关系
这两幅图表现了测试集的准确率和损失值随着迭代步数的变化规律,准确率
和步数之间有着明显的正相关,而损失值也在步数逐渐增大的情况下,损失值和
波动明显减小,当步数达到 26 步之后测试集就能得到一个很低的损失值和准确
率,并且没有发生过拟合。
实验结果分析
( ) 实验结果
本文采用了中国科学院自动化研究所提供的手写汉字数据集,基于 AlexNet
网络进行神经网络训练,得到了 73.70% 的识别率,后经改进单次输入数据数量、
增加训练轮数,修改部分卷积层的参数有效提高了识别率,最终识别率达到了
99.42%
4-4 为相关文献采用相同和本文相同的样本数据得出的最终识别率。
表 4-4 与其他文献的实验结果对比
文献
样本数据
accuracy
文献 [6]
CASIA-HWDB1.1
92.73%
文献 [7]
CASIA-HWDB1.1
94.20%
文献 [8]
CASIA-HWDB1.1
88.66%
文献 [9]
CASIA-HWDB1.1
92.45%
文献 [11]
CASIA-HWDB1.1
90.00%
文献 [12]
CASIA-HWDB1.1
90.21%
文献 [14]
CASIA-HWDB1.1
94.77%
文献 [15]
CASIA-HWDB1.1
91.89%
本文方法
CASIA-HWDB1.1
99.42%
4-5 使用的是中国科学院自动化研究所提供的均为单通道的数据集
CASIA-HWDB1.0-1.2
网络结构: LSTM Bi-LSTM VGG-16 HCCR-Net AlexNet
图像尺寸: 32*32 48*48 64*64
对比结果如下:
表 4-5 各网络模型实验结果
网络
输入尺寸
通道
epochs
t/epoch
accuracy
LSTM
32*32
1
100
50s
78.06%
Bi-LSTM
32*32
1
100
72s
85.25%
VGG-16
48*48
1
100
182s
87.62%
HCCR-Net
32*32
1
100
272s
94.58%
本文方法
64*64
1
32
266s
99.42%
( ) 实验分析
本文采用了经典的 AlexNet 模型为基础训练卷积神经网络,通过不断搭建模
型调整模型参数,达到了预期的效果,最终识别率达到了 99.42% 。在调试过程
中发现卷积层的数量和池化层的数量对训练的时间影响较大,但不是层数越多准
确率越高,而是需要选择合适的数量才能提高识别率,因为池化层算法的特殊性,
适当增加池化层反而会缩短训练的时间,一次输入数据的数量也尤为重要,当一
次输入数量太大时,运行的过程非常缓慢,因为 CPU 内存容量无法支持庞大的
数据计算,这样会出现局部最优的情况,训练的精度难以达到满意的程度,并且
效率很低,训练时间大大增加。如果一次输入数据太小,虽然内存容量充裕,但
是这样迭代一次所花的时间更多,模型不容易收敛,因此一个合适的单次输入数
据量对于训练模型非常重要,既可以提高训练速度,又能减小模型震荡。为了更
加直观的体现出识别手写汉字的效果,本文利用所训练的卷积神经制作了一个应
用脱机识别的代码,将手写体汉字识别出来。
汉字识别的应用
准备工作:读取需要识别的图片 Cv2.imread ,调用 measure(src) 处理图片。
首先得到输入汉字图片,汉字左上角位置的横坐标和纵坐标,文字的颜色,文字
的尺寸, isinstance 函数的作用是判断对象,和已知类型比较,如果属于已知类
型,那么函数会返回一个 true ,如果不属于已知类型,那么函数会返回一个 false
因为日常生活中的图片都是 RGB 三通道图片,为了识别更加快速,需要把三通
道转化为单通道的灰度图。对输出文本的设置:输出字体格式、输出字体大小、
编码格式、文本框左上角坐标、文本的颜色、文本字体的设置。
图像处理:使用高斯模糊 cv.GaussianBlur , 将 RGB 转为灰度图
cv.COLOR_RGB2GRAY ,进行二值化处理 cv.threshold ,截取一个 3*3 的矩形
cv.dilate(thresh,kernel) ,处理找到图像的轮廓 cv.findContours ,得到轮廓外接矩形
的左上角坐标, (x1,y1) ,高度和宽度, y1=y1+h1,x1=x1+w1 得到 ROL 区域,将
图片翻转 cv2.bitwise_not(img) ,储存到指定位置,调用 restore.chineseRecognize
函数识别指定路径的图片,调用 cv2lmgAddText 函数显示中文 ( 因为 opencv 无法
直接显示中文 )
( ) 识别结果
待识别的汉字:
图 4-20 unrecognized image
识别结果:
图 4-21 recognized image
待识别的汉字:
图 4-22 unrecognized image
识别结果:
图 4-23 recognized image
待识别的汉字:
图 4-24 unrecognized image
识别结果:
图 4-25 recognized image
( ) 识别中的问题
在识别测试集的过程中,核心是识别的算法以及神经网络结构的训练,而测
试集的汉字在获取的时候已经得到了一个比较好的处理结果,这一部分在 4.4
已经有了一个不错的准确率,但是要现场识别一个字或者一行字的时候,最重要
的是对采集到的图像进行预处理,不同的处理方法适合于不同的网络结果,需要
进行选择,而且现实场景下的图片变化很多,这样选择处理方法十分关键,数据
的预处理越好,识别的准确率就越高,如果对于数据的预处理没有做好的话,识
别起来就会遇到很多的限制,例如:
1.
拍照时光线的强弱不同会导致图片进行二值化处理后无法将背景和前景
清晰的分离出来导致识别失败,如图 4-26
图 4-26
从这幅图片可以看到两个字的光线明暗程度不同,尤其是右边的汉字处于光
线不均匀的地方,导致对图片二值化处理出错,没有识别成功。
2.
单个字间隔太大会被拆分为多个部分识别,如图 4-27
图 4-27
3.
字与字之间间隔太小导致堆叠会无法正常分割出单个字来,从而导致识
别错误,如图 4.28
图 4-28
4.
书写的时候形近字容易识别错误,如图 4-29
图 4-29
小结
本文采用中科院自动化研究所的脱机手写体数据集为研究对象,使用了经典
AlexNet 模型为基础训练卷积神经网络,通过不断搭建模型调整模型参数,达
到了预期的效果,最终识别率达到了 99.42% 。实验使用了准确率作为评价标准,
在查阅其他相关论文后发现,不同的网络结构准确率相差很大,总体来看,双向
LSTM 的识别率相对高于单向 LSTM 的识别率。本文使用的网络模型以 AlexNet
为基础,在调试过程中发现卷积层和全连接层的数量对训练时间和准确率影响最
大,卷积层的数量和全连接层的数量越多,花费的时间越长,但是识别率不一定
越高,要选择合适的数量,适当的增加池化层可以减少训练时间。另外单次输入
的数据量大小对最终的准确率影响较大,如果单次输入数据量太大, CPU 做运算
时内存空间会很拮据,这样要达到同样的精度耗时会大大增加,导致识别率不高;
如果单次输入数据量太小, CPU 做运算时内存空间虽然宽裕了,迭代一次花费的
时间更多,模型不容易收敛,更无法谈识别率的问题。因此适当调整单次输入数
据量的大小能够加快训练速度,减小模型震荡。在此训练模型的基础上,进行汉
字识别应用层面的实践,在光线均匀、字体清晰、无其他物体干扰的情况下,识
别一些汉字有一定的准确率,但是当光线突变或者字体模糊的情况下,汉字识别
会经常识别错误。通过对不同场景下的字符特点研究后发现,正是因为光线的条
件不同,导致图片在被预处理时就出现了无法分离前景和背景。另外字体有缺失,
字体被其他物体遮挡等都会导致失去准确识别的条件。
5
总结与展望
本文基于 AlexNet 网络模型,对手写汉字识别进行算法设计和实现。本章对
全文的研究工作进行了总结,并对本文研究的不足和缺陷进行展望。
总结
本文基于深度学习对手写体汉字识别进行算法设计和实现,学习了深度学习
在手写汉字识别方向的应用价值和研究现状,并且深入了解了深度学习的主流框
架,同时进行对比分析。重点学习了卷积神经网络在手写汉字识别领域的应用,
对其结构和优化理论进行深入了解。基于 AlexNet 模型对中国科学院自动化研究
所提供的手写汉字数据集 CASIA-HWDB1.1 进行训练,得到 73.7% 的准确率,进
行相关分析后修改模型部分参数,适当增加卷积层和池化层的数量,最终实现了
99.42% 的准确率。本文多次训练和不断调参,最终得出了一个基本规律:采用优
化算法可以有效的降低过拟合的概率,提高识别率;网络层数的适当增加有助于
提高识别率;单次输入数据量的大小需要和计算机配置相匹配,普通家用台式计
算机的配置最高输入数据量不要超过 64 ,否则有可能导致出现局部最优,大大
增加训练时长。本文的研究也存在一些问题,例如在训练模型时只采用了一种数
据集,这样训练出的模型识别率不具有广泛性和代表性;在识别应用方面现场写
出的汉字识别准确率不高,因为对于自然场景中的汉字字符来说,光线不均匀,
字符不清晰,字体不规范等问题都会导致识别出错,分析之后得出在识别汉字的
应用层面,对于采集到的图片进行恰当的预处理是可以准确识别的关键。
展望
本文使用了单一的网络模型进行网络训练,因此识别率的可信程度不够,又
因为只使用了单一的数据集,导致数据量不足,使得识别的范围不够广泛,在这
个方向下,本论文做的工作还不够,希望在后期进一步学习研究当中使用更多更
广泛的数据集和网络模型。在汉字识别应用的时候,遇到了一些问题,因为现场
的光线不均匀、字体不够规范、导致识别的准确率较低,在识别中遇到的几个问
题,大致分为三个方向:
(1) 对于识别率低的原因,因为汉字的形近字太多,书写的形式又极具变化,
所以要在采集汉字信息的时候多采集不同类别的字符信息,在训练神经
网络期间尽可能多的向计算机输入不同类型的字符信息,增加识别率的
广泛性。同时应对神经网络模型进行优化,才能更好的提高准确率。
(2) 光线不均匀导致无法识别是由于对图片预处理的过程中出现了问题,可
以在这个方向对图片进行更加细致化的研究。
(3) 汉字的间隔太大或者太小导致无法识别,是因为寻找图像的轮廓时出现
了问题,在这个方向可以进行深入研究。
参考文献
[1] 王学梅 .OCR 文字识别系统的应用 [J]. 现代信息科技 ,2019,3(18):66-67.
[2] 刘全升 . 深度学习及其在脱机手写汉字识别领域的应用研究 [D]. 华南理工大
,2016.
[3] 黄洋 . 基于深度学习的脱机手写汉字识别技术研究 [D]. 重庆邮电大学 ,2019.
[4] 毛晓波 . 基于特征图叠加的脱机手写体汉字识别 [J]. 郑州大学学报 ,2018,50(3)
78-79.
[5] 温大纬 . 基于卷积神经网络的汉字识别研究 [D]. 江西农业大学 ,2019.
[6] 王永强 . 基于深度学习的脱机手写体汉字识别研究 [D]. 云南大学 ,2019.
[7] 杨戈 . 基于极限学习机的脱机手写体汉字识别研究 [D]. 东北大学 ,2012.
[8] 陈永春 . 基于粒子群算法和支持向量机的脱机手写体汉字识别研究 [D]. 天津师
范大学 ,2013.
[9]Wang,Yanwei,Fu,QiangDing,Xiaoqing, et al.Importance sampling based
discriminative learning for large scale offline handwritten Chinese character
recongnition[J].Pattern Recognition:The Journal of the Pattern Recognition
Society,2015,48(4):1225-1234.
[10]Wang Y,Ding X,Liu C.MQDF Discriminative Learning Based Offline
Handwritten Chinese Character Recognition[C]//International Conference on
Document Analysis and Recognition.IEEE,2011:1100-1104.
[11] 周星辰 . 基于深度模型的脱机手写体汉字识别研究 [D]. 浙江大学 ,2016.
[12] 孙巍巍 . 基于深度学习的手写汉字识别技术研究 [D]. 哈尔滨理工大学 ,2017.
[13] 杜彦蕊 . 限制性手写体字符 OCR 识别方法的研究 [D]. 哈尔滨工程大学 ,2003.
[14] 沈飞 . 基于反馈知识迁移的脱机手写体汉字识别 [D]. 合肥工业大学 ,2019.
[15] 林恒青 . 基于深度卷积神经网络的脱机手写汉字识别系统的设计与实现 [J].
北理工学院学报 ,2019,35(02):31-34.
[16] 王梓鉴 . 基于 CNN 的遥感图像适配结构选取方法研究 [D]. 华中科技大学,
2016.
[17] 常欢 . 基于卷积神经网络的孤立手写体汉字识别研究 [D]. 安徽大学 ,2015.
[18] Tianwei Wang, Zecheng Xie, Zhe Li, et al. Radical aggregation network for few
shot offline handwritten Chinese character recognition. 2019, 125:821-827.
[19] Ji Gan, Weiqiang Wang, Ke Lu. Compressing the CNN architecture for in-air
handwritten Chinese character recognition. 2020, 129:190-197.
[20] Haiqing Ren, Weiqiang Wang, Xiwen Qu, et al. A new hybrid-parameter
recurrent neural network for online handwritten chinese character recognition. 2019,
128:400-406.

你可能感兴趣的:(深度学习,tensorflow)