江南大学实验报告课程名称:计算机视觉基础学院:物联网工程学院班级:计算机1206学号:1030412612姓名:王成义同组同学学号姓名:付聪+计算机1205+1030412522实验日期:2015/5/28实验名称:PCA人脸识别.1、实验目的1、熟悉人脸识别的方法原理。2、熟悉特征脸法识别人脸的方法。3、了解主成分分析在模式识别中的应用。2、实验内容/步骤内容:1.使用老师提供的人脸库图片(20个人×每人10张图片)。图片名规则****.bmp,(前2位代表第几个人,后2位代表这个人的第几张图片;例0305.bmp代表第3个人的第5张图片)2.对于每个人的相片,使用10张中的前7张作为training图片,剩下的3张作为testing图片。3.利用PCA进行分类识别,给出最后的识别正确率(也即testing图片(20人*3张=60张)有多少张能被正确识别)。步骤:1、将ORL人脸库分成两个库ORL_TRAIN(训练库20*7)和ORL_TEST(测试库20*3)。2、将训练库中的图片构造成一个训练集,根据老师所讲的PCA算法原理对训练集进行处理。3、对测试图片进行和训练集同过程处理。4、用最近邻分类器进行分类。5、求出识别率。3、实验源程序3.1、pca_of_wchy_main.m:主函数functionpca_of_wchy_main()%%%%%%%%%构造训练集%%%%%%%%%%%%%%%%path='ORL_TRAIN\';File=dir([path,'*.bmp']);dsize=length(File);%读取数据库图片数量pic=zeros(dsize,15*15);%加载样本图像到X*(15*15)的矩阵中fori=1:dsizeImage1=imread(strcat(path,File(i).name));Image2=imresize(Image1,[15,15]);pic(i,:)=double(reshape(Image2,1,[]));end;TrainSamples=pic';smalle=10.^(-5);%一个小数字阈值trsize=size(TrainSamples,2);%训练样本总数Nx=TrainSamples;xm=mean(x,2);x=x-repmat(xm,1,trsize);%训练样本及中心化%%%%%%%%%PCA%%%%%%%%%%%%%%%%[weexplain]=pca_of_wchy(x'*x);r=length(find(esmalle));w=w(:,1:r);e=e(1:r);w=x*w*diag(1./sqrt(e));%SVD方法求解PCAx0=w'*x;%将训练样本投影到PCA子空间,这里,w即为W_pca%%%%%%%%%%%%%%%测试%%%%%%%%%%%%%%%%%%%%%error_recognition=0;right_recognition=0;path_test='ORL_TEST\';File_test=dir([path_test,'*.bmp']);dsize_test=length(File_test);%读取数据库图片数量fori=1:dsize_testImage=imread(strcat(path_test,File_test(i).name));ImageI=double(imresize(Image,[15,15]));phi_test=zeros(1,15*15);phi_test(1,:)=double(reshape(ImageI,1,[]));TestSamples=phi_test';tesize=size(TestSamples,2);%测试样本总数xt0=w'*(TestSamples-repmat(xm,1,tesize));%同样地,将测试样本投影到PCA子空间%%%%%%%%%%%%用自己写的最近邻分类器进行分类,并计算识别正确和错误的数量%%%%%%%%%%%%%%%%%%wchy=Min(x0,xt0);%%最近邻分类器函数Imagess=imread(strcat(path,File(wchy).name));wchy_classifer_tr_name=File(wchy).name;wchy_classifer_te_name=File_test(i).name;%%%%%%%%%%%%因图片名前两位一致的分为同一类,故比较前两位的差异判断识别是否正确%%%%%%%%%%%%%ifstrcmpi(wchy_classifer_tr_name(1,1:2),wchy_classifer_te_name(1,1:2))==0error_recognition=error_recognition+1;elseright_recognition=right_recognition+1;endend%%%%%%%%%%%计算识别率%%%%%%%%%%%%%%%%%recognition_ratio=right_recognition/(right_recognition+error_recognition);fprintf('测试样本总数:%d,识别率:%2.2f%%',dsize_test,recognition_ratio*100)%显示测试图片最后一张,发现识别成功了,可以写到测试循环里,显示每一张测试图片的识别情况subplot(1,2,1);imshow(Image),title(['测试图片:',File_test(i).name])subplot(1,2,2);imshow(Imagess),title(['识别出的图片:',File(wchy).name])3.2、pca_of_wchy.m:PCAfunction[coeff,latent,explained]=pca_of_wchy(v)[~,latent,coeff]=svd(v);latent=diag(latent);totalvar=sum(latent);explained=100*latent/totalvar;[p,d]=size(coeff);[~,maxind]=max(abs(coeff),[],1);colsign=sign(coeff(maxind+(0:p:(d-1)*p)));coeff=bsxfun(@times,coeff,colsign);end3.3、Min.m:最近邻分类器function[I]=Min(ProjectedTrainSamples,ProjectedTestSamples)%==============u代表多少行,v代表多少列===========%[u,v]=size(ProjectedTrainSamples);Mindest(v)=0;forxm=1:vforym=1:udiff(ym)=ProjectedTrainSamples(ym,xm)-ProjectedTestSamples(ym,1);endforym=1:uMindest(xm)=Mindest(xm)+(diff(ym).*diff(ym));endendDistance=sqrt(Mindest);%对距离进行排序%=====dis是排序后的序列,ind是打乱后的下标======%[dis,ind]=sort(Distance);%从小到大排序qx=ind(1);I=qx;4、实验结果实验效果截图如下:图1图25、实验心得通过本次实验,对于PAC人脸识别算法有了更深的了解,通过自己编程实现,掌握了求解PCA的步骤,了解了最近邻分类器算法的基本原理和方法。通过对ORL人脸库的识别测试,对人脸识别以及模式识别流程有了更全面的认识。