【人脸表情识别】基于matlab PCA+SVM人脸表情识别评分系统【含Matlab源码 593期】
一、简介
1 PCA-SVM原理
1.1 主成分分析PCA
本文处理的所有原始图片都是112x 92大小的pgm格式图片, 每幅图片包含10304个像素点, 每一行代表一个样本,维数就是10304维。维数过大使得数据处理工作十分复杂,同时,图片特征之间的强相关性还会导致“维数灾难”。快速高效的人脸识别,其关键在于提取到精准表征人脸的特征。从人脸图像中找出最能表征人脸的特征空间,是主成分分析(Principal Component Analysis, PC A) [2] 在人脸特征提取中的基本思想。在这个过程中, 不能表征人脸的属性会被剔除(降维的过程),也就是在一个高维特征空间中利用一组系数对特征加权,来重新表示一张人脸图片。PCA过程的数学描述如下:
1.2 支持向量机SVM
给定训练集,在特征空间上找到一个分类超平面,将样本点分到不同的类。存在唯一的分类超平面,使得样本点距离分类超平面的距离最大。其中,距离超平面最近的点为该超平面的支持向量。找到该超平面后,对于待测点,通过计算该点相对于超平面的位置进行分类。其中,一个点距离分类超平面的距离越大,表明分类预测的确信程度越高。
支持向量机(Support Vector Machine, SVM) 需要做的就是找出一个超平面, 使得在两类样本点能完全分离的情况下,尽可能使样本边界的距离最大。
SVM是一个两类分类器, 而大多数实际分类问题都是多类分类问题, 那么就需要利用SVM这个二分类器去实现一个多类问题的分类。本文人脸识别程序中, 采用的是一对一的投票策略, 即在任意两类样本之间设计一个SVM分类器,分类为得票最多的类。
2 MATLAB工具软件
本文通过MATLAB工具软件, 对PC A-SVM人脸识别方法进行仿真计算。MATLAB人脸识别程序的使用界面上分为三个按钮:“测试准确率”“选择照片”和“图像匹配”,既可以方便操作,又可以使识别结果直观地显示出来。点击“开始运行”按钮调用的是主函数face.m, 对人脸数据进行处理; 点击“选择照片”按钮调用子函数GUl open, 用户可以在相应的文件路径下选择人脸照片; 点击“人脸识别”按钮调用子函数GUI reg, 通过每张图片所对应的标签来进行匹配, 从而得出识别结果。
3 PCA-SⅤM人脸识别模型的建立
3.1人脸库构建
人脸识别模型的建立首先需要适当的人脸库。本文分两步构建人脸库。
(1) 选择OR L人脸数据库加入本文人脸库, 其中包含40个人的每人10张人脸图片, 一共400张图片, 每张大小是112×92像素, 图片格式是pgm。
(2) 作者利用电脑摄像头拍了10张本人的照片, 将这10张图片的格式转化为pgm格式, 同时大小也转化为112×92像素,加入本文人脸库。
3.2训练集数据处理
这里将每个人的前5张人脸图片作为训练集,后5张人脸图片作为测试集。训练集数据处理步骤如下:
(1) 读入训练集数据, 储存在矩阵f_matrix(205*10304) 中。
(2) 对训练集数据进行PC A降维, 本文选择的降维维数是100。
(3)规范化特征数据,将同一个样本中的不同维度归一化,从而对于不同的属性之间也可以进行比较。
这里特别增加了一个显示特征脸的步骤。由于数据降至100维,在低维空间中的基就是100张特征脸,其他所有经过降维的脸都可以通过这100张特征脸线性表示。图1显示了前10个特征脸。
图1 特征脸显示
3.3 参数选择
在PCA-SVM人脸识别模型建立中, 参数取值如下:
(1) n persons:样本包含41个人的人脸, 将n persons设置为41。
(2)flag:flag为0时子函数ReadFace.m读取训练样本数据, flag为1时读取测试样本数据。
(3) k:表示降维至k维。该参数在子函数fast PC A.m中以输入参数出现, 在后面的SVM训练中也有用处。k值与gamma值有很大关联, 这里经过反复调整将k设置为100。
(4) low vec:经过降维后的图像数据pc a face的最小值, 通过设置low new,即新的边界的下限,对数据进行归一化处理。
(5) up vec:经过降维后的图像数据pc a face的最大值, 通过设置up new, 即新的边界的上限, 对数据进行归一化处理。
(6)核函数:本文选择的是高斯核函数。
(7) gamma:参数gamma是选择高斯核函数RBF作为核函数后该函数自带的一个参数。它隐含地决定了数据映射到新的特征空间后的分布。gamma越大, 支持向量越少, 反之支持向量越多。支持向量的个数直接影响到训练与预测的速度。gamma如果设置得很大, 会使得高斯分布显得高而窄,只作用于支持向量样本附近,对于未知样本的分类效果很差,最终会导致训练准确率很高,而识别准确率很低的结果,即过拟合。而gamma设置过小, 则会造成平滑效应过大, 对于噪声不敏感。本文设置参数gamma时, 在10-3~103的范围依次尝试,最终设置为0.01。
(8)c:参数c可以理解为惩罚参数,类似于正则化中一的作用。c越大,意味着拟合非线性的能力越强,但是容易入出现过拟合的情况,而c过小会导致出现欠拟合的情况,总而言之,c过大或者过小,泛化能力都会变差。本文设置参数c为1。
4 PCA-SⅤM人脸识别模型的测试
测试时,首先读取测试数据,类似于处理训练数据,需要对测试数据进行降维和归一化处理,然后利用训练所得的模型对测试数据集进行分类识别。将识别结果与本身自带的标签(即这是第几个人的人脸图片)进行比对,可以获得识别准确率。测试结果表明, 基于PCA-SVM的人脸识别方法准确率为83.9024%。这里选取第8个人的人脸图片作为示例,可以看到在最终的人脸识别阶段可以准确地进行人脸识别。
备注:简介部分仅作为理论参考,与本文程序和运行结果略有出入。
二、部分源代码
clear;
clc;
close all;
%获取原始图片
m=1;
%选择样本图像库里面的图片
n=num2str(m);
k=strcat(n,'.jpg');
i=imread(k);
I=rgb2gray(i);
BW=im2bw(I); %利用阈值值变换法将灰度图像转换成二进制图像
figure(1);
imshow(BW);
%最小化背景
[n1 n2]=size(BW);
r=floor(n1/10);
c=floor(n2/10);
x1=1;x2=r;
s=r*c;
switch m
case 1
yan=80; biao=60;
case 2
yan=40; biao=30;
case 3
yan=70; biao=100;
case 4
yan=60; biao=50;
case 5
yan=90; biao=60;
case 6
yan=50; biao=70;
case 7
yan=90; biao=40;
case 8
yan=70; biao=80;
case 9
yan=70; biao=50;
case 10
yan=70; biao=90;
end
zongfen=yan+biao;
zongfen=zongfen*0.55;
for i=1:10
y1=1;y2=c;
for j=1:10
if(y2<=c || y2>=9*c) || (x1==1 || x2==r*10)
loc=find(BW(x1:x2,y1:y2)==0);
[o p]=size(loc);
pr=o*100/s;
if pr<=100
BW(x1:x2,y1:y2)=0;
r1=x1;r2=x2;s1=y1;s2=y2;
pr1=0;
end
imshow(BW);
title('图像识别分析中 ... ...');
set(gcf,'unit','centimeters','position',[10 5 17 15])
end
y1=y1+c;
y2=y2+c;
end
x1=x1+r;
x2=x2+c;
end
figure(2)
imshow(BW)
title('图像识别分析完毕');
set(gcf,'unit','centimeters','position',[10 5 17 15])
%人脸识别
L=bwlabel(BW,8);
BB=regionprops(L,'BoundingBox');
BB1=struct2cell(BB);
BB2=cell2mat(BB1);
[s1 s2]=size(BB2);
mx=0;
for k=3:4:s2-1
p=BB2(1,k)*BB2(1,k+1);
if p>mx && (BB2(1,k)/BB2(1,k+1))<1.8
mx=p;
j=k;
end
end
%-----人脸匹配
%-----输入:细胞结构体数据Cell_all(包括样本集合,特征值与特征向量)
% 想要识别的人脸(彩色图像)
%-----输出:匹配的结果
%-----------------------------------
function FaceFind = facefind(Cell_all,img2find)
%细胞结构体的调用
img_all = Cell_all{1};
[m1,n1] = size(img_all);
V = Cell_all{2};
D = Cell_all{3};
namud = 0.5; %图片缩小的倍数
%对需要识别的图像进行灰度等的处理
pic = rgb2gray(img2find); %灰度处理
pic = imresize(pic,namud); %变换大小
[m2,n2] = size(pic);
pic = reshape(pic,1,m2*n2); %重新排列
pic = double(pic)/255;
pic_done = pic*V*D; %处理完的数据
%% 归一化 --》避免运算出现特别大的数据
Ma = max(max(pic_done));
Mi = min(min(pic_done));
pic_done = pic_done/(Ma - Mi);
%%
for i=1:m1
% 归一化 --》避免运算出现特别大的数据
Ma1 = max(img_all(i,:));
Mi1 = min(img_all(i,:));
img_all(i,:) = img_all(i,:)/(Ma1 - Mi1);
%求范数--》把他们之间的几何距离作为评判与哪一个人脸最近的标准
error(i) = norm(img_all(i,:)-pic_done);
end
- 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
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
三、运行结果
四、matlab版本及参考文献
1 matlab版本
2014a
2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/115048943
- 点赞
- 收藏
- 关注作者
评论(0)