本文是对论文Bridging the gap between anchor-based and anchor-free detection via adaptive training sample selection的解读和实现。
在编程过程中,代码中有一些参考或照抄了maskrcnn_benchmark和mmdetection的地方,特此声明。
论文解读
anchor-based和anchor-free的本质区别
论文第一部分通过实验的方式,验证了anchor-base(采用了RetinaNet)和anchor-free(采用了FCOS)的性能差距在于正负样本的划分。
简单回顾一下RetinaNet和FCOS划分正负样本的方法。
检测算法 | 划分正负样本的方法 |
---|---|
RetinaNet | (1)每个pixel处都预先生成一组anchor (2)根据每个anchor和每个物体框的iou来划分正负样本 |
FCOS | (1)首先根据当前pixel是否在某个物体框内部来生成候选集 (2)采用空间上的尺度约束来得到最终的正样本,其余为负样本 |
(a)图上表示RetinaNet,(a)图下表示FCOS。
但是,FCOS上采用了很多RetinaNet所没有采用的trick,如下所示:
- 在detection head网络中采用group norm
- 采用Giou Loss
- 划分正样本时,要求正样本的中心点必须位于物体框中
- 采用了一个中心分支,获取当前预测框的"中心点"的偏移程度
- 采用了一个scaler方法,对不同level的feature map上的预测框进行调整
而RetinaNet也有一个trick,即每个pixel处有多个anchor。
为了公平的比较,论文中为RetinaNet只保留一个正方形的anchor。这个anchor的尺度为 8 S ∗ 8 S 8S * 8S 8S∗8S,这里的 S S S表示当前feature map的stride。那么最小的anchor size为 64 ∗ 64 64*64 64∗64,最大的anchor size为 1024 ∗ 1024 1024*1024 1024∗1024。论文中称这样的RetinaNet为RetinaNet(#A=1)。
然后为RetinaNet(#A=1)加入上面提到的trick,于是就可以得到下表:
可以看到目前RetinaNet(#A=1)的性能达到了37.0,并且无关变量完全相同,可以公平的进行比较了。此时RetinaNet(#A=1)和FCOS有两个不同点,即:
- 正负样本划分的方法(如前所述)
- 回归的状态,FCOS是立足中心点,预测当前点到物体框上、下、左、右四个边界的距离。而RetinaNet(#A=1)是预测4个回归因子,利用回归因子和anchor解码得到物体框
下面就需要通过实验验证到底是哪个原因导致了RetinaNet(#A=1)和FCOS的性能差距(37.0对37.8)。
需要做四个实验,即不同样本划分方法(根据iou划分和根据空间尺度约束划分)和不同回归方法(从anchor开始预测和从点开始预测),共有四个实验,实验结果如下所示:
可以看到,不同的回归方法对于性能几乎没有影响,而“根据空间尺度划分样本”要远远优于“根据iou划分样本”,因此可以得出结论,真正决定anchor-based和anchor-free性能差距的原因是正负样本划分方法
atss算法的计算过程
具体计算过程
论文中给出的计算过程:
翻译:
我们假设当前有一个物体 g g g,图片上的pixel集合为 C C C,anchor集合为 A A A,显然这里每个 c i ∈ C c_{i}\in C ci∈