Matlab PCA+SVM人脸识别(一)

声明:本文转载自http://blog.csdn.net/light_lj/article/details/26703959
概述:

编程平台:Matlab;

数据:       ORL人脸库。pgm格式的图片。40人,每人10幅图,图像大小为112*92像素。 图像本身已经经过处理,不需要进行归一化和校准等工作;下载地址第三段的两个都是下载链接

数据处理:主成分分析法(PCA);有关算法原理可以参考这里

分类器:    支持向量机(SVM)。

人脸识别算法步骤概述:

1、读取训练数据集;

2、主成分分析法降维并去除数据之间的相关性;

3、数据规格化(去除数据单位因素对分类造成的影响,这个对此实验造成的影响不大);

4、SVM训练(选取径向基和函数);

5、读取测试数据、降维、规格化;

6、用步骤4产生的分类函数进行分类(多分类问题,采用一对一投票策略,归位得票最多的一类);

7、计算正确率。

准备工作:

下载人脸库

如果你用的不是ORL人脸库,可能还需要先进行人脸检测

把Matlab的左上角当前路径(current folder)设置为你的.m的保存的路径,或者用addpath('...... ')设置

编程实现:
读取数据:

ReadFace.m文件,若flag=0,表述读取原文件的前五幅图作为训练数据,若flag=1,表述读取原文件的后五幅图作为测试数据,数据存入f_matrix中,每一行为一个文件,每行为112*92列。

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function [f_matrix,realclass] = ReadFace(npersons,flag)  
  2. %读取ORL人脸库照片里的数据到矩阵  
  3. %输入:  
  4. %     nPersons-需要读入的人数,每个人的前五幅图为训练样本,后五幅为验证样本  
  5. %     imgrow-图像的行像素为全局变量  
  6. %     imgcol-图像的列像素为全局变量  
  7. %     flag-标志,为0表示读入训练样本,为1表示读入测试样本  
  8. %输出:  
  9. %已知全局变量:imgrow=112; imgcol=92;  
  10. global imgrow;  
  11. global imgcol;  
  12. realclass=zeros(npersons*5,1);  
  13. f_matrix=zeros(npersons*5,imgrow*imgcol);  
  14. for i=1:npersons  
  15.     facepath='E:\ORL_face\s';  
  16.     facepath=strcat(facepath,num2str(i));  
  17.     facepath=strcat(facepath,'\');  
  18.     cachepath=facepath;  
  19.     for j=1:5  
  20.         facepath=cachepath;  
  21.         if flag==0 %读入训练样本图像的数据  
  22.             facepath=strcat(facepath,'0'+j);  
  23.         else %读入测试样本数据  
  24.             facepath=strcat(facepath,num2str(5+j));  
  25.             realclass((i-1)*5+j)=i;  
  26.         end  
  27.         facepath=strcat(facepath,'.pgm');  
  28.         img=imread(facepath);  
  29.         f_matrix((i-1)*5+j,:)=img(:)';  
  30.     end  
  31. end  
  32. end  
主成分分析:

去除原成分各维之间的相关性并进行降维,对降维后维数的选择要看你对最小平方误差的要求,被舍去的协方差矩阵的特征根的平方和与所有特征根的平方和就是最小平方误差。这里选择降至20维。下面是fastPCA.m

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function [ pcaA,V] = fastPCA( A,k,mA)  
  2. %快速PCA,主成份分析  
  3. %输入:A-样本矩阵,每行是一个样本,列是样本的维数  
  4. %      k-降至k维  
  5. %输出:pacA-降维后的k维样本特征向量组成的矩阵,即主成分  
  6. %     v-主成分分量  
  7. m=size(A,1);  
  8. Z=(A-repmat(mA,m,1));  
  9. T=Z*Z';  
  10. [V,D]=eigs(T,k);%计算T的最大的k个特征值和特征向量  
  11. V=Z'*V;         %协方差矩阵的特征向量  
  12. for i=1:k       %特征向量单位化  
  13.     l=norm(V(:,i));  
  14.     V(:,i)=V(:,i)/l;  
  15. end  
  16. pcaA=Z*V;       %线性变换,降至k维  
  17. end  
数据规范化:

scaling.m

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function [ scaledface] = scaling( faceMat,lowvec,upvec )  
  2. %特征数据规范化  
  3. %输入——faceMat需要进行规范化的图像数据,  
  4. %       lowvec原来的最小值  
  5. %       upvec原来的最大值  
  6. upnew=1;  
  7. lownew=-1;  
  8. [m,n]=size(faceMat);  
  9. scaledface=zeros(m,n);  
  10. for i=1:m  
  11.     scaledface(i,:)=lownew+(faceMat(i,:)-lowvec)./(upvec-lowvec)*(upnew-lownew);  
  12. end  
  13. end  
SVM分类器训练:

multiSVMtrain.m

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function [ multiSVMstruct ] =multiSVMtrain( traindata,nclass,gamma,c)  
  2. %多类别的SVM训练器  
  3. %   Detailed explanation goes here  
  4. for i=1:nclass-1  
  5.     for j=i+1:nclass  
  6.         X=[traindata(5*(i-1)+1:5*i,:);traindata(5*(j-1)+1:5*j,:)];  
  7.         Y=[ones(5,1);zeros(5,1)];  
  8.         multiSVMstruct{i}{j}=svmtrain(X,Y,'Kernel_Function',@(X,Y) kfun_rbf(X,Y,gamma),'boxconstraint',c);  
  9.     end  
  10. end  
  11. end  
SVM分类器的径向基核函数:kfun_rbf.m

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function [ K ] = kfun_rbf(u,v,gamma)  
  2. %SVM分类器的RBF核函数  
  3. %   Detailed explanation goes here  
  4. m1=size(u,1);  
  5. m2=size(v,1);  
  6. K=zeros(m1,m2);  
  7. for i=1:m1  
  8.     for j=1:m2  
  9.         K(i,j)=exp(-gamma*norm(u(i,:)-v(j,:))^2);  
  10.     end  
  11. end  
  12. end  
SVM分类器对测试数据进行分类:

multiSVM.m

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function [ class] = multiSVM(testface,multiSVMstruct,nclass)  
  2. %对测试数据进行分类  
  3. m=size(testface,1);  
  4. voting=zeros(m,nclass);  
  5. for i=1:nclass-1  
  6.     for j=i+1:nclass  
  7.         class=svmclassify(multiSVMstruct{i}{j},testface);  
  8.         voting(:,i)=voting(:,i)+(class==1);  
  9.         voting(:,j)=voting(:,j)+(class==0);  
  10.     end  
  11. end  
  12. [~,class]=max(voting,[],2);  
  13. end  
主函数:

face.m

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. clc,clear  
  2. npersons=40;%选取40个人的脸  
  3. global imgrow;  
  4. global imgcol;  
  5. imgrow=112;  
  6. imgcol=92;  
  7.   
  8. disp('读取训练数据...')  
  9. f_matrix=ReadFace(npersons,0);%读取训练数据  
  10. nfaces=size(f_matrix,1);%样本人脸的数量  
  11. disp('.................................................')  
  12. %低维空间的图像是(nperson*5)*k的矩阵,每行代表一个主成分脸,每个脸20维特征  
  13.   
  14. disp('训练数据PCA特征提取...')  
  15. mA=mean(f_matrix);  
  16. k=20;%降维至20维  
  17. [pcaface,V]=fastPCA(f_matrix,k,mA);%主成分分析法特征提取  
  18. disp('.................................................')  
  19.   
  20. disp('显示主成分脸...')  
  21. visualize(V)%显示主分量脸  
  22. disp('.................................................')  
  23.   
  24. disp('训练特征数据规范化...')  
  25. disp('.................................................')  
  26. lowvec=min(pcaface);  
  27. upvec=max(pcaface);  
  28. scaledface = scaling( pcaface,lowvec,upvec);  
  29.   
  30. disp('SVM样本训练...')  
  31. disp('.................................................')  
  32. gamma=0.0078;  
  33. c=128;  
  34. multiSVMstruct=multiSVMtrain( scaledface,npersons,gamma,c);  
  35.   
  36. disp('读取测试数据...')  
  37. disp('.................................................')  
  38. [testface,realclass]=ReadFace(npersons,1);  
  39.   
  40. disp('测试数据特征降维...')  
  41. disp('.................................................')  
  42. m=size(testface,1);  
  43. for i=1:m  
  44.     testface(i,:)=testface(i,:)-mA;  
  45. end  
  46. pcatestface=testface*V;  
  47.   
  48. disp('测试特征数据规范化...')  
  49. disp('.................................................')  
  50. scaledtestface = scaling( pcatestface,lowvec,upvec);  
  51.   
  52. disp('SVM样本分类...')  
  53. disp('.................................................')  
  54. class= multiSVM(scaledtestface,multiSVMstruct,npersons);  
  55.   
  56. accuracy=sum(class==realclass)/length(class);  
  57. display(['正确率:',num2str(accuracy)])  
补充:
这里的两部分是为了让大家更容易理解主成分分析,而特意做的补充。
显示主分量脸:

在主函数的第21行 有一句程序是visualize(V)%显示主成分脸”,这个是吧20个最大特征之对应的特征向量(就是低维空间的基)以图像的形式显示出来,其他所有图片就是这20张图片(主分量)的线性组合,保存为文件visualize.m

[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. function visualize( B )  
  2. %显示主成分分量脸(变换空间中的基向量,即单位特征向量)  
  3. %输入:B——每列是个主成分分量  
  4. %     k——主成分的维数  
  5. global imgrow;  
  6. global imgcol;  
  7. figure  
  8. img=zeros(imgrow,imgcol);  
  9. for i=1:20  
  10.     img(:)=B(:,i);  
  11.     subplot(4,5,i);  
  12.     imshow(img,[])  
  13. end  
  14. end  

下面是调用visualize.m显示的主分量人脸:

基于主分量的人脸重构:
这段程序没有特意写成一个单独的函数,可以把它插入在主函数里主成分分析的代码下面
[plain]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. approx=mA;  
  2. for i=1:k  
  3.     approx=approx+pcaface(1,i)*V(:,i)';%pcaface的第一个参数代表你要重建的人脸,这里对第一个人的第一张脸脸进行重建  
  4. end  
  5. disp('人脸重建')  
  6. figure  
  7. B=reshape(approx',112,92);  
  8. imshow(B,[])  
下面分别是主成分为20维、50维、100维、150维时重构出来的第一张照片
     

原图为:

可见150维已经可以很好地对原图片进行重构。

附:pgm格式的图片好像是Linux的格式,在Windows上无法直接打开,在这里我是用Matlab的指令打开:imshow(imread('文件路径'))。


  • 10
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
PCA XGB人脸识别是一种基于主成分分析(PCA)和XGBoost算法的人脸识别方法。PCA即主成分分析,是一种常用的降维方法,可以将高维的人脸特征映射到低维空间,从而减少特征的数量,提高计算效率和模型性能。 XGBoost是一种基于梯度提升树的机器学习算法,可以有效地处理高维数据,并具有较强的分类和回归能力。将PCA和XGBoost结合起来,可以利用PCA降维的优势来减少计算量,然后使用XGBoost进行人脸识别的建模和预测。这种方法在人脸识别领域被广泛应用,具有较高的准确率和鲁棒性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [PCA经典人脸识别PCA+SVM人脸识别方法_matlab](https://download.csdn.net/download/m0_53407570/85137102)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [机器学习及项目实战](https://blog.csdn.net/weixin_44888486/article/details/107047653)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [我愿称之为史上最全的深度学习面经总结(附答案详解)](https://blog.csdn.net/qq_29462849/article/details/125241065)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值