基於pca的人臉識別


轉自:http://www.cnblogs.com/liu-jun/archive/2013/03/20/2970132.html

 

以前對PCA算法有過一段時間的研究,但沒整理成文章,最近項目又打算用到PCA算法,故趁熱打鐵整理下PCA算法的知識。本文觀點旨在拋磚引玉,不是權威,更不能盡信,只是本人的一點體會。

主成分分析(PCA)是多元統計分析中用來分析數據的一種方法,它是用一種較少數 量的特征對樣本進行描述以達到降低特征空間維數的方法,它的本質實際上是K-L變換。PCA方法最著名的應用應該是在人臉識別中特征提取及數據維,我們知 道輸入200*200大小的人臉圖像,單單提取它的灰度值作為原始特征,則這個原始特征將達到40000維,這給后面分類器的處理將帶來極大的難度。著名 的人臉識別Eigenface算法就是采用PCA算法,用一個低維子空間描述人臉圖像,同時用保存了識別所需要的信息。下面先介紹下PCA算法的本質K- L變換。

1、K-L變換(卡洛南-洛伊(Karhunen-Loeve)變換):最優正交變換  

  • 一種常用的特征提取方法;
  • 最小均方誤差意義下的最優正交變換;
  • 在消除模式特征之間的相關性、突出差異性方面有最優的效果。
離散K-L變換:對向量x(可以想象成 M維=width*height 的人臉圖像原始特征)用確定的完備正交歸一向量系uj展開:
 
 
 
這個公式由來我想應該是任一n維歐式空間V均存在正交基,利用施密特正交化過程即可構建這個正交基。
現在我們希望用d個有限項來估計向量x,公式如下:
 
計算該估計的均方誤差如下:
 
要使用均方誤差最小,我們采用Langrange乘子法進行求解:
 
                                                           
 
因此,當滿足上式時,
取得最小值。
 
 
即相關矩陣R的d個特征向量(對應d個特征值從大到小排列)為基向量來展開向量x時,其均方誤差最小,為:
 
因此,K-L變換定義:當取矩陣R的d個最大特征值對應的特征向量來展開x時,其截斷均方誤差最小。 這d個特征向量組成的正交坐標系稱作x所在的D維空間的d維K-L變換坐標系, x在K-L坐標系上的展開系數向量y稱作x的K-L變換。
 
總結下,K-L變換的方法:對相關矩陣R的特征值由大到小進行排隊,
均方誤差最小x近似於:
                                                              
矩陣形式:
 
上式兩邊乘以U的轉置,得
                                             
 

向量y就是變換(降維)后的系數向量,在人臉識別Eigenface算法中就是用系數向量y代替原始特征向量x進行識別。


 
下面,我們來看看相關矩陣R到底是什么樣子。
 
因此,我們可以看出相關矩陣R是一個實對稱矩陣(或者嚴謹的講叫正規矩陣),正規矩陣有什么特點呢??學過《矩陣分析》的朋友應該知道:
若矩陣R是一個實對稱矩陣,則必定存在正交矩陣U,使得R相似於對角形矩陣,即:
 
 因此,我們可以得出這樣一個結論:
                                                    
 
 降維后的系數向量y的相關矩陣是對角矩陣,即通過K-L變換消除原有向量x的各分量間的相關性,從而有可能去掉那些帶有較少信息的分量以達到降低特征維數的目的。
 
2、主成分分析(PCA)
 
主成分分析(PCA)的原理就是將一個高維向量x,通過一個特殊的特征向量矩陣U,投影到一個低維的向量空間中,表征為一個低維向量y,並且僅僅損失了一些次要信息。也就是說,通過低維表征的向量和特征向量矩陣,可以基本重構出所對應的原始高維向量。
在人臉識別中,特征向量矩陣U稱為特征臉(eigenface)空間,因此其中的特征向量ui進行量化后可以看出人臉輪廓,在下面的實驗中可以看出。
以人臉識別為例,說明下PCA的應用。
設有N個人臉訓練樣本,每個樣本由其像素灰度值組成一個向量xi,則樣本圖像的像素點數即為xi的維數,M=width*height ,由向量構成的訓練樣本集為
該樣本集的平均向量為:
平均向量又叫平均臉。
 
樣本集的協方差矩陣為:
 
求出協方差矩陣的特征向量ui和對應的特征值,這些特征向量組成的矩陣U就是人臉空間的正交基底,用它們的線性組合可以重構出樣本中任意的人臉圖像,(如果有朋友不太理解這句話的意思,請看下面的總結2。)並且圖像信息集中在特征值大的特征向量中,即使丟棄特征值小的向量也不會影響圖像質量。
將協方差矩陣的特征值按大到小排序:。由大於對應的特征向量構成主成分,主成分構成的變換矩陣為:
                              
這樣每一幅人臉圖像都可以投影到構成的特征臉子空間中,U的維數為M×d。有了這樣一個降維的子空間,任何一幅人臉圖像都可以向其作投影,即並獲得一組坐標系數,即低維向量y,維數d×1,為稱為KL分解系數。這組系數表明了圖像在子空間的位置,從而可以作為人臉識別的依據。

有朋友可能不太理解,第一部分講K-L變換的時候,求的是相關矩陣的特征向量和特征值,這里怎么求的是協方差矩陣?
其實協方差矩陣也是:
,可以看出其實用代替x就成了相關矩陣R,相當於原始樣本向量都減去個平均向量,實質上還是一樣的,協方差矩陣也是實對稱矩陣。

總結下:
1、在人臉識別過程中,對輸入的一個測試樣本x,求出它與平均臉的偏差,則在特征臉空間U投影,可以表示為系數向量y
                                    
U的維數為M×d的維數為M×1y的維數d×1。若M為200*200=40000維,取200個主成分,即200個特征向量,則最后投影的系數向量y維數降維200維。
2、根據1中的式子,可以得出:
                               
這里的x就是根據投影系數向量y重構出的人臉圖像,丟失了部分圖像信息,但不會影響圖像質量。

 

 

3.PCA算法的實驗部分(matlab)

  

% training
clear; clc; train_path
='.\TrainDatabase\'; % phi存儲樣本,每一列對應一個樣本 phi=zeros(64*64,20); for i=1:20 path=strcat(train_path,num2str(i),'.jpg'); Image=imread(path); Image = rgb2gray(Image);%彩色圖像轉為灰度圖像 Image=imresize(Image,[64,64]); %樣本歸一到同一個尺寸 phi(:,i)=double(reshape(Image,1,[])'); end; mean_phi=mean(phi,2); %計算機平均臉 mean_face=reshape(mean_phi,64,64); Image_mean=mat2gray(mean_face); imwrite(Image_mean,'meanface.jpg','jpg'); Train_Number = size( phi , 2 ); %樣本歸一化,使每一維特征的期望為0,因為不同維度的取值范圍差異很大,為方便處理,我們使其取值在同一個范圍 A = []; for i = 1 : Train_Number temp = double( phi(:,i)) - mean_phi; A = [ A temp ]; end % C = A*A' 是A的協方差矩陣,然而C的維度太高,直接使用C計算特征值與特征向量太耗時 % L= C' ,L的特征值與C的特征值相同 , 而C的特征向量可以通過L的特征向量得到,因此這里使用L L = A'*A; [V D] = eig ( L ); L_eig_vec = []; grad = sum( D ,2 ); %D為對角矩陣,每個元素為相應的特征值,為方便后續處理,這里將特征值放到一個列向量 [ sortGrad , index ] = sort( grad ,'descend' );%排序 i = 1; temp = 0.0; sumValue = sum( grad ); %取能量值占所有特征值99%的前K的特征向量 while( temp/sumValue <= 0.99 && i <= 20 ) L_eig_vec = [ L_eig_vec V(:,index(i)) ]; temp = temp+sortGrad(i); i = i+1; end UL = A * L_eig_vec;%協方差矩陣C的特征向量,也稱特征臉,每一維為一個特征臉。 UL也是轉換矩陣,即通過UL將樣本轉化到低維空間,對樣本進行降維 for i=1: size( UL , 2 ) Eigenface=reshape(UL(:,i),[64,64]); figure(i); imshow(mat2gray(Eigenface)); end



%使用測試樣本進行測試
clc;
test_path='.\TestDatabase\';
error=zeros([1 10]);


for i=1:10
    path=strcat(test_path,num2str(i),'.jpg');
    Image=imread(path);
    Image = rgb2gray( Image );
    Image=double(imresize(Image,[64,64]));
    phi_test=zeros(64*64,1);
    phi_test(:,1)=double(reshape(Image,1,[])');
    
    X_test=phi_test-mean_phi;
    Y_test=UL'*X_test;%將測試樣本映射到新空間
    %樣本重建
    X_test_re=UL*Y_test;
    Face_re=X_test_re+mean_phi;

    %%display figure
    Face_re_2=reshape(Face_re(:,1),[64,64]);
    figure(i);
    subplot( 1 , 2 , 1);
    imshow(mat2gray(Image));
    title('Original');
    subplot( 1 , 2 , 2 );
    imshow(mat2gray(Face_re_2));
    title('Reconstruct');
  
end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM