论文链接
一.背景
1.anchor-base缺点
(1).anchor的设置对结果影响很大,不同项目这些超参都需要根据经验来确定,难度较大.
(2).anchor太过密集,其中很多是负样本,引入了不平衡.
(3).anchor的计算涉及IOU增加计算复杂度.
2.anchor free检测框
yolov1可看成是anchor free方式,通过划分格子,target的中心点位于格子里的,才将相应的格子负责预测target.而yolov2采用了anchor的思想.anchor遍布图片,自然召回率上升了.fcos取长补短,采取了gt框里的所有点进行回归,同时采用center-ness分支优化框的质量.
二.网络介绍
1.网络结构
输出分支主要由三部分组成
(1)classification,大小为(W,H,C),输出不同类别
(2)Regression,大小为(W,H,4),输出图上每个点的上下左右偏差
(3)Center-ness大小为(W,H,1),预测检测框中心点与gt检测框的中心点的重合概率,用来提升检测框精度,下面有具体分析.
2.中心采样(center sampling)
对于任何一个gt bbox,首先映射到每一个输出层,利用center_sample_radius×stride计算出该gt bbox在每一层的正样本区域以及对应的left/top/right/bottom的target.
对于每个输出层的正样本区域,遍历每个point位置,计算其max(left/top/right/bottom的target)值是否在指定范围内,不再范围内的认为是背景.
(1).减少歧义target数目,能很大解决overlap特征点不知道该回归那个框的问题
(2).减少标注噪声干扰
box标注通常会框住很多无关区域,如果无关区域的point也要回归明显不对,比如空中的飞机,飞机旁边的天空就是无关区域.
3.FPN
通过FPN在每层feature map去预测不同尺度大小的物体,就解决了这种overlap的问题(overlap特征点不知道该回归那个框).
如果FPN和中心采样还没解决的话,就按最小的框来.
同时FPN每一层回归范围进行约束.
P3:回归范围在[0,64],P4:回归范围在[64,128],P5:回归范围在[128,256]
P6:回归范围在[256,512],P7:回归范围在[612,inf],这样就解决了不同层预测不同大小目标的问题.
但是比如还是存在多个head回归一物体现象,比如在第二层回归的最大范围是80,在往上一层回归的最大范围就是40(因为第二层是第一层的1/2),所以导致同一个物体是有两层进行回归的。
4.分类
训练C个二分类器,而不是训练一个多分类器.
5.坐标回归
anchor-based回归方式在于回归anchor与gt框之间的偏移量,而fcos在特征图上面的每一个点回归上下左右的距离(可认为是point-based).
公式:
(l ∗ , t ∗ , r ∗ , b ∗ ) :回归的上下左右四个量;
(x0,y0),(x1,y1):gt在原图上面的左上右下坐标;
(x,y):特征图内的点的坐标;
s: 相应feature map的步长, 用于压缩预测范围,容易平衡分类和回归Loss权重.
6. center-ness
作者发现引入了很多远离taget中心点的低质量预测框,预测框的中心点与target框的中心点更接近的话,预测框更加可靠.所以在回归的分支引入center-ness分支来回归预测框中心与target中心,虽然是回归问题,但采用的是celoss
可看出低IOU但score高的box得到了很大减少,IOU和score的一致性得到了改善.
7.loss函数
Lcls: focal loss
Lreg: GIoU loss
Npos:正样本数据
λ:取1平衡回归与分类loss
centerness loss用于约束预测框中心与gt中心点,限制边界处的loss,直接与上面分类与回归相加即可,在推理时,输出的score为分类score乘以中心score.
import cv2
import numpy as np
def draw_centerness(box):x1, y1, x2, y2 = boxw, h = x2 - x1, y2 - y1print(np.arange(w).repeat(h).reshape(h, w))print(np.arange(w).repeat(h).reshape(h, w).transpose(1, 0))xs = np.arange(w).repeat(h).reshape(h, w).transpose(1, 0).reshape(-1, 1)print('==xs:', xs)ys = np.arange(h).repeat(w).reshape(h, w).reshape(-1, 1)print('==ys:', ys)left = xs - x1print('==left:', left)right = x2 - xstop = ys - y1bottom = y2 -yshm = np.sqrt(np.minimum(left, right)/np.maximum(left, right) * np.minimum(top, bottom)/np.maximum(top, bottom))hm = hm.reshape(h, w)return hm
hm =draw_centerness([0, 0, 100, 100])
max_num = np.max(hm)
cv2.imwrite('./test.jpg', hm/max_num*255.)
8.推理
获取feature map上每个点的分类score在与回归的四个边界进行组合即可得出预测框.在进行阈值0.6的NMS.
三.实验结果
参考:https://www.zybuluo.com/huanghaian/note/1747551