matlab自带的人脸分类器,基于MATLAB,运用PCA+SVM的特征脸方法人脸识别

概述:

此文章将要描述一种基于MATLAB平台,运用PCA主成分分析方法对图片数据进行降维,运用SVM支持向量机分类器对降维后的图片数据进行分类处理,从而达到人脸识别的目的。

首先要感谢以下几篇文章的作者(后面引用会标识文章标号)

2.

PCA (主成分分析)详解 (写给初学者) 结合matlab(F),E篇列出了具体的数据供大家检验,大家可以根据数据来验证数学过程,简单易懂。F篇与前篇有点相似,对初学者很有帮助。

4.浅谈协方差矩阵(G)此篇文章对于大家了解协方差矩阵以及matlab实现很有作用。

准备:

1.编程平台:MATLAB。

首先你得保证你的机器上安装有matlab,建议较高的版本。

2.libsvm工具箱。

本人在对第一篇文章中代码关于SVM分类的部分没有运行成功,所以运用了libsvm工具箱对样本训练,测试,并没有运用第一篇文章的代码,如果你能成功可忽略,但建议安装此工具箱,其对SVM分类有很大帮助。如果你一样没有成功,这里推荐一个链接,有关于libsvm工具箱的安装配置的视频。

3.数据:ORL人脸库。

这个数据为已经预处理的数据,格式为pgm,属于Linux格式,windows环境下无法直接打开,可以在matlab中打开,打开方式imshow(imread('图片路径'));数据是400张人脸图片,属于40个人,每个人10张,每张大小112*92像素,数据下载地址在第一篇文章中有,这里也给个链接,第四段两个链接都可下载。

4.主成分分析法PCA。

主成分分析法是一种降维的方法,上面给出了几个有用的链接,本文只给出代码,以及代码说明,关于原理,大家尽可参照上面几个链接,写得非常详细也非常通俗。

5.SVM支持向量机分类器。

SVM支持向量机是一个二类分类器,但是本次人脸识别不仅只是分出两类,而是需要分出40个类别。本人以前有过一点机器学习基础,所以在支持向量机原理的理解上没有多大问题,如果读者没有SVM基础,可参考SVM入门(H),以及写的非常给力的帖子,SVM三层境界(I)。

注:也许很多初学者看到这么多的资料,链接都已经晕了,失去了学习的动力。先别灰心,稍后我会把代码以及代码运行的结果和过程展示给大家,当大家看到这些图像的变换的美妙,就会有学习的兴趣。

编程实现:

以下将要展示的是几个.m文件的代码,.m文件即是能在matlab上面打开运行的代码文件,可以在其中定义函数,如果matlab的当前路径指定在含有这些.m文件的文件夹中,运行时就可以调用这些文件中定义的函数。

首先展示第一个.m文件,便是图片数据读取函数ReadFace.m

function [f_matrix,realclass]=ReadFace(n_persons,flag)

%ORL人脸库。pgm格式的图片。40人,每人10幅图,图像大小为112*92像素。

%每个人有10幅照片,前5幅当作训练集,后5幅当作测试集

%

%输入变量flag:

%   flag是一个标识变量

%   当flag为0时,表示输入为训练集,flag为1时,表示输入为测试集

%

%输入变量n_persons:

%   n_persons标志着你想要识别的人脸个数

%

%输出变量realclass:

%   realclass是一个n_person*5行,1列的列向量。

%   realclass即是数据的标签,无论训练集测试集都进行了标签处理

%

%输出变量f_matrix:

%   f_matrix是一个n_person*5行,112*92列的矩阵

%   每一行便是每一张图片的灰度数据

%   将每一张图片列向量排成一个列向量后转置得到放入f_matrix各行当中

imgrow=112;imgcol=92;

global imgrow;   %载入图片行数

global imgcol;    %载入图片列数

realclass=zeros(n_persons*5,1);

f_matrix=zeros(n_persons*5,imgrow*imgcol);

for i=1:n_persons

%路径设置

%函数num2str(i)说明:将数字转化为字符

facepath=strcat('F:\MATLAB人脸识别\Face\facedata\s',num2str(i),'\');  %路径因不同情况而定

cachepath=facepath;

for j=1:5

facepath=cachepath;

if flag==0

%函数strcat(a,b,...)说明:将输入字符a,b...连接成单个字符

facepath=strcat(facepath,num2str(j));

else

facepath=strcat(facepath,num2str(j+5));

end

realclass((i-1)*5+j)=i;

facepath=strcat(facepath,'.pgm');

%函数imread说明:读取输入路径的图片,将每个像素灰度值保存在输出的矩阵中

img=imread(facepath);

f_matrix((i-1)*5+j,:)=img(:)';

end

end

end

代码当中有着详细的注释,代码与第一篇文章中提供的代码大同小异,根据本人情况修改了一点路径的代码,以及增加了对训练集标签的标识,且增加了注释。现在对代码进行一些说明。

代码第一行有对函数的申明,function []=ReadFace(),中括号为函数的输出,小括号为函数的输入,函数名与文件名一致,一个.m文件当中可以有多个函数申明,但当外面的函数想要调用这个文件中的函数时,只能调用与文件名一致的函数。所以这个文件叫ReadFace.m。

何为训练集以及测试集?

在机器学习方法当中,分为监督学习,非监督学习,强化学习。而SVM支持向量机是一种监督学习的算法。所谓监督学习,就是给予机器一套题目并附上标准答案,让它去做题,自己总结了一套做题的方法(这些方法就是建立的模型),它在根据已经学习好的方法来做一套新的题目,把题目做对,尽可能打高分。

训练集就是给予机器的一套题目及标准答案,测试集就是给它的一套新题。而训练集有标签和数据之分,标签就是标准答案,标签有着1和0,就表示这些训练集中有两类,像我们的人脸数据有40种人脸,我们就用1到40来表示。数据就是有着多维的表征一个事物的数据,就是给机器的第一套题目。测试集也有数据,就是后面给机器测试的题目,如果测试集原本含有标签,这些标签就可以作为标准给机器前面训练总结的方法(模型)打分,查看准确率。

在这个人脸库中,每个人有10张图,我们将前5张作为训练集,就有200张图。用一个矩阵来表示这200张图,就形成了一个200*10304的矩阵。后5张图用来当测试集,可以看代码中的说明。

当flag为0时,找出训练集的标签realclass(200*1的矩阵)与数据f_matrix(200*10304的矩阵).

当flag为1时,就是找出测试集来测试分类效果,得出准确率。

SVM训练的目的就是利用训练集找到这么一个分类函数(模型),再在测试集中检测。关于SVM的具体原理查看上面的H和I篇。

--------------------------------分割线---------------------------------------

第二个.m文件的文件名为fastPCA.m,用于将样本进行降维处理,参考上面主成分分析PCA文章D,E,F篇,上面有通俗且具体的阐述。

function [ pcaA,V] = fastPCA( A,k,mA)

%快速PCA,主成份分析

%输入:A-样本矩阵,每行是一个样本,列是样本的维数

%            k-降至k维

%           mA-图像矩阵f_matrix每一列的均值排成一个行向量,即mean(f_matrix)

%输出:pacA-降维后,训练样本在低维空间中的系数坐标表示

%            V-主成分分量,即低维空间当中的基

%

m=size(A,1);  %m为读取图片的张数

Z=(A-repmat(mA,m,1));  %中心化样本矩阵

%一般用中心化的矩阵代替原矩阵。为什么?因为将数据集的均值归零(预处理),也就是只取数据的偏差部分

T=Z*Z';

[V1,D]=eigs(T,k);%计算T的最大的k个特征值和特征向量

V=Z'*V1;         %协方差矩阵的特征向量

%这一点是关键步骤,很可能很多初学者无法理解:

%按理来讲,协方差矩阵的计算公式为(假设上面中心化的Z已经求出):

%V = (Z'*Z)./(size(Z,1)-1)(先不管单位化,V=Z'*Z)(这里是一行为一个样本,一列为一个维数的情况)

%协方差矩阵是N*N的方阵,维数N应该与原图片f_matrix(200*10304)维数相等

%f_matrix中行数200为图片个数,列数10304为维数

%那为什么这里是T=Z*Z',再求T的K个最大特征值和特征向量V1,再用V=Z'*V1来求协方差矩阵特征向量呢?

%因为我们如果求V=Z'*Z这个V就是一个10304*10304的矩阵,MATLAB奔溃了,太复杂

%我们可以这样看P^-1*(Z*Z')*P=S等价于P^-1*(Z')^-1*Z'*Z*Z'*P=S等价于(Z'*P)^-1*(Z'*Z)*(Z'*P)=S

%注:P^-1是P的逆矩阵,(Z')^-1为Z'的逆矩阵,类推,建议大家写在纸上

%最后一个式子可以看出Z'*Z的特征向量矩阵为Z'*P,而Z*Z'的特征向量矩阵为P,即为程序中的V1

%这是一种简便方法,为的就是避免像V=Z'*Z这种维数太高的计算。

%可查看C篇文章步骤4

for i=1:k       %特征向量单位化

l=norm(V(:,i));

V(:,i)=V(:,i)/l;

end

%单位化后的V才能是真正的低维空间的基,需要满足正交化单位化两个条件

%具体原因参考D篇文章

pcaA=Z*V;       %线性变换,降至k维  ,将中心化的矩阵投影到低维空间的基中,V就是低维空间的基

%pcaA为低维空间的坐标表示,即一个图像的判断依据

end

代码与第一篇文章代码没有不同,只是多加了注释,便于大家理解。

下面贴出原图,均值脸以及两者的差值图:

513d87bc533296dd6f20d641ccbeb359.png

-------------------------------------------------分割线---------------------------------------------------------

第三个文件为scaling.m文件,其中的代码与原作者代码无二。略加注释。function [ scaledface] = scaling( faceMat,lowvec,upvec )

%特征数据规范化

%即是将同一个样本中的不同维度归一化

%因为因为对于不同的属性,如果不归一化是不具有比较性的,两者不在一个量级上

%输入——faceMat需要进行规范化的图像数据,

%                lowvec原来图像数据中的最小值

%                upvec原来图像数据中的最大值

upnew=1;

lownew=-1;

[m,n]=size(faceMat);

scaledface=zeros(m,n);

for i=1:m

scaledface(i,:)=lownew+(faceMat(i,:)-lowvec)./(upvec-lowvec)*(upnew-lownew);

%将图像数据中一个样本的不同维度的值,最小值和最大值规范到-1和1,其他值按比例规范到(-1,1)

end

end

-----------------------------------------------------分割线-----------------------------------------------------

第四个文件visualize.m中为显示特征脸的代码,比较简单,并附上显示结果。function visualize( B )

%显示特征脸(变换空间中的基向量,即单位特征向量)

%输入:B——每列是个主成分分量,显示的就是低维中每个基组成的图像

%     k——主成分的维数

global imgrow;

global imgcol;

figure

img=zeros(imgrow,imgcol);

for i=1:20

img(:)=B(:,i);

subplot(4,5,i);

imshow(img,[])

end

end

因为降至20维,所以其在低维中的基便是这20张特征脸,其他所有的经过了降维的脸都可以由这20张特征脸线性表示,即我们要进行脸部识别时,把选择要识别的脸进行降维处理后,再右乘这些基(特征脸)所构成的矩阵,就能得到这些脸在低维中的线性表示。这些表示就是识别的依据。

特征脸截图:

65f2e1d90c9d7b0e4507baf56195b71f.png

-------------------------------------------------分割线---------------------------------------------------------

第五个文件recognition.m中的代码,在A篇文章当中没有,是我自己编写的脸部识别的小程序,比较简单,没有像A篇文章中一样做GUI界面。function recognition(mA,V,model)

%函数作用:人脸识别模块,利用已经建好的模型,重新找一个样本进行识别

%输入:

%           mA-均值

%           V-协方差矩阵特征向量

%           model-通过SVM对训练集训练得出的已经建立好的模型

%%

global imgrow;

global imgcol;

%%

%弹出输入框,选择要识别的图片

select_person_num=str2double(cell2mat(inputdlg('请输入想要识别的人的编号(总共40个人):')));%总共40个人

select_img_num=str2double(cell2mat(inputdlg('请输入此人图片的编号(总共10张):')));%总共10张图

%%

%对图片信息进行处理,化为1*10304的行向量

disp('读取选择的图片...')

select_facepath=strcat('F:\MATLAB人脸识别\Face\facedata\s',num2str(select_person_num),'\',num2str(select_img_num),'.pgm');

select_img=imread(select_facepath);

select_matrix=zeros(1,imgrow*imgcol);

select_matrix(1,:)=select_img(:)';

select_matrix=(select_matrix-mA)*V;%PCA降维后的低维表示

%%

%图形归一化

disp('规范化选择的图片...')

select_matrix = scaling( select_matrix,min(select_matrix),max(select_matrix));

%%

%测试选择的图片,accuracy只有两个值,100%表示匹配正确,0%表示匹配错误

disp('测试选择的图片...')

[select_predict_label,accuracy,decision_values]=svmpredict(select_person_num,select_matrix,model);

%%

%显示原有图片和匹配图片进行比较

disp('显示选择的图片...')

figure(2);

subplot(1,2,1);imshow(select_img);title('你选择的图片');

subplot(1,2,2);

imshow(imread(strcat('F:\MATLAB人脸识别\Face\facedata\s',num2str(select_predict_label),'\',num2str(1),'.pgm')));

title('匹配的图片');

程序运行到此会弹出输入框,让用户选择想要识别的图片,当Accuracy=100%表示识别正确,如果Accuracy=0%表示识别错误。

fcc6dc526b3d331230a46e358a67dd1f.png          

57472ec11d6f87704bdcd44717bbb702.png          

a169441542de3b072e6dbc27a0c05230.png

输入编码后选择的图片,以及匹配到的图片对比。

fdf5d44ed0acff5a7ce16779a681ea3c.png

-------------------------------------------------分割线---------------------------------------------------------

第六个文件face.m中的代码为主程序。读者想要看到整个效果,只需要将此文件中的程序全部选中按F9即可运行。

注:我的SVM分类器是用libsvm工具箱当中的函数实现的两个关键函数便是svmtrain和svmpredict,核函数选用线性核函数。

以上暂时是初稿,肯定还有很多需要修改的地方,如果读者有什么疑问或是看到什么错误,希望能留言,我会加以请教。大家相互学习,相互进步。

转自:http://blog.csdn.net/yb536/article/details/40586695

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

J2EE的13个规范之(二) JDBC 及其使用

我想大家都知道ODBC是什么?ODBC(OpenDatabaseConnectivity。开放数据库互连)是微软公司开放服务结构(WOSA,WindowsOpenServicesArchitecture)中有关数据库的一个组成部分。它建立了一组规范,并提供了一组对数据库訪问的标准API(应…

被恶意上传了.php,轻松解决网站被恶意镜像

老听说有人的网站被恶意镜像,于是我先收藏几种解决方法。镜像站看似一个完整的站点,其实每次用户访问镜像站点,他的小偷程序就会来正版的网站查询数据,并修改相关链接然后呈献给用户。实质上还是在读取原站的数据,我们…

【代码笔记】iOS-对UIView进行截图

一,效果图。 二,工程图。 三,代码。 RootViewController.m #import "RootViewController.h"interface RootViewController ()endimplementation RootViewController- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBund…

mysql中括号_干货!Python与MySQL数据库的交互实战

作者 | Huang supreme,责编 | 郭芮头图 | CSDN 下载自视觉中国安装PyMySQL库如果你想要使用python操作MySQL数据库,就必须先要安装pymysql库,这个库的安装很简单,直接使用pip install pymysql;假如这种方式还是安装不上…

苹果天气不显示_热门天气APP被苹果拿下,安卓用户不能再使用

近日,Android平台最受欢迎的订阅式天气APP之一Dark Sky官方宣布其被苹果收购。收购后,Android和Wear OS上的Dark Sky APP都会在2020年7月1日下架,届时将关闭服务并提供退款,iOS版APP则不受影响。Dark Sky天气预报Dark Sky服务早就…

求n的阶乘的算法框图_算法|从阶乘计算看递归算法

欢迎点击「算法与编程之美」↑关注我们!本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。1理解递归“程序设计是实践计算机思维的重要手段”。程序设计的三种特征就是封装、继承和多态。而对于…

Python成长之路_装饰器

一、初入装饰器 1、首先呢我们有这么一段代码,这段代码假设是N个业务部门的函数 1 def f1(aaa): 2 print(我是F1业务) 3 if aaa f1: 4 return ok 5 6 def f2(aaa): 7 print(我是F2业务) 8 if aaa f2: 9 return ok 业务代码这里的…

python卸载_删除系统 Python 引发的惨案

这个案例告诉我们,千万不要动系统自带的 Python,Win系统除外文 | fanzhenyu 出处 | http://fanzhenyu.cn/由于无知,卸载 Ubuntu 自带的 python3 引发惨案,谨记,深刻反思。惨案由于实验需要使用 Python3.6 以上版本&…

python3迭代器是什么,python3 迭代器

1. 想要了解 迭代器 ,需要先 知道什么是 可迭代对象。简单点说,可以直接作用于for循环的对象,称之为可迭代对象(Iterable)。1.png可迭代对象,一定实现了__iter__方法。isinstance內建函数,可以判断一个对象是否是某个类…

边缘检测robert原理_机器视觉尺寸检测基础

尺寸测量/边缘检测利用边缘检查的尺寸检查是图像传感器的最新应用趋势。图像传感器可以将检查对象在平面上表现出来,通过边缘检测,测算位置、宽度、角度等。下面将按照处理过程来介绍边缘检查的原理。理解原理有助于优化检查设置。除此之外,还将介绍一些…

Telnet 爆破 kail_【UZI|SN输给DWG后,AD选手被爆破,弹幕刷了半小时Uzi】英雄联盟S10于10月31日终于正式落幕了_科技资讯...

『联盟玩科技摘要_UZI|SN输给DWG后,AD选手被爆破,弹幕刷了半小时Uzi』在SN输给了DWG之后,最大的背锅选手也出来了,AD选手huanfeng成为了这次的背锅选手,毕竟在最重要的第三把比赛中,huanfeng的EZ全程都没有…

no.7_qzhai 开心版_开心宝贝GM版下载-开心宝贝GM版安卓下载

开心宝贝GM版是一款经典Q萌风格的仙侠冒险ARPG手游。游戏画面精致唯美,角色刻画活灵活现,动态特效表达细致,原创的剧情故事跌宕起伏,为玩家们奉上了一场殿堂级的视听双重盛宴。Q萌仙侠世界任你探索,快来九妖下载体验一…

咋安装redhatlinux镜像在哪下载_Windows7正版系统安装教程

大家好,今天分享一篇来自装机吧官网(zhuangjiba.com)的图文教程。操作系统在整个计算机系统中具有承上启下的地位。但由于上网的操作系统鱼龙混杂的,很多朋友是不知道在哪下载Windows7正版系统的,所以贴心的小编就整理了这个Windows7正版系统…

Duanxx的图像处理学习: 透视变换(一)

当人用眼睛看事物的时候,会感觉到近处的东西是比远处的东西要大一些的,通俗的说,这就是透视。 总的来说。透视变换是将3D的世界转换到2D图像上的一种手段,人的视觉系统和摄像头视觉系统也是基于这一工作原理。 对透视变化的研究&a…

虚拟摄像头 安卓版_林俊杰 ft. M.E.,联同视效大厂数字王国加码虚拟偶像

原标题:林俊杰 ft. .,联同视效大厂数字王国加码虚拟偶像睽违三年,林俊杰携新专《幸存者如你》强势回归,一场「新歌首唱LIVE」在10月30日晚间如约而至。对虚拟科技情有独钟的林俊杰,从未错过每一次变身资深玩家的机会。此番线上视听盛宴的中途,一位「平行…

iphone屏蔽系统更新_iOS13屏蔽系统更新升级教程

好消息 !今天开始可以安装 tvOS13 屏蔽系统升级描述文件了。说起系统屏蔽更新,以前都是利用 tvOS描述文件去屏蔽系统更新,如果你之前有使用过它,你应该知道,一旦安装了,在软件更新就会显示当前系统为最新&a…

myeclipse 怎么安装与激活

摘录自:http://blog.csdn.net/u012318074/article/details/71310553 第一步:安装完成后不要运行MyEclipse 第二步:下载对应的破解文件 第三步:解压并打开破解文件 第四步:打开文件夹patch,将里面的文件全部…

oracle insert select 大 批量 数据_芬兰 Vaisala维萨拉 HM70手持式温湿度表 型号:FL15/HM70+HMP75【北京中西华大吧】...

陈经理18910282263芬兰 Vaisala维萨拉 HM70手持式温湿度表 型号:FL15/HM70HMP75库号:M72537 相对湿度测量范围 0…100 % RH多种语言用户界面显示图形趋势维萨拉HUMICAP 传感器技术3个探头, 温度范围-70 至180 C湿度探头、露点探头和二氧化碳探头均可连接显示多种湿度…

c++思维导图_必看|用好思维导图,别神话思维导图

不知不觉,时间已经划至5月中旬,20级的萌新们也从当初的“小白”不断进阶,化身老司机指日可待~相信从备考到现在,各位一定对“思维导图”这四个大字都听倦了!不管是老学长老学姐们公开课上传授的经验,还是刚…

spring处理循环依赖时序图_Maven依赖管理系统

【思考】首先,简单讲述一下为什么需要这样一个系统?不知道大家有没有思考,在一个可能有上千个模块/产品的公司,对于模块之间有较多相互依赖的情况,以下问题该如何解决:我们把一个生命周期结束的组件移除之后…