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: A CPU Real-time Face Detector with High Accuracy(论文解析+源码阅读)

faceboxes的三个spotlight:

FaceBoxes: A CPU Real-time Face Detector with High Accuracy(论文解析+源码阅读) 

  • 设计RDCL层:加速faceboxes在cpu上至实时处理速度,有三个策略:

 

FaceBoxes: A CPU Real-time Face Detector with High Accuracy(论文解析+源码阅读) 

  1. 快速减少feature map尺度:在这个模块中,卷积的滑动步长是很大,属于比较稀疏的滑动卷积。其中conv1滑动步长为4,使得feature map缩小1/4,conv2使得滑动步长为2,使得feature map缩小1/2,pool1,pool2分别缩小1/2,最终feature map缩小1/32。这样就使得feature map减小的比较快,速度也就会提升。
  2. 选择合适的卷积核尺度:conv1、conv2、所有的pooling操作中,卷积核尺度为7 x 7、5 x 5、3 x 3,作者认为使用大尺度可以获取更大的感受野,进而获取更多的上下文信息;这个需要和1配合着理解,1快速减少了feature map尺度,丢失了很多信息,2通过更大的卷积核匹配上1中快速下降尺度造成的感受野与feature map尺度不匹配的问题,这样就达到了一个折中的效果;
  3. 使用C.Relu替代Relu,可以减少卷积核数目,但经过C.Relu后卷积核数目(对应的就是feature map changel数目)又可以翻倍;(了解crelu
  • 设计MSCL层:丰富感受野和离散化anchor至不同的feature map上,在实现原理上很简单:

 

  1. 丰富感受野,使用了googlenet的inception结构
  2.  

2.1 :使用了googlenet的inception结构,参照文中fig1、fig2(b);

2.2 离散化anchor至不同的feature map复用了SSD的做法,以处理人脸的大尺度变化,参照文中fig1;

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