当前位置:文档之家› 中科院模式识别大作业——人脸识别

中科院模式识别大作业——人脸识别

人脸识别实验报告---- 基于PCA 和欧氏距离相似性测度一、理论知识1、PCA 原理主成分分析(PCA) 是一种基于代数特征的人脸识别方法,是一种基于全局特征的人脸识别方法,它基于K-L 分解。

基于主成分分析的人脸识别方法首次将人脸看作一个整体,特征提取由手工定义到利用统计学习自动获取是人脸识别方法的一个重要转变[1]。

简单的说,它的原理就是将一高维的向量,通过一个特殊的特征向量矩阵,投影到一个低维的向量空间中,表示为一个低维向量,并不会损失任何信息。

即通过低维向量和特征向量矩阵,可以完全重构出所对应的原来高维向量。

特征脸方法就是将包含人脸的图像区域看作是一种随机向量,因此,可以采用K-L 变换获得其正交K-L 基底。

对应其中较大特征值的基底具有与人脸相似的形状,因此又称为特征脸。

利用这些基底的线性组合可以描述、表达和逼近人脸图像,因此可以进行人脸识别与合成。

识别过程就是将人脸图像映射到由特征脸张成的子空间上,比较其与己知人脸在特征空间中的位置,从而进行判别。

2、基于PCA 的人脸识别方法2.1 计算特征脸设人脸图像f(x,y)为二维N×M 灰度图像,用NM 维向量R 表示。

人脸图像训练集为{}|1,2,...,i R i P =,其中P 为训练集中图像总数。

这P 幅图像的平均向量为:_11Pi i R R P ==∑ 对训练样本规范化,即每个人脸i R 与平均人脸_R 的差值向量:i A =i R -_R (i= 1,2,…,P) 其中列向量i A 表示一个训练样本。

训练图像由协方差矩阵可表示为:T C AA =其中训练样本NM ×P 维矩阵12[,,...,]P A A A A =特征脸由协方差矩阵C 的正交特征向量组成。

对于NM 人脸图像,协方差矩阵C 的大小为NM ×NM ,对它求解特征值和特征向量是很困难的,由此引入奇异值分解定理来解决维数过高的问题。

2.2 奇异值分解定理奇异值分解定理( Singular ValueDecomposition 简称SVD 定理)原理表述如下: 其中A 是一个秩为r 的n×r 维矩阵,则存在两个正交矩阵:011[,,...,]n rT r U u u u R U U I ⨯-=∈= 011[,,...,]r r T r V v v v R V V I ⨯-=∈=以及对角矩阵[]011,,...,r r r diag R λλλ⨯-Λ=∈且011r λλλ-≥≥≥L满足下试:12T A U V =Λ 其中: ()0,1,1i i r λ=-L 为矩阵T AA 和T A A 的非零特征值, i u 与i v 分别为T AA 和T A A 对应于i λ的特征向量。

上述分解称为矩阵A 的奇异值分解(简称SVD )为A 的奇异值。

由上述定理可以得到一个推论:12U AV -=Λ 由于协方差矩阵T C AA =,故构造矩阵: T P P L A A R ⨯=∈ ,容易求出其特征值i λ及相应的正交归一特征向量i v (i=1,2,…,p)。

有上述推论可知, C 的正交归一特征向量i u 为:1,2,,i i u Av i P ==L这就是图像的特征向量,它是计算P×P 低维矩阵L 的特征值和特征向量而间接求出来的。

实际上个K(K<P)个特征值足够用于人脸识别。

因此仅取L 的前K 个最大特征值的特征向量计算特征脸。

2.3 特征向量的选取我们总共得到了P (训练样本数目)个特征向量。

虽然P 比NM 小很多。

但通常情况下,P 仍然会太大。

根据应用的要求,并不是所有的i u 都有很大的保留意义。

考虑到使用K-L 变换做为对人脸图像的压缩手段,可以选取最大的前K 个特征向量,使得:11k i i P ii λαλ==≥∑∑ 在实际中,可以选择α=0.90,或者自定义的其他值。

这说明样本集在前K 个轴上的能量占到整个能量的90%以上。

2.4 基于特征脸的人脸识别基于特征脸的人脸识别过程由训练阶段和识别阶段两个阶段组成。

在训练阶段,每个已知规范化后的人脸i A 映射到由特征脸张成的子空间上,得到K 维向量:1,2,,T i iC U A i P ==L 其中[]12,,,T i k C c c c =L ,[]12,,k U u u u =L ,P 为人脸数目。

在识别阶段,首先把待识别的图像规范化后的人脸_''i A R R =-映射到特征脸空间,得到向量:''T i C U A =其中''''12,,,T k C c c c ⎡⎤=⎣⎦L 计算'C 和i C 的欧氏距离,有:'2||||i i C C ε=-找到最小的i ε,则待识别图像与第i 个训练样本匹配。

二、实现方法步骤1、 获取数据。

在编程时具体是把一幅二维的图像转换成一维的;2、 减去均值,实现图像数据的规范化处理。

3、 计算协方差矩阵根据SVD 原理得到的构造矩阵。

4、 计算构造矩阵的特征向量和特征值。

5、 根据构造矩阵的特征值和特征向量得到协方差矩阵的特征向量。

6、 根据能量比选择主成分特征向量。

7、 得到训练集中样本在主成份上的投影系数,得到待识别图像在主成份上的投影系数,根据已给相似度准则(欧氏距离)对各投影系数进行判别以确定匹配样本。

8、 统计识别率,随机输出几个匹配结果进行观察。

三、实验结果如图所示,对测试集中1192个图像数据的总识别率为69.27%,用时338秒对于随机输出的四个匹配结果可以看出PCA法能较准确的对人脸进行识别,但是错误率也比较高。

四、参考文献【1】边肇其,张学工.模式识别【M】.第2版.北京.:清华大学出版社,2000【2】周杰,卢春雨,张长水,李衍达,人脸自动识别方法综述【J】.电子学报,2000,5(4):102-106【3】田印中,董志学,黄建伟,基于PCA的人脸识别算法研究及实现【J】.内蒙古科技与经济,2010.3【4】张俊虎,郝晓剑,邢昊,人脸图像识别中的PCA算法实现【J】.微计算机信息,2010,26(7—1)五、附录(matlab 程序代码)用一个文件face_recongnition.m实现从读取文件数据到PCA主成份提取和人脸识别的整个过程tic;SampleFiles = dir('F1');%返回目录中的文件%经测试图片文件从3到1193allsample = [];%样本矩阵fnum=3;lnum=1193;for i = fnum : lnum= SampleFiles(i).name;%读图片名('F1','\',);sample = imread();[row,col]=size(sample);pix_num=row*col;%图片像素点数目%figure(i);%subplot(2,2,1);imshow(sample);%subplot(2,2,2);imshow(sample);temp=reshape(sample,pix_num,1);%返回一个m*1的矩阵temp,将二维图像数据变成一维列向量allsample=[allsample temp];%将所有图片数据变成一个样本矩阵endallsample = uint8(allsample);%%%%%%%%%主成分分析(PCA)%%%%%%%%%%%%%% %%%%%%%%%计算平均图片数据%%%%%%%%%%%m = mean(allsample,2); %计算样本每一维平均值img_num = size(allsample,2);%返回列数,也即训练图片数目%%%%%%计算每个图像与均值的差%%%%%%%%%%%%%%A = zeros(pix_num,img_num);%行为图片像素个数,列为图片数目m1=ones(1,img_num);%用于构造矩阵运算A = double(allsample) - m*m1;%%%%%%%计算协方差矩阵的特征矢量和特征值%%%%%%L = A'*A; %由SVD理论构造矩阵L=A'*A用于计算特征值和特征向量[V D] = eig(L);%计算矩阵A的特征值D和特征向量矩阵Vd1=diag(D);% 按特征值大小以降序排列dsort = flipud(d1);vsort = fliplr(V);%以下选择95%的能量dsum = sum(dsort);dsumtemp = 0;char_num = 0;%特征值主分量个数while( dsumtemp/dsum < 0.95)char_num = char_num + 1;dsumtemp = sum(dsort(1:char_num));end%%%%%%计算特征脸主分量%%%%%%%%%%U=zeros(pix_num,char_num);%主分量特征向量vsort=vsort(:,1:char_num);dsort=dsort(1:char_num).^(-1/2);dsort=diag(dsort);U=A* vsort*dsort;%求协方差矩阵的特征向量主分量%%%%%%计算训练集中人脸在特征空间中的投影表示%%%%% Train_pro=zeros(char_num,img_num);Train_pro=U'*A;%%%%%%%%%%对测试集中人脸进行识别%%%%%%%% testFiles = dir('F2');%返回目录中的文件()%经测试图片文件从3到1193alltest = [];%样本矩阵for i = fnum : lnumt = testFiles(i).name;t('F2','\',t);test = imread(t);[row,col]=size(test);ttemp=reshape(test,row*col,1);%返回一个m*1的矩阵temp,将二维图像数据变成一维列向量alltest=[alltest ttemp];%将所有图片数据变成一个样本矩阵endalltest = uint8(alltest);%%%%%%%%计算减去均值后的人脸矩阵%%%%%%tA = zeros(pix_num,img_num);tA = double(alltest) - m*m1;%%%%计算测试集中人脸在特征空间中的投影表示%%%%Test_pro=zeros(char_num,img_num);Test_pro=U'*tA;%%%%%%测试集中人脸和训练集中人脸相似性进行匹配%%%% pro_match=zeros(char_num,img_num);mtemp=ones(1,img_num);diatance=zeros(img_num,img_num);sum1=0;%sum1为匹配成功的数目for i=1:img_num %测试集中的第i个图片数据pro_match=Test_pro(:,i)*mtemp-Train_pro;distance=pro_match'*pro_match;distance=diag(distance);[mat_min,match(i)]=min(distance);if(i==match(i))sum1=sum1+1;endendrec_perc=(sum1/img_num)%%%%%%随机抽取5个图形做代表显示匹配效果%%%%%%for i=1:5ri=(round(100*rand(1,1)));figure(i);subplot(121);r=allsample(:,ri);imshow(reshape(r,142,120));title(SampleFiles(ri).name,'FontWeight','bold ','Fontsize',15,'color','red');subplot(122);k=match(ri);imshow(reshape(alltest(:,k),142,120));title(testFiles(k).name,'FontWeight' ,'bold','Fontsize',15,'color','red');endtoc。

相关主题