您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > 基于PCA和SVM的人脸识别方法
基于PCA和SVM的人脸识别方法一、PCA算法1计算特征脸设人脸图像f(x,y)为二维mn灰度图像,用nm维向量R表示。人脸图像训练集为piRi,,2,1,其中p为训练集中图像总数。这p幅图像的平均向量为:piiRpR11对训练样本规范化,即每个人脸iR与平均人脸R的差值向量:RRAiipi,,2,1其中列向量iA表示一个训练样本。训练图像由协方差矩阵可表示为:TAAC其中训练样本pnm维矩阵],,,[21pAAAA特征脸由协方差矩阵C的正交特征向量组成。对于nm维人脸图像,协方差矩阵C的大小为nm×nm,对它求解特征值和特征向量是很困难的,由此引入奇异值分解定理来解决维数过高的问题。2奇异值分解定理奇异值分解定理(SingularValueDecomposition简称SVD定理)原理表述如下:其中A是一个秩为r的rn维矩阵,则存在两个正交矩阵:rnrRuuuU],,,[110IUUTrrrRvvvV],,,[110IVVT以及对角矩阵rrrRdiag],,,[110且110r满足下试:TVUA21其中:)1,,1,0(rii为矩阵TAA和AAT的非零特征值,iu与iv分别为TAA和AAT对应于i的特征向量。上述分解称为矩阵A的奇异值分解(简称SVD),i为A的奇异值。由上述定理可以得到一个推论:21AVU由于协方差矩阵TAAC,故构造矩阵:ppTRAAL,容易求出其特征值i及相应的正交归一特征向量),,2,1(pivi。有上述推论可知,C的正交归一特征向量iu为:iiiAvu1pi,,2,1这就是图像的特征向量,它是计算pp低维矩阵L的特征值和特征向量而间接求出来的。实际上l)(pl个特征值足够用于人脸识别。因此仅取L的前l个最大特征值的特征向量计算特征脸。3特征向量的选取我们总共得到了p(训练样本数目)个特征向量。虽然p比nm小很多。但通常情况下,p仍然会太大。根据应用的要求,并不是所有的iu都有很大的保留意义。考虑到使用LK变换做为对人脸图像的压缩手段,可以选取最大的前l个特征向量,使得:piilii11在实际中,可以选择90.0,或者自定义的其他值。这说明样本集在前l个轴上的能量占到整个能量的90%以上。4基于特征脸的人脸识别基于特征脸的人脸识别过程由训练阶段和识别阶段两个阶段组成。在训练阶段,每个已知规范化后的人脸iA映射到由特征脸张成的子空间上,得到l维向量:iTiAUCpi,,2,1其中TlicccC],,,[21,],,,[21luuuU,p为人脸数目。在识别阶段,首先把待识别的图像规范化后的人脸RRAi映射到特征脸空间,得到向量:iTAUC其中TlcccC],,,[21iC),,2,1(li为降维之后的向量iiCxli,,2,1二、支持向量机的算法(1)已知训练集lllYXyxyxyxT),()},(,),,(),,{(2211,其中niRXx,}1,1{Yyi,li,,2,1。(2)选择核函数),(jixxK和惩罚参数C,构造并求解最优化问题:ljjjijijliljixxKyy111),(21min..ts01iliiyliCi,,2,1,0得最优解Tl),,,(**2*1*。(3)计算iiliixyw*1*,*b可通过满足01)),((*1*bxxKyyjiliiij的样本(支持向量)求得。(4)解决上述问题后可得最优分类面函数:}),(sgn{})sgn{()(**1**bxxKybxwxfiilii一个修改后的PCA+SVM进行人脸识别的Matlab代码tic;allsamples=[];%所有训练图像tcoor=[];fori=1:40forj=1:5a=imread(strcat('D:\MATLAB7\work\ORL\s',num2str(i),'\',num2str(j),'.pgm'));%imshow(a);b=a(1:112*92);%b是行矢量1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右b=double(b);allsamples=[allsamples;b];%allsamples是一个M*N矩阵,allsamples中每一行数据代表一张图片,其中M=200endendsamplemean=mean(allsamples);%平均图片,1×Nfori=1:200xmean(i,:)=allsamples(i,:)-samplemean;%xmean是一个M×N矩阵,xmean每一行保存的数据是“每个图片数据-平均图片”end;sigma=xmean*xmean';%M*M阶矩阵[vd]=eig(sigma);d1=diag(d);[d2index]=sort(d1);%以升序排序cols=size(v,2);%特征向量矩阵的列数fori=1:colsvsort(:,i)=v(:,index(cols-i+1));%vsort是一个M*col(注:col一般等于M)阶矩阵,保存的是按降序排列的特征向量,每一列构成一个特征向量dsort(i)=d1(index(cols-i+1));%dsort保存的是按降序排列的特征值,是一维行向量end%完成降序排列%以下选择90%的能量dsum=sum(dsort);dsum_extract=0;p=0;while(dsum_extract/dsum0.9)p=p+1;dsum_extract=sum(dsort(1:p));endi=1;%(训练阶段)计算特征脸形成的坐标系while(i=p&&dsort(i)0)base(:,i)=dsort(i)^(-1/2)*xmean'*vsort(:,i);%base是N×p阶矩阵,除以dsort(i)^(1/2)是对人脸图像的标准化,详见前文。i=i+1;end%将训练样本对坐标系上进行投影,得到一个M*p阶矩阵allcoorallcoor=allsamples*base;accu=0;%测试过程fori=1:40forj=6:10%读入40x5副测试图像a=imread(strcat('D:\MATLAB7\work\ORL\s',num2str(i),'\',num2str(j),'.pgm'));b=a(1:10304);b=double(b);tcoor=b*base;%计算坐标,是1×p阶矩阵c=b*base;tcoor=[tcoor;c];endend%将数据规范化到[-1,1]x=allcoor;[m,n]=size(x);S=zeros(m,n);fori=1:mmea=mean(x(i,:));va=var(x(i,:));S(i,:)=(x(i,:)-mea)/va;endy=tcoor;[m,n]=size(y);T=zeros(m,n);fori=1:mmea=mean(y(i,:));va=var(y(i,:));T(i,:)=(y(i,:)-mea)/va;end%给每个数据贴上标签label=[1;1;1;1;1;2;2;2;2;2;3;3;3;3;3;4;4;4;4;4;5;5;5;5;5;6;6;6;6;6;7;7;7;7;7;8;8;8;8;8;9;9;9;9;9;10;10;10;10;10;11;11;11;11;11;12;12;12;12;12;13;13;13;13;13;14;14;14;14;14;15;15;15;15;15;16;16;16;16;16;17;17;17;17;17;18;18;18;18;18;19;19;19;19;19;20;20;20;20;20;21;21;21;21;21;22;22;22;22;22;23;23;23;23;23;24;24;24;24;24;25;25;25;25;25;26;26;26;26;26;27;27;27;27;27;28;28;28;28;28;29;29;29;29;29;30;30;30;30;30;31;31;31;31;31;32;32;32;32;32;33;33;33;33;33;34;34;34;34;34;35;35;35;35;35;36;36;36;36;36;37;37;37;37;37;38;38;38;38;38;39;39;39;39;39;40;40;40;40;40];%前200个数据作为训练集合,后200个数据作为测试集合traindata=S;trainlabel=label;testdata=T;testlabel=label;%利用训练集合建立分类模型model=svmtrain(trainlabel,traindata,'-s0-t2-c1.2-g2.8');%用LibSVM实现svm算法,参数可修改。LibSVM工具可以在这里~cjlin/下载%分类模型model解密modelParameters=model.ParametersLabel=model.Labelnr_class=model.nr_classtotalSV=model.totalSVnSV=model.nSV%利用建立的模型看其在训练集合上的分类效果[ptrain,acctrain]=svmpredict(trainlabel,traindata,model);%利用建立的模型看其在测试集合上的分类效果[ptest,acctest]=svmpredict(testlabel,testdata,model);toc;下面是运行的结果:model=Parameters:[5x1double]nr_class:40totalSV:200rho:[780x1double]Label:[40x1double]ProbA:[]ProbB:[]nSV:[40x1double]sv_coef:[200x39double]SVs:[200x71double]Parameters=02.00003.00002.80000Label=12345678910111213141516171819202122232425262728293031323334353637383940nr_class=40totalSV=200nSV=5555555555555555555555555555555555555555Accuracy=96.5%(193/200)(classification)Accuracy=81%(162/200)(classification)Elapsedtimeis5.678511seconds.
本文标题:基于PCA和SVM的人脸识别方法
链接地址:https://www.777doc.com/doc-2571202 .html