SeetaFace開源引擎GitHub地址:https://github.com/seetaface/SeetaFaceEngine
SeetaFace2開源引擎GitHub地址:https://github.com/seetafaceengine/SeetaFace2
本文是使用VS2017+QT5.11.2+SeetaFace/SeetaFace2的簡單實現,涉及該開源引擎的概念較少。SeetaFace1.0例子項目地址:https://github.com/coididy/simple-example-with-SeetaFace1.0
SeetaFace2.0例子項目地址:https://github.com/coididy/simple-example-with-SeetaFace2.0
一、1.0版本和2.0版本簡介:
SeetaFace人臉識別引擎包括了搭建一套全自動人臉識別系統所需的三個核心模塊,即:人臉檢測模塊、面部關鍵點定位模塊,以及人臉特征提取與比對模塊。
- 1.0版本中與之對應的分別是:FaceDetection、FaceAlignment、FaceIdentification;
- 2.0版本中與之對應的分別是:FaceDetector、FaceLandmarker、FaceRecognizer,另外2.0版本還提供了兩個輔助模塊 FaceTracker 和 QualityAssessor用於人臉跟蹤和質量評估。除此之外,2.0版本還引入了一個FaceDataBase對象,用於管理注冊的人臉庫,方便進行1v1或者1vN的人臉比對。

二、SeetaFace1.0的編譯
1.0版本的SeetaFace編譯教程在百度很多,大部分都是可以直接參考的,此處不再贅述。需要VS2017版的dll、lib的可以到項目地址中下載。https://github.com/coididy/simple-example-with-SeetaFace1.0
三、SeetaFace2.0的編譯
該部分參考https://blog.csdn.net/sinat_33896833/article/details/100183581,使用CMake進行編譯。
需要VS2017版的dll、lib的可以到項目地址中下載。https://github.com/coididy/simple-example-with-SeetaFace2.0
1、下載安裝CMake
2、下載SeetaFace2.0源代碼:https://github.com/seetafaceengine/SeetaFace2
3、創建一個空文件夾,用於存儲編譯結果:如下創建了一個空的build文件夾

4、打開CMake gui,配置源代碼目錄和編譯輸出目錄如下:

5、點擊CMake左下角的Configure按鈕選擇需要編譯的項目版本,此處我選擇VS2017對應的版本:

6、如果出現找不到OpenCV的路徑,則手動配置如下路徑:

OpenCV路徑配置好之后,再次點擊Configure直到無錯誤為止。
7、點擊Generate按鈕生成解決方案
8、此時build目錄已經生成了SeetaFace2.0項目對應的VS2017 sln解決方案,雙擊即可打開。或者直接點擊CMake 上Generate按鈕右側的Open Project按鈕打開項目。
9、項目打開之后,選擇需要的debug或者release版本

10、右鍵解決方案中的ALL_BUILD,點擊生成,即可得到相應的dll和lib

11、dll、lib目錄如下:

四、VS2017+OpenCV+SeetaFace1.0項目屬性配置
關於SeetaFace1.0的動態鏈接庫等的配置可以參考SeetaFace2.0的配置,兩者基本沒區別。
五、VS2017+OpenCV+SeetaFace2.0項目屬性配置
以debug版本為例,VS2017的項目屬性配置如下:
1、將需要的頭文件從源代碼中提取出來,方便項目中使用。我的目錄如下:

2、將用到的lib文件提取出來,我的目錄如下:

3、項目屬性->VC++目錄->包含目錄:(配置OpenCV和SeetaFace頭文件目錄)

4、項目屬性->VC++目錄->庫目錄:

5、鏈接器->輸入->附加依賴項:

6、將用到的dll文件放置到debug版本生成的exe同級目錄下:

7、對於release版本,配置方法與debug一致,只需要把相應的dll、lib特換一下就行。(*-d.dll、*-d.lib是debug版的;*.dll、*.lib是release版的)
六、SeetaFace1.0實例
VS2017、QT、OpenCV、SeetaFace1.0版本的實例可以參考博客:https://blog.csdn.net/Young__Fan/article/details/81385612
本人也實現了一個簡單的例子,可以進行圖片中人臉的檢測、人臉特征點(5點)的定位顯示、兩張人臉的相似度顯示。
七、SeetaFace2.0實例
功能與SeetaFace1.0一致,項目地址如下:
下面簡單介紹下本人項目代碼。
1、首先拷貝一份SeetaFace2.0使用的model

2、簡單界面:

3、人臉檢測與人臉特征點定位模型導入與初始化

1 seeta::ModelSetting::Device device = seeta::ModelSetting::CPU; 2 //初始化模型,需要注意的是,模型文件同一時刻只能打開一次, 3 //並且加載模型時需要一定的時間, 4 //所以如果想多線程使用,需要對模型的導入進行加鎖處理 5 this->myMutex.lock(); 6 seeta::ModelSetting FD_model("./model/fd_2_00.dat", device, 0); 7 //關於81點定位之后,得到的人臉相似度結果不理想的原因猜想: 8 //圖片的尺寸太小,導致81點都擠在了一起,然后進行人臉比對時誤差變大 9 //seeta::ModelSetting FL_model("./model/pd_2_00_pts81.dat", device, 0); 10 seeta::ModelSetting FL_model("./model/pd_2_00_pts5.dat", device, 0); 11 this->myMutex.unlock(); 12 seeta::FaceDetector FD(FD_model); 13 seeta::FaceLandmarker FL(FL_model); 14 //設置人臉框的最小尺寸,不能小於20 15 FD.set(seeta::v2::FaceDetector::PROPERTY_MIN_FACE_SIZE, 20);
4、人臉比對模型的導入與初始化

1 seeta::FaceDatabase* FDB; 2 FDB = new seeta::FaceDatabase(seeta::ModelSetting("./model/fr_2_10.dat", seeta::ModelSetting::CPU, 0)); 3 //清除之前導入的人臉 4 this->FDB->Clear();
5、使用FaceRecognizer進行人臉比對的方法:

6、人臉檢測、人臉特征點提取、人臉比對的核心代碼如下:

1 //加載待檢測的圖片; 2 //mat是傳入的cv::Mat類型的圖片 3 seeta::cv::ImageData image = mat.clone(); 4 //進行人臉檢測,獲取所有的人臉信息; 5 //FD是FaceDetector對象的實例 6 //SeetaFaceInfoArray是SeetaFaceInfo數組 7 //該數組中存儲的是檢測出的人臉框 8 SeetaFaceInfoArray facesArr = FD.detect(image); 9 //對該臉進行5點或81點定位 10 //FL是FaceLandmarker對象實例 11 //vector<SeetaPointF>是二維特征點的數組 12 std::vector<SeetaPointF> currentFace81Points = FL.mark(image, facesArr.data[i].pos); 13 //Compare的四個參數分別為: 14 //SeetaImageData類型的圖片,SeetaPointF*類型的特征點數組 15 FDB->Compare(face1Data, face1Points.data(), face2Data, face2Points.data());
7、更加詳細的接口介紹,可以參考:
http://www.mooc.ai/course/683/learn?lessonid=3083#lesson/3083
8、更加舒適的閱讀地址:
http://605cce3e.wiz03.com/wapp/pages/view/share/s/1wncU-0FN4Pf2IrwrF1-bWB82VTqd93a34ZN2NlqgI3l423r