概要
文章名称:BlazeFace: Sub-millisecond Neural Face Detection on Mobile GPUs
文章来源:Google
文章作者:Valentin Bazarevsky Yury Kartynnik Andrey Vakunov
文章下载:https://arxiv.org/pdf/1907.05047.pdf
代码实现:https://github.com/tkat0/PyTorch_BlazeFace
概要说明:算法设计时,追求复杂度低和适合硬件加速(比如适合GPU运算等)是算法加速的两大方向。BlazeFace算法是一款专为移动GPU推理量身定制的轻量级且性能卓越的人脸检测器。BlazeFace 在主流的移动设备上以200-1000+ FPS的速度运行。这种超实时性能使其能够应用于任何对性能要求极高的增强现实应用中。
主要创新点
-
改进网络,增大感受野。基于Mobilenet v1/v2,改进网络,提出一种轻量级的特征提取网络(Single BlazeBlock and Double BlazeBlock)
-
特征提取网络设计
-
改进Anchor。基于SSD的Anchor设计,改进Anchor的梯度金字塔结构,使其更加适应于GPU运算,从而达到提速的目的。
-
使用blending策略(tie resolution)替换非极大抑制(NMS)。
1. 改进网络,增大感受野
在MobileNet架构中,使用5×5卷积核代替3×3卷积核,扩大感受野,而这种在深度可分离卷积中卷积核大小增大,而带来的计算量增加是有限的。另外为了促进感受野Size的传递,提出了double BlazeBlock 模块,如下图:
[PS]在深度可分离卷积(depthwise separable convolution)中,depthwise convolution部分(s2ck2 )与 pointwise convolution 部分(s2cd)计算量比值为(k2 : d),可见depthwise separable convolution计算量主要由d 决定。使用55卷积核代替33卷积核,不会带来太大开销,但是可以增大感受野(receptive field)。
[PS]不会带来太大开销:论文中以56×56×128输入为例,在16 bit 浮点运算下, 3×3 的depthwish需要0.07ms,pointwish需要0.3s,即便换成5×5,整个网络运算时间依旧在1ms量级内,并未增加大量计算开销。
[PS]右侧的Optional需要参考特征提取网络设计来看,当stride=2的时候,需要使用右侧分支来进行通道对齐。
2. 特征提取网络设计
针对前置摄像头人脸检测的特定需要,人脸尺度变化较小,定义更加轻量级的特征提取,输入图像128*128,含有5个Single BlazeBlock和6个double BlazeBlock。网络架构如下表:
[PS] 主干网络中,首先通过一个cov增加通道
3. 改进Anchor
修改的SSD目标检测anchor机制,使其更适于GPU计算。在8×8特征图尺寸处停止而无需进一步下采样(如下图2),将8×8,4×4和2×2分辨率中的每个像素的2个anchor替换为8×8的6个anchor。由于人脸长宽比的变化有限,因此作者们发现将anchor固定为1:1纵横比足以进行精确的面部检测。
[PS] 为什么要把2×4×4和2×2×2使用4×8×8来代替?
文中讲到,与CPU的运算不同,GPU的运算成本聚焦在特定的网络层运算上,对于处理深度的低分辨率隐层,CPU能够做的更好。但这里的低分辨率为什么设置成小于8×8,论文中没有详细说明,也没有给出实验证明。
这里笔者猜测,由于本文是重在移动端GPU运算的优化,太小的分辨率的cnn在gpu上的运算比较耗时,而且对于小于8×8的场景下的人脸检测必要性不大,所以将Anchor停留在8×8。
4. 使用blending策略(tie resolution)替换非极大抑制(NMS)
由于上述anchor机制中特征提取器未将分辨率降低到8×8以下,所以与给定对象重叠的anchor数量将会下降。在SSD的NMS中,只有一个胜出的anchor用于算法输出,这导致在视频中进行检测时,人脸框抖动明显。
为了降低这种效应,作者不再使用NMS,代之一种blending策略,以重叠框的加权平均值来估计边界框的回归参数。它几乎不会产生之前NMS部分的成本。作者称对于在视频中的面部检测任务,此调整导致准确度提高10%。
论文通过连续输入目标轻微偏移的图像来统计框抖动的数量以观察模型输出是如何被影响的。在应用这一策略后,抖动的数量大幅下降。
[PS]这里举个猜测的例子:
设a,b两个矩形框为人脸框的重叠框,经由网络输出a(bbox, score), b(bbox, score),并且a_score > b_score,IoU(a,b) > iou_nms_threhold
传统的NMS方法:b(score) 设置为0,bbox直接选取a(bbox)
Blending: (weigth_a * bbox_a) + (weight_b * bbox_b) = bbox
其中 weidth_a = a(score)/[a(score)+b(score)]
实验结果
下图是比较结果,精度高于MobileNetV2-SSD,在iPhone XS上的速度也从2.1毫秒降到0.6毫秒。
更多手机上的运算速度比较: