一、简介

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个人的人脸图片作为示例,可以看到在最终的人脸识别阶段可以准确地进行人脸识别。
备注:简介部分仅作为理论参考,与本文程序和运行结果略有出入。

二、部分源代码

function varargout = test(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @test_OpeningFcn, ...'gui_OutputFcn',  @test_OutputFcn, ...'gui_LayoutFcn',  [] , ...'gui_Callback',   []);
if nargin && ischar(varargin{1})gui_State.gui_Callback = str2func(varargin{1});
endif nargout[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
elsegui_mainfcn(gui_State, varargin{:});
endfunction test_OpeningFcn(hObject, eventdata, handles, varargin)
global imgrow imgcol V pcaface accuracy
imgrow=112;
imgcol=92;%读取的图像为112*92
npersons=41;%选取41个人的脸
disp('读取训练数据...');
f_matrix=ReadFace(npersons,0);%读取训练数据
nfaces=size(f_matrix,1);%样本人脸的数量%低维空间的图像是(npersons*5)*k的矩阵,每行代表一个主成分脸,每个脸20维特征
disp('训练数据PCA特征提取...');
mA=mean(f_matrix);%求每个属性的均值
k=20;%降维至20维
[pcaface,V]=fastPCA(f_matrix,k,mA);%主成分分析法特征提取
%pcaface是200*20
disp('训练特征数据规范化....')
lowvec=min(pcaface);
upvec=max(pcaface);
scaledface=scaling(pcaface,lowvec,upvec);disp('SVM样本训练...')
gamma=0.0078;
c=128;
multiSVMstruct=multiSVMtrain(scaledface,npersons,gamma,c);
save('recognize.mat','multiSVMstruct','npersons','k','mA','V','lowvec','upvec');disp('读取测试数据...')
[testface,realclass]=ReadFace(npersons,1);disp('测试数据降维...')
m=size(testface,1);
for i=1:mtestface(i,:)=testface(i,:)-mA;
end
pcatestface=testface*V;
disp('测试特征数据规范化...')
scaledtestface=scaling(pcatestface,lowvec,upvec);
disp('样本分类...')
class=multiSVM(scaledtestface,multiSVMstruct,npersons);disp('测试完成!')
accuracy=sum(class==realclass)/length(class);
set(handles.change_font,'string','请先选择照片......')
handles.output = hObject;
guidata(hObject, handles);
function [f_matrix,realclass]=ReadFace(npersons,flag)
%读取ORL人脸库照片里的数据到矩阵
%输入:
%    npersons-需要读入的人数,每个人的前五幅图为训练样本,后五幅为验证样本
%    imgrow-图像的行像素为全局变量
%    imgcol-图像的列像素为全局变量
%    flag-标志,0表示读入训练样本,1表示读入测试样本
%输出:
%已知全局变量:imgrow=112;imgcol=92;
global imgrow;
global imgcol;
realclass=zeros(npersons*5,1);%zeros 创建全零数组 矩阵创建了一个200*1的零矩阵
f_matrix=zeros(npersons*5,imgrow*imgcol);%创建了一个200*(112*92)的零矩阵,把训练集中所有的人脸都放在这个f_matrix中
for i=1:npersonsfacepath='./orl_faces/s';%训练样本集的路径facepath=strcat(facepath,num2str(i));%strcat 字符串拼接 num2str()把数字转为字符串facepath=strcat(facepath,'/');cachepath=facepath;%得到图片的路径for j=1:5unction [ scaledface] = scaling( faceMat,lowvec,upvec )
%特征数据规范化
%输入??faceMat需要进行规范化的图像数据,
%       lowvec原来的最小值
%       upvec原来的最大值
upnew=1;
lownew=-1;
[m,n]=size(faceMat);
scaledface=zeros(m,n);
for i=1:mscaledface(i,:)=lownew+(faceMat(i,:)-lowvec)./(upvec-lowvec)*(upnew-lownew);
end
end
voting=zeros(m,nclass);
for i=1:nclass-1for j=i+1:nclassclass=svmclassify(multiSVMstruct{i}{j},testface);voting(:,i)=voting(:,i)+(class==1);voting(:,j)=voting(:,j)+(class==0);end
end
[~,class]=max(voting,[],2);
end

三、运行结果


四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.
[5]孟逸凡,柳益君.基于PCA-SVM的人脸识别方法研究[J].科技视界. 2021,(07)
[6]张娜,刘坤,韩美林,陈晨.一种基于PCA和LDA融合的人脸识别算法研究[J].电子测量技术. 2020,43(13)
[7]陈艳.基于BP神经网络的人脸识别方法分析[J].信息与电脑(理论版). 2020,32(23)
[8]戴骊融,陈万米,郭盛.基于肤色模型和SURF算法的人脸识别研究[J].工业控制计算机. 2014,27(02)

【人脸识别】基于matlab GUI PCA+SVM人脸识别(准确率)【含Matlab源码 823期】相关推荐

  1. 【图像处理】基于matlab GUI多功能图像处理系统【含Matlab源码 1876期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[图像处理]基于matlab GUI多功能图像处理系统[含Matlab源码 1876期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  2. 【机械仿真】基于matlab GUI曲柄摇杆机构运动仿真【含Matlab源码 1608期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI曲柄摇杆机构运动仿真[含Matlab源码 1608期] 点击上面蓝色字体,直接付费下载,即可. 获取代码 ...

  3. 【光学】基于matlab GUI光栅条纹投影生成【含Matlab源码 2118期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI光栅条纹投影生成[含Matlab源码 2118期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  4. 【机械仿真】基于matlab GUI直齿圆柱齿轮应力计算【含Matlab源码 2077期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[机械仿真]基于matlab GUI直齿圆柱齿轮应力计算[含Matlab源码 2077期] 点击上面蓝色字体,直接付费下载,即可. 获取代 ...

  5. 【天体学】基于matlab GUI太阳天顶角计算【含Matlab源码 2229期】

    一.⛄获取代码方式 获取代码方式1: 完整代码已上传我的资源:[天体学]基于matlab GUI太阳天顶角计算[含Matlab源码 2229期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2 ...

  6. 【语音去噪】基于matlab GUI IIR滤波器语音去噪【含Matlab源码 1864期】

    一.语音处理简介 语言是人们获得各类有效信息的主要途径, 而语音是语言的表现形式.语音在一定程度上可影响人们的生活, 因此, 语音信号的研究对科学领域和人们日常生活具有一定的研究价值和意义.噪声广泛存 ...

  7. 【数学建模】基于matlab GUI平行停车模拟仿真【含Matlab源码 1877期】

    一.平行停车模拟仿真简介 近年来, 随着我国经济的快速发展, 机动车保有量也迅速增长.截至2012年底, 全国机动车保有量已达2.4亿辆, 城市"停车难"的问题日趋严重.统计结果表 ...

  8. 【人脸识别】PCA+SVM人脸识别(准确率)【含GUI Matlab源码 823期】

    ⛄一.简介 1 PCA-SVM原理 1.1 主成分分析PCA 本文处理的所有原始图片都是112x 92大小的pgm格式图片, 每幅图片包含10304个像素点, 每一行代表一个样本,维数就是10304维 ...

  9. 【飞行器】基于matlab GUI四旋飞行器模型【含Matlab源码 2075期】

    ⛄一.四旋翼飞行器简介 0 引 言 四旋翼飞行器由于具有可垂直起降.机动性强.操作方便等诸多优点,在军事和民用场合得到广泛应用,从而成为众多学者的研究热点.四旋翼飞行器是具有四输入.六输出的欠驱动.非 ...

  10. 基于python+django学生信息管理系统设计与实现(含程序源码和毕业设计)

    摘要 随着互联网技术的加快发展,计算机电脑硬件也在不断的迭代升级,而每年大学生不断的扩招,学院的增加,对于信息平台的管理需求也越来越多.选用B/S架构模式,可以更好的服务于学生信息化的管理,这是因为C ...

最新文章

  1. linux命令查看cpu架构,Linux下如何查看CPU信息
  2. 零基础是学java还是python-零基础学编程java和python哪个好
  3. Intel Realsense D435 如何获取摄像头的内参?get_profile() video_stream_profile() get_intrinsics()
  4. springBoot搭建activiti工作流
  5. React with Webpack - 2: css 处理
  6. tf.name_scope tf.variable_scope学习
  7. java 导出excel教程_Java导出Excel表格
  8. svn java注释_svn 强制用户添加注释 和 允许用户修改注释
  9. win10桌面管理文件收纳_微软win10发布7月更新,三大版本同步更新,着重提升系统安全性...
  10. linux python指向python3_linux下切换python2和python3(转)
  11. systemd 与 sysVinit 彩版对照表
  12. Guava学习笔记(六):Immutable(不可变)集合
  13. IBus输入法安装和设置
  14. 微信小程序开发实战1 微信小程序开发概述
  15. java short 写法_Java数据类型short的使用方法
  16. python substract_Python layers.Subtract方法代码示例
  17. 学习pyton的第三天
  18. 闲话四巨头:腾讯,阿里,百度,华为
  19. OLAP介绍(zhuanzai)
  20. 国际计算机网络与信息安全博览会,2018中国(成都)国际计算机网络及信息安全展览会暨论坛...

热门文章

  1. response 画验证码
  2. Hbuilder Webview调试+逍遥安卓模拟器
  3. LeetCode-Sum Root to Leaf Numbers
  4. 动态加载Asp.net分页控件
  5. repeater 实现分列(两列的简单办法)
  6. visual studio 2019语言中文和英文的切换
  7. 传智播客 import导入模块 学习笔记
  8. Atitit 项目高扩展法 目录 1. 提升语言级别 1 1.1. 脚本化 dsl化 免编译 2 1.2. 提升语言级别到4gl 2 1.3. 语言的代际关系 sql 》script 》java 2
  9. Atitt 常见的拖欠费用的公司与个人黑名单 陕西西部安全网 2007-2008 西安 一个月 25000 西安盛世涅槃 2007 西安 1m 25000 Sicyi msc 2007 n
  10. Atitit 缓存实施遇到的问题与解决 s420 attilax 艾提拉总结 Atitit 缓存增加最佳实践与实施流程 1. 业务准确性问题正确性问题 1 1.1. 缓存key正确性问题 1