讀古今文學網 > 刷臉背後:人臉檢測 人臉識別 人臉檢索 > 6.3 OpenCV中的3種人臉識別算法 >

6.3 OpenCV中的3種人臉識別算法

OpenCV從2.4版本開始支持人臉識別功能,本書所用的版本是2.6.10,Python版本為3.4。OpenCV主要提供3種人臉識別算法,分別是Eigenfaces[12]、Fisherfaces[13]、Local Binary Patterns Histograms[14](LBP,局部二值模式直方圖)。Eigenfaces和Fisherfaces都是整體特徵,而LBP則是局部特徵,可以降低特徵向量維度。OpenCV人臉識別的官方參考文檔鏈接為:http://docs.opencv.org/2.6.10/modules/contrib/doc/facerec/facerec_tutorial.html。

6.3.1 Eigenfaces

1.算法原理

假設一張圖片的尺寸為m×n像素,那麼該圖片對應一個長度為m×n的特徵向量。所以,一張200×200像素的圖片就對應了一個長度為40 000維的特徵向量。但並不是這40 000個特徵都對我們識別圖像有幫助,我們想要的是最能代表圖片信息的主要特徵向量(40 000維中的一部分維)。主成分分析(Principal Component Analysis,PCA)由Karl Pearson(1901)和Harold Hotelling(1933)提出,它將一系列相關的屬性(維)轉換成更小的不相關屬性集合(來源:OpenCV人臉識別的官方參考文檔)。一個高維度的數據中,通常只有一部分維度代表有用的信息,而PCA就能發現高維數據中的主成分(主要屬性)。PCA算法原理如下:

(1)計算數據集平均值。

(2)根據數據集平均值計算該數據集的協方差。

(3)求出協方差的特徵向量和對應的特徵值。

(4)根據特徵值降序排列特徵向量,前k個主成分就是k個最大的特徵值對應的特徵向量。

2.算法流程

整體操作步驟如下(來源:OpenCV人臉識別的官方參考文檔)。

(1)運行源碼opencv_frprocess_data文件夾下的create_csv.py文件,將圖片路徑和標籤信息保存到at.csv文件中。

(2)編譯源碼文件夾opencv_fr下的facerec_eigenfaces.cpp文件,生成可執行文件。

具體步驟如下。

1)數據預處理

(1)使用AT&T Facedatabase[15]數據庫,該數據庫包含40個人,每個人有10張圖片,其中某些人的圖片在不同時間採集,有微弱的光照變化和面部表情變化。

(2)運行源代碼opencv_frprocess_data文件夾下的create_csv.py文件,將圖片路徑和標籤信息保存到at.csv文件中。在使用之前,讀者需要修改自己的圖片路徑。

命令形式:

create_csv.py [圖片數據所在路徑,需要指定到該路徑下包含s*的文件夾]

OpenCV提供的create_csv.py文件內容如下:

2)分類識別

(1)編譯源碼文件夾opencv_fr下的facerec_eigenfaces.cpp文件,生成的可執行文件命名為FaceRec_EigenFaces.exe。

(2)使用FaceRec_EigenFaces.exe命令:

FaceRec_EigenFaces.exe [圖片列表文件] [輸出圖片的保存路徑,可選]

例:

facerec_eigenfaces.cpp文件是OpenCV官方網站提供的源程序,其內容如下:

3.算法結果

經測試,該算法能正確預測測試圖片的標籤。

輸出為:測試圖片的預測標籤,前10個特徵向量對應的特徵值如下所示。

使用了JET模式色圖的10個Eigenfaces如圖6-8所示,從這些圖中我們可以看出,Eigenfaces不僅對面部特徵進行了編碼,而且對圖片中的光照也進行了編碼(第四張圖中的右側光,第五張圖中的左側光)。

圖6-8 使用了JET模式色圖的10個Eigenfaces

使用特徵向量重新構建的人臉圖像如圖6-9所示。重新構建一個較好的人臉圖像需要多個特徵向量,從圖6-9中可以看出,10個特徵向量不足以重新構建人臉圖像。50個特徵向量可能足夠重新構建人臉圖像,對於AT&T Facedatabase來說,300個特徵向量可以重新構建一個較好的人臉圖像(來源:OpenCV人臉識別的官方參考文檔)。

圖6-9 使用特徵向量重新構建的人臉圖像

6.3.2 Fisherfaces

1.算法原理

Eigenfaces主要基於PCA實現,但是仍有一些不足,因為該PCA是無監督的,沒有考慮類間變化,如輸入數據的主要變化是光照,經過PCA處理後,該數據不再具有可區分信息(來源:OpenCV人臉識別的官方參考文檔)。

線性鑒別分析[16](Linear Discriminant Analysis,LDA)主要是處理特定類的降維,最大化類間的離散度、最小化類內的離散度。Fisherfaces主要基於LDA實現。

2.算法流程

整體操作步驟如下。

(1)運行源碼opencv_frprocess_data文件夾下的create_csv.py文件,將圖片路徑和標籤信息保存到at.csv文件中。

(2)編譯源碼文件夾opencv_fr下的facerec_fisherfaces.cpp文件,生成可執行文件。

具體步驟如下。

1)數據預處理

同6.3.1節。

2)分類識別

編譯源碼文件夾opencv_fr下的facerec_fisherfaces.cpp文件,生成FaceRec_FisherFaces.exe可執行文件。

FaceRec_FisherFaces.exe命令:

FaceRec_FisherFaces.exe [圖片列表文件] [輸出圖片的保存路徑,可選]

例:

facerec_fisherfaces.cpp文件是OpenCV官方網站提供的源程序,其內容如下:

3.算法結果

經測試,本算法能正確預測測試圖片的標籤。

輸出為:測試圖片的預測標籤,此處只輸出了前16個類別的特徵值,如下所示。

輸出16個類的Fisherface如圖6-10所示,輸出16個類的Fisherface重新構建後的圖像如圖6-11所示。

圖6-10 16個類的Fisherface

圖6-11 16個類的Fisherface重新構建後的圖像

6.3.3 Local Binary Patterns Histograms

1.算法原理

Eigenfaces和Fisherfaces考慮的是整體特徵,Eigenfaces最大化整體離散度,由於數據內部變化可能會導致分類識別,如光照變化等;為了保留類間可區分信息,於是就有了基於LDA實現的Fisherfaces,在特定場景下,它優於Eigenfaces。

Local Binary Patterns Histograms的主要思想是:通過比較圖片中像素和與它相鄰的像素對局部進行求和。取一個像素作為中心,對相鄰的像素進行比較,如果中心像素的值大於或等於相鄰像素的值,則把該相鄰像素標為1,否則標為0。對於圖片中的每個像素,會得到一個二進制序列,如00001111。一個中心像素周圍的8個像素,可以得到28種組合,這種方法稱為LBP或LBP編碼。

為了具有尺度不變性,使用一個給定半徑的圓來定義近鄰,這種方法稱為擴展LBP。

2.算法流程

整體操作步驟如下。

(1)運行源碼opencv_frprocess_data文件夾下的create_csv.py文件,將圖片路徑和標籤信息保存到at.csv文件中。

(2)編譯源碼文件夾opencv_fr下的facerec_lbph.cpp文件,生成可執行文件。

具體步驟如下。

1)數據預處理

同6.3.1節。

2)分類識別

編譯源碼文件夾opencv_fr下的facerec_lbph.cpp文件,假設生成FaceRec_LBPH.exe可執行文件。

FaceRec_LBPH.exe命令:

FaceRec_LBPH.exe [圖片列表文件] [輸出圖片的保存路徑,可選]

例:

FaceRec_LBPH.exe F:paperbookcodeopencv_frprocess_dataat. csv

facerec_lbph.cpp文件是OpenCV官方網站提供的源程序,其內容如下:

3.算法結果

經測試,該算法能正確預測測試圖片中的標籤。

輸出為:測試圖片的預測標籤,模型信息如下所示。