DETR 的出现掀起了一波端到端检测器的高潮,各种结构下 FCN(DeFCN, OneNet 等),R-CNN(Sparse R-CNN 等),DETR (DETR,Deformable DETR,DINO 等)都出现了对应的端到端检测器。
我们在 CVPR 2023 发表的 Dense Distinct Query for End-to-End Object Detection 中,以统一的视角重新审视了当前主流检测器的设计并指出了他们各自的问题,并提出了我们的范式 Dense Distinct Query + One to one Assignment。我们在 FCN,RCNN,DETR 三种结构上都取得了显著的提升,在 COCO 与 CrowdHuamn 都达到了对应结构的 SOTA,其中 DDQ DETR 在 12 epoch 下就可以在 COCO 达到 52.1 AP。
代码早早开源,欢迎大家试用。
paper:
接下来我们将按照以下顺序为大家介绍我们的工作。
首先为了建立统一视角,我们认为传统检测器中 anchor & anchor points 的概念与 DETR 中 learned query 担任同样的角色与作用,可以认为 DETR 中的 query 是 sparse 的 anchor, anchor & anchor points 则是 在feature map 上密集分布的 query,不失一般性,在本文中我们使用后面的指代方法。
那么按照 query 是 dense 还是 sparse, label assignment 策略是 one-to-one 还是 one-to-many,已存的检测器可以分类为 a, b, c 三种。
DETR 之前几乎所有检测器都是这样一个范式,即为了保证足够的 recall,首先在 feature map 上铺设密集的 query,然后把一个 GT 同时匹配给多个 query 进行优化。这种范式弱点在于 one-to-many assignment。此范式的代表有单阶段的 RetinaNet、FCOS,多阶段的 Faster R-CNN、Cascade R-CNN,因为也是从 dense 的 query 出发的,我们也认为属于此范式。这样的一个范式其实违背了检测的定义,因为检测的定义要求我们一个物体就出一个框以及对应的类别,也就是说我们训练的时候,优化目标跟我们问题的定义不一致,导致我们在训练结束后,不得不额外添加 NMS 之类的去重操作来重新与检测定义对齐,因为不是训完即所得,还需要一个额外的部件,我们称其不是 end to end,这也导致了它无法应对存在拥挤的同类物体的场景。在同类拥挤场景下,IOU 调低,TP 就会被滤掉了,IOU 调高,FP 就增加了。因此这些检测器都无法在 CrowdHuman 直接取得优异的性能。
最近涌现的各种 DETR 都可以认为是这种范式,这种范式的弱点在于 Sparse 的 query。一组往往是几百这个量级的随机初始化的 query 会在训练过程中逐渐收敛到固定的区域,但是由于物体检测中各种形状的物体在图片各个位置都有可能出现,几百量级的 query 即使经过 6 个 stage 的 refine 也还是难以覆蓋著如此复杂的分布。
Dense Query 与 One to One assignment 结合如何呢,这样的范式的弱点在于 dense query 中的相似 query 会导致 one to one assignment 的优化遇到困难。 这非常容易理解,相似的 query 会导致相似的输出,但是在一对一匹配下,极其相似的输出会被分配为正负相反的 label,从而导致优化困难。 并且这样的问题在 dense 时候会变得更为严重,很好理解,铺得越密,相似的 query 也就越多。单阶段的 DeFCN、OneNet 以及多阶段的 Efficient DETR、 Two Stage DETR 都可以认为存在这样的问题。
我们在这里使用 sparse rcnn 来增加其 query 数目来验证下我们提到的问题(补充材料我们展示了 Deformable DETR 也有相同的趋势)。
在 Sparse R-CNN 中,我们从几十个 query 逐步增加到 7000 左右的 query,如图中黑线,可见,在起始阶段,query 数目增加可以提高性能但是趋势逐步放缓,甚至在超过 5000 个时出现了下降。我们分析认为性能上升是因为 recall 的提高,性能提升放缓并下降是因为越来越多的相似 query 阻碍了优化。
为了验证这一点,我们在对每个 stage 的输入 query 使用一个 IOU 为 0.7 的单类 NMS 来去除相似的 query,经过这样一个操作我们发现,检测器的性能显著提高,而且性能可以随 query 数目增加而不断提高。经过这样一个分析,我们得出结论,在one-to-one assignment 下,query 应该具有的性质是 dense & distinct,即要密集来保证recall 但是又相互不一样来保证易于优化。
范式已定, Dense & Distinct Query + One to One Assignment,我们先大体介绍下 Dense & Distinct 两部分。
Dense 的实现我们就 follow 传统检测器,在 feature map 上铺设具有平移不变形的 query(anchor),并使用 conv/linear 来高效地处理他们。
Distinct 则是依靠一个具有较高阈值的单类 NMS 来完成,我们只对使用这个 NMS 挑选出的 query 进行 label assignment 并计算 loss 。 在 FCN 与 R-CNN中我们使用阈值为 0.7,DETR 中我们使用 0.8。关于这样一个 NMS 与传统 NMS 的不同以及这样一个检测器是否还是 end-to-end,我们在下一节详细讨论。
DDQ框架图:从左到右依次是将DDQ使用于 FCN,R-CNN 以及 DETR 结构的示意图
具体到每个结构,我们也为了 one-to-one assigment 的优化进行了对应结构的微小改进, 具体细节可以查看论文。
单阶段检测器端到端检测器我们基于 FCOS + One-to-one assignment,但是原有分尺度运算结构缺少一个不同尺度 query 的交互,也阻碍了优化,我们先是增加了一个 pyramid shuffle 的轻量级操作来构建不同尺度 query 的交互 (细节可以查看我们的论文),然后在 assignment 前使用 IOU 0.7 的单类 NMS 来挑选 distinct query,最后我们使用之前 DeFCN 的 one-to-many 辅助头来进一步加速收敛。下表展示了每一步的提升:
1 x 41.5 AP,基本跟 SOTA 的 one to many assignment 在 COCO上打平,同时保持在拥挤场景 CrowdHuman 上的性能优势。
我们从 Sparse R-CNN 出发,先增加到 query 数到 7000,然后每个 stage 前选择 distinct query,展现提升,最后我们将前四个 stage 换成 DDQ FCN,融合 cls branch 跟 reg branch 部分的 feature作为 Sparse R-CNN 的 content 部分的输入,下表展现了每一步的提升:
我们从 DINO 里的改进版 Deformable DETR 出发,对应的 TS D-DETR 是其 Two-Stage 版本的 baseline。由于原版 Deformable DETR 中进入第二个阶段的 content embedding 是从 4 个坐标映射,导致相似的 query 更难以被区分,因此首先类似我们在 DDQ R-CNN 中的处理,采用 feature map 上的 feature 映射为 content embedding,即表中 dense 的概念,然后我们像 DeFCN,H-DETR 一样加上 one-to-many 的辅助 loss 进一步提升 baseline,最后我们在每个 stage 前为 refine head 筛选 distinct query,性能进一步提升。
为了展示 DETR 这种结构的极限,我们使用 DINO 中的 CDN 技术,并使用 5 个 scale 的 feature map,发现仅用 12 epoch就可以达到 52.1 AP。下表展现了每步的具体提升:
可见,CrowdHuman 上我们也保持了强力的性能,大幅领先于传统检测器,相对最近的端到端检测器也保持了有事。更多实验结果可以参考我们的论文以及补充材料。
细心的读者可能发现,在讨论传统检测器的弊端时候,我们只说了在同类拥挤场景会失败,并在论文中给出了 CrowdHuman 的性能,那么在 COCO 上如何呢,我们的经验是 One to Many + NMS 并不会在 COCO 上或者说一般场景下造成明显的性能损失,也即一个 GT 的多个正样本基本是能被 NMS 完美滤掉的,这也是为什么我们在提升 FCN 结构时,我们把能与 SOTA 的 one to many assignment 持平作为一个目标。(也就是说 SOTA 的 one to many assignment + Sparse RCNN/DETR 在 COCO 上一定会有提升的的,感兴趣的同学可以整一个!)
可见盲目地追求 end-to-end 是一种不是十分经济的行为,6 个 stage 往往前几个 stage 的框就很准的,更多的 stage 往往是在调整相似框的分数。但因为 DDQ 范式下最难以区分的框已经被提前删除,留给网络鉴别的较为简单,往往只需更少的 stage 数就能保持相当的性能。 这也是为什么我们在 DDQ R-CNN 中仅仅保留了两个 stage,其实 DDQ DETR 也可以在更少的 stage 数下更好的保持性能,但是为了跟最近的 SOTA 比较我们没有这么做。
在投稿周期中,因为这个问题很多 reviewer 都提出过疑问。我们对于 end-to-end object detection 的理解是优化目标与问题定义一致,整个 pipeline 训练结束可以直接使用,而不用额外设计部件插入到 pipeline 里重新拉齐到问题定义。
传统检测器中 one-to-many assignment 与检测定义不符, NMS 是一个训练结束额外添加的部件。而在 DDQ 中, NMS 作为一个中间部件,包含在整个优化过程中,其作用是挑选 query,跟 two stage Deformable DETR 中第一个 stage 的 TOPK 没有本质区别,因此我们认为我们的范式依旧是 end-to-end 的,DDQ FCN/RCNN/DETR 三种结构在 CrowdHuman 上的强力性能也证明了这一点。