「seetaface2」中科院人脸识别引擎seetaface2在Linux Qt上的配置教程
筆者的最新私人博客網站經過一段時間的努力,已經初期建設完畢,csdn上的博文會逐漸轉移過去~~ 歡迎訪問呀~ |=傳=送=門=> 多多洛的博客
2016年,中科院山世光老師開源了其研發的seetaface人臉識別引擎,使用VS編譯,只能在window系統上運行,若想在Mac和Linux系統上使用,還需進行手動編譯;隨后又發布了seetaface2版本,這一版本的重大特性在于增加了對Linux和Android的支持,為這兩個平臺的研發人員提供了很大的便利。
筆者目前主要在Linux平臺上進行人臉識別研究和學習,發現網絡上目前幾乎沒有對seetaface2在Linux平臺上的完整配置教程,經過筆者的多次試驗,總結出在Linux Qt上的較為完整的配置教程(及配置過程中可能遇到的問題),記錄如下。
一、seetaface2在LInux上的配置
先介紹一下筆者的開發環境:操作系統是Ubuntu 16.04,Qt版本是4.8.6,Qt Creator版本是4.4.0,OpenCV版本是2.4.9,g++/gcc 編譯器的版本是5.4.0。
(一)配置前的準備
Step1 安裝依賴環境
打開終端,輸入以下命令進行安裝:
# 更新軟件列表 sudo apt-get update # 安裝依賴環境 sudo apt-get install libopenblas-dev libprotobuf-dev libssl-devStep2 下載seetaface2的源碼、模型文件
官方的下載鏈接是:Seetaface2 For Linux
進入鏈接,依次下載以下四個文件(頭文件、鏈接庫文件、FaceCropper鏈接庫文件、模型文件),如下圖所示:
并將其放到本地相關目錄里。
Step3 在計算機中進行配置
一般來說,第三方的頭文件和鏈接庫都統一放于“/usr/local/”目錄下,從而便于管理和使用(之前配置OpenCV時,頭文件和鏈接庫也是放在這個目錄下的)。所以筆者將頭文件放在了“/usr/local/include/” 目錄下(為了便于整理,新建一個子文件夾,叫seeta,將頭文件放入),將鏈接庫放在了“/usr/local/lib/” 目錄下。筆者的配置步驟如下,可供參考:
筆者先將所有庫文件統一整理到lib文件夾里,頭文件整理到seeta文件夾里,如下圖所示:
在當前目錄下打開終端,輸入命令:
sudo mv seeta /usr/local/include/ sudo mv ./lib/lib*.so /usr/local/lib/這樣,在計算機上的配置就完畢了,接下來是在Qt里的配置。
Step4 在Qt中進行配置
新建一個基于C++的Qt Console Application,Build System選擇Qmake,創建完成后打開pro文件,加入以下內容,對頭文件和庫文件進行配置:
INCLUDEPATH += /usr/local/include# OpenCV libs LIBS += -L/usr/local/lib \ -lopencv_core\ -lopencv_imgproc\ -lopencv_highgui\ -lopencv_ml\ -lopencv_video\ -lopencv_features2d\ -lopencv_calib3d\ -lopencv_objdetect\ -lopencv_contrib\ -lopencv_legacy\ -lopencv_flann # Seetaface2 libs LIBS += -L/usr/local/lib \ -lholiday -lSeetaFaceDetector200 -lSeetaFaceRecognizer200 \ -lSeetaPointDetector200 -lSeetaFaceCropper200(注:筆者的OpenCV頭文件也是在/usr/local/include下的,庫文件也是在/usr/local/lib下的,讀者可自身的路徑情況進行修改)
關于pro文件的配置:
筆者最初由于pro文件配置錯誤,導致Build工程的時候出現了很多問題,所以pro文件一定要書寫正確,不然會導致無法找到庫文件。
INCLUDEPATH += 是用于指定頭文件的目錄,可以用絕對或相對路徑;相對路徑中./可以省略;路徑中不允許出現空格。
LIBS += 是動態鏈接庫的配置語句,注意“+=”中間一定不能有空格,這是一個符號,一個整體;后接“-L”指定路徑,然后“-l”(小寫的L)指定庫的名稱,注意這里庫的名稱指的是庫文件名“lib”之后,“.so”之前的那段字,比如:
這個庫文件的文件名是“libSeetaPointDetector200.so”,那么對應的庫的名稱是“SeetaPointDetector200”。
LIBS += 可以寫在一行,也可以用 \ 斷行。
其他的注意事項可以參考這位博主的博文,總結得很不錯。
到這里就基本上配置完成了,接下來通過一個demo來檢驗配置是否成功。
二、seetaface2實例
配置完成后,打開主程序main.cpp,添加以下代碼:
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp>#include <seeta/FaceDetector2.h> #include <seeta/PointDetector2.h> #include <seeta/FaceCropper2.h> #include <seeta/Struct_cv.h>#define FD_MODEL "./bindata/SeetaFaceDetector2.0.ats" #define PD_MODEL "./bindata/SeetaPointDetector2.0.pts5.ats"int main() {seeta::FaceDetector2 FD(FD_MODEL);seeta::PointDetector2 PD(PD_MODEL);seeta::FaceCropper2 FC;cv::Mat mat = cv::imread("demo.png");seeta::cv::ImageData image = mat;auto face = FD.Detect(image);auto points = PD.Detect(image, *face);// crop face according to 5 landmarksseeta::cv::ImageData cropped_face = FC.Crop(image, points);cv::Mat cropped_face_mat = cropped_face;cv::imwrite("cropped_face.jpg", cropped_face_mat);return 0; }這是官方上提供的一個SeetaFace2 Cropper的例子,可以通過人臉的5個特征點將一幅圖像中的人臉ROI切割出來并保存在本地。實驗結果如下:
三、編譯時可能出現的問題(持續總結更新中…)
? 報錯:’nullptr’ was not declared in this scope
這是因為seetaface2使用了大量的C++11的新特性,所以編譯時需要開啟C++11的全部特性。解決方法如下:
總結
以上是生活随笔為你收集整理的「seetaface2」中科院人脸识别引擎seetaface2在Linux Qt上的配置教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【学术相关】年度重磅|从2020年中科院
- 下一篇: 简单实用触模式报警器