Dlib 人脸Landmark检测速度优化

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

本人知乎号:Ngxin

-----------------------------------------------------------------------------------------------

本博文旨在记录自己在做dlib人脸landmark检测时如何提高检测速度,以及在此过程中碰到的一些其他问题,若欠妥,欢迎交流指正,转载请注明出处,谢谢!

-----------------------------------------------------------------------------------------------

背景:

Dlib是建立在OpenCV基础上的一个计算机视觉库,很多方面在一定程度上优于OpenCV的效果,比如人脸检测,人脸关键点提取,其检测准确率比OpenCV更高,鲁棒性也更好,但是随之牺牲的是计算时间以及硬件资源。最近在做疲劳检测的过程中需要用到人脸68个关键点检测,首先想到的是OpenCV和Dlib,由于在以前的项目上见识到两者效果的差距,果断采用Dlib进行开发,但在进行的过程中也是碰到了各种问题,最主要的是特征点检测时视频会卡顿的非常严重,经分析,最终确定了是dlib检测的时候占用太多计算量,代码体现在官方文档中的

std::vector<rectangle> faces = detector(cimg);

detector会造成dlib检测速度过慢,导致调用摄像头进行关键点检测时会卡顿的非常严重,因此,提高检测速度刻不容缓。

软硬件环境:

笔记本:联想T470

系统环境:Ubuntu 16.04

cpu:英特尔i5-6300U

内存:8g

显卡:Nvidia-940

IDE:Clion

Dlib:19.10 OpenCV:3.3.1

解决:

1:首先自然的想到将RGB图片转换成灰度图片,减少计算量,dlib 官方提供的example采用的是Dlib格式的图片,如果你采用OpenCV格式的图片作为参数传递会提示参数不匹配的错误,代码传送门请点击下面的链接。

点击打开链接

关于Dlib的图片格式转换以及Dlib与OpenCV图片格式之间的互相转换,请参考我的另一篇博文 dlib与opencv图片转换。转换成功后再次运行,发现并没有什么卵用,速度依旧慢的跟蜗牛一般,然后寻思另一条解决道路,这便有了第二点。

2:由于第一点并没有解决问题,便仔细看了一下官方代码,请注意一下几句话,看不明白的请自行有道翻译。

Finally, note that the face detector is fastest when compiled with at least
    SSE2 instructions enabled.  So if you are using a PC with an Intel or AMD
    chip then you should enable at least SSE2 instructions.  If you are using
    cmake to compile this program you can enable them by using one of the
    following commands when you create the build project:
        cmake path_to_dlib_root/examples -DUSE_SSE2_INSTRUCTIONS=ON
        cmake path_to_dlib_root/examples -DUSE_SSE4_INSTRUCTIONS=ON
        cmake path_to_dlib_root/examples -DUSE_AVX_INSTRUCTIONS=ON
    This will set the appropriate compiler options for GCC, clang, Visual
    Studio, or the Intel compiler.  If you are using another compiler then you
    need to consult your compiler's manual to determine how to enable these
    instructions.  Note that AVX is the fastest but requires a CPU from at least
    2011.  SSE4 is the next fastest and is supported by most current machines.

看到这的时候,心里凉了一大截,都怪自己图方便,简单的几句代码就把dlib给装了,现在想想,做任何事都不能急啊,扎心。我第一次采用的源码编译安装Dlib,使用Dlib需要先安装OpenCV,关于这两个的安装请参考我的博文或请自行谷歌点击打开链接

我这里安装会与博文中有一点点小的区别,建议源码安装前请自己阅读源码中的README, 我第一次采用的安装语句如下:

cd dlib
mkdir build
make
make install

虽然能安装好Dlib,但是这样安装的后果就是我之所以写这篇博文的导火线。这样安装会导致Dlib进行关键点检测的时候速度异常的慢。

参考官方文档及如下网站(该网站可能需要 fan *qiang)点击打开链接

发现了问题的所在,总结如下:

Dlib原Paper指出 landmark detector能达到1000FPS的速度,但是你不可能达到这样的速度,因为在检测特征点之前首先需要检测人脸,这会花费至少几十毫秒(请各位大佬指正这句话翻译是否正确:takes a few 10s of milliseconds),但是使用一些优化措施能轻松的达到30FPS。

注意到
        cmake path_to_dlib_root/examples -DUSE_SSE2_INSTRUCTIONS=ON
        cmake path_to_dlib_root/examples -DUSE_SSE4_INSTRUCTIONS=ON
        cmake path_to_dlib_root/examples -DUSE_AVX_INSTRUCTIONS=ON

AVX模式是最快的一种编译方式,但是这可能只适合支持AVX的CPU电脑,查看电脑是否支持AVX,若支持请把该模式打开,查看是否支持,请在终端输入以下语句:

cat /proc/cpuinfo

找到flags部分,如果其中输出有AVX表明支持AVX模式,同时编译的时候建议开启SSE4。

卸载第一次装的Dlib后我采用以下的语句源码编译Dlib:

cd dlib
mkdir build
cmake .. -DCMAKE_INSTALL_PREFIX="你指定的dlib安装路径" -DUSE_AVX_INSTRUCTION=ON -DUSE_SSE4_INSTRUCTIONS=ON
cmake --build . --config Release --target install
sudo make install

config release是为了打开release模式,大部分默认的是debug模式,关于VS以及QT下如何将debug模式换成release请参考以下图片



在Clion下打开release: File->Settings->Build,Execution->CMake->Build type,将Debug模式换成Release模式即可。或者请参考:点击打开链接


需要注意的几点:

1:源码安装的时候请尽量使用--prefix,指定安装路径,这样你在卸载软件的时候只需删除路径下的安装包即可,移植的时候把安装包拷贝到另一台电脑即成功(前提是系统相同),这点是我在卸载第一次安装的Dlib的时候踩过的坑,参考网站上各种方法,比如在源码下使用make uninstall卸载也都无济于事,智能自己手动在原先默认安装的位置删除各种文件,还存在删错了的可能,所以强烈建议安装的时候指明安装路径,同时在安装前最好看一下readme文件。

2:安装DLib时可能提示你安装 BLAS library,按照提示安装即可。

*** No BLAS library found so using dlib's built in BLAS. However, if you ***
*** install an optimized BLAS such as OpenBLAS or the Intel MKL your code ***
*** will run faster. On Ubuntu you can install OpenBLAS by executing: ***
*** sudo apt-get install libopenblas-dev liblapack-dev ***
*** Or you can easily install OpenBLAS from source by downloading the ***
*** source tar file from http://www.openblas.net, extracting it, and ***
*** running: ***
*** make; sudo make install ***

后记:

此次使用Dlib学习到了很多经验,包括安装的一些注意事项,以及Dlib与OpenCV图片格式转换问题。按照以上思路整理后,在此运行代码,你会发现速度会变得非常和谐优雅,不会出现卡顿的现象,纯手打,以后有想到的再补充,同时欢迎指正!


参考链接:

dlib C++ Library - webcam_face_pose_ex.cpp

Speeding up Dlib's Facial Landmark Detector

What is cmake equivalent of 'configure --prefix=DIR && make all install '?

Ubuntu 16.04开启dlib对于AVX或者CUDA的支持

Ubuntu下dlib库编译安装 - actonton - 博客园

Compiling dlib on OS X

CLion 2016.3.2 EAP: CMake configurations, project templates and GCC6

猜你喜欢

转载自blog.csdn.net/hnsywangxin/article/details/80213501