tags: 人脸检测;face detection
论文题目《Face Attention Network: An Effective Face Detector for the Occluded Faces》
作者 王剑锋、袁野 2017
一个pytorch复现的代码地址:https://github.com/rainofmine/Face_Attention_Network
论文背景
本文旨在解决人脸检测中的人脸遮挡问题。按照常规方法放宽人脸检测阈值会在一定程度上提升检测的召回率,但是同时也会引入更多的“虚警”。如何在两者之间做到折中,而且不失速度是一个需要考量的问题。本文提出的FAN就是为了解决这个问题。
算法使用了一种anchor setting的机制,该机制是在不同的特征层之间引入了一个anchor attention模块,该模块可以使网络在训练过程中对遮挡的人脸进行更多的“关注”。
FAN
FAN使用的基础网络来自RetinaNet,而RetinaNet的网络结构如下:
这部分内容主要采用了Resnet + FPN的实现方式。
而本文中引入的anchor attention机制是在FPN的预测分支上进行了添加:
可以看到,FAN的改进在于添加了一个attention的子网络,所以重点就是这个attention子网络是如何提出来并实现的。
Attention Network
作者在设计attention网络的时候主要有三点考虑:
- 要在不同的特征层关注不同尺度的人脸。(多尺度)
- 重点关注有脸区域的特征而忽视没有脸的特征。(准确性)
- 必须得保证有大量的遮挡人脸来进行训练。(可行性)
而解决上面的三个问题,分别用了以下的几种方式:
- anchor设置方式
在FAN中,一共包含5个人脸检测层,而不同不同的特征层对应的人脸尺度也不相同,如果为每一层都设置一种人脸检测anchor,那么就可以检测5种不同尺度的人脸了,而且每种anchor设置的纵横比为1和1.5。之所以仅仅设置这两项,原因在于如果人脸是正脸,那么用一个方框将其框出来是没问题的;如果人脸是侧脸,那么高和宽的比例会更大,所以这里设置了这种形状的anchor。
另外一个就是,如何设置anchor的最小边长呢?作者通过对Wider Face数据集中的GroundTruth进行了统计分析发现,80%人脸的尺度是在16到406之间的。统计结果如下:
根据这个结果,作者设置了不同特征层的anchor大小设置为16²到406²不等。而且,如果anchor与某个groundtruth之间的最大IOU大于0.5,则认为该anchor为正样本。如果最大的IOU小于0.4,则认为是背景。那些不满足这个条件的anchor,则在训练的时候不进行任何处理。
- attention函数
为了使模型更多的关注人脸,这里作者采用了另外一种比较特别的方式:类似于图像分割中的打标签方式,将GroundTruth的bbox整体内容作为attention的监督信息,并加入了attention loss做为训练监督。
图中蓝色块最后一个输出为W*H*1,也就是最后一个特征图输出的是一个二分类结果,类似图像分割,输出图像的每个像素点表示该点是人脸的概率。
那该如何为每层分配标签呢?因为人脸的大小不一样,每层所检测的人脸尺度也不一样,因此,这里的做法是根据每层的anchor所匹配的GroundTruth大小,为不同层分配不同的标签。就是下图:
在计算出每个像素点是人脸的概率之后,将这些概率经过自然指数放大之后,与之前的featrure进行相加,这样一方面突出了人脸区域特征,另一方面保留了上下文信息。
下图是经过attention部分处理之后输出的中间结果,可以看到attenion对人脸区域进行了保留,忽略掉了非人脸区域。
- 数据增强
在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=−(1−pi)−γ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,∣x∣−0.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为平衡因子。
实验结果
作者提到了三种方法来完成遮挡人脸的检测,那么下面对每个部分进行了评估,评估结果如下:
- anchor设置机制
这里作者尝试了不同密度的anchor设置方式,对比如下:
可以看到,anchor并不是设置的越密集越好,过多的anchor设置会引入更多的“噪声”,反而使性能下降。
- attention机制
在WiderFace数据集上,加入attention机制的效果如下:
而在MAFA数据集上,效果如下:
- 数据增强
使用数据增强效果对比如下:
与其他算法对比
在WiderFace数据集上与其他算法对比:
在MAFA数据集上与其他算法对比:
FAN运行时间:
结论
算法很有创意的加入了图像分割的监督信息,从而能够大幅增加遮挡情况下人脸检测效果。最重要的是,作者的思路值得学习。
参考文献
Face Attention Network: An Effective Face Detector for the Occluded Faces