人脸检测——STN

来源:互联网 发布:淘宝商品优惠券平台 编辑:程序博客网 时间:2024/05/29 17:46

本次介绍一篇来自微软的人脸检测文章:

《2016 ECCV Supervised Transformer Network for Efficient Face Detection》.

核心导读:

(1) 训练了一个端到端的级联网络;

(2) 引入了supervised transformer层,可以对候选窗口进行矫正以便后续更好地判断是否为人脸;

(3) 引入了Non-top K的抑制策略,在保证召回率的同时也不会有精度损失;

(4) 引入了ROI卷积策略,可以加速运算。

评价:

检测性能基本属于公开方法的第一梯队(ROC曲线约0.9),速度基本是第一梯队里面最快的,达到CPU上30FPS。(恕我直言,就本文方法的工作量而言,30FPS估计是一个很难复现的数字)

—————————— Network Architecture ——————————

先来一个overview:

STN-overview

由上图可以看出共包含2个阶段:

(1) 第一阶段主要是multi-task Region Proposal Network(RPN),该部分可以产生一些候选窗口以及人脸关键点。然后在一个局部邻域里使用Non-top K suppression来保留响应较大的前K个窗口。

(2) 第二阶段首先是根据关键点对候选区域进行矫正,从而消除旋转以及尺度变化带来的影响。然后送入R-CNN中,并利用拼接特征来做出最后的判断。

—— Multi-task RPN ——

Region Proposal Network(RPN)在我的之前的一篇博文 Faster R-CNN中已经有所介绍,只不过这里不再做bounding box 回归了,而是预测人脸关键点,所以称之为Multi-task。

这一部分的作用很简单:输入一张单尺度的图片,输出若干个可能的人脸区域以及相应的关键点坐标。

—— Supervised Transformer Layer ——

相似变换可以比较好的消除姿态和尺度带来的影响,从而帮助后续更好地判断输入窗口是否是人脸。

对于这个问题,一般都采用相似变换:即找到当前人脸关键点与手工指定标准模板之间变换关系,然后对图片作仿射变换。但是这种策略有两个缺点:一是手工模板可能不准而且固定死了;二是关键点标注是一个相对主观的过程,容易引入噪声。

于是,本文 不但要学关键点,还要学模板。具体是依托端到端的Loss约束和BP实现的。如下式:

STN-overview

其中,\(x_i,y_i\) 是检测到的关键点, \(\hat x_i,\hat y_i\)是模板坐标,\(m_*\) 表示对应的均值, \(i\) 表示第几个关键点, \(a,b\) 是相似变换参数。

这里只使用2个参数,是因为作者发现效果和一般的4个参数差不多,但求导更简单计算更简洁。由式(1)可以直接推导出 \(a,b\) 的最小方差解:

STN-overview

上式告诉我们,如果知道预测的关键点和关键点模板,我们就可以直接求出变换参数 \(a和b\), 然后就可以直接利用双线性差值来对图像进行矫正。

现在的问题是,预测的关键点和关键点模板都是我们需要学习的,因此就需要用Loss来约束用BP来学习。主要的约束来自两个部分:一是关键点的Ground Truth, 一是整个网络最后的分类Loss。有了Loss之后就按照链式法则,谁参与求谁导来进行BP和更新参数。

—— Non-top K suppression ——

在早先的R-CNN系列中,RPN后面会紧接着使用NMS来融合窗口。但是,保留的得分最高的窗口后续或者也会被拒绝掉,这有可能会降低召回率。但是,通过调整NMS阈值把大量窗口放过去又会增加计算量。

因此,作者采用Top-K的想法,每一个可能的人脸都保留得分最高的前K个候选窗口。

—— Multi-granularity feature combination ——

下表是RPN的网络结构图:

STN-overview

其实也很容易推导出感受野是85,而人脸的尺寸约为36~72pixels(后面会有说明),因此RPN的特征具有一定的环境上下文信息。 而后面的R-CNN特征则主要面向人脸内部,因此作者将这两个特征进行了拼接融合。

—————————— ROI Convolution ——————————

对于这里的神经网络而言,卷积部分的操作占据了90%的时间,所以作者就考虑该如何减少这部分的工作量。方法就是ROI Convolution, 即卷积操作只作用在可能是人脸的区域。

下面分小节介绍ROI Convolution的细节。

—— Cascade pre-filter ——

STN-overview

即上图,作者使用传统的比较简单的分类器快速的扫描一遍图片,得到可能的人脸区域。

这里的分类器借鉴了著名的Viola Jones人脸检测,但与后者相比弱分类器更多且训练数据更多。此外,这里使用的是boosted fern分类器(共1000个),因为fern特征比单个的Haar特征要好。

这里使用的是8bit的fern特征就,每一bit由下式计算:

STN-overview

这里的每一个fern特征都可以看做深度为8的完全二叉树(图像块为\(32\times 32\))。作者使用Real-Boost方法来训练这些树,每一次分裂的得分按照下式计算。

STN-overview

—— ROI-Mask ——

经过上一步对图像金字塔进行多尺度滑窗分类,我们可以得到很多候选窗口。作者这里对这些窗口进行分组,分组的原则是一组里面最大窗口是最小窗口的两倍。然后根据这些候选窗口便可以制作出一个group对应的ROI-Mask。

之所以分组,是因为每一个group都可以将图片缩小相应倍数,这样既可以降低工作量,也不会降低召回率。

—— Details of the ROI convolution ——

想要搞清楚这一部分,首先你得明白通常的卷积是怎样实现的:im2col,即将每一次滑窗取的数据拉成一个向量,然后将所有滑窗得到的结果拼接成一个大矩阵,最后通过矩阵乘法完成卷积操作。

具体如下图:

原图来自知乎回答:https://www.zhihu.com/question/28385679

STN-overview

于是在生成大矩阵的时候,我们就可以有选择性的只保留ROI区域构成的向量。这样矩阵变小,计算速度就变快了。

实际操作的时候,就是通过ROI-Mask来确定相应的位置是否会被计算。

STN-overview

—————————— Experiments ——————————

训练用的正样本是从FDDB、AFW等数据集直接生成的,而负样本则是从图像分割数据集中的非人区域随机采到的:

这里写图片描述

下图比较了NMS 和 Non Top-K,发现NMS比较容易引入较多的噪声。

这里写图片描述

还有很多实验就不再赘述了,整体来看速度CPU台式机约30fps,但在FDDB上的表现只能说中上。

1 0
原创粉丝点击