前言
BlazeFace是2019年发表的文章了,在日新月异的CV界,已经是过眼云烟了。我2019年的时候曾经写过相关的文章,最近因为工作原因,需要重新阅读这篇文章,正好就随便写写。给大家做个参考。这是一个相当轻量化的网络,非常适合在边缘端实现。因此又重点来看看。
在写这个博客的过程中,加入了很多我哦自己的理解,仅供大家参考。
backbone
我曾将BlazeBlock模块组合来做了一个识别网络的backbone,发表了一篇文章。实际上深度学习的Backbone可以理解为图像中的特征提取。这个特征提取方法与传统CV算法不同的是,它是由大量的基本的非线性运算的串联和并联组合而成的,而不是传统CV算法里面的确定的函数关系。
BlazeFace用了以下的两类基本的图像特征计算单元。
我其实比较好奇的是,作者采用了5X5的卷积,而非常规网络中的3X3的网络,在我之前的博客中曾讨论过,用两个3X3的卷积替代一个5X5的网络具有更好的特征表达能力,参数更少。作者在文章中主要给出了解释:
This observation implies that increasing the kernel size of the depthwise part is relatively cheap. We employ 5×5 kernels in our model architecture bottlenecks, trading the kernel size increase for the decrease in the total amount of such bottlenecks required to reach a particular receptive field size
作者主要还是从iphone的计算效率上来看,采用了5X5的卷积。
Face Detection 网络
作者设计的网络框架适用于各种对象检测任务,但是在文章中针对手机的人脸检测,并且生成 6 个面部关键点坐标(用于眼睛中心、耳垂、嘴巴中心和鼻尖),使网络能够估计面部旋转(滚动角)。
特征提取
作者采用的特征提取网络包括了5个single BlazeBlocks和6个double BlazeBlocks。其特征提取网络结构如下图所示。
特征提取网络将图像从128X128下采样到8X8,而非1X1。我认为作者主要考虑了人脸识别类设备的应用场景,这一类场景的人脸图像相对都比较大,其尺度变化范围也不大,特征提取网络无需兼顾大范围内的尺度变换。
anchor策略
与SSD在不同的尺度上对目标位置进行回归不同,作者只在8X8的特征图上对目标的位置进行回归。为了兼顾不同尺度的人脸,作者做了一个折中,将anchor设置为三个不同的尺度,分别为8X8,4X4,2X2大小(相对于8X8特征图的分辨率)。作者实际上在每个尺度设置了2个anchor,这一点作者没有给予说明,个人推测可能是为了增加用于后期的真实目标框的筛选,或者说增加网络的复杂度,提高网络对目标框的回归能力。
后处理
在后处理过程中,作者将边界框的回归参数估计为重叠预测之间的加权平均值。它对原始 NMS 算法几乎没有额外的成本。在作者的面部检测任务,这种调整使准确度提高了 10%。
后记
BlazeBlockFace的很多细节是针对iohone的GPU做优化的,在计算效率和检测精度方面均有比较大的提升。在banckbone方面,全部用通道可分离卷积替代了3维卷积。在目标位置回归方面,只用了最后一个特征层进行预测,降低了数据存取的时间。