论文:https://arxiv.org/abs/2005.12872
代码:https://github.com/facebookresearch/detr
第一个将 Transformer 成功整合为检测 pipeline 中心构建块的目标检测框架。基于Transformers的端到端目标检测,没有NMS后处理步骤、真正的没有anchor,且对标超越Faster RCNN。
效果如下:
可以看到,DETR模型可达到与经过严格调整的Faster R-CNN基线相当的结果。
Detection Transformer或DETR的新框架的主要组成部分是基于集合的全局损失函数,该损失函数通过二分匹配和transformer编码器-解码器体系结构强制进行唯一的预测。给定一个固定的学习对象查询的小集合,DETR会考虑目标对象与全局图像上下文之间的关系,并直接并行输出最终的预测集合。
与许多其他现代检测器不同,新模型在概念上很简单,并且不需要专门的库。DETR与具有挑战性的COCO对象检测数据集上公认的且高度优化的Faster R-CNN baseline具有同等的准确性和运行时性能。此外,可以很容易地将DETR迁移到其他任务例如全景分割。
Detection Transformer可以预测所有物体的剧烈运动,并通过设置损失函数进行端到端训练,该函数可以在预测的物体与地面真实物体之间进行二分匹配。DETR通过删除多个手工设计的后处理过程例如nms,对先验知识进行编码的组件来简化检测流程。与大多数现有的检测方法不同,DETR不需要任何自定义层,因此可以在包含标准CNN和转换器类的任何框架中轻松复制。
Transformer 是深度学习领域非常受欢迎的一种架构,它依赖于一种简单但却十分强大的机制——注意力机制,使得 AI 模型有选择地聚焦于输入的某些部分,因此推理更加高效。
Transformer 广泛应用于序列数据的处理,尤其是在语言建模、机器翻译等自然语言处理领域。它由编码组件、解码组件和它们之间的连接组成。如下:
其中编码组件部分由一堆编码器(encoder)构成(论文中是将6个编码器叠在一起)。解码组件部分也是由相同数量(与编码器对应)的解码器(decoder)组成的。
所有的编码器在结构上都是相同的,但它们没有共享参数。每个解码器都可以分解成两个子层。
在Transformer的encoder中,数据首先会经过一个叫做‘self-attention’的模块得到一个加权之后的特征向量,它会被送到encoder的下一个模块,即Feed Forward Neural Network。这个全连接有两层,第一层的激活函数是ReLU,第二层是一个线性激活函数。
解码器中也有编码器的自注意力(self-attention)层和前馈(feed-forward)层。除此之外,这两个层之间还有一个注意力层。
DETR的思想如下:
DETR通过将常见的CNN与transformer架构相结合,直接(并行)预测最终的检测结果。 在训练期间,二分匹配将唯一的预测分配给GT框。 不匹配的预测应产生“无对象”(∅)类预测。
DETR的流程大为简化,可以归结如下:Backbone -> Transformer -> detect header。
将DETR的结构在具体化,可以表示如下:
DETR使用常规的CNN主干来学习输入图像的2D表示。 模型将其展平并在将其传递到transformer编码器之前对其进行位置编码补充。 然后,transformer解码器将少量固定数量的学习的位置嵌入作为输入,我们称其为对象查询,并另外参与编码器的输出。 我们将解码器的每个输出嵌入传递到预测检测(类和边界框)或“无对象”类的共享前馈网络(FFN)。
可以看到分为几个主要模块:backbone -> encoder -> decoder -> prediction heads(看到encoder和decoder的画图想起了数字电路,万物皆相。。。。)
传统的CNN主干会生成较低分辨率的激活图f∈R C×H×W。 DETR使用的典型值是C = 2048和H,W = H0 / 32,W0 / 32。
首先,使用1x1卷积将高级激活映射的特征图f的通道维从C减小到较小的d, 创建一个新的特征图z0∈R d×H×W。 编码器期望一个序列作为输入,因此DETR将z0的空间尺寸折叠为一个尺寸,从而生成d×HW特征图。 每个编码器层均具有标准体系结构,并包括一个多头自我关注模块**(self-attention module)和一个前馈网络(FFN)**。 由于转换器的体系结构是置换不变的,因此DETR用固定的位置编码对其进行补充,该编码被添加到每个关注层的输入中。
解码器遵循transformer 的标准体系结构,使用多头自编码器和编码器-解码器注意机制转换大小为d的N个嵌入。与原始转换器的不同之处在于,DETR模型在每个解码器层并行解码N个对象,而Vaswani等人 [47]则是使用自回归模型,一次预测一个元素的输出序列。
由于解码器也是置换不变的,因此N个输入嵌入必须不同才能产生不同的结果。 这些输入嵌入是学习的位置编码,我们将其称为对象查询,并且与编码器类似,我们将它们添加到每个关注层的输入中。 N个对象查询由解码器转换为嵌入的输出。 然后,它们通过前馈网络(在下一个小节中进行描述)独立地解码为框坐标和类标签,从而得出N个最终预测。
利用对这些嵌入的自编码器和解码器注意力,该模型使用它们之间的成对关系,全局地将所有对象归结在一起,同时能够将整个图像用作上下文。
最终预测是由具有ReLU激活功能且具有隐藏层的3层感知器和线性层计算的。 FFN预测框的标准化中心坐标,高度和宽度, 输入图像,然后线性层使用softmax函数预测类标签。 由于我们预测了一组固定大小的N个边界框,其中N通常比图像中感兴趣的对象的实际数量大得多,因此使用了一个额外的特殊类标签∅来表示在未检测到任何对象。 此类在标准对象检测方法中与“背景”类具有相似的作用。
作者发现在训练过程中在解码器中使用辅助损耗auxiliary losses很有帮助,特别是有助于模型输出正确数量的每个类的对象。DETR在每个解码器层之后添加预测FFN和Hungarian loss,所有预测FFN共享其参数。 我们使用附加的共享层范数来标准化来自不同解码器层的预测FFN的输入
以上即为DETR的结构说明,文后作者给了更为具体的DETR结构:
上图给出了DETR中使用的转换器的详细说明,并在每个关注层传递了位置编码。来自CNN主干的图像特征通过了转换器编码器,并将空间位置编码与添加到查询和键处的空间编码一起传递。 然后,解码器接收查询(最初设置为零),输出位置编码(对象查询)和编码器内存,并通过多个多头自我关注和解码器-编码器关注来生成最终的一组预测类标签和边界框。 可以跳过第一解码器层中的第一自我注意层。
感想:
参考
https://blog.csdn.net/longxinchen_ml/article/details/86533005
https://blog.csdn.net/sinat_17456165/article/details/106394492?fps=1&locationNum=2