FisherFace 进行人脸分裂
生活随笔
收集整理的這篇文章主要介紹了
FisherFace 进行人脸分裂
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
clear all
clc
close alladdress=[pwd,'\ORL','\s'];rows=112;
cols=92;
ClassNum=40;
tol_num=10;
image_fmt='.bmp';
train_samplesize=5;%--------------------------------------------------------------------------
%------------------------PCA降維
train=1:train_samplesize;
test=train_samplesize+1:tol_num;
%PCA維數
Eigen_NUM=40;%每類訓練樣本、測試樣本個數
train_num=length(train);
test_num=length(test);%讀入訓練樣本,測試樣本
[train_sample,train_label]=readsample(address,ClassNum,train,rows,cols,image_fmt);
[test_sample,test_label]=readsample(address,ClassNum,test,rows,cols,image_fmt);%訓練樣本總數、測試樣本總數
train_tol=length(train_label);
test_tol=length(test_label);%PCA降維
Train_SET=train_sample';
[disc_set,disc_value,Mean_Image]=Eigenface_f(Train_SET,Eigen_NUM);%訓練樣本、測試樣本第一次投影
train_pro=disc_set'*train_sample';
test_pro=disc_set'*test_sample';%訓練樣本總體均值及每類均值
total_mean=mean(train_pro,2);
EachClassMean=zeros(Eigen_NUM,ClassNum);
EachClassNum=zeros(1,ClassNum);
for i=1:ClassNumtemp=train_pro(:,(i==train_label));EachClassMean(:,i)=mean(temp,2);EachClassNum(i)=sum((i==train_label));
end%構造Fai_b、Fai_w,以便計算Sb和Sw
Fai_b=zeros(Eigen_NUM,ClassNum);
Fai_w=zeros(Eigen_NUM,train_tol);
for i=1:ClassNumtemp=EachClassMean(i)-total_mean;Fai_b(:,i)=sqrt(EachClassNum(i))*temp;
end
for i=1:train_tolFai_w(:,i)=train_pro(:,i)-EachClassMean(:,train_label(i));
end
Sb=Fai_b*Fai_b';
Sw=Fai_w*Fai_w';%廣義特征值分解,得到LDA的投影矩陣
LDA_dim=ClassNum-1;
% LDA_dim=12;
[eig_vec,eig_val]=eig(Sb,Sw);
d=diag(eig_val)';
[sorted_d,ind]=sort(d,'descend');
sorted_vec=eig_vec(:,ind);
W_LDA=sorted_vec(:,1:LDA_dim);%訓練樣本、測試樣本再次投影
train_final=W_LDA'*train_pro;
test_final=W_LDA'*test_pro;%調用最近鄰分類器對測試樣本分類
Sample=test_final';
Training=train_final';
Group=train_label';
k=1;
distance='euclidean';
Class = knnclassify(Sample, Training, Group, k, distance);
accuracy=sum(test_label==Class')/test_tol;%---------------------------------輸出顯示----------------------------------
fprintf('每類訓練樣本數為:%d\n',train_samplesize);
fprintf(2,'FisherFace的識別率為:%.2f%%\n\n',accuracy*100);
function [sample,label]=readsample(address,ClassNum,data,rows,cols,image_fmt)
%這個函數用來讀取樣本。
%輸入:
%address:要讀取的樣本的路徑
%ClassNum:代表要讀入樣本的類別數
%data:數據
%rows:樣本行數
%cols:樣本列數
%image_fmt:圖片格式%輸出:
%sample:樣本矩陣,每行為一個樣本,每列為一個特征
%label:標簽向量ImageSize=rows*cols;
sample_tol=ClassNum*length(data);%讀入的樣本總數
sample=zeros(sample_tol,ImageSize);
label=zeros(1,sample_tol);
m=1;
for i=1:ClassNumfor j=dataa=imread(strcat(address,num2str(i),'_',num2str(j),image_fmt));a=imresize(a,[rows cols]);b=double(reshape(a,1,ImageSize));sample(m,:)=b;label(m)=i;m=m+1;end
end
function [disc_set,disc_value,Mean_Image]=Eigenface_f(Train_SET,Eigen_NUM) %輸入: %Train_SET:訓練樣本集,每列是一個樣本,每行一類特征,mxn %Eigen_NUM:投影維數%輸出: %disc_set:特征向量 %disc_value:特征值 %Mean_Image:均值圖像%------------------------------------------------------------------------ % Eigenface computing function[NN,Train_NUM]=size(Train_SET);if NN<=Train_NUM % m<n時Mean_Image=mean(Train_SET,2);Train_SET=Train_SET-Mean_Image*ones(1,Train_NUM);R=Train_SET*Train_SET'/(Train_NUM-1);%協方差矩陣[V,S]=Find_K_Max_Eigen(R,Eigen_NUM);disc_value=S;disc_set=real(V);else % m>n時Mean_Image=mean(Train_SET,2);Train_SET=Train_SET-Mean_Image*ones(1,Train_NUM);R=Train_SET'*Train_SET/(Train_NUM-1);[V,S]=Find_K_Max_Eigen(R,Eigen_NUM);disc_value=S;disc_set=zeros(NN,Eigen_NUM);clear R S;Train_SET=Train_SET/sqrt(Train_NUM-1);for k=1:Eigen_NUMa = Train_SET*V(:,k);b = (1/sqrt(disc_value(k)));disc_set(:,k)=b*a;enddisc_set=real(disc_set); endfunction [Eigen_Vector,Eigen_Value]=Find_K_Max_Eigen(Matrix,Eigen_NUM)[NN,NN]=size(Matrix); [V,S]=eig(Matrix); %Note this is equivalent to; [V,S]=eig(St,SL); also equivalent to [V,S]=eig(Sn,St); %S=diag(S); [S,index]=sort(S);Eigen_Vector=zeros(NN,Eigen_NUM); Eigen_Value=zeros(1,Eigen_NUM);p=NN; for t=1:Eigen_NUMEigen_Vector(:,t)=V(:,index(p));Eigen_Value(t)=S(p);p=p-1;if p==0break;end end
function [disc_set,disc_value,Mean_Image]=Eigenface_f(Train_SET,Eigen_NUM) %輸入: %Train_SET:訓練樣本集,每列是一個樣本,每行一類特征,mxn %Eigen_NUM:投影維數%輸出: %disc_set:特征向量 %disc_value:特征值 %Mean_Image:均值圖像%------------------------------------------------------------------------ % Eigenface computing function[NN,Train_NUM]=size(Train_SET);if NN<=Train_NUM % m<n時Mean_Image=mean(Train_SET,2);Train_SET=Train_SET-Mean_Image*ones(1,Train_NUM);R=Train_SET*Train_SET'/(Train_NUM-1);%協方差矩陣[V,S]=Find_K_Max_Eigen(R,Eigen_NUM);disc_value=S;disc_set=real(V);else % m>n時Mean_Image=mean(Train_SET,2);Train_SET=Train_SET-Mean_Image*ones(1,Train_NUM);R=Train_SET'*Train_SET/(Train_NUM-1);[V,S]=Find_K_Max_Eigen(R,Eigen_NUM);disc_value=S;disc_set=zeros(NN,Eigen_NUM);clear R S;Train_SET=Train_SET/sqrt(Train_NUM-1);for k=1:Eigen_NUMa = Train_SET*V(:,k);b = (1/sqrt(disc_value(k)));disc_set(:,k)=b*a;enddisc_set=real(disc_set); endfunction [Eigen_Vector,Eigen_Value]=Find_K_Max_Eigen(Matrix,Eigen_NUM)[NN,NN]=size(Matrix); [V,S]=eig(Matrix); %Note this is equivalent to; [V,S]=eig(St,SL); also equivalent to [V,S]=eig(Sn,St); %S=diag(S); [S,index]=sort(S);Eigen_Vector=zeros(NN,Eigen_NUM); Eigen_Value=zeros(1,Eigen_NUM);p=NN; for t=1:Eigen_NUMEigen_Vector(:,t)=V(:,index(p));Eigen_Value(t)=S(p);p=p-1;if p==0break;end end
總結
以上是生活随笔為你收集整理的FisherFace 进行人脸分裂的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: rectint 函数
- 下一篇: 用MFC显示一张图片