一、简介

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 = FaceRecognitionDemo(varargin)
% FACERECOGNITIONDEMO M-file for FaceRecognitionDemo.fig
%      FACERECOGNITIONDEMO, by itself, creates a new FACERECOGNITIONDEMO or raises the existing
%      singleton*.
%
%      H = FACERECOGNITIONDEMO returns the handle to a new FACERECOGNITIONDEMO or the handle to
%      the existing singleton*.
%
%      FACERECOGNITIONDEMO('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in FACERECOGNITIONDEMO.M with the given input arguments.
%
%      FACERECOGNITIONDEMO('Property','Value',...) creates a new FACERECOGNITIONDEMO or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before FaceRecognitionDemo_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to FaceRecognitionDemo_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES% Edit the above text to modify the response to help FaceRecognitionDemo% Last Modified by GUIDE v2.5 16-Mar-2015 21:04:37% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...'gui_Singleton',  gui_Singleton, ...'gui_OpeningFcn', @FaceRecognitionDemo_OpeningFcn, ...'gui_OutputFcn',  @FaceRecognitionDemo_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{:});
end
% End initialization code - DO NOT EDIT% --- Executes just before FaceRecognitionDemo is made visible.
function FaceRecognitionDemo_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to FaceRecognitionDemo (see VARARGIN)% Choose default command line output for FaceRecognitionDemo
handles.output = hObject;% Update handles structure
guidata(hObject, handles);% UIWAIT makes FaceRecognitionDemo wait for user response (see UIRESUME)
% uiwait(handles.figure1);% --- Outputs from this function are returned to the command line.
function varargout = FaceRecognitionDemo_OutputFcn(hObject, eventdata, handles)
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Get default command line output from handles structure
varargout{1} = handles.output;% --- Executes on button press in selectPCA.
function selectPCA_Callback(hObject, eventdata, handles)
% hObject    handle to selectPCA (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.selectPCA,'value',1);
% Hint: get(hObject,'Value') returns toggle state of selectPCA% --- Executes on button press in clickBeginSim.
function clickBeginSim_Callback(hObject, eventdata, handles)
% hObject    handle to clickBeginSim (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
if get(handles.selectPCA,'value')gMetholdSelect=1;
endif get(handles.selectSinglaImageRec,'value')gOneImgOrRate=1;
end
if get(handles.selectRecogRate,'value')gOneImgOrRate=2;
endgTrainNum = str2double(get(handles.inputTrainNum,'string'));
if gTrainNum<=0 || gTrainNum>10disp('error!');
end
%% face detect
if gOneImgOrRate == 1%检测单幅图片%if gMetholdSelect==1%pic = double(handles.pic);testImgData=reshape(pic,size(pic,1)*size(pic,2),1);trainPcaData = handles.trainPcaData;ImageIndex = recognizeSingleImgPCA(trainPcaData,testImgData);RealIndex = ceil(ImageIndex/gTrainNum);endpath = strcat('att_faces\s',num2str(RealIndex));matchImg=imread(strcat(path,'\',num2str(2),'.pgm'));axes(handles.axes2);imshow(matchImg);title('从人脸库中匹配出的人脸图像');
endif gOneImgOrRate == 2%计算识别概率if gMetholdSelect == 1processPCARecognizeRate(handles);end
end
% --- Executes on button press in selectRecogRate.
function selectRecogRate_Callback(hObject, eventdata, handles)
% hObject    handle to selectRecogRate (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.selectSinglaImageRec,'value',0);
set(handles.selectRecogRate,'value',1);
set(handles.inputTrainNum,'Enable','off');
set(handles.buttonTrainSamples,'Enable','off');
set(handles.buttonSelectImg,'Enable','off');
% Hint: get(hObject,'Value') returns toggle state of selectRecogRate% --- Executes on button press in selectSinglaImageRec.
function selectSinglaImageRec_Callback(hObject, eventdata, handles)
% hObject    handle to selectSinglaImageRec (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.selectSinglaImageRec,'value',1);
set(handles.selectRecogRate,'value',0);set(handles.inputTrainNum,'Enable','on');
set(handles.buttonTrainSamples,'Enable','on');
set(handles.buttonSelectImg,'Enable','on');
% Hint: get(hObject,'Value') returns toggle state of selectSinglaImageRecfunction inputTrainNum_Callback(hObject, eventdata, handles)
% hObject    handle to inputTrainNum (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)% Hints: get(hObject,'String') returns contents of inputTrainNum as text
%        str2double(get(hObject,'String')) returns contents of inputTrainNum as a double% --- Executes during object creation, after setting all properties.
function inputTrainNum_CreateFcn(hObject, eventdata, handles)
% hObject    handle to inputTrainNum (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))set(hObject,'BackgroundColor','white');
end% --- Executes on button press in buttonSelectImg.
function buttonSelectImg_Callback(hObject, eventdata, handles)
% hObject    handle to buttonSelectImg (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%打开文件对话框
[filename,pathname]=uigetfile({  '*.*','All Files(*.*)';}, '选择文件');
if isequal([filename,pathname],[0,0])return
else%读取图片picPath = fullfile(pathname,filename);pic = imread(picPath);handles.pic = pic;
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人脸识别【含Matlab源码 748期】相关推荐

  1. 【光学】基于matlab GUI杨氏双缝干涉【含Matlab源码 001期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[光学]基于matlab GUI杨氏双缝干涉[含Matlab源码 001期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付费 ...

  2. 【人脸识别】基于matlab GUI人数统计【含Matlab源码 2121期】

    ⛄一.人数统计简介(附课程作业报告) 1 课题背景 本课题为基于matlab的人数统计系统.近年来,很多行业对人流信息有极大的需求,如汽车公交站,地铁站台,商场出入口等.通过人数统计系统可以方便.可靠 ...

  3. 基于SSM的仓库管理系统(含完整源码+论文)

    后端框架:SSM 数据库:MySQL 开发工具:IDEA/Eclipse 系统介绍:本系统是基于SSM框架进行设计,MySQL作为底层数据库,前端采用bootstrap 模块大致介绍:包括库存管理.出 ...

  4. 【心电信号】基于matlab GUI心电信号预处理【含Matlab源码 938期】

    ⛄一.心电信号预处理方法简介 理论知识参考文献:心电信号预处理方法研究 ⛄二.部分源代码 function varargout = kaishi(varargin) gui_Singleton = 1 ...

  5. matlab svm 语音识别,【情感识别】基于matlab支持向量机(SVM)的语音情感识别【含Matlab源码 543期】...

    一.简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出许多特有的优势,并能够推广应用到函数 ...

  6. 基于PCA 人脸识别/人脸识别算法/人脸检测程序源码MATLAB ELM+PCA人脸识别 PCA人脸识别matlab代码 基于PCA算法的人脸识别

    1.基于PCA的人脸识别代码 2.MATLAB ELM+PCA人脸识别 2.基于PCA的人脸识别(matlab)(采用PCA算法进行人脸识别,通过抽取人脸的主要成 分,构成特征脸空间,识别时将测试图像 ...

  7. 基于MATLAB实现PCA人脸识别

    文件大小:76M 代码行数:40行(主程序) 开发环境:Matlab2016.2018.2020 下载地址:点击下载 简要概述:基于MATLAB实现PCA人脸识别 PCA,即主成分分析,是一种数据降维 ...

  8. 【Matlab人脸识别】BP神经网络人脸识别(含识别率)【含GUI源码 891期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]BP神经网络人脸识别(含识别率)[含GUI源码 891期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  9. 【Matlab人脸识别】形态学教室人数统计(带面板)【含GUI源码 1703期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]形态学教室人数统计(带面板)[含GUI源码 1703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟 ...

  10. 【Matlab人脸识别】人脸实时检测与跟踪【含GUI源码 673期】

    一.代码运行视频(哔哩哔哩) [Matlab人脸识别]人脸实时检测与跟踪[含GUI源码 673期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1]孟逸凡,柳益君 ...

最新文章

  1. QT学习-10/18/2012
  2. 【计算理论】计算复杂性 ( NP 类不同表述 | 团问题 | P 对 NP 问题 )
  3. Lidgren.Network – an introduction to networking in C# games
  4. mysql 列目录_Linux ls命令:查看目录下文件
  5. parallels desktop虚拟机与Mac共享网络设置方法
  6. Codeforces Beta Round #51 D. Beautiful numbers 数位dp + 状态优化
  7. React 篇 Search Bar and content Table
  8. vim显示python嵌套级_在Vim中为Python突出显示语法
  9. wp8对json的处理
  10. oracle 学习日志--ORACLE EXP命令
  11. TranslateMessage 和 DispatchMessage
  12. AttributeError: module ‘tensorflow‘ has no attribute ‘constant‘
  13. 解决Cannot resolve com.lowagie:itext:2.1.7.js6以及.net.jf.jasperresport下com.lowagie:itext标红的问题
  14. yolov7调用大华工业相机进行识别
  15. python urllib 函数_python的urllib.quote()和urllib.unquote()的等效javascript函数
  16. mysql 端口关闭了_关闭MySQL的3306端口
  17. PMP-强化练习题一(180题答案及解析)
  18. Java工程师成神之路 | 2020正式版
  19. 苹果笔记本装windows10后,如何一键截屏并保存到onedrive中?
  20. Java:冒泡排序法

热门文章

  1. MFC下最大化时显示PC的任务栏
  2. 分享升级架构师路上的体会,兼说我为什么有挣钱紧迫感
  3. property attribute: assign, strong, weak, unsafe_unretain and copy
  4. 转场动画CATransition~~~~~~
  5. STM32 外部中断
  6. 增强现实:原理算法与应用 第一章增强现实概论笔记
  7. python在类中创建线程
  8. 190223每日一句
  9. Atitit mysql 存储kv 以及php js接口目录kv_mysql.js 1Set.php 1Get.php 2CREATE TABLE `cfg` ( `k`
  10. Atitit 提升开发效率的方法 提升语言级别 目录 1. 提升语言级别到4gl 1 1.1. 语言的代际关系 sql 》script 》java 1 1.2. 使用4gl dsl语言与api 1