BlazeFace: Sub-millisecond Neural Face Detection on Mobile GPUs, 2019
文章目录
自说自话:因为本文提到的各种方法和手段,目的都是为了 在移动端快速地检测人脸(不包含非常细致的关键点,只包含 6 个方便确定人脸的旋转等)。所以相比其他物体检测任务来说,它的任务 相对更简单(而且前后摄像头还分开做了两个模型), 砍掉部分操作仍然能够满足人脸检测任务。
Abstract
- face detector 亚毫秒级检测速度,检测结果对后续的其他任务如 2D/3D 面部关键点检测、面部特征、表情分类、面部图像分割。
- 一个轻量的特征提取网络,灵感来源于 MobileNet V1/V2;
- 一个 GPU 友好的 anchor 机制,来自于对 SSD 的修改;
- 一个类似 NMS 作用的策略机制,去重。
Introduction
BlazeFace 修改自 SSD,贡献在于:
- 论速度:结构类似 MobileNet V1/V2,GPU 友好的 anchor 机制。
- 论质量:去重效果能与 NMS 齐平。
Face detection for AR pipelines
- 针对前后置摄像头提供不同的模型,以适应两种摄像头的焦距以及场景内物体的尺度。
- 提供 6 个面部特征点,来应对面部旋转的情况,这样就不用仅仅输出横平竖直的矩形框。
Model architecture and design
Enlarging the receptive field sizes
现在大家都比较喜欢用小的卷积核,比如能用 3 × 3,坚决不用 5 × 5。小卷积核加上 MobileNet 的卷积分离思想,能够很大程度上降低运算量。但是在 MobileNet 基础上,还能再精进一些吗?作者发现,在实际计算中,相同设备,对 56 × 56 × 128 的 tensor 运算 3 × 3 深度分离卷积需要 0.07 ms,而后面的 1 × 1 卷积从 128 channel 到 128 channel 需要 0.3 ms,慢了 4 倍。因为有一些读取的固定时间消耗,所以这个时间差还不足够真实反应两种计算中的资源消耗对比(也就是说,去除一些固定消耗,差异会更明显)。这个发现说明了什么呢?说明增加卷积核对应的运算相对更“便宜”,那么能不能通过增大卷积核,减少 bottleneck 来达到同样的模型效果(计算就减少了),此处对应图 1 左图。
MobileNet V2 中的 bottleneck 包含深度的扩增 expansion 和 深度的压缩 projection,中间有个非线性变换。为了能够在中间能少一些 channel,本文将 expansion 和 projection 互换位置了,这样残差连接能接到 expansion 之后的阶段。然后因为有深度分离卷积,计算开销允许叠加两个 block 在一起作为 double BlazeBlock。这部分对应图 1 右图,可以看到从上到下先进行通道压缩 projection,再进行通道扩张 expansion,残差连接在 expansion 之后。(其实 MobileNet 是特意设计 expansion 和 projection 的顺序的,为了减少 relu 在较为靠前的位置“损伤”特征,但是这里是因为有 5 × 5 卷积核了,所以再次颠倒过来比较节省运算)。
Feature extractor
拿前置摄像头来讲,因为涉及到的场景中物体的尺度范围较小,输入 128 × 128,5 个 BlazeBlock,6 个 double BlazeBlock。通道最多有 96 个,分辨率最小是 8 × 8 (这点就不像 SSD 等其他很多特征提取了,只到 8 × 8,并没有再降低)。
Anchor scheme
有实验发现,特征图分辨率并没有很大必要降到非常低比如 1 × 1 的地步。而且 GPU 计算时需要可观的时间成本来为每个 layer 的计算做资源分配和派遣,所以如果能减少产生 anchor 的层数,也就能提升运算速度了。这部分参照下图 2,可以看到本文相对 SSD,放弃过小的分辨率特征,在 16 × 16 和 8 × 8 上产生大约同量级的 anchor 用于检测。
Post-processing
关于去重,因为前面最低的分辨率采用只到 8 × 8,所以产生了更多的重叠结果。而 NMS 的策略一般只产生一个 “正确答案”,实际应用中,检测结果会出现一些人眼可见的跳动。为了尽量减少这种现象,我们用混合策略取代了 NMS,该策略将边界框的回归参数估计为重叠预测之间的加权平均值。相比 NMS 算法,这个策略几乎没有额外的成本。