dlib(C++)人脸关键点检测 for Linux/Mac

背景

上一篇章讲解了Seetaface在Mac端的编译与demo,但Seetaface关键点检测(facial landmark detection)只包含5个关键点,用于人脸姿态矫正完全没问题,但用于美颜、加挂件等场合,则无法施展拳脚。
 
笔者尝试了编译dlib C++ Library,这是一个开源的C++图像处理、机器学习库,可以作为opencv的一个良好补充,采用Seetaface Detect模块,检测人脸区域,接着将该区域(Rect)输入dlib的关键点检测模型,可以快速实现人脸68个关键点检测。
硬件环境:Intel(R) Core(TM) i5 @ 2.70GHz(mac),单张图片单个人脸,两兄弟默契配合,检测时间如下所示:

  • Seeta_人脸检测耗时:0.1840 秒
  • dlib_人脸关键点检测耗时:0.0023 秒

检测效果如图(原图来源于网络,侵删):
图片名称

dlib的依赖

dlib安装需要的依赖有openblas,opencv。可以直接使用brew安装。

1
2
brew install openblas
brew install opencv

X11是执行Unix程序的图形窗口环境。Mac OS X本身的程序是Aqua界面的,但是为了能够兼容unix和linux移植过来的程序(Mac OS X由BSD-UNIX修改而来),比如MatLab,就需要x11窗口环境。
 
运行dlib需要X11,但Mac目前没有自带X11,需要重新下载安装,下载地址
下载后直接安装,默认安装目录为/opt/X11,需要在/usr/loca/opt目录下创建软连接(最好使用绝对地址),创建命令如下,创建后重启Mac。

1
2
cd /usr/local/opt
ln -s /opt/X11 X11

编译dlib

1
2
3
4
5
6
7
git clone https://github.com/davisking/dlib.git  # 下载dlib
cd dlib/examples
mkdir build
cd build

cmake .. -DUSE_SSE4_INSTRUCTIONS=ON 进行配置
cmake --build . --config Release(此处都是demo,没必要全部进行build,需要用到那些build一下就好了)

运行一个build好的demo

1
2
3
cd dlib/examples/build/
wget http://dlib.net/files/shape_predictor_68_face_landmarks.dat.bz2 #下载face landmark模型,并解压文件
./webcam_face_pose_ex

至此,会出现X11窗口,打开Mac摄像头自动检测人脸并标注人脸的landmar。

dlib::Rect 与 opencv::Rect转换

dlib、opencv Rect结构体参数是不同的,所以需要进行一下转换

1
2
3
4
5
// cv 转 dlib
dlib::rectangle dlibrect;
dlibrect = dlib::rectangle((long)face_rect.tl().x, (long)face_rect.tl().y, (long)face_rect.br().x - 1, (long)face_rect.br().y - 1);
// dlib 转 cv,分别为左上、右下[x,y]坐标
faces[i].left(), faces[i].top(), faces[i].right()+1, faces[i].bottom()

dlib加载图像的两种方式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
array2d<rgb_pixel> cimg;  //dlib方式读取图像(从图像路径)
load_image(cimg, srcImagePath);
std::vector<full_object_detection> shapes;

array2d<bgr_pixel> cimg(gallery_img_color.rows, gallery_img_color.cols); //dlib方式读取图像(从cv::MAT)
for(int i=0; i < gallery_img_color.rows; i++)
{
for(int j=0; j < gallery_img_color.cols; j++)
{
cimg[i][j].blue = gallery_img_color.at< cv::Vec3b>(i,j)[0];
cimg[i][j].green= gallery_img_color.at< cv::Vec3b>(i,j)[1];
cimg[i][j].red = gallery_img_color.at< cv::Vec3b>(i,j)[2];
}
}

Ref:
📎:Mac下dlib安装