在项目间隙,思考下如何把经常使用的人脸检测方法加速快一些。我平常主要是用opencv和dlib这两个库做人脸相关的功能。
我自己没有从零开始写算法库的机会,所以很多思路只是了解一下,没有机会实践。
于仕琪是深圳大学的老师,写了一个很快很准的人脸检测算法库,以二进制形式免费发布,地址在:https://github.com/ShiqiYu/libfacedetection。
发布的二进制文件除了x86版本还有ARM版本,还算良心。
《人脸检测背景介绍和发展现状》中提供了一个图比较传统机器学习人脸检测算法的图表,可以看到于仕琪的libfacedetection站在了速度的巅峰上,准确度也处于第一梯队。
于仕琪写了一篇文章《怎么把人脸检测的速度做到极致》介绍他的加速思路。这里要说一下,他是从头开始构建人脸检测算法的,所以优化的方式比较灵活。对于使用现成算法的人来说,权当参考。
他的一些trick如下:
排除了计算量大的haar和HOG,推荐了LBP特征。但是他也表示了LBP特征的一些不足。从他的个人网站上透露的信息,他的这个检测器使用的特征确实是LBP。
Feature: LBP
Classifier: Gentle AdaBoost
Positives samples: ~150,000
人脸样本越单一,训练出的分类器的速度会越快,但正确检测率低;如果样本复杂,速度变慢但检测率升高。如何平衡样本的复杂性和检测速度,需要针对具体应用斟酌。
要准确刻画非人脸图像,负样本的规模一定要大,负样本的内容一定要多样化!
消灭重复计算、展开循环。
这两项属于代码级的优化,与检测器什么的关系不大。
Boosting算法可以运行在GPU上,并获得加速,但GPU加速Boosting优势并没有你想象的明显。
选择了AdaBoost这种Boosting方法。Boosting方法的天然优势就是快。
Boosting方法选出的多个弱特征,在图像上往往也不相邻,同样是低效的非连续内存的读写,这是Boosting类方法的一个缺点。
上面的优化思路大部分都是通用的程序性能优化思路。只有特征选择和分类器选择是检测强相关的。
下面的思路来自《Speeding up Dlib’s Facial Landmark Detector》。作者总结了很多工程化的加速经验。
Release模式会开启很多编译优化选项。
使用cmake配置的时候,可以开启SSE4或AVX指令加速。AVX相对SSE4还要更快一点。
dlib的人脸检测时间要长于关键点检测,所以加速人脸检测阶段可以加速应用。适当降低图片的分辨率可以加速人脸检测的速度,因为需要检测的人脸大小的范围减少了(虽然会丢失部分很小的人脸)。
视频中连续的两帧之间脸部移动很小,因此没必要每一帧都重新检测人脸的位置,可以使用前两帧的检测位置。
当然也可以使用卡尔曼滤波跟踪人脸的位置,不过这有点杀鸡用牛刀的感觉,对于普通对着人脸的摄像头,一般用前两帧的位置就够了。
显示也要费IO时间的,显示的分辨率越低,越能节省时间。
dlib画关键点和线段的效率不如用opencv手动实现的快。
根据作者的总结,使用以上手段,可以用dlib以129fps的速度处理视频文件。
具体url请点击参考资料里的《Improve face detection speed》
其实大家都嫌dlib的人脸检测慢,所以大家讨论了不少好思路。我来总结下
比如mtcnn。
还有一篇论文讲述使用级联神经网络加速人脸检测。
I.A. Kalinovskiy, V.G. Spitsyn,
Compact Convolutional Neural Network Cascade for Face Detection,
http://arxiv.org/abs/1508.01292
这篇论文github上有不少实现:
https://github.com/Bkmz21/CompactCNNCascade
https://github.com/anson0910/CNN_face_detection
修改dlib源码,使用TBB加速:
https://github.com/TadasBaltrusaitis/CLM-framework/blob/master/lib/3rdParty/dlib/include/dlib/image_processing/scan_fhog_pyramid.h
第一帧图片先进行普通的全图搜索,如果找到了人脸那就在这个boundingBox两倍大的区域内再次调用检测器检测,如果检测不到就使用模板匹配的方法检测,2s内检测不到就重置算法。
github上有代码实现:https://github.com/mc-jesus/face_detect_n_track
其实完全可以手动在前一帧检测的范围附近把图片裁剪出来检测以加快速度。
传统机器学习:https://github.com/FaceDetect/jointCascade_py
深度学习之FaceBoxes: A CPU Real-time Face Detector with High Accuracy https://github.com/zeusees/FaceBoxes
深度学习之MTCNN-Tensorflow:https://github.com/AITTSMD/MTCNN-Tensorflow
于仕琪:怎么把人脸检测的速度做到极致
openface issus:Improve face detection speed
Speeding up Dlib’s Facial Landmark Detector
dlib官方文档:Why is dlib slow?
Dlib 人脸Landmark检测速度优化
Dlib人脸特征点检测(速度优化)
关于高性能计算的知识记录汇总
Intel Thread Building Blocks (TBB) 入门篇
人脸检测背景介绍和发展现状
ccv开源库——行人检测