pca在人脸识别中的应用

        前一段时间一直在学习机器学习算法,上个星期感觉学的比较迷茫,跟一位师兄谈过一次,说说自己现在的学习状态,以及改进方法。主要的收获就是,现在学的知识太泛了,没有深入学习,了解了很多机器学习算法但是里面真正的原理并没有掌握,于是就给了自己一个建议:从小做起,先学简单的算法,并且自己能够实现。简单的往往也不简单,掌握了一种算法后会应用比较广。很赞成这一句话:当你看的最痛苦最纠结的部分,往往是它的精华所在。

       人脸识别系统的三个部分:人脸识别:Face Detection;特征提取:Feature Extaction;识别或确认:Face Recognition

       这是一个改进版的pca算法+k近邻算法,人脸识别达到88%。这不全是我自己写的,只是在原有基础上对错误修改,和人脸识别部分代码的补充。

allsamples=[];
for i=1:40
    for j=1:5
        a=imread(strcat('D:\ORLPGM\s',num2str(i),'\',num2str(j),'.pgm'));
        b=a(1:112*92); 
        b=double(b);
        allsamples=[allsamples; b];
    end
end
samplemean=mean(allsamples); 
for i=1:200 xmean(i,:)=allsamples(i,:)-samplemean; 
end;
sigma=xmean*xmean';  
[v d]=eig(sigma);   
d1=diag(d);
[d2 index]=sort(d1);
cols=size(v,2);
for i=1:cols 
    vsort(:,i) = v(:, index(cols-i+1) );
    dsort(i)   = d1( index(cols-i+1) ); 
end  
dsum = sum(dsort);
dsum_extract = 0;
p = 0;
while( dsum_extract/dsum < 0.9)
    p = p + 1;
    dsum_extract = sum(dsort(1:p));
end 
i=1;
while (i<=p && dsort(i)>0)
    base(:,i) = dsort(i)^(-1/2) * xmean' * vsort(:,i); 
    i = i + 1;
end
allcoor=xmean*base;
accu = 0;
for i=1:40
    for j=6:10 
        a=imread(strcat('D:\ORL\s',num2str(i),'\',num2str(j),'.bmp'));
        b=a(1:10304);
        b=double(b) - samplemean;
        %b=double(b);
        tcoor= b * base;
        for k=1:200
            mdist(k)=norm(tcoor-allcoor(k,:)); 
        end;
        [dist,index2]=sort(mdist);
        class1=floor( (index2(1)-1)/5 )+1;
        class2=floor((index2(2)-1)/5)+1;
        class3=floor((index2(3)-1)/5)+1;
        if class1~=class2 && class2~=class3   ID = class1;
        elseif (class1==class2)  ID = class2;
        elseif (class2==class3)   ID = class3;
        elseif (class1==class3)    ID=class1
        end;
        if  ID==i
            accu=accu+1;
        end;
    end;
end;
accuracy=accu/200 
a=imread('D:\ORL\s1\7.bmp');
b=a(1:10304);
b=double(b);
tcoor=b*base;
for k=1:200
    mdist(k)=norm(tcoor-allcoor(k,:));
end;
[dist,index3]=sort(mdist);
class1=floor( (index3(1)-1)/5 )+1;
class2=floor((index3(2)-1)/5)+1;
class3=floor((index3(3)-1)/5)+1;
if class1~=class2 && class2~=class3   ID = class1;
elseif (class1==class2)  ID = class2;
elseif (class2==class3)   ID = class3;
elseif (class1==class3)    ID=class1;
end;
ID


输出结果:

accuracy =

    0.8800


ID =

     1


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值