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.算法結果
經測試,該算法能正確預測測試圖片中的標籤。
輸出為:測試圖片的預測標籤,模型信息如下所示。