当前位置 博文首页 > DL_fan的博客:FCOS: A Simple and Strong Anchor-free Object D

    DL_fan的博客:FCOS: A Simple and Strong Anchor-free Object D

    作者:[db:作者] 时间:2021-07-10 22:24

    论文链接

    一.背景

    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],这样就解决了不同层预测不同大小目标的问题.

    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 = box
        w, h = x2 - x1, y2 - y1
        print(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 - x1
        print('==left:', left)
        right = x2 - xs
        top = ys - y1
        bottom = y2 -ys
        hm = 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

    cs