FaceBoxes: A CPU Real-time Face Detector with High Accuracy(论文解析+源码阅读)
论文:FaceBoxes: A CPU Real-time Face Detector with High Accuracy
代码地址:https://github.com/TropComplique/FaceBoxes-tensorflow
CPU上的高精度实时人脸检测器
综述
人脸识别是计算机视觉和模式识别的基础问题,过去几十年取得了长足进步,但是由于计算量较大,在CPU上的实时检测一直没有很好的被解决。面临的主要问题,一是人脸和背景的可变性都太大(种类太多),二是由于人脸的不同尺寸,使得搜索空间快速上升。
过去的主流方法,一种是基于手动构建的特征(hand-craft features),这种方法在CPU上速度尚可,但是面对种类繁多的图像变体精确度不足。另一种是基于CNN的方法,精确度足够,但是在CPU上过于耗时,很难达到实时效果。
本文受Faster-RCNN中RPN、SSD中多尺度技术的影响,提出了一种名为FaceBoxes的人脸检测器并且可以在CPU上达到实时检测的效果。网络结构是一个完整的CNN架构,可以实现端到端的训练,虽然网络结构轻量,但效果突出。
网络结构
faceboxes的三个spotlight:
- 设计RDCL层:加速faceboxes在cpu上至实时处理速度,有三个策略:
- 快速减少feature map尺度:在这个模块中,卷积的滑动步长是很大,属于比较稀疏的滑动卷积。其中conv1滑动步长为4,使得feature map缩小1/4,conv2使得滑动步长为2,使得feature map缩小1/2,pool1,pool2分别缩小1/2,最终feature map缩小1/32。这样就使得feature map减小的比较快,速度也就会提升。
- 选择合适的卷积核尺度:conv1、conv2、所有的pooling操作中,卷积核尺度为7 x 7、5 x 5、3 x 3,作者认为使用大尺度可以获取更大的感受野,进而获取更多的上下文信息;这个需要和1配合着理解,1快速减少了feature map尺度,丢失了很多信息,2通过更大的卷积核匹配上1中快速下降尺度造成的感受野与feature map尺度不匹配的问题,这样就达到了一个折中的效果;
- 使用C.Relu替代Relu,可以减少卷积核数目,但经过C.Relu后卷积核数目(对应的就是feature map changel数目)又可以翻倍;(了解crelu)
- 设计MSCL层:丰富感受野和离散化anchor至不同的feature map上,在实现原理上很简单:
- 丰富感受野,使用了googlenet的inception结构
2.1 :使用了googlenet的inception结构,参照文中fig1、fig2(b);
2.2 离散化anchor至不同的feature map:复用了SSD的做法,以处理人脸的大尺度变化,参照文中fig1;
3 anchor密集采样策略:对浅层feature map(如faceboxes中的inception3)检测的小尺度目标,其对应anchor(小目标对应的anchor一般预定义比较小,如32 x 32、64 x 64等),做更加密集的anchor采样,使得小目标anchor的采样密集与大目标采样密度一致,这样可以提升对小目标的召回率;-----CVPR2018 ZCC针对anchor密集采样给出了更合理的解释,提出了emo score,从理论上认证了采用anchor密集采样的优点:https://zhuanlan.zhihu.com/p/35856534