论文学习 AInnoFace:Accurate Face Detection for High Performance
论文地址
相关解读:
[论文笔记] 人脸检测方向系列论文
arxiv2019_AFD_HP
文章要点
RetinaNet + focal loss
UnitBox的IOU loss
SRN的 2-step bbox cls/reg
PyramidBox的data-anchor-sampling
S3FD的max-out label
multi-scale inference
模块简介
Focal Loss
目标检测分为one-stage/two-stage,focal loss的论文提出one-stage检测性能不如two-stage的原因之一是训练过程中的正、负、难、易样本不均,因此通过施加权重因子来平衡:
L
F
L
=
{
−
α
∗
(
1
−
p
)
γ
∗
l
o
g
(
p
)
,
y
=
1
−
(
1
−
α
)
∗
p
γ
∗
l
o
g
(
1
−
p
)
,
y
=
0
L_{FL}=\begin{cases} -\alpha*(1-p)^\gamma*log(p), & y=1 \\ -(1-\alpha)*p^\gamma*log(1-p), & y=0 \end{cases}
LFL={−α∗(1−p)γ∗log(p),−(1−α)∗pγ∗log(1−p),y=1y=0
参考FocalLoss你真的懂吗?,式中
α
\alpha
α用来平衡样本的正负不均(通常正样本少于负样本,值设置为>0.5,提高对正样本的关注度),
γ
\gamma
γ降低易分样本的损失贡献程度。最终形成对模型的关注度大小关系为:
正
难
>
负
难
>
正
易
>
负
易
正难>负难>正易>负易
正难>负难>正易>负易。
关于Focal Loss论文中提到的变种,可以见AmSoftmax作者的文章被忽略的Focal Loss变种。
Focal Loss论文中提及了RetinaNet网络结构是为了测试新损失函数性能,在结构上面没有专门进行优化,但这种结构由于具有多尺度检测能力,在end2end模型中有很多应用。本文也是以RetinaNet作为Baseline,使用ResNet-152作为主干网络,使用FPN模块输出6个分支。
IOU loss
人脸检测的结果包含人脸置信度(分类)、人脸位置(回归),前者使用交叉熵(改进后为Focal Loss),后者通常使用Smooth L1 Loss计算预测位置的数值误差。评估人脸检测框的指标一般使用IOU,这与Smooth L1并不等价,在训练时使损失值减小并不能保证预测框与GT往更重合的方向收敛。UnitBox论文中提出使用IOU Loss:
L
I
o
U
=
−
l
n
I
n
t
e
r
s
e
c
t
i
o
n
(
B
p
,
B
g
t
)
U
n
i
o
n
(
B
p
,
B
g
t
)
L_{IoU}=-ln\frac{Intersection(B_p,B_{gt})}{Union(B_p,B_{gt})}
LIoU=−lnUnion(Bp,Bgt)Intersection(Bp,Bgt)
但IOU Loss也存在无法优化两框不相交、相交时如何相交等问题,因此又出现了GIOU、DIOU、CIOU等方法。见
目标检测回归损失函数简介:SmoothL1/IoU/GIoU/DIoU/CIoU Loss
GIOU、DIOU、CIOU
SRN
RetinaNet中实现了多个尺度的输出,并用Focal Loss平衡的正负难易,但不同尺度中浅层较深层的检测更密集,因此对应的分支输出数量更多,携带信息更少,依然存在imbalance问题。
参考Selective Refinement Network,SRN在主干网络上输出6个分支,并且采用two-step策略,前3个分支实现小人脸检测,后3个分支实现人脸位置定位。
- classification的1st-step到2nd-step会通过阈值过滤部分目标,避免得到大量的fp;
- regression则认为前3层的小人脸信息较少,难以实现准确的位置定位,同时浅层网络的主要任务是检测小人脸,不应该在该阶段就强化模型对位置信息的提取。
最终输出可以划分为 Selective Two-step Classification(STC)、Selective Two-step Regression(STR),损失函数分别为:
L S T C ( { p i } , { q i } ) = 1 N s 1 ∑ i ∈ Ω L F L ( p i , l i ∗ ) + 1 N s 2 ∑ i ∈ Φ L F L ( q i , l i ∗ ) L S T R ( { x i } , { t i } ) = 1 N s 1 ∑ i ∈ Ψ [ l i ∗ = 1 ] L r ( x i , g i ∗ ) + 1 N s 2 ∑ i ∈ Φ [ l i ∗ = 1 ] L r ( t i , g i ∗ ) L_{STC}(\lbrace p_i \rbrace,\lbrace q_i \rbrace)=\frac{1}{N_{s_1}}\sum_{i\in\Omega}L_{FL}(p_i,l_i^*)+\frac{1}{N_{s_2}}\sum_{i\in\Phi}L_{FL}(q_i,l_i^*) \\ L_{STR}(\lbrace x_i \rbrace,\lbrace t_i \rbrace)=\frac{1}{N_{s_1}}\sum_{i\in\Psi}[l_i^*=1]L_r(x_i,g_i^*)+\frac{1}{N_{s_2}}\sum_{i\in\Phi}[l_i^*=1]L_r(t_i,g_i^*) LSTC({pi},{qi})=Ns11i∈Ω∑LFL(pi,li∗)+Ns21i∈Φ∑LFL(qi,li∗)LSTR({xi},{ti})=Ns11i∈Ψ∑[li∗=1]Lr(xi,gi∗)+Ns21i∈Φ∑[li∗=1]Lr(ti,gi∗)
data-anchor-sampling
数据增广方面使用随机扩充/裁剪/翻转/颜色抖动,并且以0.5的概率使用PyramidBox中的data-anchor-sampling进行图像处理。
主要过程:
- 从训练图像中选取一张人脸;
- 根据人脸按 2 i 2^i 2i确定尺度最接近的 i i i值大小;
- 从 { 0 , . . . , m i n ( 5 , i + 1 ) } \lbrace0,...,min(5,i+1)\rbrace {0,...,min(5,i+1)}中随机选取一个作为目标缩放尺度 S t a r g e t S_{target} Starget;
- 以 S t a r g e t S_{target} Starget为中心,从 ( S t a r g e t / 2 , S t a r g e t ∗ 2 ) (S_{target}/2,S_{target}*2) (Starget/2,Starget∗2)连续域中随机选取一个值作为真正的缩放尺度,并对整张图像进行缩放;
- 以缩放后图像中目标人脸为中心,截取一个640*640(依据网络的输入大小)的图像,如果超出边界以黑色像素填充。
max-out label
通过anchor密集采样可以召回小目标,但会存在大量误检。因此对每个anchor的每个类别输出多个置信度,再取最大值作为每个类别的置信度。相当于多增加一些分类器分析特征信息,增加分析的鲁棒性。
multi-scale inference
多尺度目标检测推理过程中的处理策略,将待检测的图像resize成多个尺度分别送入模型进行推理,将结果通过投票机制融合输出。
训练参数
参数名 | 设定值 |
---|---|
参数初始化 | xavier |
优化算法 | SGD |
momentum | 0.9 |
weight decay | 0.0001 |
batch size | 32 |
end_epoch | 130 |
学习率初始化策略 | 前5个epoch从0.0003125到0.01 |
学习率衰减策略 | 100、120分别除以10 |
Anchor Detail
IOU | 负样本 | 丢弃 | 正样本 |
---|---|---|---|
STC | 0 ~ 0.3 | 0.3 ~ 0.7 | > 0.7 |
STR | 0 ~ 0.4 | 0.4 ~ 0.5 | > 0.5 |