#if 0
写这个系列的动机有两点:(第0是农药双排队友周末经常有事,没人一起玩,)第一,检测和跟踪之间有斩不断分不开的密切关系(官方CP),从应用角度和通用方法都非常相似相关,人脸检测问题可以为您提供更开阔的思路;第二是打算写自己正在做的深度学习相关内容,人脸检测系列为以后CNN经典模型分析,CNN压缩和加速等内容做个铺垫,证明CNN真的非常有用不难落地(当然理论欠缺、训练难、需要大数据是客观问题)。
虽然检测的博文千千万万,但我还是希望能从工程师的角度出发,能给您完全不一样的观点和感受。最后,专栏会持续更新,请放心关注!
#endif
背景介绍
人脸检测(Face Detection),就是给一幅图像,找出图像中的所有人脸位置,通常用一个矩形框框起来,输入是一幅图像img,输出是若干个包含人脸的矩形框位置(x,y,w,h),就像这样。
人脸检测对于我们人类非常容易,出于社会生活的需要,我们大脑中有专门的人脸检测模块,对人脸非常敏感,即使下面这样的简笔画,大脑也能轻易检测出人脸,和各自的表情。人脸检测非常重要,那到底有什么用呢?(2015的A Survey)
自动人脸检测是围绕自动人脸图像分析的所有应用的基础,包括但不限于:人脸识别和验证,监控场合的人脸跟踪,面部表情分析,面部属性识别(性别/年龄识别,颜值评估),面部光照调整和变形,面部形状重建,图像视频检索,数字相册的组织和演示。
人脸检测是所有现代基于视觉的人与电脑,和人与机器人,交互系统的初始步骤。
主流商业数码相机都内嵌人脸检测,辅助自动对焦。
很多社交网络如FaceBook,用人脸检测机制实现图像/人物标记。
常用数据库
人脸检测的测试数据库有很多,这里仅选择FDDB和WIDER FACE,这个两个数据库都有官方长期维护,各种算法都会提交结果进行比较,而且很多早期数据库目前都已经饱和,没有比较意义。
第一个是2010年非约束环境人脸检测数据库FDDB FDDB : Main:
Jain V, Learned-Miller E. Fddb: A benchmark for face detection in unconstrained settings [R]. Technical Report UM-CS-2010-009, University of Massachusetts, Amherst, 2010.
结果太多比较乱,先跳过。
WIDER FACE上人脸检测算法的水平,SOTA都在这里了:
包括2011~2017年的非深度学习人脸检测方法,还有github上著名项目,深圳大学于仕琪老师的libfacedetection速度最快,和中科院山世光老师的SeetaFaceEngine中的人脸检测部分召回率很高。注意非深度学习方法有时候给出的速度是正脸检测模型,多角度模型通常慢数倍。
简单特征级联系列,有VJ框架不同特征(Haar-like, LBP, SURF), 有二值特征JointCascade, Pico, NPD,这系列占比较大,速度优势非常明显,在CPU上单核单线程就能实时,甚至上百FPS;
DPM系列,有Zhu, Structured Models, vanilla DPM,性能中上但速度都比较慢,FastestDPM较快但也需要多线程才能实时;
通道特征(channel feature)系列,有HeadHuner, ACF-multiscale, ACF+和LDCF+,这一系列是非深度学习方法中性能最好的,仅ACF+和LDCF+在2000误检时超过了0.9,这两年非深度学习方法比较少,所以在WIDER FACE也只能看到ACF-multiscale和LDCF+。
深度学习的人脸检测算法比较:

包括2015~2017的深度学习人脸检测方法,最后是我优化MTCNN的快速版本fastMTCNN。深度学习方法一般不会有正脸和多角度人脸模型的说法,但测试多了多尺度测试,速度一般是但尺度测试对应的。
这里跳过了一些只有report的方法,其中有腾讯的两个结果,基于Faster R-CNN的Face R-CNN,和基于R-FCN的Face R-FCN,在FDDB和WIDER FACE都是顶尖水平,说明Faster R-CNN/R-FCN在人脸检测中表现也很不错,不过并没有做速度方面的优化,都极慢就不关注了。
级联CNN系列,有CNN Cascade, FaceCraft, MTNN, ICC-CNN,这一系列是深度学习方法中速度最快的,CPU都在10 FPS以上,级联CNN系列优化后轻松可以在CPU上实时,全面优化后的fastMTCNN甚至可以在ARM上跑起来;
Faster R-CNN系列,性能可以做到极高,但速度都很慢,甚至不能在GPU上实时;
SSD/RPN系列:有SSH和SFD,都是目前FDDB和WIDER FACE上的最高水平,性能水平与Faster R-CNN系列不相上下,同时也可以保持GPU实时速度,SFD的简化版FaceBoxes甚至可以CPU上实时,极有潜力上ARM。
以上就是截至到2017.12.31的人脸检测算法召回率和速度情况,如有疏漏,欢迎补充。
最后,CNN到底能做到多快呢?我们拿非深度学习中最快的libfacedetection中的multiview_reinforce版本,和深度学习中我优化的fastMTCNN(MTCNN的加速版)做速度对比:
测试环境:multiview_reinforce是Intel(R) Core(TM) i7-4770 CPU @ 3.4GHz;fastMTCNN是Intel(R) Core(TM) i3-6100 CPU @ 3.7GHz,算是持平吧,我们仅比较单核单线程的速度。
速度测试:multiview_reinforce是640x480(VGA), 最小人脸48,速度109.3 FPS;fastMTCNN是640x480(VGA), 最小人脸80,速度100 FPS以上,这里multiview_reinforce略快一点点。这一对比其实也是公平的,因为MTCNN中有三阶边框回归,实际检测的最小人脸在50以下(这一点如果您暂时不能理解,请根据最后部分实测)。
性能测试:multiview_reinforce在FDDB上2000误检是0.85,fastMTCNN在FDDB上2000误检是0.92。这里需要强调,fastMTCNN的性能测试和速度测试的配置,仅最小人脸大小不同(20和80),而multiview_reinforce的性能测试和速度测试,除了最小人脸大小不同(16和48)之外,scale也不同,分别是1.08和1.2,做过人脸检测的都知道,这个意味着,如果按照速度测试的配置,multiview_reinforce的召回率还要掉一大截,或者说,如果按照性能测试的配置,multiview_reinforce的速度会慢很多。
当然libfacedetection一直在更新,这里对比的仅是2014年提交FDDB的召回率,用于证明深度学习在很高召回率的情况下,也可以做到实时。
深度学习的人脸检测算法实测
合理怀疑,fastMTCNN真的能跑这么快吗?如果您有兴趣,可以先测试一下MTCNN,看看优化之前有多快:
AlphaQi同学实现的C++版MTCNN-light: AlphaQi/MTCNN-light (不是我写的)
代码有几处小错误需要修改,按照Issue 10 你好,这两个地方可能导致错误 · Issue #10 · AlphaQi/MTCNN-light,稍微修改一下就可以测试了。
另一个错误是mtcnn.cpp中596行,第三阶不应该再矫正为正方形:
refineAndSquareBbox(thirdBbox_, image.rows, image.cols);另外,MTCNN-light的画框代码是写在检测里面的,这部分不应该计入检测时间。
C++版MTCNN-light只需要OpenBLAS和OpenCV就可以跑了,不需要其他第三方库,用于测试性能完全够用了,但请不要用于实际项目和产品中,因为代码问题较多,具体实现以kaipeng的MATLAB代码为准。动手实测,一起来感受一下吧:
输入VGA图像,最小人脸设置80,简单背景单人脸速度应该在40 fps以上。但复杂背景或人脸数量增加时,速度会严重下降,这就是级联算法的通病,在MTCNN中尤为严重,以后会详细分析成因和解决办法;
设置最小人脸80,实际检测到的最小人脸理论上可以到达52甚至更小。这是由于MTCNN是分类加回归的多任务方法(深度学习都是),回归机制可以检测到最大IoU = 0.65的更大人脸和最小IoU = 0.65更小人脸,这一点算是深度学习的天然优势吧,传统方法做不到。
END
以上内容,错误肯定是有的,而且是难免的,欢迎所有讲道理的批评指正。





































苏公安网备 32011402010933号