ubuntu14.04 + dlib19.2+【 C++ 】+Face Landmark Detection

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_17448289/article/details/56494998

1、安装dlib

dlib官网这里好像只有最新的dlib版本包,下载选项在左下角有个蓝色的按钮,写着download
这里写图片描述
博主用的还是目前最新的版本19.2,因为最新的dlib版本添加了一些新的人脸检测器,mmod+cnn算法,可以看看dlib的blog
这里写图片描述

2、 C++编译dlib

如果你是使用的C++,那么很简单,不用安装,直接按照官网的指示(也是在官网首页,左边栏目里有个how to compile,这个指示只是交你怎么快速使用dlib库中的examples).
从官网下载的dlib文件如下:
这里写图片描述

从dlib的根目录执行下面语句即可:

>>首先进入dlib的根目录下
>>再执行如下语句:
cd examples  #进入dlib下的examples文件夹
mkdir build  #新建build文件夹,存放cmake编译后的执行文件
cd build     #进入新建好的build文件夹
cmake ..     #cmake编译examples整个文件夹
cmake --build . --config Release  

最终,dlib/examples/build文件夹如下:

这里写图片描述

这只是编译好了examples下的dlib,要想编译整个dlib库,则执行以下代码即可:

>>进入dlib根目录下
mkdir build
cd build
cmake ..
make release=1 

3、 新建dlib工程

如果要自己建立工程,可以仿照dlib/examples/CMakeLists.txt,直接include(dlib/dlib/cmake)文件即可。
在其他地方新建工程(不要放dlib根目录下),首先新建一个文件夹放置工程,进入文件夹下,新建CMakeList.txt文件,可以采用vim指令编辑,如下参考如下代码:

vim CMakeList.txt

再将如下代码复制到CMakeList.txt中:

cmake_minimum_required(VERSION 2.8.4)  #版本最小为2.8.4

PROJECT(dlib_facedetector)   #设置工程名

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O2 -DDLIB_JPEG_SUPPORT")

IF(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything")
ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra")
ENDIF()

#INCLUDE OPENCV
FIND_PACKAGE(OpenCV REQUIRED)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
message(STATUS "Opencv include dir found at ${OpenCV_INCLUDE_DIRS}")

#包含头文件
INCLUDE_DIRECTORIES(/home/fr/fr/dlib) #dlib根目录地址

LINK_DIRECTORIES(/home/fr/fr/dlib/build/dlib/) #dlib编译后bulid下dlib地址

#生产类似于.exe的可执行文件
ADD_EXECUTABLE(dlib_detector dlib_test.cpp)
#链接库
TARGET_LINK_LIBRARIES(dlib_detector dlib ${OpenCV_LIBS})
#TARGET_LINK_LIBRARIES(dlib_detector libjpeg.so)

以上代码含OpenCV。
然后再自己vim test.cpp文件,编译执行,编译代码如下:

>>在自己建的工程文件夹下新建build文件夹
mkdir build
cd build
cmake ..
make -j8 #用make也行

编译正确后,在build文件夹中会出现dlib_detector:
这里写图片描述
这就是我们需要的可执行文件。
然后再执行.cpp文件,执行代码如下:

>>在build文件夹下继续执行一行代码即可显示结果:
./dlib_detector

注意:一旦我们修改过CMakeList.txt,我们需要将之前编译过的build文件删除掉,重新新建编译过一次

>>在工程目录下删除build文件夹,用rm -r指令
rm -r build  
mkdir build
cd build
cmake ..
make -j8

4、 dlib下examples中的Face Landmark Detection功能实现

按上述方法新建好了一个工程,将官网给的例程复制在我们的.cpp中。
该算法来源于One Millisecond Face Alignment with an Ensemble of Regression Trees by Vahid Kazemi and Josephine Sullivan, CVPR 2014

if (argc == 1)
        {
            cout << "Call this program like this:" << endl;
            cout << "./face_landmark_detection_ex shape_predictor_68_face_landmarks.dat faces/*.jpg" << endl;
            cout << "\nYou can get the shape_predictor_68_face_landmarks.dat file from:\n";
            cout << "http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2" << endl;
            return 0;
        }

首先要去官网下载面部特征点检测模型,接着进行解压。这是一个.bz2的压缩文件,不是.dat.bz2,不要搞错了。解压代码可以参考我之前的一篇博客:Ubuntu解压命令集

bunzip2 shape_predictor_68_face_landmarks.dat.bz2

注意,编译通过后运行.cpp根据程序内容,代码如下:

./dlib_detector ../shape_predictor_68_face_landmarks.dat ../*.jpg   #   ../*.jpg为实验图片地址  

需要将源码给出的./face_landmark_detection_ex换成我们自己生成的./dlib_detector可执行文件
运行最后结果:
这里写图片描述

小图为7个人脸被剪切出来的图,已对齐。大图为7个人脸的68个特征点定位图。
这里写图片描述

博主用自己的头像做了一次实验,结果如下:
这里写图片描述

我故意歪了一定角度的头,可以看到,小图中人脸已经矫正了。

关于人脸检测,对齐,识别等过程,可详见《人脸识别笔记:Deep Face Recognition》 ,写得很详细。

这里写图片描述
上图来源于:http://www.cnblogs.com/cv-pr/p/5438351.html

鸣谢

博主师兄 Michaelliu_dev 亲临指导,感谢师兄写的blog

猜你喜欢

转载自blog.csdn.net/qq_17448289/article/details/56494998