人脸识别基于PCA+LDA实现人脸识别matlab 源码
Posted 博主QQ2449341593
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了人脸识别基于PCA+LDA实现人脸识别matlab 源码相关的知识,希望对你有一定的参考价值。
2.2 LDA数学表示:
二、源代码
clear all
clc
close all
start=clock;
sample_class=1:40;%样本类别
sample_classnum=size(sample_class,2);%样本类别数
fprintf('程序运行开始....................\\n\\n');
for train_samplesize=3:8;
train=1:train_samplesize;%每类训练样本
test=train_samplesize+1:10;%每类测试样本
train_num=size(train,2);%每类训练样本数
test_num=size(test,2);%每类测试样本数
address=[pwd '\\ORL\\s'];
%读取训练样本
allsamples=readsample(address,sample_class,train);
%先使用PCA进行降维
[newsample base]=pca(allsamples,0.9);
%计算Sw,Sb
[sw sb]=computswb(newsample,sample_classnum,train_num);
%读取测试样本
testsample=readsample(address,sample_class,test);
best_acc=0;%最优识别率
%寻找最佳投影维数
for temp_dimension=1:1:length(sw)
vsort1=projectto(sw,sb,temp_dimension);
%训练样本和测试样本分别投影
tstsample=testsample*base*vsort1;
trainsample=newsample*vsort1;
%计算识别率
accuracy=computaccu(tstsample,test_num,trainsample,train_num);
if accuracy>best_acc
best_dimension=temp_dimension;%保存最佳投影维数
best_acc=accuracy;
end
end
%---------------------------------输出显示----------------------------------
fprintf('每类训练样本数为:%d\\n',train_samplesize);
fprintf('最佳投影维数为:%d\\n',best_dimension);
fprintf('FisherFace的识别率为:%.2f%%\\n',best_acc*100);
fprintf('程序运行时间为:%3.2fs\\n\\n',etime(clock,start));
end
function [newsample basevector]=pca(patterns,num)
%主分量分析程序,patterns表示输入模式向量,num为控制变量,当num大于1的时候表示
%要求的特征数为num,当num大于0小于等于1的时候表示求取的特征数的能量为num
%输出:basevector表示求取的最大特征值对应的特征向量,newsample表示在basevector
%映射下获得的样本表示。
[u v]=size(patterns);
totalsamplemean=mean(patterns);
for i=1:u
gensample(i,:)=patterns(i,:)-totalsamplemean;
end
sigma=gensample*gensample';
[U V]=eig(sigma);
d=diag(V);
[d1 index]=dsort(d);
if num>1
for i=1:num
vector(:,i)=U(:,index(i));
base(:,i)=d(index(i))^(-1/2)* gensample' * vector(:,i);
end
else
sumv=sum(d1);
for i=1:u
if sum(d1(1:i))/sumv>=num
l=i;
break;
end
end
for i=1:l
vector(:,i)=U(:,index(i));
base(:,i)=d(index(i))^(-1/2)* gensample' * vector(:,i);
end
end
function sample=readsample(address,classnum,num)
%这个函数用来读取样本。
%输入:address就是要读取的样本的地址,classnum代表要读入样本的类别,num是每类的样本;
%输出为样本矩阵
allsamples=[];
image=imread([pwd '\\ORL\\s1_1.bmp']);%读入第一幅图像
[rows cols]=size(image);%获得图像的行数和列数
for i=classnum
for j=num
a=imread(strcat(address,num2str(i),'_',num2str(j),'.bmp'));
b=a(1:rows*cols);
b=double(b);
allsamples=[allsamples;b];
end
end
三、运行结果
四、备注
完整代码或者代写添加QQ1575304183
以上是关于人脸识别基于PCA+LDA实现人脸识别matlab 源码的主要内容,如果未能解决你的问题,请参考以下文章
MATLAB实战系列(三十四)-MATLAB基于PCA-LDA模糊神经网络的人脸识别