论文
论文题目:Bridging the Gap Between Anchor-based and Anchor-free Detection
收录于:CVPR 2020
论文地址:https://arxiv.org/abs/1912.02424
知乎解读(含本人):如何评价zhangshifeng最新的讨论anchor based/ free的论文? - 知乎
Anchor-based vs Anchor-free
文章主要是在寻找造成 anchor-based 和 anchor-free 之间性能差异的主要因素,并指出该因素为正负样本的定义。假如采用相同的定义,那么回归方法对最后的结果产生的影响是较小的。
单阶段 anchor-based 的典型是 RetinaNet,单阶段 anchor-free 的典型是 FCOS,在以 ResNet50-FPN 为 backbone 的情况下,前者的 COCO mAP 为 35.7,后者为 38.6,这之间有 3 个点的 gap,他们的设计主要有三个不同之处:
- 每个位置对应的 anchor 数量不同,RetinaNet 每个位置放了多个 anchor,FCOS 每个位置只有一个 anchor point
- 正负样本的定义不同,RetinaNet 采用 IoU 来定义正负样本,FCOS 用空间和尺度的约束来选择样本。
- 回归的起点不同,RetinaNet 从预先设置好的 anchor 开始回归,FCOS 则是根据 anchor point 的位置进行回归
以下通过实验分析 Anchor-based 和 Anchor-free 之间的区别。
首先分析正负样本定义和回归起点,分析 RetinaNet 和 FCOS,其中为了保证变量的单一性, RetinaNet 每个 feature point 只有一个 anchor。
Backbone 是 ResNet50-FPN,RetinaNet 每个 feature point 对应一个正方形的 anchor,大小为 8S8S,其中 SS 为该 feature level 的 stride (FPN 的 strides 分别为:8,16,32,64,128,分别用了 ResNet 的 c3,c4,c5,用 fpn conv 形成 p3,p4,p5 之后在 p5 上面再进行两次 stride 为 2 的 3x3 卷积得到 p6,p7)
注:FPN 一开始并不这样用的,最开始是用了 ResNet 的 c2,c3,c4,c5 得到 p2,p3,p4,p5,此时 FPN 有 4 层,然后在 p5 上面加一层 maxpool 得到 p6,现在是 mmdetection 中 FasterRCNN+FPN 中采用的模式。在 RetinaNet 中,用的是 ReNet 的 c3,c4,c5 得到 p3,p4,p5,之所以不用 c2,在原 paper 中说的是 c2 计算量太大,往上移一下有利于大物体的检测(由此我认为假如是在实际应用中,可以根据具体情况去使用 c2 ,这样可以提高小物体识别的效果),另外一点的修改是并不使用 p5 去生成 p6,p7,而是用原始 c5 经过 stride2 3x3 conv 去生成 p6,然后 p6 再通过一层 stride2 3x3 conv 去生成 p7。到 FCOS 以及 ATSS 中,也是使用 c3,c4,c5 得到 p3,p4,p5,然后是通过在 p5 上用两层 stride2 3x3 conv 分别得到 p6,p7,从 FCOS 的 paper 来看,这两种用法的效果差不多。
输入图片统一 resize 成 1333x800 ,训练方法是 SDG,momentum=0.9, weight decay=0.0001, batch_size=16 (8 GPU x 2 images/GPU),训练 90k 个 iteration (12 epoch x 14659/2),初始 learning rate=0.01,在 60k(8 epoch) 以及 80k(11 epoch) 的时候把 learning rate 除以 10。以上都是比较常规的操作。
inference 时,将图片同样 resize 成 1333x800,得到预测的 bbox 和 class scores,滤掉 score 小于 0.05 的,然后每个 feature level 输出最高的 1000 个结果。然后进行极大值抑制(NMS),每个类别内的 iou 阈值是 0.6,最后每张图片输出 score 最高的 100 个预测。
对比实验的结果如上图所示,用 RetinaNet(#A=1) 来表示每个 feature point 只有一个 anchor 的 RetinaNet。FCOS 的 paper 中指出 FCOS 要比 RetinaNet(#A=1) 效果好,37.1 vs. 32.5 。除此之外,FCOS 还有一些额外的改进,比如将 centerness 的分支移到了 regression branch,使用 GIoU loss function,用对应的 stride 来归一化回归的目标。这些改进将性能从 37.1 提到了 37.8。从 32.5 到 37.8 的过程中,有一部分是因为一些通用的改进方法,比如在检测头加 GroupNorm,回归时使用 GIoU loss function,限制正样本在 ground truth 内部,加入 centerness,每个 feature level 添加一个可以训练的 scale 参数。ATSS 中指出,这些都可以加到 anchor-based detector 中,所以不是 anchor-based 和 anchor-free 的根本区别,在 RetinaNet(#A=1) 中依次加入上述改进来消除这些影响,可以看到:
- 在检测头加 GroupNorm(+0.9)
- 回归时使用 GIoU loss function(+0.5)
- 限制正样本在 ground truth 内部(+0.4)
- 加入 centerness (+1.5)
- 每个 feature level 添加一个可以训练的 scale 参数(+0.2,这个提高不多,是因为 anchor-based detector 每个 feature level 对应的 anchor 大小是不同的,这里取代了 anchor-free 中那个可训练的 scalar 的作用)
如此得到最终 37.0 的 RetinaNet,但是和 37.8 的 FCOS 还是有 0.8 的差别,ATSS 表明这其中蕴含着 anchor-based 和 anchor-free 之间惊天动地的本质区别。
至此,这两者只存在两点不同:
- 分类分支不同:定义正负样本的方式不同
- 回归分支不同:一个从 anchor box 回归,一个从 anchor point 回归
对于分类分支:RetinaNet 使用 IoU 来从不同的 feature level 区分正负样本,首先标注每个 ground truth 最合适的 anchor,这一步骤将 IoU>\theta_pIoU>θp 的定义为正样本,然后把 IoU<\theta_nIoU<θn 的定义为负样本,剩下的 anchor 则忽略掉。FCOS 使用空间以及尺度限制来定义正负样本,首先考虑在 ground truth 框中的 anchor point,认为他们是候选正样本,然后选择根据之前定义的每个 feature level 的尺度范围再进一步地确定正负样本,未被选择地 anchor points 视为负样本。
从表中可以看出将 IoU 选取法改成 空间及尺度约束 可以从 37.0 提升至 37.8 。
对于回归分支:正负样本确定之后,RetinaNet 从 anchor box 开始回归,回归的目标是 anchor box 和 ground truth 之间的四个偏移;FCOS 从 anchor point 开始回归,回归的目标是 anchor point 到四个边的距离。从表中可以看出当使用相同的正负样本定义时,这两种回归方法是没有明显区别的。
结论:单阶段 anchor-based 和 center-based 的区别本质上是正负样本的定义。
ATSS
基于此,文章中提出 Adaptive Training Sample Selection (ATSS)。
之前的样本选取策略(sample selection strategies) 总是会有一些比较敏感的超参数,比如 anchor-based 中的 IoU 阈值以及 anchor-free 中的尺度范围。当这些超参数确定之后,所有的 ground truth 必须根据确定的规则来选择正样本,这对大多数物体是合适的,但是对于一小部分物体而言并不合适。
流程大概是:
- 对于每个groundtruth,计算每个anchor到groundtruth的L2 distance,保留距离较近的anchor作为备选正样本anchor集合
- 对于备选正样本anchor 中的每个anchor, 计算和其对应groudtruth的IoU ,然后计算的均值和标准差
- 选取作为IoU的阈值,只有中与groundtruth IoU大于阈值的anchor被选为正样本anchor
- 保持正负anchor的总数一定
ATSS 自动根据物体的统计特性来选择正负样本,几乎没有超参数。对于每一个 ground truth,首先在每个 feature level 上选取 kk 个离 ground truth 中心最近的 anchor box。假设有 L 个 feature level,一个 ground truth 就会有 kL 个候选正样本。之后再计算这些候选正样本与 ground truth 之间的 IoU,对于每个 ground truth ,计算 IoU 的均值 mm 和方差 vv,设置 t=m+vt=m+v 为该 ground truth 的 IoU 阈值,令 IoU 大于等于 tt 的样本为最终的正样本。除此之外,还限制了样本的中心必须在 ground truth 内部;假如一个 anchor box 被赋给了多个 gt,只选择 IoU 最高的那个 gt 进行回归。剩下的就是负样本。
一些动机解释:
根据中心距离来选取样本: RetinaNet 中,IoU 越大,anchor box 的中心离 gt 的中心就越近;FCOS 中,anchor point 离 gt 的中心越近,检测质量越高,因此中心较近的候选框更好一些
用均值和方差的和作为 IoU 阈值: IoU 的均值衡量了该物体和预先定义的 anchor 之间的合适程度。比较高的均值意味着候选框质量很高,因此 IoU 阈值应该高;比较低的均值意味着候选框质量较低,因此 IoU 阈值应该低。比较高的标准差意味着存在一个 feature level 和这个 gt 非常合适,均值加上该标准差之后可以只从这一 level 选择样本;比较低的标准差意味着多个 feature level 都很合适,均值加上标准差之后可以从多个 feature level 选择样本。
限制正样本的中心在gt内部: 中心在 gt 之外的 anchor 使用的是 gt 之外的特征,所以这样的样本不好,应该去掉。
保持不同物体之间的公正: 根据统计学,大约有 16% 的样本在置信区间 [m+v,1][m+v,1] 中。尽管 IoU 的分布不是一个标准正态分布,统计结果显示每个物体大概有 0.2kL0.2kL 的正样本。这个数量与他的尺度、宽高比以及位置都无关。而 RetianNet 和 FCOS 中较大的物体倾向于有更多的正样本(并不是这样吧,RetinaNet 较大的 anchor 在较高的 feature level 上,同时比较稀疏,平均下来一看并不会产生这种现象)
几乎没有超参: 只有一个超参 kk,并且实验证明 kk 的取值对结果影响较小。
验证部分:加过改进后的 RetinaNet(#A=1) 达到了 37.0,在此基础上加 ATSS,可以到 39.3 (+2.3)。因为 ATSS 只重新定义了正负样本,因此带来的额外开销可以忽略不记。对于 FCOS,ATSS 也可以加进去,精简版只加入了 center sampling,从 37.8 提升到了 38.6 (+0.8),其中每个 feature level 仍有尺度限制;完整版则全部使用 ATSS,从 37.8 提升至 39.2,在 center sampling 的基础上 +0.6,整体 + 1.4。这两种版本的候选框选择是相同的,确定最后的选择结果时使用的方法是不同的。
分析:
超参 kk: 从实验结果来看整体影响较小。
anchor 大小: 之前的实验中,anchor 的大小是 8S8S ,SS 是每个 feature level 的 stride (8,16,32,64,128,8S8S 则是 64,128,256,512,1024),改变 anchor 的大小和宽高比,发现对结果的影响较小。
比较:在 \verb|test-dev|test-dev 上进行比较,使用多尺度训练:在 640-800 中随机选一个值来作为 resize 后的短边长,然后把训练时间从 90k 延长至 180k,学习率减小的时间也移动到了 120k 和 160k。
讨论:考虑在每个位置放更多的 anchor,之前考虑的都是每个位置一个 anchor RetinaNet(#A=1) ,现在考虑 RetianNet(#A=9) ,此时 AP 为 36.3(RetinaNet(#A=1) 时为 32.5),加上之前提到的改进,可以提升至 38.4,再加 ATSS 可以提升至 39.2,此时和 RetinaNet(#A=1)+ATSS 的结果相差非常小。可以说,只要选择正负样本的策略是合适的,在一个位置放多少 anchor,以及放什么样大小、宽高比的 anchor,对最终的影响都是较小的。
知乎解读
如何评价zhangshifeng最新的讨论anchor based/ free的论文? - 知乎
解读1
作者:张士峰
链接:https://www.zhihu.com/question/359595879/answer/927861326
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
感谢楼主的提问,以前都是偷偷看各位大佬们在知乎上提问和讨论的,现在有机会来回答一下。首先想跟楼主说一下,就是问题最后的那个描述“这篇论文是否说明anchor-based的方法在未来目标检测可能要被淘汰 ?”感觉描述这篇论文不是很合适,因为这个工作主要是探索anchor-based和anchor-free的区别与联系,并没有说哪个要被淘汰。
回到正题,最近anchor-free的检测出了很多优秀的论文,不少大佬都有对anchor-based和anchor-free进行分析,其中指出过说,只铺1个anchor的RetinaNet和类似FCOS的anchor-free方法非常像,这也是我们这个工作的出发点。既然两者非常像,为什么性能存在不少的差距?为了分析导致两者性能差异的本质区别,我们首先把一些实现差异排除掉,FCOS提出或使用了几点改进,这些改进在RetinaNet中也work,因此我们把这些改进都加到了只铺1个anchor的RetinaNet中。此时的RetinaNet与FCOS还有差不多1个点的性能差距,而两者的不同仅剩正负样本的选取和回归的起点。一开始我们猜想是,这两个不同都会导致最终性能的差异,但实验结果表明,回归的起点对结果影响不大,主要是正负样本的选取导致的性能差异。所以,除了提出一些通用的改进外,FCOS还提出了一个更好的正负样本选取方式,它比RetinaNet中基于固定IoU选取正负样本要有更好的表现。
受此启发,我们就对正负样本的选取进行了一些探索,提出了一个adaptive的选取方式ATSS,在几乎没有超参的情况下,对只铺1个anchor的RetinaNet涨2.3个点,对铺多个anchor的RetinaNet涨0.8个点,对FCOS涨1.4个点(FCOS不加center sampling结果是37.8,我们的center sampling是只用了ATSS的第一步,能涨到38.6,再用ATSS剩下的步骤能涨到39.2)。虽然ATSS需要借助于铺设1个anchor来选取正样本,但无论这1个anchor铺什么比例,或铺多大尺寸,ATSS提升都挺稳定,主要是因为ATSS会根据目前所铺设的anchor,自适应地根据统计信息来选取合适的正负训练样本。
另外一点,我们发现使用ATSS后,只铺1个anchor的RetinaNet和铺3~9个anchor的RetinaNet结果基本一致。铺多个anchor的目的之一是提供更多的正样本,同时解决FCOS中提到的ambiguous samples问题。但铺多个anchor会带来两个问题,一是负样本的大量增加,二是需要同一个特征点来预测多个不同的类别。这两个问题会加剧分类的难度。我们猜想,这是在使用恰当正负样本采样策略后铺一个anchor和多个anchor性能没区别的原因。因此,铺设多个anchor还需进一步研究来发挥它的作用。
以上说的都是在one-stage的anchor-based算法和center-based的anchor-free算法中验证。知乎网友也说了有些类似的实验结果或结论,感谢知乎网友的点评以及对我们的看重,着实压力很大,后面会努力,做出更solid的解决办法。
解读2
作者:王剑锋
链接:https://www.zhihu.com/question/359595879/answer/927936835
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
看到这篇paper的第一反应是比较失落,因为我们组也在做很类似的事情,但走了很多惨绝人寰的弯路。等看完code之后发现和预想的有点出入,总体上是比较遗憾和失望,下面会提到为什么。
ATSS的实际motivation大概率是来自FreeAnchor。FreeAnchor告诉了我们anchor matching(或者说label assign)这个地方是有油水的。说起来我有个同事上半年就想做label assign,但是这个环节非常不好做上限分析,就一直没有开始做,也是直到FreeAnchor出来才开始做。我对FreeAnchor的评价还不错,可惜细节比较多,一些实现方式也不太好做更深的分析。(另外吐槽一下知乎上对FreeAnchor的讨论都是什么鬼。)
类似的paper其实之前也有,最像的是PISA,虽然表现形式完全不同,本质却是非常相似,都是「对于每个ground-truth,依照某种指标取top-k个sample,再在loss上进行一下re-weight」。
有了FreeAnchor之后,挪到FCOS上做一个“FreeFCOS”好像是一个非常直接的想法,毕竟FCOS就是RetinaNet的一个简单变种而已。事实上我们组在几天之内就成功跑出了一版可以跑到39.2的FreeFCOS(简单移植,没有novelty不值得写paper),我当时还立了一个半个月内做过40的flag,但再往后就像遇到了次元壁一样无论怎么做都提不上去了。
ATSS虽然基本上照搬了FreeAnchor的matching部分,但毕竟形式上比FreeAnchor简洁太多了,总体上很清爽。只是有两处问题我觉得蛮硬伤的:
- 去掉了FCOS的hand-crafted分层(告诉ground-truth归哪一层feature map管),但是依然需要保留一个有面积的anchor,实质上还是在用这个面积来进行hand-crafted分层,而且这个面积会和RetinaNet的anchor一样critical。Table 5告诉我们这个面积不敏感,但Table 5的范围太窄了,我推测RetinaNet也有差不多的robustness。而FreeFCOS是可以不分层的。
- mean+std这个threshold恐怕大概率是试出来的;4.1中最后一段对此做了解释,但是非常牵强:首先引入1σ分位点的概念,但top-k的iou还满足正态分布这个就很鬼畜了;另外这里提到了一个20%,我个人推测这个threshold能work的原因很可能是因为feature map有5层,每层取一样多的k个,那ground-truth落在某一层的概率就是20%;也就是说,真正本质的threshold可能是让最终的正样本大致落在同一层上比较好,和mean、std、正态分布之类的都没什么关系。也就是说,也还是hand-crafted分层的一部分。
这两处问题合在一起,会导致整个方法其实根本不是adaptive的,因为不管网络训练到什么程度,对于一个ground-truth,ATSS给它match到的anchor(看起来会变但)始终都没变。因为anchor不会变,anchor和ground-truth的中心点距离和iou也就不会变,根据距离算出的每层的top-k也就不会变,threshold也是根据iou算出来的,于是最终的正样本也就不会变。哪里adaptive了呢?
真正的adaptive我觉得应该做到两点:(1) 没有anchor;(2) 也不要做其他形式的hand-crafted分层。孙剑老师曾经challenge我为什么这样是有价值的?我当时的回答是,我们有很多个项目,模型本身是一模一样的,但因为数据resolution不同,ground-truth的size不同,每个项目拿过来都要重新调anchor或者调分层参数,不仅是研究员和工程师的精力成本,也是自动化的障碍,在学术上还是更好解scale问题的阻碍;这个事,能不能训练的时候自己就学了?甚至,能不能其他一些辅助训练的threshold也自己就选好了?至少目前的detection方法还做不到。
至于ATSS的另一个贡献,即bridging the gap,我觉得这个应该算是FCOS文里就该指出来但是遗憾没有指出来的东西,如果换成更老辣的人(比如FAIR)来做FCOS,可能早就没有这个问题了。(题外话,FCOS不成熟的地方有好几处,有一部分被impr版fix了,有的现在也没有)。
还有一个问题可能值得一提,就是label assign的上限问题。由于label assign没有ground-truth,我们很难做上限分析,不知道还有多少空间可以做。关注label assign的除了FreeAnchor、PISA、ATSS之外,还有一篇与ATSS几乎同时放出来的MAL,抱歉我还没怎么看它具体怎么做的,但它的ResNet-50的结果也是39.2。虽然实现方式各有差异,但都只做到39出头。我不知道是因为我们还没有找到更好的方式,还是说label assign的空间可能已经不大了,毕竟说到底label assign也只是为了网络更好地收敛而服务的。这个需要其他人来解答了。
转载&参考
ATSS: Bridging the Gap Between Anchor-based and Anchor-free Detection via ATSS 笔记 - winechord - 博客园
解读《Bridging the Gap Between Anchor-based and Anchor-free Detection》_watermelon1123的博客-CSDN博客 如何评价zhangshifeng最新的讨论anchor based/ free的论文? - 知乎