ATSS论文解读和简洁代码实现

目录

  • 论文解读
    • anchor-based和anchor-free的本质区别
    • atss算法的计算过程
      • 具体计算过程
      • 理解
    • 实验分析
  • 简洁代码实现
  • 最后

本文是对论文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)采用空间上的尺度约束来得到最终的正样本,其余为负样本

ATSS论文解读和简洁代码实现_第1张图片
(a)图上表示RetinaNet,(a)图下表示FCOS。

但是,FCOS上采用了很多RetinaNet所没有采用的trick,如下所示:

  1. 在detection head网络中采用group norm
  2. 采用Giou Loss
  3. 划分正样本时,要求正样本的中心点必须位于物体框中
  4. 采用了一个中心分支,获取当前预测框的"中心点"的偏移程度
  5. 采用了一个scaler方法,对不同level的feature map上的预测框进行调整

而RetinaNet也有一个trick,即每个pixel处有多个anchor。

为了公平的比较,论文中为RetinaNet只保留一个正方形的anchor。这个anchor的尺度为 8 S ∗ 8 S 8S * 8S 8S8S,这里的 S S S表示当前feature map的stride。那么最小的anchor size为 64 ∗ 64 64*64 6464,最大的anchor size为 1024 ∗ 1024 1024*1024 10241024。论文中称这样的RetinaNet为RetinaNet(#A=1)。
然后为RetinaNet(#A=1)加入上面提到的trick,于是就可以得到下表:
ATSS论文解读和简洁代码实现_第2张图片
可以看到目前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开始预测和从点开始预测),共有四个实验,实验结果如下所示:
ATSS论文解读和简洁代码实现_第3张图片
可以看到,不同的回归方法对于性能几乎没有影响,而“根据空间尺度划分样本”要远远优于“根据iou划分样本”,因此可以得出结论,真正决定anchor-based和anchor-free性能差距的原因是正负样本划分方法

atss算法的计算过程

具体计算过程

论文中给出的计算过程:
ATSS论文解读和简洁代码实现_第4张图片
翻译:
我们假设当前有一个物体 g g g,图片上的pixel集合为 C C C,anchor集合为 A A A,显然这里每个 c i ∈ C c_{i}\in C ciC,都有一个 a i ∈ A a_{i}\in A aiA,并且 c i c_i ci a i a_i ai的中心点。为 g g g分配正样本,流程如下所示:

  1. for c i ∈ C c_i \in C ciC,计算 g g g c i c_i ci的欧式距离
  2. 选取K个到 g g g最近的样本点,构成候选样本集合 C c a n d i d a t e C_{candidate} Ccandidate
  3. for c i ∈ C c a n d i d a t e c_i \in C_{candidate} ciCcandidate,计算 g g g a i a_i ai的iou值,并且得到这些iou值的均值 m e a n mean mean和标准差 v a r var var
  4. for c i ∈ C c a n d i d a t e c_i \in C_{candidate} ciCcandidate,如果 c i c_i ci g g g内部,并且 i o u ( a i , g ) > m e a n + v a r iou(a_{i},g)>mean+var iou(ai,g)>mean+var,那么 c i c_i ci就是正样本。
    如果按照如上步骤,一个anchor被划分给了多个物体,那么将这个anchor分配给“和它的iou最大”的那个物体。

加入FPN之后和上面步骤一致

理解

首先,我们可以理解,无论是RetinaNet还是FCOS,样本的中心点越是接近于物体框的中心点,那么这个样本是正样本的概率就越大。那么这样的样本就越适合作为候选的正样本。
那么为什么要将 m e a n + v a r mean+var mean+var作为新的阈值呢?
论文中这样解释: m e a n mean mean值用来衡量预设的anchor和当前物体的匹配程度, m e a n mean mean值越高,意味着候选anchor的质量越高,反之则越低。而 v a r var var则衡量了哪些层次的feature适合用来检测该物体。如果 v a r var var较高,则意味着存在某个特定层的feature和该物体较为匹配,这样 m e a n + v a r mean+var mean+var较高,可以主要用这一层的feature来学习这个物体,如果 v a r var var较低,则意味着存在多层的feature和该物体匹配,此时 m e a n + v a r mean+var mean+var较低,这些层都会受到监督。采用 m e a n + v a r mean+var mean+var作为阈值筛选正样本,一方面保证了每个物体都会被分配到足够的样本,以供学习,另一方面,自适应的调整了样本的分布,让最适合学习该物体的特征层受到监督,而不是人为先验的设定。

实验分析

论文中先将ATSS加入到RetinaNet(#A=1)中,性能直接提升了2.3%,达到了39.3%,如下表所示
ATSS论文解读和简洁代码实现_第5张图片
然后考察了候选集的大小(即k)对性能的影响:
ATSS论文解读和简洁代码实现_第6张图片

可以看到如果候选集太大,那么候选集里面样本的质量会降低,那么最终用来学习该物体的样本的质量可能会较差。而如果候选集太小,每个物体没有足够数量的样本,会导致统计的不稳定。
后面考察了预设anchor的尺寸对性能的影响。
ATSS论文解读和简洁代码实现_第7张图片
举个例子,当scale=5时,表示此时采用的是 5 S ∗ 5 S 5S*5S 5S5S大小的anchor。从上表中可以看到ATSS对于预设anchor的大小并不敏感。
最后论文中做了几个实验,考察对于一个pixel处,设置多个预设anchor会有什么影响。实验结果如图所示:
ATSS论文解读和简洁代码实现_第8张图片
这里为每个pixel设置了9个anchor,称为RetinaNet(#A=9),表中的+Imprs.表示加入之前提到的种种trick,可以看到在不采用ATSS的时候,一个位置上设置多个anchor是有效果的,但是采用了ATSS之后,却得出了相反的结论。论文中认为,只要适当的选取正样本,在每个pixel处设置多少个anchor对最终性能无关紧要。

简洁代码实现

基于resnet50复现了ATSS,并且在实现过程中多处或参考或照抄了mmdetection。最终性能达到了39.4%,
ATSS论文解读和简洁代码实现_第9张图片

map 推理速度fps
our atss 39.4 17.43
mmdetection对应配置 39.4 17.9

注意推理速度在rtx2080ti上测得。
代码和具体使用方法请见git仓库。

最后

更多目标检测论文解读和代码实现请关注博文。
如有任何技术问题可以联系qq 1401997998。

你可能感兴趣的:(目标检测,pytorch,深度学习,神经网络,计算机视觉)