数字图像处理(五) 利用PCA算法进行人脸识别

来源:互联网 发布:minitab软件入门 编辑:程序博客网 时间:2024/06/05 22:06

    把你的脸部识别出来这样高科技的东西,原来可以简单的实现,说是简单,其实不像之前的那些,这次写不出来,直接拿了高材生老师的代码来理解整个思路(请尊重他的知识产权),将算法读懂。数字图像处理,觉得挺实用的而写这些东西。


    首先需要我们提取人脸库,如一个公司,一所学校,把每个人的头像切下来。imcrop一下,截取成一个个小方框,就如南大标准脸那样的照片。


(:)是将矩阵转成一列。n个人可以排成n列,存成一个库。为了让识别的效果更好,同一个人可以用多个图片取样。所以可以用个三维的矩阵存储。(这里一个人用了两张样照。)

i 为 1  1  2  2  3  3  4  4

k 为 1  2  1  2  1  2  1  2

filelist=dir('*.bmp');FileNum=length(filelist);%for i=1:FileNum/2for j=1:FileNum    inFilename = filelist(j).name;    fa=imread(inFilename);    fa=fa(:);%取整    i=ceil(j/2);    if mod(j,2) == 1        k=1;    else k=2;    end    FaceLib(:,k,i)=double(fa);endsave FaceLib;
save之后会保存为一个mat文件,通过load方法可将数据拿到。


识别部分利用了PCA算法


识别处理源码:

load('FaceLab.mat'); %他人源码,未经同意不得随便转载 % filelist=dir('*.bmp');%inFilename = filelist.name;%读入识别图像 testface = imread('test.bmp');% testface = rgb2gray(testface);% testface = imresize(testface, [128 128], 'bicubic');testface = double(testface(:));dim=size(StuFaceLab,1);tal=size(StuFaceLab,2);class=size(StuFaceLab,3);ell=2; % ell training sample;ellsample=1; % ellsample test sample;t=1e7; % Similarity matrix 的参数order=1;  dita=1e7; NumTotal=ell*class;lpp=NumTotal-class;lda=class-1;polynomial=1;pca=40;%-------------------    KPCA       ------------------------------%Itr=zeros(dim,ell,class);  % Training sample feature vectorfor classnum=1:class    for e=1:ell%         Itr(:,e,classnum)=Iv(:,e,classnum);  %          Itr(:,e,classnum)=StuFaceLab(:,e,classnum);  %    end    end%----------------------------------------------------------------%%   倒入向量 Iv(dim,ell)%   样本类数  classImean=zeros(dim,1);for classnum=1:class    for i=1:ell        Imean=Imean+Itr(:,i,classnum);     endendImean=(1/(ell*class))*Imean;     %求平均向量Q=zeros(dim,ell*class);for classnum=1:class    for num=1:ell        Q(:,num+(classnum-1)*ell)=Itr(:,num,classnum)-Imean(:,1);    endendR=zeros(ell*class,ell*class);R=Q'*Q;    % R's size is ell * elld=rank(R);d=pca;[U,L]=eigs(R,d,'LM');  % 求出 R 的eigenvector and eigenvalueWpca=zeros(dim,d);for p=1:d    Wpca(:,p)=(1/(sqrt(L(p,p))))*Q*U(:,p);end % 程序至此得到了线形变换的矩阵  Wpca  .%----------------------------------------------------------------%Iy=zeros(d,ell,class); % training feature vector  %   for classnum=1:class    for num=1:ell        Y=zeros(d,1);        Iy(:,num,classnum)=Wpca'*Itr(:,num,classnum);    endend          %---------------------------循环体开始-------------------------------%        %       X=Tldalpp(:,img,cl);                     % X   input sample vector            %        %以下为改进算法, 求每个类的 Z1 的平均值%         Iymean=zeros(dimension,class);         Iymean=zeros(d,class); % because there two training face, revised by Y.G.Wang        for classnum=1:class              % Z1 :  the mean of Z1            for i=1:ell                Iymean(:,classnum)=Iymean(:,classnum)+Iy(:,i,classnum);             end            Iymean(:,classnum)=(1/ell)*Iymean(:,classnum);        end%-------------------------进行匹配-------------------%%----------------此处可以进行修改,利用其他simlarity measure------------%                G2=zeros(1,class);                 for classnum=1:class               G2(1,classnum)=(X'*Iymean(:,classnum))/(norm(X)*norm(Iymean(:,classnum)));              end        Sclass=max(G2);        %---------------得出最后的结果---------------------%        for classnum=1:class               if Sclass==G2(1,classnum)                lastresult=classnum;            end           end        clc        if Sclass > 0.97            fprintf('此脸在本库中,且是学号:%d\n', lastresult);        else            fprintf('此脸不在本库中!\n');        end

pca可以降维,因为如果这么大的一个矩阵数据进行处理匹配,速度肯定很慢,所以线性代数派上用场,一个这么大的矩阵,如果能得到两幅图像之间几乎相似的特征即可。


而PCA的求解:对样本的散布矩阵进行特征值分解,所求子空间为过样本均值,以最大特征所对应的特征向量为方向的子空间。PCA是一种非监督的算法,能找到很好地代表所有样本的方向,但这个方向对于分类未必是最有利的。(转自降维(一)),有时,数学的用处就用上了。


参考资料

特征向量的几何意义,学线性代数学了很久,也搞不懂这个的东西,很好的一篇文章:

http://blog.csdn.net/hexbina/article/details/7525850


还有个12届毕业的师兄:

http://www.cnblogs.com/blue-lg/archive/2012/05/14/2499581.html


还有PCA方法从原理到实现。

http://blog.csdn.net/celerychen2009/article/details/9048033#comments


   

2 0
原创粉丝点击