1. 摘要

这篇文章[1]针对目标检测任务给出了一个基于 Transformer 的端到端的神经网络模型 DETR,简单且有效,不再需要任何的前/后处理操作。DETR 可谓是目标检测方向上一个里程碑式的工作。作者将目标检测看作是一个集合预测问题,即给定一个图片,预测出所有的物体框的集合。通过将问题转化为集合预测的问题,结合 Transformer 结构,作者将原先目标检测模型中依赖于人的先验知识的部分(NMS 和 Anchor)都删除了,设计出一个简单的端到端架构 DETR。DETR 通过一个全局的集合 Loss,强制模型针对一个物体只会对应有一个框,而不会生成过多的冗余框。此外,在 DETR 架构中,Transformer 的解码器的输入额外有一项 Learned Object Queries,类似于可学习的 Anchor。DETR 简单且有效(但在目标检测上和 SOTA 还是差了挺多)!

2. 引言

在目标检测领域,以前的深度学习方法主要分为三种:基于 Proposal 的方法、基于 Anchor 的方法和基于 Window Center 的方法。这些方法都没有直接处理几何预测问题,而是设计了代理的回归或分类问题来间接实现目标检测任务。这些方法都会生成很多的冗余框,即针对同一物体会预测出很多多相差无几的重复框,因此都需要 NMS(非极大值抑制)后处理操作,这也导致这些方法整体都比较复杂,难以优化。

作者提出,基于深度学习的端到端模型在其它领域已经展现出了简单有效的性能,但在目标检测领域还没有真正意义上的端到端模型。为此,这篇本章便提出了一个简单有效的端到端模型 DETR。

3. 总概

DETR 的总体流程主要有四步:

  • 第一步,使用卷积神经网络抽特征;

  • 第二步,使用 Transformer Encoder 去学全局特征;

  • 第三步,使用 Transformer Decoder 去生成固定数量的预测框(DETR 默认是 100100 个);

  • 第四步,将预测的框和 GT 的框进行匹配,求 Loss。

    在训练时,看成集合预测问题,使用二分图匹配,求出和 GT 的框对应的那些框,然后再计算它们之间的分类 Loss 和 Bounding Box Loss。

    在推理时,不用计算 Loss,直接通过设定一个阈值(比如 DETR 默认 0.70.7),超出这个阈值的才被认为是物体框,未超出的都认为是背景框。

4. 方法

4.1 集合预测

从 DETR 的模型架构可以看出,主要的方法部分在于如何处理集合预测问题。作者将问题建模成一个二分图最优匹配问题,即 DETR 预测出的框和 GT 的框,然后使用匈牙利算法来进行求解。作者直接使用的 Scipy 包提供的 Linear-Sum-Assignment 函数(本质便是匈牙利算法)来求解这个问题,只需提供二分图的 Cost Matrix,如下图所示,就能求出最优匹配:

而这个 Cost Matrix 中的每一项 Cost,便是两个框的 Loss,即分类 Loss + Bounding Box Loss:

Lmatch(yi,y^σ(i))=1{ci}p^σ(i)(ci)+1{ci}Lbox (bi,b^σ(i))(1)\mathcal{L}_{\operatorname{match}}\left(y_{i}, \hat{y}_{\sigma(i)}\right) = -\mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \hat{p}_{\sigma(i)}\left(c_{i}\right)+\mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \mathcal{L}_{\text {box }}(b_{i}, \hat{b}_{\sigma(i)}) \tag{1}

使用 Cost Matrix 求得最优匹配后,再计算它们之间的总体 Loss 用于梯度下降优化:

LHungarian (y,y^)=i=1N[logp^σ^(i)(ci)+1{ci}Lbox (bi,b^σ^(i))](2)\mathcal{L}_{\text {Hungarian }}(y, \hat{y})=\sum_{i=1}^{N}\left[-\log \hat{p}_{\hat{\sigma}(i)}\left(c_{i}\right)+\mathbb{1}_{\left\{c_{i} \neq \varnothing\right\}} \mathcal{L}_{\text {box }}(b_{i}, \hat{b}_{\hat{\sigma}(i)})\right] \tag{2}

其中,Lbox (bi,b^σ(i))=λiou Liou (bi,b^σ(i))+λL1bib^σ(i)1\mathcal{L}_{\text {box }}(b_{i}, \hat{b}_{\sigma(i)}) = \lambda_{\text {iou }} \mathcal{L}_{\text {iou }}(b_{i}, \hat{b}_{\sigma(i)})+\lambda_{\mathrm{L} 1}\|b_{i}-\hat{b}_{\sigma(i)}\|_{1}

作者这里的 Lbox \mathcal{L}_{\text {box }} 除了一般的 L1 Loss,还加了 Generalized IoU Loss。这是因为 L1 和框大小有关,框越大 L1 Loss 也越大,Transformer 由于有全局信息容易出大框,因此只用 L1 Loss 不利于优化,而 Generalized IoU Loss 是一个与框大小无关的 Loss。

4.2 模型结构

5. 结果

DETR 在 COCO 数据集上和 Faster R-CNN 的基线网络达到相当的性能,而且实验发现,DETR 在大物体检测上的性能更好,这主要归功于使用了 Transformer 这种能够全局建模的结构。

5.1 对比

作者将 DETR 和 Faster R-CNN 进行了对比,在 COCO 数据集上的性能如下表所示:

其中模型后 ++ 表示为了公平比较,对原来模型同样使用了 DETR 的一些 Trick,比如使用 GLU 而不是 ReLU 等。可以看到,Faster RCNN 在小物体上的检测效果要更好,但 DETR 在大物体上的检测效果更好。

作者对 Learned Object Queries 进行了可视化展示,如下图所示,Learned Object Queries 的确学习到类似 Anchor 的机制:

5.2 消融

5.2.1 Encoder

作者对比了使用不同数量的 Encoder 层的效果,如下表所示:

并给出了 Encoder 的可视化说明,如下图所示,Encoder 的确学习到物体所在的位置:

5.2.2 Decoder

作者对每一层的 Decoder 输出都计算了 AP 值,可以看到,每一层 Decoder 输出都提升了性能,且 NMS 对 DETR 的影响甚微,也即说明 DETR 可以不需要 NMS。

Decoder 的可视化展示如下,可以看到,Decoder 的注意力非常准确:

5.3 Position Encoding

作者还比较了使用不同的位置编码以及在何处加上位置编码的效果,如下表所示:

5.4 Loss

作者也比较了使用不同的损失函数的效果,如下表所示:

6. 实现

作者为了显示 DETR 的简单性, 还在文中直接贴出了 DETR 的 Pytorch 代码,确实很简洁:

7. 讨论

DETR 在目标检测任务上虽然性能没有超过 SOTA,而且训练也非常耗时,但其后续工作如 Deformable DETR 层出不穷,并且也解决了这两个问题。

此外,作者还将 DETR 用在了全景分割上,并取得了非常好的效果:

DETR 在全景分割任务上的性能对比如下表所示:

8. 总结

DETR 是一个全新的端到端的目标检测架构,其使用了 Transformer 和二分图匹配来将目标检测看作是一个集合预测问题,具有很大的发展潜力。DETR 在大物体检测上表现的很好,但在小物体上则不尽意。此外,DETR 训练比较耗时,这也是未来可以改进的方面。

附录


  1. Carion, N., Massa, F., Synnaeve, G., Usunier, N., Kirillov, A., & Zagoruyko, S. (2020, August). End-to-end object detection with transformers. In European conference on computer vision (pp. 213-229). Springer, Cham. ↩︎