孟逸凡 柳益君
(1.江蘇理工學院計算機工程學院,江蘇 常州 213001;2.常州市云計算與智能信息處理重點實驗室,江蘇 常州 213001)
人臉識別技術是指包括人臉檢測和人臉身份認證技術在內的識別技術。隨著國內外人臉識別方法研究的不斷發展,人臉識別技術已經廣泛進入了人們的日常生活,如日常的考勤打卡、電子身份證等[1]。 本文探究了一種經典的PCA-SVM 人臉識別方法,并通過MATLAB 工具軟件進行仿真計算。
1.1.1 主成分分析PCA
本文處理的所有原始圖片都是112×92 大小的pgm 格式圖片,每幅圖片包含10304 個像素點,每一行代表一個樣本,維數就是10304 維。 維數過大使得數據處理工作十分復雜,同時,圖片特征之間的強相關性還會導致“維數災難”。 快速高效的人臉識別,其關鍵在于提取到精準表征人臉的特征。從人臉圖像中找出最能表征人臉的特征空間, 是主成分分析(Principal Component Analysis,PCA)[2]在人臉特征提取中的基本思想。 在這個過程中,不能表征人臉的屬性會被剔除(降維的過程),也就是在一個高維特征空間中利用一組系數對特征加權,來重新表示一張人臉圖片[3]。 PCA 過程的數學描述如下:
讀取樣本矩陣X={xi1,xi2,…,xin} (i=1,2,…,m),假設樣本矩陣是一個m 行n 列的矩陣, 其中m 為樣本數目,n 為特征數目。
用原始數據X 減均值之后可以得到Z={z1,z2,…,zn},其中
找到一個方向u1,使所有zi在u1方向上投影長度(方差)最大,即最大化展開可以得到

在這個過程中,如果要計算k 個方向(即降為k維),則保留前k 大的特征值對應的特征向量V(V 為n 行×k 列)。
最后得到的降維后的數據為pcaA=(X-Z)×V,pcaA 是一個m 行k 列的矩陣。
1.1.2 支持向量機SVM
給定訓練集, 在特征空間上找到一個分類超平面,將樣本點分到不同的類。存在唯一的分類超平面,使得樣本點距離分類超平面的距離最大。 其中,距離超平面最近的點為該超平面的支持向量。找到該超平面后,對于待測點,通過計算該點相對于超平面的位置進行分類。 其中,一個點距離分類超平面的距離越大, 表明分類預測的確信程度越高。 支持向量機(Support Vector Machine,SVM)[4,5]需要做的就是找出一個超平面, 使得在兩類樣本點能完全分離的情況下,盡可能使樣本邊界的距離最大。
定義正樣本邊界f(SV)=WTx++b=1,負樣本邊界f (SV)=WTx-+b=-1。 那么兩個邊界的距離等于正邊界上的點x*+(WTx*+b)=1 到負邊界(WTx-+b=-1)的距離:要最大化該距離,但是存在一個問題,函數在0 處不光滑,所以做一個變換, 求此函數的倒數的最小值, 即求的最小值,但此函數同樣存在在0 處不平滑這個問題。 最終函數滿足處處平滑這個條件,可以求出其最小值。
在這個過程中,可能存在一種問題:兩類樣本在原始空間中線性不可分。這時可以采用核函數將原始空間的點映射到高維空間中,在更高維的空間中找到一個線性分類將兩類樣本分開,從而使線性學習具有非線性可分的能力。
SVM 是一個兩類分類器,而大多數實際分類問題都是多類分類問題, 那么就需要利用SVM 這個二分類器去實現一個多類問題的分類。本文人臉識別程序中,采用的是一對一的投票策略,即在任意兩類樣本之間設計一個SVM 分類器,分類為得票最多的類。
本文通過MATLAB 工具軟件,對PCA-SVM 人臉識別方法進行仿真計算。MATLAB 人臉識別程序的使用界面上分為三個按鈕:“開始運行”“選擇照片”和“人臉識別”,既可以方便操作,又可以使識別結果直觀地顯示出來。點擊“開始運行”按鈕調用的是主函數face.m,對人臉數據進行處理;點擊“選擇照片”按鈕調用子函數GUIopen,用戶可以在相應的文件路徑下選擇人臉照片;點擊“人臉識別”按鈕調用子函數GUIreg,通過每張圖片所對應的標簽來進行匹配,從而得出識別結果。
人臉識別模型的建立首先需要適當的人臉庫。本文分兩步構建人臉庫。
(1)選擇ORL 人臉數據庫加入本文人臉庫,其中包含40 個人的每人10 張人臉圖片, 一共400 張圖片,每張大小是112×92 像素,圖片格式是pgm。
(2)作者利用電腦攝像頭拍了10 張本人的照片,將這10 張圖片的格式轉化為pgm 格式, 同時大小也轉化為112×92 像素,加入本文人臉庫。
這里將每個人的前5 張人臉圖片作為訓練集,后5張人臉圖片作為測試集。 訓練集數據處理步驟如下:
(1) 讀入訓練集數據, 儲存在矩陣f_matrix(205*10304)中。
(2)對訓練集數據進行PCA 降維,本文選擇的降維維數是100。
(3)規范化特征數據,將同一個樣本中的不同維度歸一化,從而對于不同的屬性之間也可以進行比較。
這里特別增加了一個顯示特征臉的步驟。由于數據降至100 維, 在低維空間中的基就是100 張特征臉,其他所有經過降維的臉都可以通過這100 張特征臉線性表示。 圖1 顯示了前10 個特征臉。

圖1 特征臉顯示
(4)利用SVM 分類器對訓練樣本集進行訓練,獲得SVM 人臉識別模型。
在PCA-SVM 人臉識別模型建立中, 參數取值如下:
(1)npersons:樣本包含41 個人的人臉,將npersons設置為41。
(2)flag:flag 為0 時子函數ReadFace.m 讀取訓練樣本數據,flag 為1 時讀取測試樣本數據。
(3)k:表示降維至k 維。該參數在子函數fastPCA.m中以輸入參數出現,在后面的SVM 訓練中也有用處。k 值與gamma 值有很大關聯,這里經過反復調整將k設置為100。
(4)lowvec: 經過降維后的圖像數據pcaface 的最小值,通過設置lownew,即新的邊界的下限,對數據進行歸一化處理。
(5)upvec: 經過降維后的圖像數據pcaface 的最大值,通過設置upnew,即新的邊界的上限,對數據進行歸一化處理。
(6)核函數:本文選擇的是高斯核函數。
(7)gamma: 參數gamma 是選擇高斯核函數RBF作為核函數后,該函數自帶的一個參數。 它隱含地決定了數據映射到新的特征空間后的分布。 gamma 越大,支持向量越少,反之支持向量越多。支持向量的個數直接影響到訓練與預測的速度。gamma 如果設置得很大,會使得高斯分布顯得高而窄,只作用于支持向量樣本附近,對于未知樣本的分類效果很差,最終會導致訓練準確率很高, 而識別準確率很低的結果,即過擬合。 而gamma 設置過小, 則會造成平滑效應過大, 對于噪聲不敏感。 本文設置參數gamma 時,在10-3~103的范圍依次嘗試,最終設置為0.01。
測試時,首先讀取測試數據,類似于處理訓練數據,需要對測試數據進行降維和歸一化處理,然后利用訓練所得的模型對測試數據集進行分類識別。將識別結果與本身自帶的標簽(即這是第幾個人的人臉圖片)進行比對,可以獲得識別準確率。 測試結果表明,基于PCA-SVM 的人臉識別方法準確率為85.85%,如圖2 所示。 這里選取第8 個人的人臉圖片作為示例,如圖3 所示,可以看到在最終的人臉識別階段可以準確地進行人臉識別。

圖2 人臉識別準確率

圖3 人臉識別結果示例
人臉識別的發展方向就在于不斷提高識別準確率和數據處理效率。 這不僅需要改進圖像的特征提取,同時也需要改進分類器的設計,從而實現快速準確的人臉識別。 本文采用MATLAB 工具軟件對基于PCA-SVM 的人臉識別方法進行了探究,結果表明,基于PCA-SVM 的人臉識別方法效果良好,但還有較大的提高空間。 在以后的工作中,擬從優化懲罰參數的角度提高該方法的性能。