Opencv-Facial-Landmark-Detection
利用OpenCV中的LBF算法進行人臉關鍵點檢測(Facial Landmark Detection)
Note: OpenCV3.4+OpenCV-Contrib以及上支持Facemark
下面是Amusi具體利用OpenCV中的LBF算法進行人臉關鍵點檢測的教程,**大家如果喜歡這個教程,記得給個star!**項目的教程和源碼,只需要你在命令行或終端打開git后,輸入下述命令即可,或者直接點擊Clone or download,並選擇Download ZIP下載壓縮包即可。
git clone https://github.com/amusi/opencv-facial-landmark-detection.git
測試環境
- Windows10
- Visual Studio 2013
- OpenCV3.4.1+OpenCV-Contrib3.4.1
Note:感謝apple ^(oo)^蘭 童鞋的提醒,注意本教程一定需要OpenCV-Contrib的支持。即你的OpenCV環境需要使用CMake對OpenCV和OpenCV-Contrib進行編譯,生成動態鏈接庫。版本最好是3.4.1。
引言
人臉一般是有68個關鍵點,常用的人臉開源庫有Dlib,還有很多深度學習的方法。
本教程僅利用OpenCV,不依賴其它第三方庫來實現人臉關鍵點檢測,這一特性是之前沒有的。因為OpenCV自帶的samples中只有常見的人臉檢測、眼睛檢測和眼鏡檢測等(方法是harr+cascade或lbp+cascade)。
本教程主要參考Facemark : Facial Landmark Detection using OpenCV
截止到2018-03-20,OpenCV3.4可支持三種人臉關鍵點檢測,但目前只能找到一種已訓練好的模型,所以本教程只介紹一種實現人臉關鍵點檢測的算法。而且此類算法還沒有Python接口,所以這里只介紹C++的代碼實現。
Facemark API
OpenCV官方的人臉關鍵點檢測API稱為Facemark。Facemark目前分別基於下述三篇論文,實現了三種人臉關鍵點檢測的方法。
- FacemarkKazemi: This implementation is based on a paper titled “One Millisecond Face Alignment with an Ensemble of Regression Trees” by V.Kazemi and J. Sullivan published in CVPR 2014. An alternative implementation of this algorithm can be found in DLIB
- FacemarkAAM: This implementation uses an Active Appearance Model (AAM) and is based on an the paper titled “Optimization problems for fast AAM fitting in-the-wild” by G. Tzimiropoulos and M. Pantic, published in ICCV 2013.
- FacemarkLBF: This implementation is based a paper titled “Face alignment at 3000 fps via regressing local binary features” by S. Ren published in CVPR 2014.
在寫這篇文章的時候,FacemarkKazemi類似乎不是從Facemark類派生的,而其他兩個類都是。
Facemark訓練好的模型
盡管Facemark API包含三種不同的實現,但只有FacemarkLBF(local binary features,LBF)才提供經過訓練的模型。 (之后在我們根據公共數據集訓練我們自己的模型后,這篇文章將在未來更新)
你可以從中下載已訓練好的模型:
利用OpenCV代碼進行實時人臉關鍵點檢測
步驟
1. 加載人臉檢測器(face detector)
所有的人臉關鍵點檢測算法的輸入都是一個截切的人臉圖像。因為,我們的第一步就是在圖像中檢測所有的人臉,並將所有的人臉矩形框輸入到人臉關鍵點檢測器中。這里,我們可以使用OpenCV的Haar人臉檢測器或者lbp人臉檢測器來檢測人臉。
2. 創建Facemark對象
創建Facemark類的對象。在OpenCV中,Facemark是使用智能指針(smart pointer,PTR),所以我們不需要考慮內存泄漏問題。
3. 加載landmark檢測器
加載關鍵點檢測器(lbfmodel.yaml)。此人臉檢測器是在幾千幅帶有關鍵點標簽的人臉圖像上訓練得到的。
帶有注釋/標簽關鍵點的人臉圖像公共數據集可以訪問這個鏈接下載:https://ibug.doc.ic.ac.uk/resources/facial-point-annotations/
4.從網絡攝像頭中捕獲幀
捕獲視頻幀並處理。我們既可以打開一個本地視頻(.mp4),也可以打開網絡攝像機(如果電腦有的話)來進行人臉關鍵點檢測。
5. 檢測人臉
我們對視頻的每一幀運行人臉檢測器。人臉檢測器的輸出是一個包含一個或多個矩形(rectangles)的容器(vector),即視頻幀中可能有一張或者多張人臉。
6. 運行人臉關鍵點檢測器
我們根據人臉矩形框截取原圖中的人臉ROI,再利用人臉關鍵點檢測器(facial landmark detector)對人臉ROI進行檢測。
對於每張臉我們獲得,我們可以獲得68個關鍵點,並將其存儲在點的容器中。因為視頻幀中可能有多張臉,所以我們應采用點的容器的容器。
7. 繪制人臉關鍵點
根據獲得關鍵點,我們可以在視頻幀上繪制出來並顯示。
代碼
本教程的代碼一共有兩個程序,分別為faceLandmarkDetection.cpp和drawLandmarks.hpp。
- faceLandmarkDetection.cpp實現視頻幀捕獲、人臉檢測、人臉關鍵點檢測;
- drawLandmarks.hpp實現人臉關鍵點繪制和多邊形線繪制。
faceLandmarkDetection.cpp和drawLandmarks.hpp都在src文件夾中
實驗結果

Reference
[1]Tutorial:https://www.learnopencv.com/facemark-facial-landmark-detection-using-opencv/
[2]Code:https://github.com/spmallick/learnopencv/tree/master/FacialLandmarkDetection
[3]Models:https://github.com/kurnianggoro/GSOC2017