1EigenFace算法回顾及Matlab代码基于PCA的EigenFace算法发表自1987年,是第一种可行的人脸辨识算法。虽然已有20余年历史,但仍是人脸辨识算法研究中的经典,新算法都要与之作比较。EigenFace是2D辨识算法,但为了进行3D表情辨识的研究,有必要对这一经典算法进行回顾,SIGGRAPH13的文献OnlineModelingForRealtimeFacialAnimation实现表情3D重构的基础是SIGGRAPH99中AMorphableModelfortheSynthesisof3DFaces提出的MorphableFacialModel,而建立这一模型的基础思想仍是PCA,与Eigenface有着天然联系。学习EigenFace应该是研究生时代的事儿了,旧编重拾、开卷有益,并写了Matlab代码附录于后。网上许多实例代码只实现了辨识,略去了一个重要环节:通过分解-重构,将一幅输入人脸照片表示为EigenFace基底的组合,这对于表情辨识及3D人脸模型分析都是很有用的(OnlineModelingForRealtimeFacialAnimation中就利用了此思想),附录的Matlab代码做了这一步。训练集合包含20幅图片2生成20-1=19个特征脸最近欧式距离法得出的前三位匹配3利用特征脸空间进行人脸重构~sis26/EigenfaceTutorial.htm中给出了EigenFace算法Matlab代码,含有重构过程与比较,但其代码中有一个错误,训练集合照片未减去平均脸,就计算协方差矩阵了具体算法文献教材上都有,捡要点写几句:(1)将训练集合中的每幅图像拉伸为列向量,并减去所有图像的均值(称之为平均脸),形成N*M矩阵A,其中N为单幅图像像素数,M为图像数目(训练集合容量)。(2)求协方差矩阵AA'的特征向量,作为正交基底张成人脸空间,好是好但运算量过大,转而求替代矩阵(surrogate)A'A的特征向量,减少计算量(3)矩阵A'A的秩等于M-1,这是由于减去平均脸所致,故有M-1个非零特征值(正),去除属于0的特征向量,将M-1个属于非零特征值得特征向量(记住须作左乘A的修正)作为EigenFace基底(特征脸),张成人脸空间。(4)EigenFace基底由M-1个相互正交的向量构成,它们是协方差矩阵AA'的前M-1个最显著的特征向量方向,能量主要集中在这些向量方向上,但要记住虽正交但不完备,故存在重构误差。(5)为了用EigenFace基底对人脸照片进行正确的分解-重构,需要对所得的基底向量进行规一化修正,因为A'A的特征向量左乘A之后,虽成为AA'的特征向量,但模不为1,需除以自身的模,修正为标准正交向量集合,才能进行投影分解-重构。(6)训练集合及测试集合中的人脸照片都能利用EigenFace基底较好地实现分解-重构,但训练集合之外的人脸,重构误差变大(7)EigenFace缺点:1拍摄时光照环境对识别效果(EigenFace基底)影响大2训练集合扩容时,需重构EigenFace基底(8)为了有效显示EigenFace基底图像(特征脸)需要用imagesc函数Eigenface算法识别人脸的步骤:Thissectiongivesstep-by-stepinstructionsalongwithphotosandformulasonhowtorecognizefacesandimplementedintoMatlab.Allthenecessaryfilestocompletethistutorialwouldbeprovided.Steps41.ThefirststepistoobtainasetSwithMfaceimages.InourexampleM=25asshownatthebeginningofthetutorial.EachimageistransformedintoavectorofsizeNandplacedintotheset.2.Afteryouhaveobtainedyourset,youwillobtainthemeanimageΨ3.ThenyouwillfindthedifferenceΦbetweentheinputimageandthemeanimage4.NextweseekasetofMorthonormalvectors,un,whichbestdescribesthedistributionofthedata.Thekthvector,uk,ischosensuchthat求特征值:isamaximum,subjecttoNote:ukandλkaretheeigenvectorsandeigenvaluesofthecovariancematrixC5.WeobtainthecovariancematrixCinthefollowingmannerWherethematrix.ThematrixC,however,isN2byN2,anddeterminingtheN2eigenvectorsandeigenvaluesisanintractabletaskfortypicalimagesizes.Weneedacomputationallyfeasiblemethodtofindtheseeigenvectors.WecansolvefortheN2dimensionaleigenvectorsinthiscasebyfirstsolvingfortheeigenvectorsofanMbyMmatrix-e.g.,solvinga16*16matrixratherthana16,384*16,384matrixandthentakingappropriatelinearcombinationsofthefaceimagesΦi,ConsidertheeigenvectorsviofATAsuchthatATAvi=μiviPremultiplyingbothsidesbyA,wehaveAATAvi=μiAviFromwhichweseethatAvi(特征向量)aretheeigenvectorsofC=AAT.MS,.........,,,321MnnM11iiMnnTkkuM121otherwiseif01kluulkkTlTMnTnnAAMC11,.......,,,321nA5Followingthisanalysis,weconstructtheMbyMmatrixL=ATA,where(Φ是1*16,384维的向量),andfindtheMeigenvectors,vi(M维的向量)ofL.ThesevectorsdeterminelinearcombinationsoftheMtrainingsetfaceimagestoformtheeigenfacesul(特征脸向量).Oncewehavefoundtheeigenvectors,vl,ul∑l=1,2,…M6.ThesearetheeigenfacesofoursetoforiginalimagesRecognitionProcedure1.Anewfaceistransformedintoitseigenfacecomponents.FirstwecompareourinputimagewithourmeanimageandmultiplytheirdifferencewitheacheigenvectoroftheLmatrix.EachvaluewouldrepresentaweightandwouldbesavedonavectorΩ.新脸向量在每个特征脸向量上的投影:Fork=1,2,…,M’.2.Wenowdeterminewhichfaceclassprovidesthebestdescriptionfortheinputimage.ThisisdonebyminimizingtheEuclideandistance3.Theinputfaceisconsidertobelongtoaclassifεkisbellowanestablishedthresholdθε.Thenthefaceimageisconsideredtobeaknownface.Ifthedifferenceisabovethegiventhreshold,butbellowasecondthreshold,theimagecanbedeterminedasaunknownface.Iftheinputimageisabovethesetwothresholds,theimageisdeterminedNOTtobeaface.4.Iftheimageisfoundtobeanunknownface,youcoulddecidewhetherornotyouwanttoaddtheimagetoyourtrainingsetforfuturerecognitions.Youwouldhavetorepeatsteps1trough7toincorporatethisnewfaceimage.ThesourcecodefacerecognitionusingMatlabisprovidedbelow:Matlab代码:所用训练集合含20幅jpg图片,存于名为TrainDataBase的文件夹中,测试集合含10幅jpg图片,存于名为TestDataBase的文件夹中,命名均为1.jpg2.jpg3.jpg........%----------------------------------------------------------------------%人脸辨识:FaceRecognition%EigenFace算法nTmmnLTkkuMT,.......,,212kk6%EigenFace空间的生成分解与合成%人脸辨识%-----------------------------------------------------------------------functionmeigenface()%------------------------------------------------------%step1:读取训练集合中的人脸照片,并通过列向量拉伸生成%人脸训练集合矩阵%------------------------------------------------------clearallclccloseallimset=[];M=20;%训练集合中人脸照片的数目figure(1);fori=1:Mfilename=['.\TrainDataBase\'num2str(i)'.jpg'];im=imread(filename,'JPG');im=im(:,:,2);%im=im(:,:,3);[imheightimwidth]=size(im);%将图像矩阵按列拉伸为列向量imv=reshape(im,imheight*imwidth,1);%将im中数据转化为imheight*imwidth高的列向量imset=[imsetimv];%将每个图像的像素占据一列位置,共20列向量ifi==4title('训练集合人脸照片','fontsize',18)endsubplot(5,4,i);imshow(im);enddisp('============Outputimageiscompleted!===================')%imset=double(imset);imset=double(imset);[w,h]=size(imset)%-