11

BlazeFace: 亚毫秒级的人脸检测器 (含代码)

 3 years ago
source link: https://bbs.cvmart.net/articles/1135
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

BlazeFace: 亚毫秒级的人脸检测器 (含代码)

1年前 ⋅ 3978 ⋅ 1 ⋅ 0

人脸检测是一个很常用的算法,可应用在许多业务中,可为应用提供人脸所在图片区域的坐标信息,一般用(xmin, ymin, xmax, ymax)的坐标格式进行描述。本文我们给大家介绍的BlazeFace是一个非常轻量级的人脸检测器,其在许多嵌入式设备中都可以达到超实时的效率,在一些性能较好的手机gpu中甚至可达亚毫秒级(文中在某果手机中进行了该实验)。笔者复现了该算法,在RK3399开发板中,使用阿里开源的MNN进行移植,CPU上的inference仅耗时10ms,性能相当强劲。下图为其在各个设备上的耗时,基于MNN的测试代码见GitHub

file
▲BlazeFace在各个平台的推理速度

下面我们来跟大家分析讨论一下该算法模型的设计。我打算从两个方面去给大家说说该算法,第一个是骨干网络的设计,第二个是检测回归器的设计。

骨干网络设计

首先我们先看看骨干网络,其骨干网络设计的出发点很简单,就是快准狠!第一,模型的表达能力要够用;其次,推理的速度要快。目前能同时满足需求的骨干网络有MobileNet系列、ShuffleNet系列、SqueezeNet系列等,由于BlazeFace是谷歌的工作,其大概率会继续MobileNet进行改进。

熟悉MobileNet工作的同学可能会比较清楚,如果你想加速MobileNet骨干网络的前传速度,我们可以通过调节depth multiplier的方式,这里我们假设输入的尺寸不变。我们做工程如果这么去设计无可厚非,回归到论文写作本身上看,这么做的贡献是不够的。我们先来看看论文作者的骨干网络的模块设计,如下图

file
▲左: single blaze, 右: double blaze

作者区别于MobileNet的模块设计,使用了更大感受野的depthwise convolution配合1x1卷积核来进行特征提速。因为作者在实验中发现,1x1卷积核的开销实际上要大于depthwise convolution。作者在较低层次的特征提速中,第一通过增加depthwise conv的感受野,用以增加特征的提取能力;第二降低1x1卷积核的输出通道数,用以提升推理速度,作者称其为single blaze。

在高层次的特征提取中,MobileNet的处理是对应增加1x1卷积核的通道数,depthwise conv亦同理。该方式虽然可较好的对高层次的特征进行提取,但会引入较大的计算量,MobileNet到最后几层的输出通道数达1024,这在嵌入式设备中是一个不小的计算量。更直接一点,大家肯定会想到的方法就是减少1x1的卷积输出通道数,但是又会造成模型表达能力的减弱。为了克服这个问题,作者沿用之前的思路,采取大感受野的depthwise conv配合小维度的1x1卷积核。不过作者这里做了一个小改动,采用了嵌套single blaze的方式来增加模型的表达能力。仔细观察上图可以发现,其在第一个single blaze的输出为24,而在第二个single blaze的输出为96。相比于MobileNet动则256、512、1024的1x1卷积核输出通道数,作者仅仅用了一个24和一个96的1x1卷积核就完成了操作。在相同的模型层数下,BlazeFace的网络大小要小于MobileNet很多,速度上也会快上不少。作者的实验中可以看出,在正脸检测的任务上略优于MobileNet SSD,同时速度是其约4倍,非常优秀。

检测回归器的设计

检测回归器的设计,作者主要还是参考了SSD的工作。由于该算法主要需处理的任务为正脸的检测,其anchor在大多数的情况下,使用比例为1.0的anchor即可以得到很好的效果。相比于传统的SSD通过级联6个尺度下的特征(本文作者实现的MSSD级联了4个尺度下的特征),BlazeFace仅仅级联了2个尺度的特征进行人脸检测,且在16x16特征下每个点仅采用2个anchor,在8x8特征下每个点采用6个anchor,在数据分布不复杂的情况下,既能解决问题,又可以提升网络推理的速度,一举两得。

file
▲左:MSSD网络结构,右:BlazeFace网络结构

最后

BlazeFace是一个非常高效的人脸检测器,其在近距离正脸场景下的人脸检测任务的表现中非常优异,既可以保证检测的准确性,又有很快的推理速度,非常适合部署于嵌入式设备中。后续我们会再写一篇文章,给大家介绍如何用tensorflow来实现BlazeFace,并借助MNN进行端上设备的网络推理加速。

参考
1、https://sites.google.com/view/perception-cv4arvr/blazeface

2、MNN:https://github.com/alibaba/MNN

3、MNN-BlazeFace: https://github.com/xindongzhang/MNN-APPLICATIONS/tree/master/applications/blazeface/tensorflow/jni


来源:糖心他爸@知乎专栏

推荐阅读:
SeetaFace2.0:中科视拓开源跨平台 C++ 商业人脸识别库
500 万面孔 | 15 个免费人脸识别数据集
不规则四边形坐标的标注工具(可用于车牌 / OCR / 人脸关键点)

file

△ 关注极市平台
获得最新CV干货

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK