FCOS
之前阅读后忘记记录笔记,稍微记录一下一些重要的
- 采用全卷积神经网络的形式,对每个像素点都进行目标检测,类似于语义分割的形式
- 一种anchor-free设计,将点看做样本而不是锚框
- 非常有名,有这一些通用的trick,以及比较优秀的正负样本分配策略
如上图左所示,FCOS回归的一个四维向量 ( l , t , r , b ) (l,t,r,b) (l,t,r,b),即样本点到gt box的四个距离,值得注意的是回归目标都为正样本吗,所以在reg head的部分使用了 e x p ( x ) exp(x) exp(x)将这四个量映射到了第一象限。右图展示了如果一个样本点同时落在多个gt box之中可能会存在一定的模糊,该样本点回归的边界框可能不明确,后续也专门介绍了解决此类问题的方法。
算法结构
从图中可以看到FCOS使用Backbone的{c3,c4,c5}通过FPN特征融合得到{P3,…,P7}层,其中P6为从P5层使用一个步长为2的卷积层进行下采样得到,对应的步长分别为{8,16,32,64,128}。
FCOS定义输入图片的gt box为
{
B
i
}
=
{
(
x
0
(
i
)
,
y
0
(
i
)
,
x
1
(
i
)
,
y
1
(
i
)
,
c
i
)
}
∈
R
4
×
{
1
,
2...
C
}
,
(1)
\{B_i\} = \{(x_0^{(i)},y_0^{(i)},x_1^{(i)},y_1^{(i)},c^{i})\} \in \mathbb{R}^{4} \times \{1,2...C\}, \tag{1}
{Bi}={(x0(i),y0(i),x1(i),y1(i),ci)}∈R4×{1,2...C},(1)
其中,
c
i
c^i
ci为包围框物体所属的类别,
C
C
C为类别的数量,因选用COCO数据集,所以此处为80。
对于特征图 F i F_i Fi 的每个坐标 ( x , y ) (x,y) (x,y) ,可以将其映射回原图坐标为 ( ⌊ s 2 ⌋ + x s , ⌊ s 2 ⌋ + y s ) (\left\lfloor\frac{s}{2}\right\rfloor + xs, \left\lfloor\frac{s}{2}\right\rfloor + ys) (⌊2s⌋+xs,⌊2s⌋+ys),可以看做在特征图上点的感受野的中心附近。FCOS不是用锚框作为初始回归的点,而是直接将位置作为训练样本进行回归,这种特殊性源自于其建模设计。具体来说,如果点落入gt box中,且该目标的类标签为前景类,那么将该点视为正样本,否则是负样本。
FCOS使用的损失函数如下:
L
(
{
p
x
,
y
}
,
{
t
x
,
y
}
)
=
1
N
p
o
s
∑
x
,
y
L
c
l
s
(
p
x
,
y
,
c
x
,
y
∗
)
+
λ
N
p
o
s
∑
x
,
y
1
{
c
x
,
y
∗
>
0
}
L
r
e
g
(
t
x
,
y
,
t
x
,
y
∗
)
,
(2)
\begin{aligned} L(\{\textbf{p}_{x,y}\},\{\textbf{t}_{x,y}\})& =\frac{1}{N_{\mathrm{pos}}}\sum_{x,y}L_{\mathrm{cls}}(\boldsymbol{p}_{x,y},c_{x,y}^*) \\ &+\frac{\lambda}{N_{\mathrm{pos}}}\sum_{x,y}1_{\{c_{x,y}^{*}>0\}}L_{\mathrm{reg}}(\boldsymbol{t}_{x,y},\boldsymbol{t}_{x,y}^*), \end{aligned} \tag{2}
L({px,y},{tx,y})=Npos1x,y∑Lcls(px,y,cx,y∗)+Nposλx,y∑1{cx,y∗>0}Lreg(tx,y,tx,y∗),(2)
其中,
L
c
l
s
L_{cls}
Lcls 是focal loss,
L
r
e
g
L_{reg}
Lreg是IoU loss。
N
p
o
s
N_{pos}
Npos为正样本数量,
λ
\lambda
λ为平衡系数。针对特征图上的所有位置进行求和,
{
c
i
∗
>
1
}
\{c_i^*>1\}
{ci∗>1}为指示函数,当为正样本的时候才计算reg损失。
**推理:**FCOS的推理过程很简单,给定输入图像,获取特征图 F i F_i Fi上的每个位置 ( x , y ) (x,y) (x,y) 的分类得分 p x , y p_{x,y} px,y和回归预测 t x , y t_{x,y} tx,y。选择 p x , y > 0.05 p_{x,y} > 0.05 px,y>0.05的位置作为正样本并反演公式(1),获得预测的边界框。
使用FPN的多级预测
FPN-base的FCOS解决了两个可能的问题,其一为直观上BPR不高,其二为若有重叠的GT box样本点同时落入两个框中会导致模糊样本的存在。
BPR(best possible recall)定义为检测器可以最大检出的框数量除以所有GT数量的比值,是检测器recall的上限,如果该值较低说明正负样本分配或者回归设置不合理。
首先,如果是Anchor-base的检测器,想要提升BPR是直观而且简单的,可以通过降低IoU阈值进行相应的补偿关于由于顶层特征图的大步长造成的低召回率。但是对于FCOS这种anchor-free算法,乍一看其BPR是要低于anchor-base的,因为网络不可能召回由于大步长导致没有位置编码的对象。但通过实验表明,其BPR不弱甚至要高于RetinaNet,这说明FPN-base的FCOS可以解决此类问题。实验如下图所示(关于此部分是通过实验来证明的):
另一个问题是模糊样本问题,这种模糊造成了FCOS的性能大幅度下降,但是通过多级预测可以很好地解决这个问题,使用 { P 3 , P 4 , P 5 , P 6 , P 7 } \{P_3, P_4, P_5, P_6, P_7\} {P3,P4,P5,P6,P7}即步长分别为 { 8 , 16 , 32 , 64 , 128 } \{8, 16, 32, 64, 128\} {8,16,32,64,128} 的特征图,使不同尺寸的目标在不同等级的特征图上进行预测。
anchor-base将不同大小的锚框分配给不同的特征等级,FCOS直接限制每个级别的边界框回归范围。步骤为:
- 首先计算所有特征图级别的每个位置的回归目标 t ∗ t^* t∗,即 ( l ∗ , t ∗ , r ∗ , b ∗ ) (l^*,t^*,r^*,b^*) (l∗,t∗,r∗,b∗)
- 然后如果一个位置满足 m a x ( l ∗ , t ∗ , r ∗ , b ∗ ) > m i max(l^*,t^*,r^*,b^*) > m_i max(l∗,t∗,r∗,b∗)>mi 或者 m a x ( l ∗ , t ∗ , r ∗ , b ∗ ) < m i − 1 max(l^*,t^*,r^*,b^*) < m_{i-1} max(l∗,t∗,r∗,b∗)<mi−1,那么将该样本分配为负样本,不进行回归预测
- 上述式子中的 m i m_i mi 是每个特征图等级需要回归的最大距离,在FCOS中定义有 m 2 , m 3 , m 4 , m 5 , m 6 , m 7 m_2, m_3, m_4, m_5, m_6, m_7 m2,m3,m4,m5,m6,m7,其分别为 [ 0 , 64 , 128 , 256 , 512 , ∞ ] [0, 64, 128,256,512,\infty] [0,64,128,256,512,∞]
因为大部分的重叠都是不同尺度的目标重叠,所以通过这种方式可以极大可能的减少模糊样本的问题,但是如果使用了多级预测还是存在重叠的情况,那么优先将样本点分配给小目标。
同时FCOS共享所有不同特征图等级的head的权重,这使得参数量降低同时提升了性能。但是对于不同的特征图层级,其回归的范围是不一致的,因此选用相同的head可能是不合理的。最终,FCOS使用具有可训练标量 s i s_i si 的 e x p ( s i x ) exp(s_ix) exp(six) 来自动调整特征登记 P i P_i Pi 的指数函数的基,略微提升了性能。
Center-ness branch
使用上述的方法后,同anchor-base的算法依然存在一个差距,FCOS的作者发现是因为存在着大量的远离GT box中心的样本点产生了许多低质量的边界框。
为了解决这种问题,增加了一个单独的分支同classification分支并行,去预测center-ness(中心度),center-ness分支描述了从该位置到该位置所对应的对象中心的归一化距离。
上图展示了加入center-ness分支后,处于右下角的低质量预测框都被推移到左上册,这说明该分支能够使得这些质量不好的正样本的分类得分降低了。
给定回归目标,那么centerness分支如下:
centerness
∗
=
min
(
l
∗
,
r
∗
)
max
(
l
∗
,
r
∗
)
×
min
(
t
∗
,
b
∗
)
max
(
t
∗
,
b
∗
)
.
(3)
\operatorname{centerness}^*=\sqrt{\frac{\min(l^*,r^*)}{\max(l^*,r^*)}\times\frac{\min(t^*,b^*)}{\max(t^*,b^*)}}. \tag{3}
centerness∗=max(l∗,r∗)min(l∗,r∗)×max(t∗,b∗)min(t∗,b∗).(3)
之所以采用 sqrt 是为了减缓中心性的衰减,中心度的范围0-1,使用二进制交叉熵BCE损失进行训练,同时将其添加到训练loss中,测试的时候,将中心度同相应的分类分支相乘作为最终得分,用于对检测到的边界框进行排名,这也解释了为什么加入centerness分支后如上图展示分数会降低即被推到左上角的原因。
centerness分支可以尽可能的降低远离对象中心的边界框的分数,在nms的帮助下可以过滤掉,那么就提升了检测性能。
还有一种可以替代centerness的方式,就是仅对GT box的中心点进行采样,但是需要添加一个额外的超参数,但是实验证明,两者连着使用可以达到最佳效果,如下表所示。
ctr.on.reg是将centerness分支移动到回归分支,ctr.sampling是只对中心点进行采样,GIoU是在损失中乘法联合区域超过外接举行的区域,Normalizition是在损失中对回归目标使用FPN的步长进行归一化。
一定要注意,中心度分支只在测试的时候使用,训练的时候GT box内所有的位置都会标成正样本,所以可以尽可能多的使用前景位置进行训练回归器,从而产生更加准确的边界框。