-
2023年4月23日发(作者:marginwidth)
模式识别课程论文
----手写数字识别系统的设计与实现综述
学 院: 计算机学院
班 号: *********
姓 名: ******
学 号:
指导老师:
2010.07
一、样本的获取预处理
手写数字识别因书写者的随意性和环境差异限制了其向实际应用领域的推广,因此有必
要对其进行预处理研究。
手写数字识别的预处理一般包括数字字符图像的平滑去噪、二值化、归一化和细化等过
程。
1. 平滑去噪
平滑去噪的目的在于除去孤立的噪声点,删除其中的小凸起,平滑笔划边缘,以利于后
续算法的进行。一般选择二维中值滤波进行平滑去噪,二维中值滤波输出为:
( , ){( , ) , ( , )} gxymedfxkylklW=−−
其中f(x,y),g(x,y)分别为原始图像和处理后图像,W为二维模板,通常为2*2或3*3区
域。模板的选择很关键,太小则不能去除噪声,太大则不但去除了噪声,也删除字符图像中
的有用信息。字符图像经平滑处理后, 还有一些孤立噪声或只是减小了噪声的面积,而没有
消除。对于这些噪声, 可以在区域连通处理中消除。
2. 二值化
二值化处理是将图像转化为由 0 和 1 表示的二值像素矩阵形式。二值化的关键在于阈
值T 的选择,通常采用由灰度级直方图确定整体阈值T。字符图像的直方图一般有两个峰值,
一个峰值对应数字的笔划部分,另一个峰值对应数字的背景部分。阈值应该取在两个峰值的
波谷处,波谷越深陡,二值化效果越好。本文采用基于类间方差最大化的ostu方法求取阈
值,进行二值化。
3. 尺寸归一化
为便于识别,我们要将手写数字进行归一化得到尺寸一致的图像。尺寸归一化包括字符
分割和规范化。
a)字符分割
字符分割首先对图像自上而下逐行扫描找到第一个黑像素点,记录下来;再由下向上逐
行扫描找到第一个黑像素点,记录下来,得到图像的高度范围。然后在这个高度范围之内自
左向右逐列扫描,记录第一个黑像素点;再由右向左逐列扫描找到第一个黑像素点,记录下
来,得到图像的宽度范围。剪裁掉图像四个方向的边界空白区域,得到位于矩形框中的单个
数字字符,分割结束。
b)规范化
规范化是预处理中非常重要的一环, 由于原始图像在大小方面存在着很大的差异, 必须
将图像规范到统一大小,即进行归一化处理,有利于减少网络训练的时间, 提高识别的准确
率。
这里有几个方法可供参考。第一,通过双线性内插将图像缩放到指定大小,第二,通过
宽高自适应映射比得到不同的规范化函数来规范化数字字符图像。通过实验可以知道,这两
种方法都可以得到令人比较满意的结果。
4. 细化
细化就是把数字字符二值图像变成笔画宽度只有一个象素的字符骨架图形。细化主要是
在保留字符原有特征的基础上去除多余的点,以利于字符特征的提取。可以采用形态学thin
命令减少笔画边缘的像素,“thin”的结果不会产生毛刺,但是比划不够细,不是单像素,
所以还要对其结果进行处理。再次处理可选择如下的细化算法:构造一套8方向结构基元后,
循环应用该结构基元组对二值图像处理,依次去除各方向的多余点。
以上这些就是对手写数字的预处理。经过以上几个步骤的预处理,系统再识别手写数字
的时候就简单了很多,正确率也大大提高。
二、特征提取的方法综述与对比
手写数字字符识别的关键在于找出有效的特征,使得选取的特征不仅具有可靠性、独立
性、可分辨性,而且其数量也少。随着特征量的增加,听觉来源的提取,模式识别系统的复
杂度和所需要的样本数据量也会随之迅速增大。所以,在选择特征时要依照上面四个原则,
挑选出最适合识别系统的特征集合。
针对手写数字字符的特点,大致有以下几种特征提取方法:
1.八点特征
第一,定义:从 0 度开始每45 度从外到内为一个方向,则总共有八个方向。
记录各个方向上第一个黑点出现的坐标(x,y),则共有8*2=16 个特征(F1-F16)。
2.笔划密度特征
笔划密度特征[2]的提取方法是:在本文中,对16*16 的样本在垂直方向上每隔4 行扫
描一次,提取了3 个特征值,并在水平方向上也每隔4 行扫描一次,提取3个特征值,最
后共形成6 个值的特征向量(F17-F22)。
3.投影特征
将一个字符像素点阵划分成四个区域,则共有十二个边线。将一个字符像素点阵中的所
有黑点向最近的四条边线沿垂直和水平方向投影,将十二条边线上的投影长度作为投影特
征,则共有十二个特征(F23-F34)。
4.傅里叶变换特征
图像在傅立叶变换后直流项正比于图像灰度值的平均值,低频分量则表明了图像中目标
边缘的强度和方向。手写体字符一般能用很多线段构成的封闭轮廓来表示,通过映射所得到
的一些离散量能够充分的反映这些封闭轮廓的变化。
三、判别方法的分析与对比
高维的特征集对判别学习未必全是重要和有效的,同时高维特征集会加剧机器学习的负
担。在一般的判别系统中,往往先从不同的角度大量抽取各种特征,然后加以精心挑选,即
从一个给定的特征集合中,挑选出一个尽可能好的子集。
我总结了关于手写数字识别系统的判别方法,大致有以下几个:
1.Fisher判别方法
Fisher判别的基本原理是找到一个最合适的投影轴,使两类样本在该轴上投影之间的距
离尽可能远,而每一类样本的投影尽可能紧凑,从而使分类效果为最佳。
评价投影方向w的原则:使原样本向量在该方向上的投影能兼顾类间分布尽可能分开,
类内尽可能密集的要求。
Fisher准则函数的定义:
Fisher最佳投影方向的求解:
w*argmaxJ(w)
F
w
2.感知器准则
感知器准则是一种自学习判别函数生成方法。其特点是随意确定的判别函数初始值,在
对样本分类训练过程中逐步修正直至最终确定。
感知准则函数方法的思路是:先随意找一个初始向量a,然后用训练样本集中的每个
1
样本来计算。若发现一个y出现ay<0,则只要a = a + ry,r为正(步长系数),则必有ay
TT
k+1kkkk+1
= ay + ryy,就有趋势做到使ay >0。当然,修改后的a还可以使某些y出现ay <0
kkk+1k+1k+1
TTTT
的情况,理论证明,只要训练样本集线性可分,无论a的初值是什么,经过有限次叠代,
1
都可收敛。
3.最小平方误差准则
根据其名字,我们可以知道,这个准则的原理是对应数据求差以后平方,,将所有平方
值相加, 使得这个和最小。
将此准则应用到线性识别中,其思想是:对每个样本,设定一个“理想”的判别函数输出
值,以最小平方误差为准则求最优权向量。
误差向量 e=Ya-b
平方误差准则函数J(a):
s
J(a)eYab(ayb)
sii
T2
i1
22
N
最小二乘近似解(MSE解):
a*argminJ(a)
s
a
四、 聚类方法的分析与对比
聚类(Clustering)就是将数据分组成为多个类(Cluster)。在同一个类内对象之间具有较高
的相似度,不同类之间的对象差别较大。它作为其他数学算法的预处理步骤,获得数据分布
状况,集中对特定的类做进一步的研究。
主要的聚类方法有以下几种:
1. 层次的方法
(也称系统聚类法)(hierarchical method)
定义:对给定的数据进行层次的分解
分类:
1) 凝聚的方法(自底向上)
思想:一开始将每个对象作为单独的一组,然后根据同类相近,异类相异的原
则,合并对象,直到所有的组合并成一个,或达到一个终止条件为止。
2) 分裂的方法(自顶向下)
思想:一开始将所有的对象置于一类,在迭代的每一步中,一个类不断地分为
更小的类,直到每个对象在单独的一个类中,或达到一个终止条件。
特点:
类的个数不需事先定好
需确定距离矩阵
运算量要大,适用于处理小样本数据
缺陷:一旦一个步骤(合并或分裂)完成,就不能被撤销或修正
2. 划分方法
(partitioning method)
思想:随机选择k个对象,每个对象初始地代表一个类的平均值或中心,对剩余每个对
象,根据其到类中心的距离,被划分到最近的类;然后重新计算每个类的平均值。
不断重复这个过程,直到所有的样本都不能再分配为止。
特点:
k事先定好
创建一个初始划分,再采用迭代的重定位技术
不必确定距离矩阵
比系统聚类法运算量要小,适用于处理庞大的样本数据
适用于发现球状类
缺陷:
不同的初始值,结果可能不同
有些k均值算法的结果与数据输入顺序有关,如在线k均值算法
用爬山式技术(hill-climbing)来寻找最优解,容易陷入局部极小值
3. 基于密度的方法
(density-based method)
思想:只要临近区域的密度超过一定的阀值,就继续聚类;
特点:可以过滤噪声和孤立点outlier,发现任意形状的类。
4. 基于网格的方法
(grid-based method)
把样本空间量化为有限数目的单元,形成一个网络结构,聚类操作都在这个网格结构(即
量化空间)上进行
5. 基于模型的方法
(model-based method)
为每个类假定一个模型,寻找数据对给定模型的最佳拟合。
五、利用神经网络进行识别
1. 算法思想
(1)界面方面:这里我们先来熟悉一下算法的思想,为了使程序跟用户有交
流界面,我们必须提供一个给用户输入的终端,这里我们用鼠标代替手写,
并绘制一个输入终端用于提取我们的输入,首先子类化一个静态控件,并给
重绘重载,在里面绘制控件的背景(白色),和网格线(淡青色),通过矩
阵的信息进行点的重绘,响应鼠标事件,用来绘制终端的点。
(2)神经网络:我们这里采用了10×10的网格结构,为了是算法清晰易见,
所以输入采用100个输入,事实上用到的点没有那么多,用户可以根据需要
更改,中间的隐层采用5个输入,因为我们只是识别数字,所以只是有10
个输出就足够了,(其实不用10个输出也可以完成任务,1010就可以标识
10了,可以只要四位,但是还是那句话,为了算法清晰易见),所以神经网
络的结构是100:5:10.可以通过改变源代码的define来改变网络拓扑结构。
2. 算法描述
(1)学习
设输入层为n个输入,隐层是m个输入,输出层是p个输出
a.初始化V,W,α,ε //给V,W赋初值,这里用随机值,有经验的话可以给V
和W赋一个近似的初值,这样的话可以加快收敛速度。
// 是学习因子,可以根据学习的进度来动态改变,这里自始
//至终取0.7, 是精度系数,
b.循环学习直到误差小于精度
e=(I,T)//对每一个样本取样放到集合e中,I代表输入样本,T代表输出样板
求a[j]=g(in[j])=g() //求隐层的值,其中V
是各个权值的向量,I是样板值
o[i]=g(in[i])=g() //求输出层的值,其中W是
各个隐层输入的权值,a[j]是输入的隐层的值
Err[i]=T[i]-O[i] (1<=i<=p) //Err是误差值
求 Δ[i]=Err[i]*g`(in[i]) (1<=i<=p) //g`(in[i])是g(in[i])函数的求导
W[j,i]=W[j,i]+a[j]*Err[i]*g`(in[i]) //权值调整,即训练学习, 是学习因子,
用来反映学习的频率,可以自己根据程序需要来定。
c.返回V,W,学习完成
(2)实现识别
a.获取输入层的各个值 a
a[j]=g(in[j])=g()//求隐层的值,其中
V是各个权值的向量
o[i]=g(in[i])=g() //求输出层的值,其中W是各
个隐层输入的
Err[i]=(T[i]-O[i])2 /2
// ε为精度,如果全局误差都小于精度就证明输出的矩阵O是
合法的。
-
更多推荐
中文手写输入系统
发布评论