笔者的最新私人博客网站经过一段时间的努力,已经初期建设完毕,csdn上的博文会逐渐转移过去~~ 欢迎访问呀~ |=传=送=门=> 多多洛的博客
2016年,中科院山世光老师开源了其研发的seetaface人脸识别引擎,使用VS编译,只能在window系统上运行,若想在Mac和Linux系统上使用,还需进行手动编译;随后又发布了seetaface2版本,这一版本的重大特性在于增加了对Linux和Android的支持,为这两个平台的研发人员提供了很大的便利。
笔者目前主要在Linux平台上进行人脸识别研究和学习,发现网络上目前几乎没有对seetaface2在Linux平台上的完整配置教程,经过笔者的多次试验,总结出在Linux Qt上的较为完整的配置教程(及配置过程中可能遇到的问题),记录如下。
先介绍一下笔者的开发环境:操作系统是Ubuntu 16.04,Qt版本是4.8.6,Qt Creator版本是4.4.0,OpenCV版本是2.4.9,g++/gcc 编译器的版本是5.4.0。
打开终端,输入以下命令进行安装:
# 更新软件列表
sudo apt-get update
# 安装依赖环境
sudo apt-get install libopenblas-dev libprotobuf-dev libssl-dev
官方的下载链接是:Seetaface2 For Linux
进入链接,依次下载以下四个文件(头文件、链接库文件、FaceCropper链接库文件、模型文件),如下图所示:
并将其放到本地相关目录里。
一般来说,第三方的头文件和链接库都统一放于“/usr/local/”目录下,从而便于管理和使用(之前配置OpenCV时,头文件和链接库也是放在这个目录下的)。所以笔者将头文件放在了“/usr/local/include/”
目录下(为了便于整理,新建一个子文件夹,叫seeta,将头文件放入),将链接库放在了“/usr/local/lib/”
目录下。笔者的配置步骤如下,可供参考:
在当前目录下打开终端,输入命令:
sudo mv seeta /usr/local/include/
sudo mv ./lib/lib*.so /usr/local/lib/
这样,在计算机上的配置就完毕了,接下来是在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来检验配置是否成功。
配置完成后,打开主程序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 landmarks
seeta::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切割出来并保存在本地。实验结果如下:
这是因为seetaface2使用了大量的C++11的新特性,所以编译时需要开启C++11的全部特性。解决方法如下:
g++ --version
后回车),记下自己的版本QMAKE_CXXFLAGS += -std=c++0x
,如果版本 >= 4.7,则添加QMAKE_CXXFLAGS += -std=c++11
,然后清理一下工程,重新Build即可(注意,一定要确认好版本,不同版本的配置是不通用的)。