FCOS发表于ICCV 2019,是常用的无需锚框(先验框、anchor)
的目标检测算法之一。
核心思想:将铺设锚框
变为铺设锚点
,进行物体检测。
所谓铺设锚框,又称为Anchor-Based,是指在输出特征图上的每个像素的位置,放置几个预先定义的anchor框,在网络训练过程中,对这些anchor框进行分类与回归。
通过GT框和这些anchor框计算IoU,依据设定的阈值条件来定义正负样本,典型的有YOLOv3。
所谓铺设锚点,又称为Anchor-free,如下图所示,将原有的 对锚框进行分类与回归,变为对锚点进行分类与回归,其中回归是预测锚点到检测(GT)框上下左右四条边界的距离,典型的有FCOS。
早期的FCOS网络结构如下图所示:
FCOS采用FPN结构,backbone的C3、C4、C5特征层作为FPN的输入,FPN生成P3,P4,P5,P6,P7特征图,送入后续的检测头Head。
每个Head包含3个分支:
在检测子网络Head中,分类分支和回归分支都先经过了4个卷积层进行了特征强化。
早期版本,在分类分支中,既包含 正、负样本锚点的 类别预测分支,又包含正、负样本锚点中心性判断的center-ness分支,用来强化检测结果;
回归分支 用来回归正样本锚点到检测框上、下、左、右四个边界的距离 。
center-ness分支,早期版本是和classification分支一起,如上图所示,后来大家发现center-ness分支和regression分支一起效果更好,如下图所示。
感谢 太阳花的小绿豆 画的更详细的网络结构图:
以最新版本损失函数为例,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节中看到。
使用候选框进行目标检测时,也就是anchor_based方式,候选框中是否包含目标就是判断正负样本的的准则。
有目标的就是正样本,没有目标的就是负样本。
对于使用anchor_free方式的FCOS,它是把特征图上的每个点作为一个样本,如果这个点落在任何一个GT框内,它就是正样本,否则它就是负样本。
在正样本中,存在一个点落在多个GT框中的情况,如下图所示,这个点称之为模糊样本(ambiguous)。
此时,有两个问题:
下面分别回答。
对于特征图 F i ∈ R H × W × C F_i \in R^{H \times W \times C} Fi∈RH×W×C,其相对于输入图片的stride定义为 s s s (举个例子,特征图宽高是40x40,输入图片宽高是320x320,那么 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)
注意: 锚点落在任何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∗)。
网络能把每个锚点距离真实标准框的距离预测的越准,说明网络检测效果越好。
此处的 ( x , y ) (x,y) (x,y)应该是特征图上的锚点映射到原图上的位置。
这里用stride (上图中的s) 进行缩放,使得不同尺度的物体,回归目标值都在一定范围内,避免训练过程中可能出现的梯度爆炸。
由于4个回归值要大于0,最后的输出采用ReLU来保证回归值的范围为(0, +∞)。
锚点落在多个GT框的区域内,则称其为模糊样本(ambiguous)。
以一个像素落在两个GT框的情况为例,选择的原则是:选择面积最小的一个GT框作为它训练用的回归目标。
为什么选面积最小的GT框作为它的回归目标?我的理解是:回归小框的像素点本来就少,大的GT框肯定有更多的点去回归的!
思考: 有点草率了,应该先有点什么限制或减少这种情况出现!
回答: 模糊样本的出现,大部分是由于物体重叠造成的,但是重叠的物体多数大小是不同的,所以 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^*)
也就是特征图 P 3 P_3 P3 覆盖的是[0,64]之间的目标回归值,而 P 7 P_7 P7 则是负责512以上的目标回归值。
作者在使用了多尺度检测后发现仍然和anchor-based的检测器有很大差距,发现FCOS存在大量的低质量的检测框。这是由于把中心点的区域扩大到整个物体的边框,经过模型优化后可能有很多中心离GT box中心很远的预测框。
于是,FCOS在regression分支的末尾添加了一个额外的center-ness分支(早期放在classification分支,但是放在regression分支效果更好)来抑制一些检测框:由偏离目标中心的锚点 所预测的低质量检测框。
中心性预测分支center-ness,动机在于如果一个锚点距离物体标注框中心点越近,锚点的回归目标值(锚点距离标注框左、上、右、下四个边界的距离)就越一致,回归难度较低,回归效果会越好。
center-ness分支只预测一个值:当前位置与要预测的物体中心点之间的归一化距离,值在[0, 1]之间,距离物体中心点越近,得分越高。下图给出了可视化效果,其中红色和蓝色值分别1和0,其它颜色介于两者之间,从物体中心向外,center-ness从1递减为0。
给定回归的 t a r g e t = ( l ∗ , t ∗ , r ∗ , b ∗ ) target=(l^*,t^*,r^*,b^*) target=(l∗,t∗,r∗,b∗),center-ness的target label定义为 c e n t e r n e s s ∗ centerness^* centerness∗:
由于 c e n t e r n e s s ∗ centerness^* centerness∗值在0~1之间,训练过程中可以采用 BCE损失函数 进行优化。
可以看出,当loss越小时,centerness就越接近1,也就是说回归框的中心越接近真实框。
注意: 在测试阶段,最终的置信度为center-ness和分类概率的乘积
也就是要落在: ( 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效果最好。
https://zhuanlan.zhihu.com/p/468494402
https://zhuanlan.zhihu.com/p/156112318
https://zhuanlan.zhihu.com/p/443367551
https://zhuanlan.zhihu.com/p/104236411
https://zhuanlan.zhihu.com/p/62869137
https://blog.csdn.net/qq_37541097/article/details/124844726