实时人脸68关键点检测 for Mac/iOS

背景

前段时间的人脸68关键点检测项目,需要移植到手机端,而且需要达到实时性,所以对算法进行了改进。大致的解决方案是,由于人脸检测耗时较大,所以搭配追踪、模板匹配、ROI区域内检测算法。用一幅图说明如下所示:
图片名称

Mac端需要先配置dlib依赖

直接使用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

real_dlib_muban_roi.cpp

功能:实时单人脸区域检测(从摄像头读取),及人脸68个关键点位置检测
实时帧率:23 fps
视频大小:320$\ast$240 标清
硬件平台:Intel(R) Core(TM) i5 @ 2.70GHz(Mac)
算法描述:
1、先进行Face Detect得到第一帧中人脸区域;
2、将该区域放大1.2倍,取为ROI区域;
3、在ROI区域中进行模板匹配(模板为前一帧中检测的人脸)
4、假如模板匹配算法得分较低,或者bbox超出了图像边界(即人脸出界),则在整张图中重新进行Face Detect
调用指令: ./real_dlib_muban_roi

Tips:笔者也尝试过在ROI区域中不执行模板匹配,而是直接执行Face Detect,但实际人脸静止情况下,检测到的人脸位置突变极大。折腾了两三天,不断运行代码,发现位置分布居然是有规律的,就在几个固定位置跳动。
突然意识到人脸检测器不是每个像素划窗的(🤦‍♂️),而是每20/40个像素滑,这样就不能在ROI区域中完美匹配到上次的位置。所以采取了模板匹配的方法,挨个像素滑动,这样检测位置便是正确的了。

video_Seeta_Track.cpp

功能:实时单人脸区域检测(从视频读取),及人脸68个关键点位置检测
实时帧率:25 fps
视频大小:320$\ast$240 标清
硬件平台:Intel(R) Core(TM) i5 @ 2.70GHz(Mac)
算法描述:追踪代码运行超过75次,或者追踪失败的情况下,调用Face Detect函数,重新进行人脸位置检测
调用指令: ./video_Seeta_Track
检测demo附图:图片名称

real_dlib.cpp / real_seeta.cpp

功能:多人脸区域检测(从摄像头读取),及多人脸68个关键点位置检测
实时帧率:8~10 fps
视频大小:320$\ast$240 标清
硬件平台:Intel(R) Core(TM) i5 @ 2.70GHz(Mac)
算法描述:
这两个算法,仅用了face detect,而detect在人脸关键点检测项目中,占据的时间较长,所以仅用检测,无法在mac上达到实时效果。
调用指令:./real_dlib./real_seeta.cpp

作为对比,分别对seetaface、dlib库进行了测试,发现两个face detect库耗时相当,seetaface人脸检测器,能检测到更小的人脸[40,40],人脸偏转一定角度(45度范围内),基本也能检出。而dlib的优势在于其稳定性,这个应该跟模型设计的划窗步长相关,见第二点’Tips’中的分析。

Pic_LandMark68.cpp

功能:多人脸区域检测(从图片读取),及多人脸68个关键点位置检测
算法描述:
采用Seetaface进行人脸检测,dlib进行后续的人脸关键点检测
调用指令:./build/Pic_LandMark68 1.png ./model/seeta_fd_frontal_v1.0.bin
检测demo附图:图片名称

Github代码连接

上述代码已经全部上传至github,目前仅实现了实时单人脸68关键点绘制,后面有时间话再完善多人关键点检测代码吧。

1
2
3
4
5
6
# clone该工程
cd Video_Face
mkdir build
cd build
cmake ..
make # 即可在build文件夹中生成可执行程序,调用方式如上

PS:dlibSeetaface的相关代码我也一起打包到工程中了,如果你自己编译安装了OpenCV,用上述CMakeLists便可以。如果你没有编译OpenCV,恰巧又是Mac平台,可以使用我编译好的OpenCV动态库,就在libs文件夹,OpenCV头文件在include文件夹。
github代码链接

Ref:

Face detect模块采用山世光老师开源的seetaface
Facial Landmark模块采用了dlib库