脱机手写签名识别作业.docx
《脱机手写签名识别作业.docx》由会员分享,可在线阅读,更多相关《脱机手写签名识别作业.docx(14页珍藏版)》请在冰豆网上搜索。
脱机手写签名识别作业
脱机手写签名识别作业
学生:
张洋
专业:
计算机软件与理论
学号:
20101402081
班级:
2010级5班
重庆大学计算机学院
二O一O年12月
一实验要求:
脱机手写签名识别
一共有20个人,在其对应的文件夹中存放了每个人的20个手写签名图像,每幅图像均为PCX图像格式,大小为12994像素大小。
对每个人的手写签名,用其中80%的图像作为训练样本进行训练,用余下的20%的图像进行测试。
在签名图像进行特征提取时,提取6个ET1和6个DT12轮廓特征。
1每一个人的手写签名特征假设为48维特征空间的多维高斯分布。
用贝叶斯参数估计法估算概率密度函数(pdf),然后用Bayes分类器识别。
分别计算closetest和opentest下的分类性能。
2根据每个类的概率分布函数的最近邻估算来计算贝叶斯识别的opentest识别率。
3适用kn最近邻法来直接估算每个类在每个测试样本的后验概率并计算opentest下的分类性能,将该识别率表示为一个关于k的函数并绘图。
这些是基于后验概率的非参数估计的贝叶斯估计。
使用C++/VC++编程语言编写程序,并提交一个可在Windows平台下直接运行的可执行文件,命名为ass1.exe。
该程序可测试一个名为“unknown.pcx”的手写签名图像,并返回识别结果。
二实验原理
假设每一个人的手写签名特征假设为48维特征空间的多维高斯分布。
用贝叶斯参数估计法估算概率密度函数(pdf),然后用Bayes分类器识别。
(1)特征提取
文字经过数字化后,它通常就是被描述为黑白象素的矩阵。
但如果直接用
矩阵作为该文字的描述参数,那么当矩阵规模很大的时候,需要的存储空间也很大,同时运算量也很大。
为此需要进行特征抽取。
将它最能反应本质的因素描述出来,同时减少存储量和计算量。
实验证明ET1特征和DT12特征是两种很好描述文字特点的特征。
它们能
较好的用于文字的模式识别。
ET1和DT12的描述如下:
ET1:
从边缘开始直到遇到第一个黑色象素的白色象素个数。
DT12:
从边缘开始经过一次跳变(从白色象素第一次遇到黑色象素)到第二次跳变间白色象素的数目。
ET1
计算结果:
f=(8+7+6)/3=7
DT12
计算结果:
f=(4+4+4)/3=4
f24
f200
f19
f1
f18
f13
f6
f2
f7
对一幅图像的四个边界,每个边界均分为6等分,每部分提取6个特征。
则ET1特征可提取24个,DT12也可以提取24个。
一共48个特征。
(2)特征的相似性度量。
由于前面所做得签名特征服从多维高斯分布假设。
本次实验采用的度量距离为马氏距离
但是由于样本数量n和特征维数d的关系是n所以协方差矩阵不可以求逆。
所以要修正距离度量方法:
a将求取的48维特征采用引入LDA思想的PCA降维方法。
降至16维。
这样协方差矩阵可求逆。
b采用欧式距离度量,这样就不用求协方差矩阵了。
c作出特征间独立性假设,即协方差矩阵为对角阵。
用样本每一维属性的方差来近似估计对角线元素。
其中第i类的均值向量为:
即第i类的协方差矩阵为diag(
,…
)
的计算为:
对a,b,c方案的考察,并通过实验验证发现:
a的开测试准确率:
65%左右。
主要是由于学习的样本数目不够,导致降维过量。
b的开测试准确率:
96.7%左右。
已有较高的准确率,且计算简便,但该种距离度量没有考虑类间特征差异和特征间权重(事实上,DT12特征方差较ET1特征方差小)
c的开测试准确率:
98.7%左右。
准确率非常高,且计算也较简便。
它也考虑到了,DT12特征数据抖动性大,而ET1特征数据平稳性的特点。
(采用加权欧式距离加以调整)。
综合a,b,c。
我们采用方案c:
加权欧式距离作为度量准则。
三程序结构
(1)程序采用的语言:
VC++
(2)文件模块:
a)hand.vcproj
这是使用应用程序向导生成的VC++项目的主项目文件。
它包含生成该文件的VisualC++的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。
b)hand.h
这是应用程序的主要头文件。
它包括其他项目特定的头文件(包括Resource.h),并声明ChandApp应用程序类。
c)hand.cpp
这是包含应用程序类ChandApp的主要应用程序源文件。
d)hand.rc
这是程序使用的所有MicrosoftWindows资源的列表。
它包括RES子目录中存储的图标、位图和光标。
此文件可以直接在MicrosoftVisualC++中进行编辑。
项目资源位于2052中。
e)res\hand.ico
这是用作应用程序图标的图标文件。
此图标包括在主要资源文件hand.rc中。
f)res\hand.rc2
此文件包含不在MicrosoftVisualC++中进行编辑的资源。
您应该将不可由资源编辑器编辑的所有资源放在此文件中。
g)hand.reg
这是一个示例.reg文件,它显示了框架将为您设置的注册设置的种类。
可以将它用作将与您的应用程序一起使用的.reg文件,或者索性将它删除,而采用默认的RegisterShellFileTypes注册。
h)StdAfx.h,StdAfx.cpp
这些文件用于生成名为hand.pch的预编译头(PCH)文件和名为StdAfx.obj的预编译类型文件。
i)Resource.h
这是标准头文件,它定义新的资源ID。
MicrosoftVisualC++读取并更新此文件。
j)hand.manifest
应用程序清单文件供WindowsXP用来描述应用程序对特定版本并行程序集的依赖性。
加载程序使用此信息从程序集缓存加载适当的程序集或从应用程序加载私有信息。
应用程序清单可能为了重新分发而作为与应用程序可执行文件安装在相同文件夹中的外部.manifest文件包括,也可能以资源的形式包括在该可执行文件中。
四实验结果
(1)bayes测试(开/闭测试)
说明:
每类一共20个样本,前16个样本作为训练,后4个作为测试样本。
Class:
类别,
OpenRightNum:
开测试正确归类个数。
OpenRightPercentage:
开测试正确率。
CloseRightNum:
闭测试正确归类个数。
CloseRightPer:
闭测试正确率。
Class
CloseRightNum
OpenRightPercentage
CloseRightNum
CloseRightPer
1
16
100%
4
100%
2
16
100%
4
100%
3
16
100%
4
100%
4
16
100%
3
75%
5
16
100%
4
100%
6
16
100%
4
100%
7
16
100%
4
100%
8
16
100%
4
100%
9
16
100%
4
100%
10
16
100%
4
100%
11
16
100%
4
100%
12
16
100%
4
100%
13
16
100%
4
100%
14
16
100%
4
100%
15
16
100%
4
100%
16
16
100%
4
100%
17
16
100%
4
100%
18
16
100%
4
100%
19
16
100%
4
100%
20
16
100%
4
100%
bayes测试总体的结果:
openTest:
(19*4+3)/80=98.75%
closeTest:
100%
(2)k近邻测试(开测试)
说明k=1:
最近邻测试;k>1,kn近邻测试
测试集大小:
20×4=80。
nRightJustice:
正确分类的个数。
OpenTestPercentage
K
nRightJustice
OpenTestPercentage
1
68
85%
2
79
98.75%
5
79
98.75%
10
79
98.75%
15
79
98.75%
19
79
98.75%
20
78
97.50%
25
79
98.75%
30
78
97.50%
31
79
98.75%
33
77
96.25%
35
74
92.50%
37
70
87.50%
40
69
86.25%
43
68
85%
45
62
77.5%
50
48
60%
55
44
55%
60
39
48.75%
65
31
38.75%
对应的曲线图:
(3)输入未知图片,判断属于哪一类。
输入的图片unknow.pcx(用windows画图工具画)
采用kn近邻法(k=11,15,17,20,28)测试结果均判决该图片属于第6类。
第6类图片的一个样例为:
(图片:
007-020.pcx)
五实验结果分析
从实验结果数据上看,开,闭测试的准确率很高。
这主要是由于以下几点主要原因:
(1)ET1,DT12特征非常适合对文字进行描述。
(2)样本集数据分散较开,即每个类别间的签名差异大(外形轮廓差距大),而类内样本字形很相近。
(3)bayes分类器准确率要好于k近邻,这与bayes分类器是基于最小错误率结论是一致的。
(4)kn近邻(当n不大的时候)要好于最近邻,这是由于类间字型差异很小,各个类别的协方差矩阵很接近。
此时两个样本间比较的是欧氏距离。
(5)k增大到一定程度后,随着k进一步增大,准确率降低,这主要是由于kn近邻的多数投票机制决定的。
(比如,一个属于A类的样本m,前三个离m最近的A类样本判决m属于A类,后五个离A次近的B类样本判决m属于B类,最终决断m是B类,从而造成错误!
)
六附录(部分源程序)
(1)hand.cpp
%------------------------------------Bayes测试--------------------------%
for(inti=0;i<48;i++)
for(intj=0;j<48;j++)
{
if(i==j)
{
this->test[i][j]=this->reversecov[i][j];
}
else
{
this->test[i][j]=0;
}
}
for(intk=0;k<20;k++)
{
for(inti=0;i<48;i++)
{
T[i]=testfeature[i]-mean[k][i];
}
//第一步乘法
doublesum=0.0;
for(inti=0;i<48;i++)
{
for(intj=0;j<48;j++)
{
sum=sum+T[j]*reversecov[j][i];
}
A[i]=sum;
}
CStringstr;
//第二步乘法
sum=0.0;
for(inti=0;i<48;i++)
{
sum=sum+A[i]*T[i];
}
sum=0.5*sum;
if(k==0)
{
Maxindex=1;
Maxvalue=sum;
}
if(sum{
Maxindex=k+1;
Maxvalue=sum;
}
}
CStringkind;
kind.Format("这个样本属于第%d个人写的哦!
!
",Maxindex);
MessageBoxA(NULL,kind,"Bayes估算结果:
",MB_OK);
%------------------------------------Bayes测试--------------------------%
%------------------------------------近邻法测试--------------------------%
for(inti=0;i<20;i++)
{
doublesum=0.0;
for(intj=0;j<48;j++)
{
sum=sum+(testfeature[j]-mean[i][j])*(testfeature[j]-mean[i][j]);
}
sum=sqrt(sum);
if(i==0)
{
result=sum;
index=1;
}
if(sum{
result=sum;
index=i+1;
}
}
CStringkind;
kind.Format("这个样本属于第%d个人写的哦!
!
",index);
MessageBoxA(NULL,kind,"最近邻估算结果",MB_OK);
%-------------------------------近邻法测试----------------------------%