论文名称:Feature Selective Anchor-Free Module for Single-Shot Object Detection
论文地址:https://arxiv.org/pdf/1903.00621.pdf
为了能够利用更多的语义特征,目前很多目标检测的方式中都使用了特征金字塔或者多层级特征。而且目前,无论是one-stage还是two-stage的目标检测方法,大都使用了anchor机制。根据启发式方法认为在高层级特征图中有更多的语义特征来检测大尺度物体,在底层级特征图中,有更多的细节信息来检测小尺度目标。anchor机制的使用也更好的解决了实例的尺度变化。目前的检测方式大都涉及到这两种概念。然而作者认为这样的设计存在两个问题:1)启发式的特征选择; 2)基于(IoU)overlap的anchor取样。根据IoU的方式,每个实例会根据IoU的大小分配给最相近(即重叠部分最大)的anchor,同时根据人为规则(例如box size),特定层级的特征图对应特定尺度的anchors。作者也举例说明了这个问题,如下图:
如上图,假设有这三种不同尺度的车的实例,可能存在5050和4040的两个实例在同一层级,6060的在另一层级。作者认为这种基于启发式算法的anchor匹配机制并不是最优化的。于是作者提出了一种不基于anchor的特征选择方式:Feature Selective Anchor-Free Module(FSAF)。这种方式解决了上诉问题,可以更好的更自由地让不同实例来选择特征层级,而不受限于anchors。论文中提到这个模型可以很方便的应用到特征金字塔的one-stage的检测架构中,论文中的实现就是在RetinaNet中。
作者提出的FSAF模型也是很简单的,包含了两个子网络:分类网络与位置回归网络。网络结构也很简单。分类子网络由一个33的卷积以及sigmoid组成,最后会输出K个分类值(有K个类);回归子网络也由一个3*3的卷积以及ReLU组成,最后会输出特征图中实例的位置偏置。如下图。
接下来看看损失函数的定义。 假设给定一个实例 b,我们知道了它的类别标签 k以及ground-truth [x, y, w, h],其中(x,y)为中心坐标,w、h分别为宽和长。再把这个实例匹配到特征层级
P
l
Pl
Pl, 同时定义实例 b在特征层级
P
l
Pl
Pl上的映射为
b
p
l
=
[
x
p
l
,
y
p
l
,
w
p
l
,
h
p
l
]
b_p^l = [x_p^l, y_p^l, w_p^l, h_p^l]
bpl=[xpl,ypl,wpl,hpl], 且我们可以假设
b
p
l
=
b
/
2
l
b_p^l = b / 2^l
bpl=b/2l。再定义在
b
p
l
b_p^l
bpl中有效区域box为
b
e
l
=
[
x
e
l
,
y
e
l
,
w
e
l
,
h
e
l
]
b_e^l = [x_e^l, y_e^l, w_e^l, h_e^l]
bel=[xel,yel,wel,hel], 以及无效区域
b
i
l
=
[
x
i
l
,
y
i
l
,
w
i
l
,
h
i
l
]
b_i^l = [x_i^l, y_i^l, w_i^l, h_i^l]
bil=[xil,yil,wil,hil],其中
x
p
l
=
x
e
l
=
x
i
l
x_p^l = x_e^l = x_i^l
xpl=xel=xil,
y
p
l
=
y
e
l
=
y
i
l
y_p^l = y_e^l = y_i^l
ypl=yel=yil,
w
e
l
=
ϵ
e
w
p
l
w_e^l = \epsilon_e w_p^l
wel=ϵewpl,
w
i
l
=
ϵ
i
w
p
l
w_i^l = \epsilon_i w_p^l
wil=ϵiwpl,
h
e
l
=
ϵ
e
h
p
l
h_e^l = \epsilon_e h_p^l
hel=ϵehpl,
h
i
l
=
ϵ
i
h
p
l
h_i^l = \epsilon_i h_p^l
hil=ϵihpl,我们设
ϵ
e
=
0.2
\epsilon_e = 0.2
ϵe=0.2,
ϵ
i
=
0.5
\epsilon_i = 0.5
ϵi=0.5,结合一个车的实例来解释损失,如下图Figure 5:
分类损失
上图中白色部分为有效区域:
b
e
l
b_e^l
bel,这个白色区域被’1’填补,而灰色区域:
b
i
l
−
b
e
l
b_i^l - b_e^l
bil−bel作为忽略区域,而黑色区域作为无效区域被’0’填补,表明没有目标物体。同时,作者还是利用了Focal loss进行监督,其中的超参数
α
\alpha
α=0.25以及
γ
\gamma
γ=2.0.最后总的分类损失为所有的非忽略区域的Focal loss分类损失总和,而且利用所有有效区域的像素总和进行了归一化。
回归损失
回归输出的是与分类无关的4个偏置映射,在
b
p
l
b_p^l
bpl上,对于每一个像素点(i,j)都有对应向量组
d
i
,
j
l
d_{i,j}^l
di,jl = [
d
t
l
d_t^l
dtl,
d
l
l
d_l^l
dll,
d
b
l
d_b^l
dbl,
d
r
l
d_r^l
drl]分别表示这个像素点到在
b
p
l
b_p^l
bpl边界的上,左,下, 右的距离。同时后续也做了一个正则化处理:
d
i
,
j
l
d_{i,j}^l
di,jl / S,S是个正则化常量设为4.0,最后使用了IoU loss,最后总的anchor-free branches损失是所有有效区域的IoU所示之和。
在inference的时候,直接对分类输出以及回归输出的预测boxes进行decode。对于每一个像素点(i,j),假设预测的偏置为[
o
^
t
i
,
j
\hat{o}_{t_{i,j}}
o^ti,j,
o
^
l
i
,
j
\hat{o}_{l_{i,j}}
o^li,j,
o
^
b
i
,
j
\hat{o}_{b_{i,j}}
o^bi,j,
o
^
r
i
,
j
\hat{o}_{r_{i,j}}
o^ri,j], 对应预测的距离为[
S
o
^
t
i
,
j
S\hat{o}_{t_{i,j}}
So^ti,j,
S
o
^
l
i
,
j
S\hat{o}_{l_{i,j}}
So^li,j,
S
o
^
b
i
,
j
S\hat{o}_{b_{i,j}}
So^bi,j,
S
o
^
r
i
,
j
S\hat{o}_{r_{i,j}}
So^ri,j],然后再得出坐上角与右下角( i -
S
o
^
t
i
,
j
S\hat{o}_{t_{i,j}}
So^ti,j, j -
S
o
^
l
i
,
j
S\hat{o}_{l_{i,j}}
So^li,j)、 i +
S
o
^
t
i
,
j
S\hat{o}_{t_{i,j}}
So^ti,j, j +
S
o
^
l
i
,
j
S\hat{o}_{l_{i,j}}
So^li,j),最后再乘上尺度因子
2
l
2^l
2l就能得到最后的结果。同时confidence score以及类别有在(i, j)上输出的K维向量的最高分以及对应类别决定。
动态特征选择
anchor-free branch的设计可以网络不依靠实例box的大小而是依据实例的真实信息进行尺度选择。
假设实例
I
I
I, 我们定义它在
P
l
P_l
Pl的分类损失和回归损失分别为
L
F
L
I
(
l
)
L_{FL}^I(l)
LFLI(l)以及
L
I
o
U
I
(
l
)
L_{IoU}^I(l)
LIoUI(l)(详细计算公式可参考论文)。
如图6。 第一步,实例
I
I
I会通过所有的不同尺度的特征层,在这个过程中计算出每一层级anchor-free branches分类损失
L
F
L
I
(
l
)
L_{FL}^I(l)
LFLI(l)和回归损失
L
I
o
U
I
(
l
)
L_{IoU}^I(l)
LIoUI(l),最后选择分类损失
L
F
L
I
(
l
)
L_{FL}^I(l)
LFLI(l)和回归损失
L
I
o
U
I
(
l
)
L_{IoU}^I(l)
LIoUI(l)之和最小的层级进行学习这个实例。
实验结果
首先作者对比了RetinaNet、一般的FPN的启发式特征选择方式、论文中的动态特征选择方式。如下图1.可以看到采用论文的动态选择方式精度都能提高一个点左右。
然后作者又对比了不同backbone对实验结果的影响,如下图2。
最后,作者对比了不同网络结构在不同backbone下的实验结果。如下图。
个人想法
个人来说,比较喜欢这个思想。原先利用多尺度的思想大多数就认为大尺度检测小目标,小尺度检测大目标。这篇论文不从大小出发,选择了一种更好的方式来给每个实例适配不同的层级。同时也利用了anchor-free的思想,这就很大程度上减轻了计算量与复杂度。而且在目标检测中anchor-free也是一个趋势。