「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-dev
Step2 下载seetaface2的源码、模型文件

官方的下载链接是:Seetaface2 For Linux

进入链接,依次下载以下四个文件(头文件、链接库文件、FaceCropper链接库文件、模型文件),如下图所示:
「seetaface2」中科院人脸识别引擎seetaface2在Linux Qt上的配置教程_第1张图片
并将其放到本地相关目录里。

Step3 在计算机中进行配置

一般来说,第三方的头文件和链接库都统一放于“/usr/local/”目录下,从而便于管理和使用(之前配置OpenCV时,头文件和链接库也是放在这个目录下的)。所以笔者将头文件放在了“/usr/local/include/” 目录下(为了便于整理,新建一个子文件夹,叫seeta,将头文件放入),将链接库放在了“/usr/local/lib/” 目录下。笔者的配置步骤如下,可供参考:

  1. 笔者先将所有库文件统一整理到lib文件夹里,头文件整理到seeta文件夹里,如下图所示:
    「seetaface2」中科院人脸识别引擎seetaface2在Linux Qt上的配置教程_第2张图片

  2. 在当前目录下打开终端,输入命令:

    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”之前的那段字,比如:
「seetaface2」中科院人脸识别引擎seetaface2在Linux Qt上的配置教程_第3张图片
这个库文件的文件名是“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 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」中科院人脸识别引擎seetaface2在Linux Qt上的配置教程_第4张图片

三、编译时可能出现的问题(持续总结更新中…)

▶ 报错:’nullptr’ was not declared in this scope

这是因为seetaface2使用了大量的C++11的新特性,所以编译时需要开启C++11的全部特性。解决方法如下:

  1. 先确认自己的G++编译器的版本(打开终端,输入g++ --version 后回车),记下自己的版本
  2. 打开pro文件进行编辑,如果自己的g++版本 <4.7,那么添加如下配置指令:QMAKE_CXXFLAGS += -std=c++0x,如果版本 >= 4.7,则添加QMAKE_CXXFLAGS += -std=c++11,然后清理一下工程,重新Build即可(注意,一定要确认好版本,不同版本的配置是不通用的)。

你可能感兴趣的:(人脸识别,深度学习;)