人臉識别主要方法:
.Eigenfaces,PCA(Principal Component Analysis),Turk and Pentland,1991
.Fisherfaces,LDA(Linear Discriminant Analysis),Belhumeur, Hespanha and Kriegman,1997
.LBPH,Local Binary Pattern Histograms,Ahonen, Hadid and Pietikäinen,2004
本文的目的,是結合人臉識别體驗一把PCA,體會其内涵:降維。另外文獻說,PCA的識别效果一般比神經網絡ANN好。本文有20張人臉用于訓練,10張人臉用于測試。
訓練樣本和測試樣本來自:http://cswww.essex.ac.uk/mv/allfaces/faces94.zip
1.PCA人臉識别方法
将PCA方法用于人臉識别,其實是假設所有的人臉都處于一個低維線性空間,而且不同的人臉在這個空間中具有可分性。其具體做法是由高維 圖像空間經PCA變換後得到一組新的正交基,對這些正交基做一定的取舍,保留其中的一部分生成低維的人臉空間,也即是人臉的特征子空間。PCA人臉識别算法步驟包括:
a.人臉圖像預處理 【我沒做,人臉大小都是高200,寬180】
b.讀入人臉庫,訓練形成特征子空間 【特征值、特征向量的求法,采用我上一篇文章的QR算法】
c.把訓練圖像和測試圖像投影到上一步驟中的特征子空間上 【矩陣相乘】
d.選擇一定的距離函數進行判别 【歐氏距離,挑最小的比對】
2.PCA人臉識别流程
a.讀入人臉庫,讀入每一個二維的人臉圖像并轉化為一維的向量,每個人標明一定數量的人臉照片構成訓練集【共20張】,則訓練集是一個36000*20的矩陣。測試集共10張圖像,每次選一張,則測試集是一個36000*1的矩陣。
樣本集:

測試集:
代碼:
b.計算 PCA變換的生成矩陣Q。首先計算訓練集的協方差矩陣X,其中x1,x2,...,xn為第i副圖像的描述,即xi為一個36000*1的列向量。
,
由于這個矩陣太大36000*36000,求特征值和特征向量比較坑,是以改為求 P=XTX 的特征向量和特征值,且有如下性質:
設e是矩陣P的特征值λ對應的特征向量,則有:
這裡,X*e也是矩陣Q的特征值λ對應的特征向量,可以如此變換。
c.計算生成矩陣P的特征值和特征向量,并挑選合适的特征值和特征向量,構造特征子空間變化矩陣。這裡P是實對稱矩陣,可以采用上一篇的方法,先進行Household變換将P變成三對角矩陣,然後使用QR疊代算法求解特征值和特征向量,疊代次數60,誤差eps=0.000001,代碼:
挑選合适的特征值和特征向量,其實就是挑特征值大于1的【關于挑選,可以排序選前k個,也可以設門檻值】:
d.把訓練圖像和測試圖像投影到特征空間中。每一幅人臉圖像投影到子空間以後,就對應與子空間的一個點。同樣,子空間中的任一點也對應于一副圖像。這些子空間的點在重構以後的圖像很像人臉,是以他們被成為特征臉Eigenface。有了這樣一個由特征臉組成的降維子空間,任何一副人臉圖像都可以向其做投影并獲得一組坐标系數,這組系數表明了該圖像在子空間中的位置,這樣原來的人臉圖像識别問題就轉化為依據子空間的訓練樣本點進行分類的問題。
【非必要步驟,特征臉如何重構,即 X*e,X大小為36000*20,e大小為20*k,每次隻需将36000行的一列資料按照圖像大小按行存儲即可,這樣就有k張特征臉圖像】:
結果:
回到原題,我們已經對P使用QR算法求的特征向量和特征值,通過X*e得到了Q的特征向量eigenvector大小36000*k,它構成了降維子空間。接下來,分别讓樣本集和測試集的圖像投影到該子空間中,即:eigenvector ' * X 等等,然後得到一組坐标系數。
計算Q的特征向量和樣本集像子空間投影的代碼:
讀取測試圖像,并投影到子空間的代碼:
e.把投影到特征子空間中的測試圖像和樣本集進行比較,确定待識别樣本所屬類别。本文使用歐氏距離計算坐标之間的距離:
實驗結果:
即測試集中的4.jpg和樣本集中的7.jpg對應比對
下面給出主函數及各個頭檔案聲明:
My_Matrix.h:
Process.h:
main.cpp:
這裡面 ,矩陣操作有點頭大,再梳理一遍:
1.将20副高200,寬180的圖像,存入矩陣T中,36000*20
2.計算T的協方差矩陣L,20*20
3.求P的特征值b,20*1,特征向量q,20*20【q中的第j列向量即為b中第j個特征值對應的特征向量】,經過挑選後的特征向量num_q,20*k
4.構造特征子空間,即計算 T*p_q,得到eigenvector,36000*k,也是k副特征臉
5.将樣本集圖像投影到特征子空間,即計算eigenvector ' * T,得到一組坐标系數,projected_train,k*20,每一列為對應圖像在子空間中的坐标
6.同理操作,得到測試圖像在子空間中的坐标,projected_test,k*1
7.分别計算projected_tes和projected_train的坐标距離,選最小的比對。