人脸识别识别正确率仿真源码程序,程序员在编程的过程中可以参考学习使用,希望对IT程序员有用,此源码程序简单易懂、方便阅读,有很好的学习价值!
%faces.mat为ORL人脸图像库,共40人,每人10幅图像,其中每人的前5幅作为训练样本,
%后5幅作为测试分类样本,统计正确分类率。分类准则为余弦距离分类。
%真实的图像尺寸为112x92=10304,列向量堆积对应人脸库矩阵的每一列。
%%人脸数从10:10:400,分别求出其识别概率。。。做出图形趋势图。。
clear all
clc
load faces.mat;
a1=faces;%%样本库
pattennumbers=40;
accu=zeros(1,pattennumbers);
for ii=1:pattennumbers
%for i=1:20
%f=reshape(a(:,i),112,92);
%subplot(5,4,i);
%imshow(f);
%imagesc(f);
%end
%patten提取用pca method
%其中每人的前5幅作为训练样本,训练样本总数为200,后5幅作为测试分类样本,
%测试样本总数也为200
%clear all
i=0;
j=0;
trainsamples=[];
testsamples=[];
index1=[1 2 3 4 5];
index2=[6 7 8 9 10];
numbpatten=ii*10;
while(j<numbpatten)
index1=[j+1 j+2 j+3 j+4 j+5];
index2=[j+6 j+7 j+8 j+9 j+10];
trainsamples=[trainsamples,a1(:,index1)] ;
testsamples=[testsamples,a1(:,index2)];
j=j+10;
end
%% 通过训练样本求出人脸的特征子空间U
%training
num=numbpatten/2;%训练样品数
trainsamples=trainsamples';
testsamples=testsamples';
trainsamplesmean=mean(trainsamples);%samplesmean维数为1*10304,为训练样本的均值行向量
testsamplesmean=mean(testsamples);
trainallsamples=trainsamples-repmat(trainsamplesmean,num,1);%200*10304
testallsamples=testsamples-repmat(testsamplesmean,num,1);
trainallsamples=trainallsamples';%10304*200 为A矩阵
testallsamples=testallsamples';
a=trainallsamples;
Gt=a'*a;
[V D]=eig(Gt);
[PD index2]=sort(-diag(D));
PV=V(:,index2);
dim=num;%%可以根据特征谱信息来选取
%dim=num;
PV=PV(:,1:dim);%200*50 PY为特征脸空间
U=trainallsamples*PV;%为特征脸空间 10304*100
%% (GA)遗传算法进行人脸特征的筛选(U)
%遗传算法作用于特征脸空间空间后变为U1
%% 获得训练样本的特征
Y1=zeros(dim,num);%为训练样本的特征100*200
for i=1:num
Y1(:,i)=U'*trainallsamples(:,i);
end
%% 获得测试样本特征
Y2=zeros(dim,num);%为训练样本的特征100*200
for i=1:num
Y2(:,i)=U'*testallsamples(:,i);
end
%%
% trainsamples is 训练样本,testsamples is 测试样本
%Y1=Getpatten(trainsamples,numbpatten);%为训练样本的特征空间 100*200
%Y2=Getpatten(testsamples,numbpatten);%为测试样本的特征空间 100*200
%% 采用余弦距离分类器进行分类
num=numbpatten/2;
%num测试人脸数
mdist=zeros(1,num);
for i=1:num
for j=1:num
mdist(j)=(Y1(:,j)'*Y2(:,i))/(norm(Y1(:,j))*norm(Y2(:,i)));%余弦距离分类器
%mdist(j)=norm( Y1(:,j)- Y2(:,i) );
end
[dist ,index200]=sort(mdist);
class=ceil(index200(num)/5);
%index200(num)
%class=ceil(index200(1)/5);
i1=ceil(i/5);
%ii
if class==i1;
accu(1,ii)=(accu(1,ii)+1);
% accu
end
end
%ii
% accu(1,ii)
accu(1,ii)= accu(1,ii)/num;
end
plot(accu)
%%2010 ,by 哈工程alin