文章目录
1 FCOS是什么
FCOS发表于ICCV 2019,是常用的无需锚框(先验框、anchor)的目标检测算法之一。
1.1 核心思想
核心思想:将铺设锚框变为铺设锚点,进行物体检测。
所谓铺设锚框,又称为Anchor-Based,是指在输出特征图上的每个像素的位置,放置几个预先定义的anchor框,在网络训练过程中,对这些anchor框进行分类与回归。
通过GT框和这些anchor框计算IoU,依据设定的阈值条件来定义正负样本,典型的有YOLOv3。
所谓铺设锚点,又称为Anchor-free,如下图所示,将原有的 对锚框进行分类与回归,变为对锚点进行分类与回归,其中回归是预测锚点到检测(GT)框上下左右四条边界的距离,典型的有FCOS。

1.2 Anchor-Based缺点
- Anchor-Based方式,检测性能对于anchor的大小、数量、长宽比 都非常敏感,通过改变这些超参数Retinanet在COCO benchmark上面提升了4%的MAP。
- 固定size和aspect ratio的anchor损害了检测器的普适性,导致对于不同任务,anchor可能需要重新设置大小和长宽比。
- 为了达到更高的召回率(查全率),需要生成大量的anchor(FPN约18万个),但是大部分的anchor在训练时标记为负样本(negative),造成了样本不均衡问题。
- 在训练中,需要计算所有anchor与真实框的IoU,这样会消耗大量内存和计算资源。

1.3 FCOS优点
- 检测问题被统一到 FCN-solvable 的问题,可以简单地重用其他任务的idea,如语义分割。
- anchor-free方式,不需要像anchor-based那样大量调整参数,使训练更为简单。
- 由于不需要计算IoU,节省了大量算力和内存。
- 提出了一些关于交叠区域的解决方法和思考。
- 模型部署会受到两种限制,一种是计算量的限制,一种是I/O 带宽的限制。anchor-free方式相比于anchor-based方式,对部署更友好一些。
2 FCOS 网络总解
2.1 初始版本网络结构
每个Head包含3个分支:
- classification分支:预测类别,图中的C表示类别数,相当于C个二分类
- regression分支:回归位置,图中的4表示:l,t,r,b,预测锚点到检测框上下左右四条边界的距离
- center-ness:中心度,一个锚点对应一个中心度,用于锚点相对于检测框中心性的判断
在检测子网络Head中,分类分支和回归分支都先经过了4个卷积层进行了特征强化。
早期版本,在分类分支中,既包含 正、负样本锚点的 类别预测分支,又包含正、负样本锚点中心性判断的center-ness分支,用来强化检测结果;
回归分支 用来回归正样本锚点到检测框上、下、左、右四个边界的距离 。
2.2 分支改进后网络结构
2.3 损失函数
以最新版本损失函数为例,Head总共有三个输出分支:Classification、Regression和Center-ness。故损失由分类损失 L c l s L_{cls} Lcls、定位损失 L r e s L_{res} Lres以及center-ness损失 L c t r n e s s L_{ctrness} Lctrness三部分共同组成:

分类损失 L c l s L_{cls} Lcls采用 BCELoss + Focal Loss ,计算损失时所有样本都会参与计算(正样本和负样本)。
定位损失 L r e s L_{res} Lres采用GIoU loss(早期采用 IoU loss),计算损失时只有正样本参与计算。
center-ness损失 L c t r n e s s L_{ctrness} Lctrness采用 BCELoss,计算损失时只有正样本参与计算。

更详细的centerness分支可在第7节中看到。
3 正样本、负样本、模糊样本的定义
对于使用anchor_free方式的FCOS,它是把特征图上的每个点作为一个样本,如果这个点落在任何一个GT框内,它就是正样本,否则它就是负样本。
在正样本中,存在一个点落在多个GT框中的情况,如下图所示,这个点称之为模糊样本(ambiguous)。

此时,有两个问题:
- 特征图上的点怎么知道它是在原图上的GT框内还是外呢?
回答:见第4节分析。 - 一个点恰好只落在一个框内,此时它就去负责预测这个GT框,那模糊样本预测谁呢?怎么处理呢?
回答:一个点落在多个GT框中,取最小的那个GT框作为回归目标,此外,利用FPN进行多尺度预测会极大程度上减少这种情况的发生。具体细节在第6节介绍。
下面分别回答。
4 特征图上的点映射回原图
对于特征图 F i ∈ R H × W × C F_i \in R^{H \times W \times C} Fi∈RH×W×C,其相对于输入图片的stride定义为 s s s (举个例子,特征图宽高是40×40,输入图片宽高是320×320,那么 s 等于8)。
另外记GT框的信息为 B i B_i Bi, B i = { x 0 ( i ) , y 0 ( i ) , x 1 ( i ) , y 1 ( i ) , c ( i ) } B_i=\{ x_0^{(i)},y_0^{(i)},x_1^{(i)},y_1^{(i)},c^{(i)} \} Bi={
x0(i),y0(i),x1(i),y1(i),c(i)},其中 ( x 0 ( i ) , y 0 ( i ) ) (x_0^{(i)},y_0^{(i)}) (x0(i),y0(i)) 和 ( x 1 ( i ) , y 1 ( i ) ) (x_1^{(i)},y_1^{(i)}) (x1(i),y1(i)) 分别表示GT框的左上角和右下角顶点坐标, c ( i ) c^{(i)} c(i) 是GT框的类别。
对于特征图 F i F_i Fi上的每个点坐标 ( x , y ) (x,y) (x,y) ,可以用如下公式把它映射到原输入图像上:
( ⌊ s 2 ⌋ + x s , ⌊ s 2 ⌋ + y s ) (\lfloor \frac{s}{2} \rfloor + xs, \lfloor \frac{s}{2} \rfloor + ys) (⌊2s⌋+xs,⌊2s⌋+ys)
5 锚点回归目标值
注意: 锚点落在任何GT框的内部,就认为这个锚点是正样本,并负责预测这个GT框,在映射回原图后的该点直接回归目标框,而不是把这个点看成目标框的中心点进行回归。
锚点的回归目标值计算公式如下图所示,其中 ( l ∗ , t ∗ , r ∗ , b ∗ ) (l^*,t^*,r^*,b^*) (l∗,t∗,r∗,b∗)是锚点距离物体真实标注框左、上、右、下边界的距离。
在regression分支中,每个锚点预测一个4维向量,即 ( l ∗ , t ∗ , r ∗ , b ∗ ) (l^*,t^*,r^*,b^*) (l∗,t∗,r∗,b∗)。
6 模糊样本的处理
锚点落在多个GT框的区域内,则称其为模糊样本(ambiguous)。
思考: 有点草率了,应该先有点什么限制或减少这种情况出现!
回答: 模糊样本的出现,大部分是由于物体重叠造成的,但是重叠的物体多数大小是不同的,所以 FPN特征金字塔 闪亮登场。

启发于anchor-based方法,采用FPN时会将不同大小的anchor放置在不同大小的特征图上,特征图越小,感受野相应更大,用来检测更大的物体。同样地,这种设计理念可以用在FCOS模型上。
FCOS采用5个大小不同的特征图 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,其对应的stride分别是8,16,32,64,128。辅助理解: 2 i 2^i 2i。
为了减少尺度差异大的物体重叠,对于anchor-based方法,由于是根据anchor和GT框的IoU来进行匹配,所以很自然地将大小不同的GT框分配到不同的特征图。
而FCOS直接通过限制不同特征图上目标回归值来达到这一目的。
具体来说,每个特征图 P i P_i Pi 会设定一个回归值的下限值 m i − 1 m_{i-1} mi−1 和上限值 m i m_{i} mi ,作为其回归距离限制。
对于特征图 F i F_i Fi上的每个点坐标 ( x , y ) (x,y) (x,y) ,满足 m a x ( l ∗ , t ∗ , r ∗ , b ∗ ) > m i max(l^*,t^*,r^*,b^*)>m_i max(l∗,t∗,r∗,b∗)>mi 或 m i n ( l ∗ , t ∗ , r ∗ , b ∗ ) < m i − 1 min(l^*,t^*,r^*,b^*)
min(l∗,t∗,r∗,b∗)<mi−1
也就是特征图 P 3 P_3 P3 覆盖的是[0,64]之间的目标回归值,而 P 7 P_7 P7 则是负责512以上的目标回归值。
7 Center-ness分支
作者在使用了多尺度检测后发现仍然和anchor-based的检测器有很大差距,发现FCOS存在大量的低质量的检测框。这是由于把中心点的区域扩大到整个物体的边框,经过模型优化后可能有很多中心离GT box中心很远的预测框。
于是,FCOS在regression分支的末尾添加了一个额外的center-ness分支(早期放在classification分支,但是放在regression分支效果更好)来抑制一些检测框:由偏离目标中心的锚点 所预测的低质量检测框。
中心性预测分支center-ness,动机在于如果一个锚点距离物体标注框中心点越近,锚点的回归目标值(锚点距离标注框左、上、右、下四个边界的距离)就越一致,回归难度较低,回归效果会越好。
可以看出,当loss越小时,centerness就越接近1,也就是说回归框的中心越接近真实框。
注意: 在测试阶段,最终的置信度为center-ness和分类概率的乘积
8 后续改进
8.1 center sampling
- 原始论文:GT bbox 内的点,分类时均作为正样本(下图上面小图的所有黄色区域)。
- 改进 trick:只有 GT bbox 中心附近的 radius * stride 内的小 bbox(可以叫 sub box)内的点,分类时才作为正样本(下图下面小图的黄色和绿色区域)。

也就是要落在: ( x − r s , y − r s , x + r s , y + r s ) (x-rs,y-rs,x+rs,y+rs) (x−rs,y−rs,x+rs,y+rs)这个框内,作者通过消融实验发现在coco数据集上 r 取1.5效果最好。
8.2 centerness 分支的 centerness计算
- 原始论文:利用 l,t,r,b 计算 centerness。小目标的 centerness 值比较小,最终 cls 分数很容易被阈值卡掉。
- 改进 trick:直接用 IoU
8.3 regression分支的loss
- 原始论文:IoU loss
- 改进 trick:GIoU loss
8.4 bbox loss weight
- 原始论文:平权
- 改进 trick:用 centerness 分支的 target,即离gt中心越近,权重越大。
8.5 norm on bbox
- 原始论文:reg分支最后使用exp操作
- 改进 trick:reg分支最后使用relu操作
8.6 开发板上部署时优化策略
- 使用轻量型网络,例如mobilenetv2,Efficientnet对backbone进行替换。
- 使用BiFPN替换FPN。BIFPN给各个层赋予了不同权重去进行融合,让网络更加关注重要的层。BIFPN还减少了一些不必要的 层的结点连接。
- 将Efficientnet中的swish激活函数替换成ReLu,去掉backbone中的sigmoid结构
9 感谢链接
https://zhuanlan.zhihu.com/p/ https://zhuanlan.zhihu.com/p/ https://zhuanlan.zhihu.com/p/ https://zhuanlan.zhihu.com/p/ https://zhuanlan.zhihu.com/p/ https://blog.csdn.net/_/article/details/
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219010.html原文链接:https://javaforall.net
