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