您的位置:首页 > 其它

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

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

首先需要我们提取人脸库,如一个公司,一所学校,把每个人的头像切下来。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/2
for 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);
end
save 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 vector
for classnum=1:class
    for e=1:ell
%         Itr(:,e,classnum)=Iv(:,e,classnum);  %
          Itr(:,e,classnum)=StuFaceLab(:,e,classnum);  %
    end    
end

%----------------------------------------------------------------%
%   倒入向量 Iv(dim,ell)
%   样本类数  class
Imean=zeros(dim,1);
for classnum=1:class
    for i=1:ell
        Imean=Imean+Itr(:,i,classnum); 
    end
end

Imean=(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);
    end
end

R=zeros(ell*class,ell*class);
R=Q'*Q;    % R's size is ell * ell
d=rank(R);
d=pca;

[U,L]=eigs(R,d,'LM');  % 求出 R 的eigenvector and eigenvalue
Wpca=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);
    end
end

  
        
%---------------------------循环体开始-------------------------------%
        
%       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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐