代碼下載:基於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)。