Matlab PCA+SVM人脸识别(一)
分类: Matlab 模式识别 计算机视觉2014-05-23 20:12 3260人阅读 评论(20) 收藏 举报
PCA人脸识别SVM主成分分析支持向量机
目录(?)[+]
概述:
编程平台:Matlab;
数据: ORL人脸库。pgm格式的图片。40人,每人10幅图,图像大小为112*92像素。图像本身已经经过处理,不需要进行归一化和校准等工作;下载地址第三段的两个都是下载链接
数据处理:主成分分析法(PCA);有关算法原理可以参考这里
分类器: 支持向量机(SVM)。
人脸识别算法步骤概述:
1、读取训练数据集;
2、主成分分析法降维并去除数据之间的相关性;
3、数据规格化(去除数据单位因素对分类造成的影响,这个对此实验造成的影响不大);
4、SVM训练(选取径向基和函数);
5、读取测试数据、降维、规格化;
6、用步骤4产生的分类函数进行分类(多分类问题,采用一对一投票策略,归位得票最多的一类);
7、计算正确率。
准备工作:
下载人脸库
如果你用的不是ORL人脸库,可能还需要先进行人脸检测
把Matlab的左上角当前路径(current folder)设置为你的.m的保存的路径,或者用addpath('...... ')设置
编程实现:
读取数据:
ReadFace.m文件,若flag=0,表述读取原文件的前五幅图作为训练数据,若flag=1,表述读取原文件的后五幅图作为测试数据,数据存入f_matrix中,每一行为一个文件,每行为112*92列。
[plain] view plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
主成分分析:
去除原成分各维之间的相关性并进行降维,对降维后维数的选择要看你对最小平方误差的要求,被舍去的协方差矩阵的特征根的平方和与所有特征根的平方和就是最小平方误差。这里选择降至20维。下面是fastPCA.m
[plain] view plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
数据规范化:
scaling.m
[plain] view plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SVM分类器训练:
multiSVMtrain.m
[plain] view plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SVM分类器的径向基核函数:kfun_rbf.m
[plain] view plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SVM分类器对测试数据进行分类:
multiSVM.m
[plain] view plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
主函数:
face.m
[plain] view plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
补充:
这里的两部分是为了让大家更容易理解主成分分析,而特意做的补充。
显示主分量脸:
在主函数的第21行 有一句程序是“visualize(V)%显示主成分脸”,这个是吧20个最大特征之对应的特征向量(就是低维空间的基)以图像的形式显示出来,其他所有图片就是这20张图片(主分量)的线性组合,保存为文件visualize.m
[plain] view plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
下面是调用visualize.m显示的主分量人脸:
基于主分量的人脸重构:
这段程序没有特意写成一个单独的函数,可以把它插入在主函数里主成分分析的代码下面
[plain] view plaincopy
1.
2.
3.
4.
5.
6.
7.
8.
下面分别是主成分为20维、50维、100维、150维时重构出来的第一张照片
原图为:
可见150维已经可以很好地对原图片进行重构。
附:pgm格式的图片好像是Linux的格式,在Windows上无法直接打开,在这里我是用Matlab的指令打开:imshow(imread('文件路径'))。
转载请您尊重作者的劳动,完整保留文章出处以及文章链接,谢谢您的支持!
¥29.8
¥9.9
¥59.8