手写数字识别文成2150230509汇总.docx
《手写数字识别文成2150230509汇总.docx》由会员分享,可在线阅读,更多相关《手写数字识别文成2150230509汇总.docx(16页珍藏版)》请在冰豆网上搜索。
手写数字识别文成2150230509汇总
深圳大学研究生课程论文
题目基于SVM的手写数字识别系统成绩
专业软件工程
课程名称、代码神经网络与进化算法(162023050014)
年级2015级姓名文成
学号**********时间2016年6月
任课教师朱安民
基于SVM的手写数字识别系统
[摘要]
手写数字识别是符号识别的一个分支,虽然只是识别简单的10个数字,但却有着非常大的实用价值。
在我们的日常生活中,每天都要进行大量的文档处理工作,税单、银行支票、汇款单、信用卡账单的处理,以及邮局信函的分检等等,如何利用计算机字符识别和文档处理技术,使人们从这些繁重的手工劳动中解放出来已成为一个迫切需要解决的问题。
另外随着平板电脑和触摸屏手机的普及,手写输入成为了很多人的主要输入方式。
手写数字虽然只有10个种类,但很多情况下对识别的精度要求非常高,而且每个人都有不同的字迹,要做到准确地识别还是有一定难度的。
况且在实际应用中,手写数字识别的精确度要求要比汉字[2]严格的多,因为数字识别经常用在财务、金融等领域。
本文使用支持向量机的方法实现了一个手写数字识别系统,采用MINST手写数字图片库作为训练集,最终结果的识别准确度非常高。
一、简介
1.引言
手写数字识别[1]是“光学字符识别技术”(简称OCR)的一个分支,它研究的对象是:
如何利用电子计算机自动辨认人手写在纸张上的阿拉伯数字。
在整个OCR领域中,最为困难的就是脱机手写字符的识别。
到目前为止,尽管人们在脱机手写英文、汉字识别的研究中已取得很多可喜成就,但距实用还有一定距离。
而在手写数字识别这个方向上,经过多年研究,研究工作者已经开始把它向各种实际应用推广,为手写数据的高速自动输入提供了一种解决方案。
2.研究背景
字符识别处理[4]的信息可分为两大类:
一类是文字信息,处理的主要是用各国家、各民族的文字(如:
汉字、英文等)书写或印刷的文本信息,目前在印刷体和联机手写方面技术已趋向成熟,并推出了很多应用系统;另一类是数据信息,主要是由阿拉伯数字及少量特殊符号组成的各种编号和统计数据,如:
邮政编码、统计报表、财务报表、银行票据等等,处理这类信息的核心技术是手写数字识别。
这几年来我国开始大力推广的“三金”工程在很大程度上要依赖数据信息的输入,如果能通过手写数字识别技术实现信息的自动录入,无疑会促进这一事业的进展。
因此,手写数字的识别研究有着重大的现实意义,一旦研究成功并投入应用,将产生巨大的社会和经济效益。
3.研究的理论意义
手写数字识别作为模式识别领域的一个重要问题,也有着重要的理论价值:
1、阿拉伯数字是唯一的被世界各国通用的符号,对手写数字识别的研究基本上与文化背景无关,这样就为各国、各地区的研究工作者提供了一个施展才智的大舞台。
在这一领域大家可以探讨,比较各种研究方法。
2、由于数字识别的类别数较小,有助于做深入分析及验证一些新的理论。
这方面最明显的例子就是人工神经网络,相当一部分的人工神经网络模型都以手写数字识别作为具体的实验平台,验证理论的有效性,评价各种方法的优缺点。
3、尽管人们对手写数字的识别已从事了很长时间的研究,并已取得了很多成果,但到目前为止机器的识别本领还无法与人的认知能力相比,这仍是一个有难度的开放问题。
4、手写数字的识别方法很容易推广到其它一些相关问题,一个直接的应用是对英文这样的拼音文字的识别。
事实上,很多学者就是把数字和英文字母的识别放在一块儿研究的。
4.手写数字识别技术展望
随着国家信息化进程的加快,手写数字识别的应用需求将越来越广泛,因此应当加强这方面的研究工作。
作者认为,应用系统的性能的关键与瓶颈仍然在于手写数字识别核心算法性能上,最终目标是研究零误识率和低拒识率的高速识别算法。
此外,尽早建立反映中国人书写习惯的、具有国家标准性质的手写数字样本库也是当务之急。
二、OPENCV+SVM简介
1.支持向量机简介
支持向量机(SVM)是一个类分类器,正式的定义是一个能够将不同类样本在样本空间分隔的超平面。
换句话说,给定一些标记(label)好的训练样本(监督式学习),SVM算法输出一个最优化的分隔超平面。
如何来界定一个超平面是不是最优的呢?
考虑如下问题:
假设给定一些分属于两类的2维点,这些点可以通过直线分割,我们要找到一条最优的分割线。
在上面的图中,你可以直觉的观察到有多种可能的直线可以将样本分开。
那是不是某条直线比其他的更加合适呢?
我们可以凭直觉来定义一条评价直线好坏的标准:
距离样本太近的直线不是最优的,因为这样的直线对噪声敏感度高,泛化性较差。
因此我们的目标是找到一条直线,离所有点的距离最远。
由此,SVM算法的实质是找出一个能够将某个值最大化的超平面,这个值就是超平面离所有训练样本的最小距离。
这个最小距离用SVM术语来说叫做间隔(margin)。
概括一下,最优分割超平面最大化训练数据的间隔。
2.如何计算超平面
下面的公式定义了超平面的表达式:
叫做 权重向量 ,
叫做 偏置(bias) 。
最优超平面可以有无数种表达方式,即通过任意的缩放
和
。
习惯上我们使用以下方式来表达最优超平面[3]
式中
表示离超平面最近的那些点。
这些点被称为 支持向量。
该超平面也称为canonical超平面.
通过几何学的知识,我们知道点
到超平面
的距离为:
特别的,对于canonical超平面,表达式中的分子为1,因此支持向量到canonical超平面的距离是
刚才我们介绍了间隔(margin),这里表示为
它的取值是最近距离的2倍:
最后最大化
转化为在附加限制条件下最小化函数
。
限制条件隐含超平面将所有训练样本
正确分类的条件,
式中
表示样本的类别标记。
这是一个拉格朗日优化问题,可以通过拉格朗日乘数法得到最优超平面的权重向量
和偏置
。
3.SVM的特点
(1)非线性映射是SVM方法的理论基础,SVM利用内积核函数代替向高维空间的非线性映射;
(2)对特征空间划分的最优超平面是SVM的目标,最大化分类边际的思想是SVM方法的核心;
(3)支持向量是SVM的训练结果,在SVM分类决策中起决定作用的是支持向量。
(4)SVM的最终决策函数只由少数的支持向量所确定,计算的复杂性取决于支持向量的数目,而不是样本空间的维数,这在某种意义上避免了“维数灾难”。
(5)少数支持向量决定了最终结果,这不但可以帮助我们抓住关键样本、“剔除”大量冗余样本,而且注定了该方法不但算法简单
(6)SVM在小样本训练集上能够得到比其它算法好很多的结果。
4.SVM的缺点
(1)SVM算法对大规模训练样本难以实施(由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。
)
(2)用SVM解决多分类问题存在困难(经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。
可以通过多个二类支持向量机的组合来解决。
)
5.OPENCV
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上。
它轻量级而且高效——由一系列C函数和少量C++类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。
该库也有大量的Python,JavaandMATLAB/OCTAVE(版本2.5)的接口。
这些语言的API接口函数可以通过在线文档获得。
如今也提供对于C#,Ch,Ruby的支持。
所有新的开发和算法都是用C++接口。
一个使用CUDA的GPU接口也于2010年9月开始实现。
OpenCV下SVM的使用也相当简单,开发者只需要阅读一下文档,了解一下参数的类型即可,一下就是Opencv下SVM的简单样例。
//C++、opencv2.4+SVM实现
//建立训练样本
MattrainingDataMat(x,x,CV_32FC1,trainingData);
MatlabelsMat(x,x,CV_32FC1,labels);
//设置SVM参数
CvSVMParamsparams;
params.svm_type=CvSVM:
:
C_SVC;
params.kernel_type=CvSVM:
:
LINEAR;
params.term_crit=cvTermCriteria(CV_TERMCRIT_ITER,100,1e-6);
//训练支持向量机
CvSVMSVM;
SVM.train(trainingDataMat,labelsMat,Mat(),Mat(),params);
三、主要流程
1.手写数字识别主要流程
2.训练样本
训练样本来源于MNIST手写数字图片库,该图片库总共提供60000个训练样本,每个数字提供6000个训练样本,另外提供1000个测试样本。
(
例如:
0的训练样本和1的训练样本(这里只展示少部分,实际上每个数字有6000个训练样本)
2.训练样本图像预处理
本文是对已经扫描后的手写体数字图像进行识别,在识别前由于得到的图像和图像中数字的各种属性有很大差别,给识别增加了难度,因而对待识别图像要进行预处理[5]。
对所给出的图像进行预处理使得方面后面的数字识别操作,包括图像的二值化和图像的压缩等。
(1)归一化
归一化处理包括两个部分:
一是裁剪,裁剪出图像中只有文字信息的部分,作为该项研究处理的对象。
二是图像的缩放,本文首先求得图像中的数字上下左右四个边界点,剪裁掉图像四个方向的边界空白区域,并求出待识别数字的高度和宽度,然后按比例将图像统一缩放为10*10像素。
(2)二值化
由于手写体数字识别只需要处理图像中的字符信息,对颜色等信息不作处理!
所以可对扫描得到的图像进行二值化处理,本文直接利用opencv中的函数将待识别图像转化为二进制图像。
(3)细化
一个图像的骨架,是指图像中央的骨架部分。
它是描述图像几何及拓扑性质的重要特征之一,求一个图像骨架的过程通常称为对图像的细化过程。
本文直接利用opencv中的函数得到待识别数字的骨架。
数字图像的二值化即使图像只有黑白两种颜色,同理测试样本也需要进行图像的二值化。
下面给出一个二值化的例子
原图如下:
二值化处理结果如下:
除了图像的二值化,另一个工作就是图像的压缩。
因为训练样本是28*28的,一共有6000个,不压缩的话训练时间太长了。
4.SVM训练
SVM最初设计出来是用于解决二分类问题的,多分类问题需将多个SVM的二分类器组合起来。
例如0和1-9的二分类器,1和0/2/3/4/5/6/7/8/9的二分类器,然后将多个二分类器组合起来。
核函数的选择:
核函数是SVM的核心,不同的核函数可以构造不同的SVM分类器,比如线性核函数,二次核函数和多项式核函数,径向基核函数等等。
本文选取的是径向基核函数。
5.测试样本图像预处理
第一步要做一个简单的图像分割,例如下图的8,仅将含数字的图像分割出来。
接下来与训练样本的大小需要统一,所以也需要压缩成10*10的图像。
完成这一步之后就可以将测试样本交给识别器识别,得到识别结果
四、手写数字识别系统的实现
1.Windows下C++实现
程序可见附件,下面展示一下运行结果。
下图是测试图像。
经过图像分割后。
经过压缩后。
识别器识别结果。
2.安卓应用实现
运行截图如下
五、实验结果与分析
每个数字100个训练样本,测试数据正确率80.21%(训练集太少)
每个数字1000个训练样本,测试数据正确率95.45%(体现小样本高准确率的特性)
每个数字6000个训练样本,测试数据正确率97.67%
当手写字体比较正式的情况下,其识别效果较好,但当手写字比较随意时,识别效果比较差。
比如右图横着写的8和加了噪音的3。
这存在多个方面因素,一方面是由于训练样本中不存在歪曲的样本,另一方面用SVM解决多分类问题存在困难。
还有图像预处理时将原图像映射成10*10的,存在精度丢失。
六、未来的工作
本文已经实现了一个识别0-9这十个数字的系统,精度也比较高。
但是其实精度还可以提高。
前文提到,我在图像预处理时对训练样本进行了压缩,将28*28的图像压缩成10*10的,主要是出于训练效率考虑。
如果直接使用28*28的图像进行训练,精度必然可以得到提高,但是训练结果也是漫长的,可能要等待好几个小时。
字母识别的实现和数字识别类似,但是字符数量更多,而且可能会和数字混淆,例如2和z。
未来如果要加入英文字母识别的话,对精度的要求也会更高。
参考文献
[1]边肇祺,张学工.模式识别[M],北京:
清华大学出版社2002年
[2]周昌乐。
手写汉字的机器识别,北京:
科学出版社1997年
[3]VladimirNVaapnik著,张学工译.系统学习理论的本质,北京:
清华大学出版社2002年
[4]施善昌.自动识别技术原理及应用,北京:
人民邮电出版社1989
[5]马立权等.手写数字识别中的预处理技术研究,仪器仪表学报2001