OpenCV Facial Landmark Detection 人臉關鍵點檢測


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

測試環境

Note:感謝apple ^(oo)^蘭 童鞋的提醒,注意本教程一定需要OpenCV-Contrib的支持。即你的OpenCV環境需要使用CMake對OpenCV和OpenCV-Contrib進行編譯,生成動態鏈接庫。版本最好是3.4.1。

引言

人臉一般是有68個關鍵點,常用的人臉開源庫有Dlib,還有很多深度學習的方法。

OpenCV Facemark : Facial Landmark Detection

本教程僅利用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類似乎不是從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.cppdrawLandmarks.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

 

 

來源:https://github.com/amusi/opencv-facial-landmark-detection

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM