基於PCA(主成分分析)的人臉識別

馬衛飛發表於2017-12-12

程式碼下載:基於PCA(主成分分析)的人臉識別

人臉識別是一個有監督學習過程,首先利用訓練集構造一個人臉模型,然後將測試集與訓練集進行匹配,找到與之對應的訓練集頭像。最容易的方式是直接利用歐式距離計算測試集的每一幅影象與訓練集的每一幅影象的距離,然後選擇距離最近的影象作為識別的結果。這種直接計算距離的方式直觀,但是有一個非常大的缺陷—計算量太大。如果每幅影象大小為100*100,訓練集大小1000,則識別測試集中的一幅影象就需要1000*100*100的計算量,當測試集很大時,識別速度非常緩慢。

解決上述問題的一個途徑是對影象進行降維,通過只保留某些關鍵畫素可以使識別速度大大提升。降維的一個方法即是PCA(主成分分析),在此我們介紹通過PCA進行人臉識別的步驟。

1 讀取訓練集影象資料

讀取測試集目錄下指定個數的影象,然後將其儲存在一個二維陣列中。如果影象個數為m,影象長寬為i、j,則我們建立一個二維陣列A[m][i*j=n]用來儲存影象資料。陣列的每一行表示一個影象的所有畫素資訊,每一列表示一個隨機變數,也即不同影象同一位置的畫素資訊,降維也即用更少的列來代表影象。

2 每列減去均值

將步驟一的每列減去該列的均值,這樣每列的資料均值為0。在利用matlab的函式princomp執行PCA的過程中,princomp會首先將每一列減去該列均值,不用我們自己執行。

3 計算協方差矩陣

協方差矩陣表示不同隨機變數之間的相互關係,影象中也即求任意兩個畫素之間的關係。如果兩個隨機變數的協方差為正或為負,表明兩個變數之間具有相關性,如果為零表示兩個變數不相關。通過計算協方差矩陣,我們就可以獲得不同畫素之間的關係。針對人臉識別,計算的協方差矩陣大小為n*n,其中n表示影象的畫素點個數。

4 計算協方差矩陣的特徵值和特徵向量

由於協方差矩陣是實對稱陣,所以可以求得其所有的特徵值和特徵向量,其共有n個特徵值和特徵向量。

5 選擇主成分

所謂主成分即是具有最大特徵值的特徵向量,所以我們需要將特徵向量按照特徵值由大到小排序,然後根據精度要求選擇不同數量的特徵向量,例如我們選擇了前p個特徵向量,通常p遠小於n(在我們的人臉識別實驗中,為了達到95%的精度,p只有72,而n為120*140=17040)。

6 將訓練集進行降維

此步驟將原始的訓練集進行降維變換,原始的影象資料是m*n的矩陣,只包含主成分的特徵向量構成一個n*p的矩陣(每一列都是一個特徵向量)。將兩個矩陣相乘,我們即可獲得降維之後的影象矩陣m*p,這個矩陣遠小於原始的影象資料。

7 將測試集進行降維

同步驟6相似,讀取所有的測試集影象,然後對其也進行降維操作。如果測試集有M幅影象,則降維後的矩陣為M*p。

8 人臉識別

       該步驟為人臉識別的最後一步,用來對測試集進行識別,並計算識別準確率。該步驟有一個限制,測試集中的頭像必須包含在訓練集中,否則得出的結果將沒有意義(這也就是程式碼一開始要求訓練集大於測試集的目的)。識別的方法和最初的影象匹配方法類似:將測試集中的每一幅降維影象與降維的訓練集進行匹配,然後將其分類到距離最小的訓練集頭像中,如果兩個頭像表示一個人,表示識別成功,否則表示識別失敗。與原始的匹配相比,由於對影象進行了降維,所以匹配速度大大提升,在我們的實驗中速度提升了200以上(120*142/72)。

如果想了解PCA的原理,請參考:PCA的數學原理

相關文章