【模式识别】基于GUI SVM和PCA的人脸识别【Matlab 298期】

一、简介

本文所用的是ORL人脸库,由英国剑桥实验室拍摄,共有40人,每人不同角度不同表情拍摄了10张,所以共有400个样本数据,图片尺寸为11292,格式为pgm。本文将每人的前5张作为训练集,后5张作为测试集。ORL人脸库可在该网址下载https://www.cl.cam.ac.uk/research/dtg/attarchive/facedatabase.html
1 什么是人脸识别?
人脸识别技术,就是以计算机为辅助手段,从静态或动态图像中识别人脸。
本问题中的人脸识别,是给定一幅人物图,利用人脸数据库 来与之进行匹配,判断其是否属于此数据库。若是,给出她所属的类别。
2 为什么选择人脸作为识别特征来识别?
因为人脸和指纹一样,具有唯一性,可以用来鉴别一个人的身份。
也就是说,我们想要识别一个东西,要选它主要的特征,辨识度区分度高的特征,这样识别结果才可靠。 就像我们要识别一个人,为什么不去识别他的身高,体重,肤色,眼睛大小啥的?因为这些没有独特性,作为数据来说,太普通了,两个人身高体重肤色相同的概率还是很大的,所以不能作为唯一辨识特征。而选择DNA、指纹、虹膜等属性来作为识别一个人特征,就是因为这些属性具有唯一性,这世界上,不会有人和你在这些特征上重样。
3 人脸识别是怎么进行的?
(1)找感兴趣区域----从复杂场景中检测并分离出人脸所在的区域;
(2)抓特征—抽取人脸识别特征;
(3)匹配吧—进行匹配和识别;
4 为了实现人脸识别,你要做什么?
(1)人脸数据库ORL
(2)数据库中的人脸图片一部分用来做训练数据,建立模型。
(3)另一部分可以用来做测试数据,检验识别率。
5 PCA主成分分析来降维
(1)为什么要降维?
因为每幅人脸图像包含112
92=10304个像素点,每一行代表一个样本,那维度就是10304维。
如此巨大的维数使得数据处理工作很是艰难,也打消了我们直接利用像素点作为特征值来识别的念头。
(2)PCA是什么?它怎么来实现降维的?
PCA是主成分分析(principal component analysis).利用PCA降维去除像素之间的相关性,取出主成分,同时抛弃那些不能为我们提供重要特征信息的分量。
PCA 通过对样本数据中各成分分量(10304维)进行排序,可选出主要成分,构成主成分分量V(n*k)矩阵(k维)且输出降维后的k维矩阵pcaA。
b1) 其中主成分矩阵V 可在 test.m 和 classify.m中直接带入公式求得降维后的矩阵。
b11) test.m中, TestFace = (TestFace-repmat(meanVec, m, 1))*V; %多个样本数据 经过pca变换降维
b12) classify.m中,xNewFace=(xNewFace-meanVec)*V; %单个样本数据 经过PCA变换降维
b2) 其中输出的k维矩阵pcaA将代替 原样本数据 参与后续数据处理,即pcaA成为样本。
3 数据规格化scaling
(1)数据规格化是什么?
数据规格化又称数据尺度归一化,是指将某一属性的取值范围 投射到一个特定范围之内,例如常用的[0,1]或[-1,+1]归一化。
b) 数据规格化的作用?
b1) 防止那些处于相对较大的数值范围的特征 压倒那些数值范围小的 特征。例如:几个人具有变化范围大的身高(150cm-180cm)以及 变化范围小的体重(50kg-60kg), 数据规格化后,两个属性的变化差异就缩小了,很好的保护了 变化范围小的 属性依旧能对目标识别起到重要作用。
b2) 避免一些数据溢出问题,统一放缩到同一范围,例如,把数据都限定在[-1,+1]区间,让那些大个子也不得不低头。
4)SVM分类识别
a)SVM是什么?
SVM支持向量机(support vector machine)。SVM是一种分类的方法,通过训练数据来建立分类模型,将分类模型用于对测试数据的分类。就相当于是叠了一个黑盒子,然后你往里扔小球(测试数据),他就能把小球分好类。当然前提是,你得用一堆小球(训练数据)去建立这样一个黑盒。
a1) SVMTrain —通过训练数据来建立分类模型SVMStruct
a2) SVMClassify —通过模型来对测试数据进行分类识别

b) SVM的优点?
传统模式识别技术只考虑分类器对训练样本的拟合情况,以最小化训练集上的分类错误为目标。然而在缺乏代表性的小训练集情况下,一味降低训练集上的错误,容易导致过度拟合。 这就叫只注重已有的(训练数据),不懂得审时度势,要放眼未来(测试数据)啊大兄弟!
这时候,SVM出现了,她懂得权衡利弊,而不是一味追求完美的训练数据拟合,她呢兼顾了训练误差与测试误差,以求得全局胜利,真是有智慧的女神! 让传统识别技术的屌丝哥哥们望尘莫及啊!
c) SVM的重点?
SVM的重点,在于分类模型的选择和模型参数的选择。
c1) 分类模型:通过控制分类模型的复杂性可以防止过度拟合,因此SVM更偏爱解释数据的简单模型—二维空间中的直线,三维空间中的平面,以及更高维空间中的超平面。
c2) 参数选择:参数选择的依据是–>寻找最优分类超平面,即寻找能成功分开两类样本 且 具有最大分类间隔的最优分类超平面。
d) SVM的技术热点有什么?

核函数:低维无法将两类样本分开时,可采用非线性映射到高维,利用超平面分开。从低维到高维的映射这就用到了核函数,而且核函数很神奇的无需知道具体映射关系就能给你实现某一非线性分类变换后的线性分类,且计算复杂度相较于低维并未增加。这,简直就是个天才函数!核函数。常用核函数有:线性核函数、多项式核函数、径向基核函数、Sigmoid核函数。(知道函数表达式,找出参数,就可带进去直接用了)
SVM推广到多类:因为SVM是一个二分器,她的基本思想是分开两类样本,即只能用于两类样本的分类。若想识别多类,需用到一些策略。常用的策略有:一对多的最大响应策略、 一对一的投票策略、一对一的淘汰策略。

二、源代码

% FR_GUI.m
addpath(genpath('./'))
global h_axes1;
global h_axes2;
h_f = figure('name', '基于PCA和SVM的人脸识别系统');

h_textC = uicontrol(h_f, 'style', 'text', 'unit', 'normalized', 'string', 'C=', 'position',...
    [0.05 0.7 0.1 0.06]);
h_editC = uicontrol(h_f, 'style', 'edit', 'unit', 'normalized', 'position', [0.05 0.6 0.1 0.06],...
    'callback', 'C = str2num(get(h_editC, ''string''))');
h_textGamma = uicontrol(h_f, 'style', 'text', 'unit', 'normalized', 'string', 'gamma=', 'position',...
    [0.05 0.5 0.1 0.06]);
h_editGamma = uicontrol(h_f, 'style', 'edit', 'unit', 'normalized', 'position', [0.05 0.4 0.1 0.06],...
    'callback', 'gamma = str2num(get(h_editGamma, ''string''))');

% 取得参数 C 和 gamma 的当前值,即最近一次训练所使用的值
t = dir('Mat/params.mat');
if length(t) == 0
    % 没有找到参数文件
    C = Inf;
    gamma = 1
else
    load Mat/params.mat;
end
function [imgRow,imgCol,FaceContainer,faceLabel]=ReadFaces(nFacesPerPerson, nPerson, bTest)
% 读入ORL人脸库的指定数目的人脸前前五张(训练)
%
% 输入:nFacesPerPerson --- 每个人需要读入的样本数,默认值为 5
%       nPerson --- 需要读入的人数,默认为全部 40 个人
%       bTest --- bool型的参数。默认为0,表示读入训练样本(前5张);如果为1,表示读入测试样本(后5张)
%
% 输出:FaceContainer --- 向量化人脸容器,nPerson * 103042 维矩阵,每行对应一个人脸向量

if nargin==0 %default value
    nFacesPerPerson=5;%5张用于训练
    nPerson=40;%要读入的人数(每人共10张,前5张用于训练)
    bTest = 0;
elseif nargin < 3
    bTest = 0;
end

img=imread('Data/ORL/S1/1.pgm');%为计算尺寸先读入一张
[imgRow,imgCol]=size(img);


FaceContainer = zeros(nFacesPerPerson*nPerson, imgRow*imgCol);
faceLabel = zeros(nFacesPerPerson*nPerson, 1);

% 读入训练数据
for i=1:nPerson
    i1=mod(i,10); % 个位
    i0=char(i/10);
    strPath='Data/ORL/S';
    if( i0~=0 )
        strPath=strcat(strPath,'0'+i0);
    end
    strPath=strcat(strPath,'0'+i1);
    strPath=strcat(strPath,'/');
    tempStrPath=strPath;
    for j=1:nFacesPerPerson
        strPath=tempStrPath;
        
        if bTest == 0 % 读入训练数据
            strPath = strcat(strPath, '0'+j);
        else
            strPath = strcat(strPath, num2str(5+j));
        end

        FaceContainer((i-1)*nFacesPerPerson+j, :) = img(:)';
        faceLabel((i-1)*nFacesPerPerson+j) = i;
    end % j
end % i

三、运行结果

在这里插入图片描述
在这里插入图片描述

四、备注

完整代码或者代写添加QQ912100926
往期回顾>>>>>>
【图像压缩】图像处理教程系列之图像压缩【Matlab 074期】
【图像分割】图像处理教程系列之图像分割(一)【Matlab 075期】
【图像分割】图像处理教程系列之图像分割(二)【Matlab 076期】
【模式识别】银行卡号之识别【Matlab 077期】
【模式识别】指纹识别【Matlab 078期】
【图像处理】基于GUI界面之DWT+DCT+PBFO改进图像水印隐藏提取【Matlab 079期】
【图像融合】CBF算法之图像融合【Matlab 080期】
【图像去噪】自适应形态学之图像去噪【Matlab 081期】
【图像增强】DEHAZENET和HWD之水下去散射图像增强【Matlab 082期】
【图像增强】PSO寻优ACE之图像增强【Matlab 083期】
【图像重建】ASTRA算法之图像重建【Matlab 084期】
【图像分割】四叉树之图像分割【Matlab 085期】
【图像分割】心脏中心线之提取【Matlab 086期】
【图像识别】SVM植物叶子之疾病检测和分类【Matlab 087期】
【图像识别】基于GUI界面之模板匹配手写数字识别系统【Matlab 088期】
【图像识别】基于GUI界面之不变矩的数字验证码识别【Matlab 089期】
【图像识别】条形码识别系统【Matlab 090期】
【图像识别】基于GUI界面RGB和BP神经网络之人民币识别系统【Matlab 091期】
【图像识别】CNN卷积神经网络之验证码识别【Matlab 092期】
【图像分类】极限学习分类器之对遥感图像分类【Matlab 093期】
【图像变换】DIBR-3D之图像变换【Matalb 094期】
【图像分割】模糊聚类算法之FCM图像分割【Matlab 095期】
【模式识别】银行监控系统之人脸识别【Matlab 096期】
【模式识别】基于GUI界面之疲劳检测系统【Matlab 097期】
【图像识别】国外车牌识别【Matlab 098期】
【图像分割】最大类间方差法(otsu)之图像分割【Matlab 099期】
【图像分割】直觉模糊C均值聚类之图像分割IFCM【Matlab 100期】
【图像分割】基于matlab形态学重建和过滤改进FCM算法(FRFCM)之图像分割【Matlab 101期】
【图像增强】局部对比度增强CLAHE算法之直方图增强【Matlab 102期】
【图像融合】Frequency Partition之图像融合【Matlab 103期】
【图像评价】SVM之图像无参考质量评价【Matlab 104期】
【图像边缘检测】最小二乘法用于椭圆边缘检测【Matlab 105期】
【图像加密】基于GUI界面之混沌系统图像加密解密【Matlab 106期】
【图像配准】SIFT算法之图像配准【Matlab 107期】
【图像分割】随机游走算法用于图像分割【Matlab 108期】
【图像分割】形态学重建和过滤改进FCM算法(FRFCM)用于图像分割【Matlab 109期】
【图像分割】图像分割IFCM之直觉模糊C均值聚类【Matlab 110期】
【图像增强】区域相似变换函数与蜻蜓算法之灰度图像增强【Matlab 111期】
【图像直线拟合】最小二乘法之图像直线拟合【Matlab 112期】
【图像去雾】暗通道之图像去雾【Matlab 113期】
【图像识别】基于matlab GUI界面之路面裂缝识别【Matlab 114期】
【图像识别】身份证号码之识别【Matlab 115期】
【图像聚类】FCM和改进之FCM脑部CT图像聚类【Matlab 116期】
【图像评价】CCF算法之图像质量评价【Matlab 117期】
【图像分割】蚁群优化模糊聚类之图像分割【Matlab 118期】
【模式识别】基于GUI界面之水果检测系统【Matlab 119期】
【模式识别】基于GUI界面之水果分类系统【Matlab 120期】
【模式识别】基于GUI界面之水果分级系统【Matlab 121期】
【模式识别】人脸识别之检测脸、眼、鼻子和嘴【Matlab 122期】
【图像处理】基于 GUI界面之图像加解密【Matlab 124期】
【模式识别】基于GUI界面BP网络之手写体大写字母识别【Matlab 125期】
【图像分割】基于GUI界面之医学影像分割【Matlab 126期】
【图频处理】基于GUI界面之环图像处理与音乐播放系统【Matlab 127期】
【图像隐藏】基于Laguerre 变换之图像隐藏【Matlab 128期】
【图像处理】基于dwt函数之实现二维小波变换【Matlab 129期】
【图像处理】分形插值算法之调换图片【Matlab 130期】
【图像边缘检测】基于GUI界面之图像边缘检测系统【Matlab 131期】
【图像分割】基于GUI界面之彩色图像分割【Matlab 132期】
【图像去噪】基于GUI界面之图像滤波去噪【Matlab 133期】
【图像几何运算】基于GUI界面之图像几何运算系统【Matlab 134期】
【图像处理】基于GUI界面之图像处理系统【Matlab 135期】
【图像识别】基于matlab之细胞识别和边缘检测【Matlab 136期】
【模式识别】反馈神经Hopfield的数字识别【Matlab 172期】
【模式识别】指纹图像细节特征提取 【Matlab 173期】
【图像分割】RGB HSV YCbCr Lab颜色空间人脸检测之图像分割【Matlab 174期】
【图像压缩】小波变换之图像压缩【Matlab 175期】
【模式识别】基于GUI界面的火灾检测【Matlab 230期】
【模式识别】基于Hough变换的答题卡识别【Matlab 231期】
【模式识别】二值膨胀差分和椒盐滤波之教室内人数识别系统【Matlab 232期】
【小波变换】基于GUI界面DWT与SVD算法的数字水印 【Matlab 233期】
【模式识别】基于GUI界面的指针式表盘识别【Matlab 234期】
【模式识别】基于Hough变换图片车道线检测 【Matlab 235期】
【图像分割】粒子群优化T熵图像分割【Matlab 236期】
【图像分割】粒子群优化指数熵图像分割【Matlab 237期】
【图像分割】粒子群优化指数熵图像分割【Matlab 238期】
【模式识别】基于GUI贝叶斯最小错误率手写数字识别【Matlab 239期】
【模式识别】PCA手写数字识别【Matlab 240期】
【模式识别】特征匹配的英文印刷字符识别【Matlab 241期】
【模式识别】知识库的手写体数字识别【Matlab 242期】
【模式识别】银行卡数字识别【Matlab 243期】
【边缘检测】插值法亚像素边缘检测【Matlab 248期】
【图像识别】表情检测【Matlab 288期】
【图像检测】LSD直线检测【Matlab 289期】
【图像融合】红外与可见光的融合与配准算法【Matlab 290期】
【图像识别】帧差法跌倒检测【Matlab 291期】
【图像识别】组合BCOSFIRE过滤器进行墙体裂缝识别【Matlab 292期】
【模式识别】中值滤波和二值化的跌倒检测【Matlab 293期】
【图像隐写】DCT的图像隐写【Matlab 294期】
【图像隐写】LSB的图像隐写提取【Matlab 295期】
【图像隐写】高斯模型的JPEG图像隐写【Matlab 296期】
【图像隐写】图像自适应隐写算法wow【Matlab 297期】

你可能感兴趣的:(matlab,图像处理)