1. 程式人生 > >基於MATLAB,運用PCA+SVM的特徵臉方法人臉識別

基於MATLAB,運用PCA+SVM的特徵臉方法人臉識別

%%
%主程式,程式從此開始
clc,clear  
npersons=40;%選取40個人的臉  
global imgrow;  
global imgcol;  
imgrow=112;  
imgcol=92;  
%%
%讀取訓練資料 
disp('讀取訓練資料...')  
[f_matrix,train_label]=ReadFace(npersons,0);%讀取訓練資料  
nfaces=size(f_matrix,1);%樣本人臉的數量  
disp('.................................................')  
%低維空間的影象是(nperson*5)*k的矩陣,每行代表一個主成分臉,每個臉20維特徵  
%%
%對訓練集進行降維處理
disp('訓練資料PCA特徵提取...')  
mA=mean(f_matrix);  
k=20;%降維至20維  
%按理來講,協方差矩陣的維數是10304維,而訓練集的樣本數量只有200
%那麼起作用的特徵值對應的特徵向量小於等於199個,其餘的特徵向量對應的特徵值都為0
[train_pcaface,V]=fastPCA(f_matrix,k,mA);%主成分分析法特徵提取  
disp('.................................................')  

%%
%顯示主成分臉,即特徵臉,低維的基
disp('顯示主成分臉...')  
visualize(V)%顯示主分量臉  ,即特徵臉
disp('.................................................')  
  
%%
%低維訓練集歸一化
disp('訓練特徵資料歸一化...')  
disp('.................................................')  
lowvec=min(train_pcaface);  
upvec=max(train_pcaface);  
train_scaledface = scaling( train_pcaface,lowvec,upvec);  
 
%%
%SVM樣本訓練
%本人的程式叫源程式有改動,使用的是libsvm工具箱進行SVM分類
disp('SVM樣本訓練...')  
disp('.................................................')  
 model = svmtrain(train_label,train_scaledface,'-t 0');
 
 %%
 %讀取測試資料
disp('讀取測試資料...')  
disp('.................................................')  
[test_facedata,test_facelabel]=ReadFace(npersons,1);  
  
%%
%測試資料降維
%test_pcatestface-測試資料低維空間的表示
disp('測試資料特徵降維...')  
disp('.................................................')  
m=size(test_facedata,1);  
for i=1:m  
    test_facedata(i,:)=test_facedata(i,:)-mA;  
end  
test_pcatestface=test_facedata*V;  
  
%%
%測試資料歸一化
disp('測試特徵資料歸一化...')  
disp('.................................................')  
scaled_testface = scaling( test_pcatestface,lowvec,upvec);  
  
%%
%利用訓練集建立的模型,對測試集進行分類
disp('SVM樣本分類...')  
disp('.................................................')  
[predict_label,accuracy,decision_values]=svmpredict(test_facelabel,scaled_testface,model);

%%
%人臉識別模組
disp('人臉識別模組')
disp('.................................................')  
recognition(mA,V,model) ;