目标检测算法FCOS

文章介绍了FCOS目标检测算法,它采用全卷积网络,无锚框设计,通过回归距离向量和中心度分支改进预测精度。算法利用多级预测和中心性分支解决BPR低和模糊样本问题,提升了检测性能。
摘要由CSDN通过智能技术生成

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,yLcls(px,y,cx,y)+Nposλx,y1{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\} {8163264128} 的特征图,使不同尺寸的目标在不同等级的特征图上进行预测。

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)<mi1,那么将该样本分配为负样本,不进行回归预测
  • 上述式子中的 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内所有的位置都会标成正样本,所以可以尽可能多的使用前景位置进行训练回归器,从而产生更加准确的边界框。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值