人脸检测论文FAN

tags: 人脸检测;face detection

论文题目《Face Attention Network: An Effective Face Detector for the Occluded Faces》
作者 王剑锋、袁野 2017
一个pytorch复现的代码地址:https://github.com/rainofmine/Face_Attention_Network

论文背景

本文旨在解决人脸检测中的人脸遮挡问题。按照常规方法放宽人脸检测阈值会在一定程度上提升检测的召回率,但是同时也会引入更多的“虚警”。如何在两者之间做到折中,而且不失速度是一个需要考量的问题。本文提出的FAN就是为了解决这个问题。

FAN检测结果示例

算法使用了一种anchor setting的机制,该机制是在不同的特征层之间引入了一个anchor attention模块,该模块可以使网络在训练过程中对遮挡的人脸进行更多的“关注”。

FAN

FAN使用的基础网络来自RetinaNet,而RetinaNet的网络结构如下:

RetinaNet网络结构

RetinaNet网络结构

这部分内容主要采用了Resnet + FPN的实现方式。
而本文中引入的anchor attention机制是在FPN的预测分支上进行了添加:

FAN网路结构

FAN网路结构

可以看到,FAN的改进在于添加了一个attention的子网络,所以重点就是这个attention子网络是如何提出来并实现的。

Attention Network

作者在设计attention网络的时候主要有三点考虑:

  1. 要在不同的特征层关注不同尺度的人脸。(多尺度)
  2. 重点关注有脸区域的特征而忽视没有脸的特征。(准确性)
  3. 必须得保证有大量的遮挡人脸来进行训练。(可行性)

而解决上面的三个问题,分别用了以下的几种方式:

  1. anchor设置方式

在FAN中,一共包含5个人脸检测层,而不同不同的特征层对应的人脸尺度也不相同,如果为每一层都设置一种人脸检测anchor,那么就可以检测5种不同尺度的人脸了,而且每种anchor设置的纵横比为1和1.5。之所以仅仅设置这两项,原因在于如果人脸是正脸,那么用一个方框将其框出来是没问题的;如果人脸是侧脸,那么高和宽的比例会更大,所以这里设置了这种形状的anchor。

另外一个就是,如何设置anchor的最小边长呢?作者通过对Wider Face数据集中的GroundTruth进行了统计分析发现,80%人脸的尺度是在16到406之间的。统计结果如下:

Wider Face人脸大小统计结果

Wider Face人脸大小统计图

根据这个结果,作者设置了不同特征层的anchor大小设置为16²到406²不等。而且,如果anchor与某个groundtruth之间的最大IOU大于0.5,则认为该anchor为正样本。如果最大的IOU小于0.4,则认为是背景。那些不满足这个条件的anchor,则在训练的时候不进行任何处理。

  1. attention函数

为了使模型更多的关注人脸,这里作者采用了另外一种比较特别的方式:类似于图像分割中的打标签方式,将GroundTruth的bbox整体内容作为attention的监督信息,并加入了attention loss做为训练监督。

attention模块的机制

attention模块

图中蓝色块最后一个输出为W*H*1,也就是最后一个特征图输出的是一个二分类结果,类似图像分割,输出图像的每个像素点表示该点是人脸的概率。
那该如何为每层分配标签呢?因为人脸的大小不一样,每层所检测的人脸尺度也不一样,因此,这里的做法是根据每层的anchor所匹配的GroundTruth大小,为不同层分配不同的标签。就是下图:

不同层的标签

不同特征层的标签

在计算出每个像素点是人脸的概率之后,将这些概率经过自然指数放大之后,与之前的featrure进行相加,这样一方面突出了人脸区域特征,另一方面保留了上下文信息。

下图是经过attention部分处理之后输出的中间结果,可以看到attenion对人脸区域进行了保留,忽略掉了非人脸区域。

attention模块输出结果

attention模块的输出
  1. 数据增强

在Wider Face数据集中仅有很小部分被遮挡的人脸有标注,因此这里作者采用了随机裁剪的方式,对训练数据进行了增强。裁剪方式为:随机裁剪方块,每个方块的大小为原始图像最短边的0.3~1倍。得到裁剪图像之后又通过随机翻转和色彩抖动进行了进一步增强。

损失函数

算法的损失函数如下:

损失函数

损失函数

其中k表示特征金字塔的每一层,这里为[3,7], A k A_k Ak表示在金字塔第 P k P_k Pk层生成的anchor,如果anchor内的样本为正样本,则 p i ∗ p_i^\ast pi为1,否则为0。 p i p_i pi为预测的分类标签。 t i t_i ti为预测的bbox坐标, t i ∗ t_i^\ast ti为GroundTruth标签。
分类损失函数 L c L_c Lc为focal loss损失:
F L = − ( 1 − p i ) − γ l o g ( p i ) FL=-(1-p_i)^{-\gamma}log(p_i) FL=(1pi)γlog(pi)
回归损失 L r L_r Lr为smooth L1损失:
s m o o t h L 1 ( x ) = { 0.5 x 2 , if |x|  ≤  1 ∣ x ∣ − 0.5 , otherwise smooth_{L_1}(x)=\begin{cases} 0.5x^2, & \text{if |x| $\leq$ 1} \\ |x|-0.5, &\text{otherwise} \end{cases} smoothL1(x)={0.5x2,x0.5,if |x|  1otherwise
N k c N_k^c Nkc为第 P k P_k Pk层所生成的anchor数量。 L a L_a La表示attention loss,这里用的是像素级的sigmoid交叉熵。 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2为平衡因子。

实验结果

作者提到了三种方法来完成遮挡人脸的检测,那么下面对每个部分进行了评估,评估结果如下:

  1. anchor设置机制

这里作者尝试了不同密度的anchor设置方式,对比如下:

anchor设置对比

不同密度的anchor设置对比

可以看到,anchor并不是设置的越密集越好,过多的anchor设置会引入更多的“噪声”,反而使性能下降。

  1. attention机制

在WiderFace数据集上,加入attention机制的效果如下:

attention机制在WiderFace数据集上的表现

attention机制在WiderFace数据集上的表现

而在MAFA数据集上,效果如下:

attention机制在MAFA数据集上的表现

attention机制在MAFA数据集上的表现
  1. 数据增强

使用数据增强效果对比如下:

数据增强效果对比

与其他算法对比

在WiderFace数据集上与其他算法对比:

在WiderFace数据集上与其他算法对比

在WiderFace数据集上与其他算法对比

在MAFA数据集上与其他算法对比:

在MAFA数据集上与其他算法对比

在MAFA数据集上与其他算法对比

FAN运行时间:

运行时间

运行时间

结论

算法很有创意的加入了图像分割的监督信息,从而能够大幅增加遮挡情况下人脸检测效果。最重要的是,作者的思路值得学习。

运行示例

处理结果示例

参考文献

Face Attention Network: An Effective Face Detector for the Occluded Faces

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值