【目标检测】Anchor Free —— OneNet(不需要NMS)
作者:互联网
Contents
开始之前学习一个单词热热身:
canonical 英[kəˈnɒnɪkl]
adj. 被收入真经篇目的; 经典的;
Some of the paintings were canonical, included in art-history books.
有些画是经典的,收录在艺术史书中。
0 写在前面
OneNet: End-to-End One-Stage Object Detection by Classification Cost.
OneNet是一个不需要NMS后处理的网络。与其说是这是一个创新的目标检测网络,不如说其是改变了目标检测过程中对于正样本的判定问题。(论文中表述为" label assignment "
,我就用"判定"这个词代替吧)。这篇论文最大创新点是改变了以往One-Stage方法中,对于某个anchor是否为正样本的判定方法(Anchor-Based)或是特征图上某个网格点是否是正样本(Anchor-Free)的判定方法;使得在训练过程中,每个真实框都仅有一个正样本所对应;在 Inference 阶段,预测出的每一个物体即可认为是图片中的不同物体,不会出现以往One-Stage方法预测结果出现一个物体对应很多Score很高的预测框进而需要NMS来抑制冗余的预测框。
回顾一下One-Stage方法判定 候选框/候选网格点 是否为正样本的方法:
- 对于 Anchor-Based 方法,若anchor与真实框的IoU大于某个阈值,则被认为是正样本;
- 对于Anchor-Free方法,CornerNet和CenterNet仅仅是将真实框中心点对应的特征图上的某个网格为正样本,而FCOS是在真实框对应到特征图上的区域内所有网格点为正样本,可以看到其被判定是否为正样本仅仅与其真实框的位置有关。
在这里回顾下YOLO中是如何定义正负样本的:
- 正样本的选择:
首先计算目标中心点落在哪个grid上,然后计算这个grid的9个anchor 和目标真实位置的IoU值(直接计算,不考虑二者的中心位置),取IoU值最大的anchor和目标匹配。于是,找到的 该grid中的 该anchor 负责预测这个目标,其余的网格、anchor都不负责; - 负样本的选择:
计算所有的anchor和所有的真实框之间的IoU,如果某 anchor 和图像中所有物体最大的IoU都小于阈值(一般0.5),那么就认为该先验框不含目标,记作负样本; - 不参与计算部分
这部分虽然不负责预测对象,但IoU较大,可以认为包含了目标的一部分,不可简单当作负样本,所以这部分不参与误差计算。
综上,如下图所示:
所以对于每个定义的正样本,在训练时计算正样本的边界框回归损失;在预测时,根据网络模型预测出的分类Score来执行NMS用以筛取冗余的预测框。(正样本有很多,分类Score最高的正样本附近肯定有一些正样本的分类Score也不会低,NMS正是要去掉这些不是最高但还很高的冗余检测框)
1 Introduction
论文中提到 " The detection performance is largely sensitive to sizes, aspect ratios, and the number of anchor boxes. "
是这样的,所以在YOLO/RetinaNet中,针对于不同数据集的大小分布,可以适当的选取(保留或去掉)不同尺度的预测层,以及修改anchor的个数来 “设计” 符合特定任务的网络模型。
作者提到:"We discover that the lack of classification cost between sample and ground-truth in label assignment is the main obstacle for a one-stage detector to remove NMS and reach end-to-end. "
正如开头提到的,解决了多个正样本对应一个真实物体的情况,即实现仅仅判定出一个正样本对应一个真实物体,而其他样本均为负样本的方案,即可去掉NMS后处理。同时避免判定正样本仅仅与真实框的位置有关,作者也把真实框的类别标签作为判定正样本的部分依据。
" However, if trained with only location cost, the classification branch is forced to output the approximate solution; that is, one object has multiple predictions. "
2 Label Assignment
之前提到,label assignment
是正负样本的判定问题。作者是怎么解决以往的 仅根据真实框的位置来判定正负样本 的问题,进而加入真实框的类别标签作为判定正样本的部分依据的呢?
首先OneNet仍是借鉴FCOS的检测方法,即对预测特征图上的每个网格来判定是正样本还是负样本。如上图,在 cls
分支预测出每个网格点是某类物体的Score,在reg
分支预测每个网格点对于物体边界框的上下左右距离。作者通过计算以下公式并选取结果最小值对应的那个网格点,即为正样本:
其中λcls、λL1、λgiou是超参数(论文中实验取λcls=2、λL1=5、λgiou=2),Ccls是预测类别与真实类别间的Focal Loss,CL1和Cgiou是预测框和真实框间的归一化中心坐标和宽高。
也就是说,这里是通过计算出来的cost
值的大小来判定正负样本的,最小的cost
值对应的网格点即为正样本,其余均为负样本。对于图片中的每个真实框,计算出对应的最小cost
值来选取每个真实框所对应的唯一正样本。
3 实施细节
输入图片(H×W×3),backbone产生feature map(H/4×W/4×C),head预测分类(H/4×W/4×K,K为类别数)和边框回归(H/4×W/4×4),最后的输出直接取top-k(e.g., 100)得分框。
在训练过程中,OneNet网络的损失函数同样采用上述公式,即Focal Loss、L1 Loss和GIOU Loss。
在Inference
阶段,直接选取top-k(e.g., 100)得分框(个人认为k不也是一个超参数吗???即表示一张图片中预测出k个物体)
4 最后的最后
其实我对该网络是有一些怀疑的,与CenterNet相同,这两个网络没有采用NMS后处理,但是都在 Inference
阶段通过选取阈值的方式来获得最终的结果,比如OneNet直接选取top-k(e.g., 100)得分框最为输出结果,而这个k
表示一张图片中有个物体;
同样的,对于CenterNet,在预测阶段,通过将特征图中的每个类的峰值点单独地提取出来。具体怎么提取呢?就是检测当前热点的值是该点的八领域中最大的点,然后一共取100个这样的点,采用的方式是一个3x3的MaxPool,类似于anchor-based检测中NMS的效果。
根据模型预测出来的 heatmap中的值,也就是当前中心点存在物体的概率值,代码中设置的阈值为0.3,也就是从上面选出的100个结果中筛选出大于该阈值的中心点作为最终的预测结果。
下图分别对应取top=100的检测结果、阈值筛选后的最终图。
那么CenterNet中的阈值 0.3
以及 OneNet中的超参数 top-k 中的 k
又是如何选取的呢,应该也是要根据经验来选择的吧。
标签:真实,OneNet,NMS,样本,网格,Free,判定,anchor 来源: https://blog.csdn.net/qq_43360533/article/details/113530074