基於MATLAB,運用PCA+SVM的特徵臉方法人臉識別
阿新 • • 發佈:2019-01-27
%% %主程式,程式從此開始 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) ;