来源:arXiv:2005.12872v3, Facebook AI
代码:https://github.com/facebookresearch/detr
Transformer入侵CV。目标检测目前的框架包括mmdetection等对于检测领域挺好用的,但对于其他领域而言可能就挺难上手的,集成度有点太大:( Facebook傲娇的不适用已有的检测框架,支持。另一方面,将大热的transformer纳入cv领域的基础目标检测,必然引起cv领域transformer化的热潮。个人更欣赏这种暴力美学,目标检测目前发展有些过多设计的痕迹,让人对其泛化能力还是有所怀疑的。当然DETR把暴力推的太远,肯定会有些工作把他往回拉,但这个工作还是开创了一个新的思路的,让人兴奋。值得仔细读一下。
摘要
我们提出了一种新的检测方法将目标检测任务直接视作为集合预测问题。该方法有效的移除了传统深度检测方法中的许多手工设计的部件以简化检测流程,如非极大值抑制和anchor生成,其中anchor显式的编码了检测任务的先验知识。我们提出框架,DEtection TRansformer(DETR)的主要成分是一种基于集合的全局损失和一个transformer编解码框架,其中基于集合的全局损失通过二部匹配保证单一预测。给定已学习的的固定的小规模目标查询集合, DETR推理目标之间的关系以及图像全局信息进而以并行的方式直接输出最终的预测集合。该新模型概念简单,且不像其他的一些现代检测器那样需要一些特定的库。DETR在COCO目标检测数据集上展现了和Faster RCNN可比的精度和速度表现。更让人期待的是,DETR能够很方便的扩展到全景分割任务中,实验展示了相对于一些基线方法的较大优势。
介绍
目标检测的目标是预测感兴趣目标的bbox和类别标签集合。modern检测器以一种间接的方式处理集合预测问题,即转换为基于大规模候选框、anchors或者windows中心点上的回归和分类问题。这类方法的性能受制于一些手工设计策略,比如用于处理近重复预测的后处理步骤、anchor集合的设计以及anchor与gt的分配策略等。为了简化检测流程,我们跳过代理方式直接预测输出集合。这种端到端哲学在一些复杂的结构化预测问题,比如机器翻译和语音识别,上都取得较好反馈,但在目标检测上尚未推广。之前的一些假设要不添加其他形式的先验知识,要不没有证明在挑战性数据集上能获得与强baseline可比的性能。本文目标是填补之一缺陷。
我们将目标检测问题直接视作集合预测问题以简化训练流程。我们采用了基于transformers的编解码框架,该框架被广泛应用于序列预测。transformers中的自注意力机制使该框架非常适合于集合预测的特定约束比如移除重复预测等,自注意力机制显示的建模了序列中元素对之间的交互关系。
如图1所示,DETR能够一次性预测所有的目标,其训练采用一种集合损失函数以端到端方式进行。集合损失定义在预测结果与真实目标的二部匹配结果上。DETR扔掉了当前主流检测器中手工设计的一些用于编码先验知识的模块,比如空间anchor和非极大值抑制等,简化了检测流程。不想已经存在的其他检测方法,DETR不需要任何定制的层,因此能够便捷的在任何包含transformer和CNN的深度框架中进行复现。
与当前的大多数直接set预测方法相比,DETR的主要特点在于二部图损失和并行编码的transformers的结合。与之相反的是,之前的方法往往聚焦于使用RNN进行autoregressive的编码。我们的匹配损失能够将一个预测唯一的分配给一个gt,且对于预测目标具有排列不变性,因此能够并行处理。
我们在一个广泛使用的目标检测数据集COCO上虞当前较强的检测方法Faster R-CNN进行了对比。Faster R-CNN已经经过了好多次迭代设计,相较于其原始版本性能有较明显的提升。我们实验表明提出的模型具有可比的性能。更具体而言,DETR在大目标上性能提升明显,该提升可能源于transformer中的non-local计算。然对于小目标而言,性能较差。我们希望后续工作能通过FPN对于Faster R-CNN一样的路径改善这个问题。
DETR的训练策略和标准的目标检测器有许多不同。新模型需要更长的训练周期,并且transformer中辅助的编码损失有利于性能的提升。我们详细探索了哪些部件对于性能提升至关重要。
DETR能够被便宜的拓展到更复杂的任务中。在我们的实验中,我们验证了在预训练的DETR中引入简单的分割头就能获得比baseline方法优越的全景分割结果(全景分割是指最近流行的逐像素识别任务)。
相关工作
我们的工作建立在一些领域的已有工作基础上:集合预测中的二部图匹配损失, 基于transformers的编解码结构,并行编码以及目标检测方法。
集合预测
目前并没有标准的用于直接预测集合的深度模型。最基础的集合预测任务是多标签分类,而其基线方法one-vs-rest并没有应用于检测任务,因为检测任务中元素之间有潜在的结构性(例如ID相近的目标框)。这些任务中的首要问题是避免近似重复。绝大多数当前的检测器都利用后处理方法,比如NMS,处理这个问题,但是直接的集合预测是不需要后处理过程的。他们需要全局的推理框架,用以建模所有预测结果之间的关系进而避免冗余。对于固定大小的集合预测问题,密集全连接网络可以解决但是代价太大。更一般的方法是采用auto-regressive序列将该问题建模为RNN网络。在所有的情况下,损失函数相对于预测都应该具有排列不变性。最常见的解决办法是设计一种基于匈牙利算法的损失函数,找到gt与predict之间的二值匹配。这样能够保证排列不变性且保证了每个目标只有唯一的匹配结果。我们采用了二部图匹配损失的思路。然而,与当前大多数方法不同的是,我们抛开了auto-regressive模型,使用的是可以并行编码的transformers框架。
Transofmers和并行编码
Transformers是由Vaswani提出的一种新的用于机器翻译的注意力模块。注意力机制是用于从整个输入序列中聚合信息的网络层。Transformers和Non-local网络一样引入了自注意力机机制,遍历序列中的每个元素并通过整个序列的聚合信息更新该元素。基于attention的模型的一个主要优势在于他全局计算与记忆,使其相对于RNN更适合于长时序列。Transformers现在已经在NLP,CV和语音处理等多个领域上取代了RNN。
仿照早期序列到序列的模型,Transformers首先在auto-regressive模型中使用,逐个产生输出向量。但是其令人望而生畏的推理代价(正比于输出长度,且难以用于batch方式处理)促使并行序列生成方法的发展,比如audio领域,机器翻译,词嵌入学习以及最近的语音识别。我们同样的将transformers和并行编码融合用于权衡集合预测中的计算代价和性能表现。
目标检测
多数目标检测器都是预测相对于初始猜测的偏差。两阶段检测器预测box相遇于proposal的差异,而单阶段模型则是相对于anchors或者目标中心点可能存在的网格的差异。最近的工作[52]证明,这些模型的最终性能严重依赖于他们初始猜测的集合的精度。在我们的模型中,我们移除了这些手工处理的过程,通过直接预测具有绝对box的检测集合(即相对于整张图象,而非anchor)简化了检测过程。
基于集合的损失。 一些目标检测器利用了二部图匹配损失。但是在这些早期的深度模型中,不同的预测之间的关系一帮使用卷积或者全连接层建模,且手工设计的NMS操作能够提升其性能。更新的检测器[23,37,53]则使用了gt与预测间非唯一分配策略以及NMS。
可学习的NMS策略以及关系网络显式的用注意力建模了预测之间的关系。直接使用set损失,不需要任何后处理过程。然而这些方法仍然利用了想候选框坐标这些手工设计的上下文特征去有效建模检测之间的关系,而本文寻求不适用任何先验知识的解决方案。
循环检测器。 与我们思路最接近的是用于目标检测的集合预测[43]和实例分割[30,36,41,42].和我们相似,他们使用了二部图损失以及基于CNN激活的编解码结构直接预测bbox的集合。然而这些方法只在小的数据集上进行了对比,并没有对比大的数据集。值得注意的是,他们急于autoregressive模型,更具体是RNN,因此无法使用最近提出的具有并行编码的transformers。
DETR模型
检测中直接使用集合预测有两个重要的点:1.能够强制保证gt与预测一一对应的集合预测损失;2.能够一次性预测出目标集合以及建模其中关系的网络结构。
目标检测集合预测损失
DETR通过编码器一次前向推理预测出长度为N的固定大小的集合,N显著大于图像中能具有的目标数。训练该模型的一个主要难点在于评估预测相对于gt的质量。我们的损失函数先预测和gt之间计算一个最优的二部图匹配,然后监督特定目标的损失函数。
假设用表示目标的gt结合,表示N个预测,N大于图像中存在的目标数,我们使用空集配平gt数和预测数。为了找到两个集合中最有二部图匹配,我们找到如下的N个u元素排列:
其中,是gt与预测的匹配损失。该优化问题能够通过匈牙利算法进行有效求解。
该匹配代价同时考虑了类别预测以及预测和gt之间的相似度。gt的每个元素表示为,其中是目标类别(可能为),是相对于图像size的gt目标的中心点坐标以及宽高。对于索引为的预测,我们将其属于类别的概率表示为,其预测的框表示为. 于是使用这些符号可以定义匹配损失:
这个寻找最优匹配的过程类似于当代检测器中将proposals或者anchors分配给gt的过程。关键不同点在于直接集合预测寻找的是一一匹配,因此避免了重复预测。
第二步是计算上一步中所有匹配对的匈牙利损失。我们使用的损失函数和一般的检测器相似,即用于类别预测的负对数似然函数和后续定义的box回归损失的线性组合:
其中是上一步中获得的最优匹配。在实际应用中,我们对于为空的类别预测项系数除以10以平衡类别。这个操作和Faster RCNN训练过程中通过下采样平衡正负候选类似。注意目标和空集在匹配损失(Eq1)中是个常数,并不依赖于检测。在匹配损失中我们直接使用概率而非对数值是为了让类别预测项与box损失一个量级,我们发现这种效果更好。
bbox 损失。 匹配损失和匈牙利损失的第二部分是用于评价bbox的。 不像其他一些检测器预测box相对于一些初始猜测的偏量,我们直接预测box。尽管该方法简化了操作,但是带来了一些损失的相对尺度问题。最常用的L1损失对于大小不同的目标即使相对error类似但是尺度差异挺大。为了缓解该问题,我们使用L1损失逾GIOU损失的联合,GIoU是尺度不变的。最终我们的box损失定义为,这两项损失在batch中使用目标个数进行归一化。
DETR的结构
DETR的结构如图2所示非常简单。主要包括三个模块:CNN的backbone用于压缩和抽取特征表示,编解码transformer,以及一个简单的前向网络(FFN)用于输出最终预测结果。
和其他一些现代的检测器不同,DETR能在任何提供了普通CNN和transformer结构的深度学习框架中使用几百行代码简单实现。PyTorch中DETR的推理代码不足50行。我们希望我们方法的简洁性能吸引更多的研究人员进入目标检测领域。
Backbone 输入初始的图像, 传统的卷积网络生成了一个更低分辨率的特征图。 典型值为.
Transformer 编码器. 首先,使用一个1x1的卷积核将f的通道由C降为d,生成新的特征图. encoder的输入是一段序列,因此我们将Z0的空间维度拉成列向量,产生的特征map。每个encoder层具有相同的结构,包含了一个多头自注意力机制以及一个前向网络。由于transformer结构式排列不变的,我们使用固定的位置编码作为补充输入每个注意力层。该结构的具体定义参考补充材料。
Transformer 解码器。 decoder沿用了transformer的标准结构, 将N个d维的特征嵌入使用多头自注意力机制和编解码机制进行转换。和原始的transformer相比,我们模型在每个decoder层并行的解码N个目标,而不是像aswani那样使用autoregression模型以序列方式输出一个序列。由于decoder也是排列不变的,因此为了产生N个不同的结果,那么输入也必须不同。这些输入采用学习到的位置编码,称之为目标queries,与encoder类似,我们将其输入到decoder的每个注意力层。N个目标quries被decoder转换为N个输出。然后这些输出被独立的FFN解码为类别标签和box预测作为最终结果。使用这些embedding的自注意力机制以及编解码注意力特性,模型能够利用目标对之间的关系以及整张图象内容全局的推理所有目标。
前向预测网络FFNs。 最终的预测网络由使用激活函数ReLU的3层感知机实现,中间隐层维度为d,以及一个线性预测层。 FFN预测相对于图像尺寸的归一化后的box中心点坐标以及宽高。线性层+softmax哟关于预测类别标签。因为我们预测一个相对较大的固定尺寸N的集合,我们使用空集表示该预测为no object,即背景区域。
辅助解码损失。 我们发现在训练过程中对decode添加辅助损失是有益的,尤其是对于输出每类正确的目标个数。每个解码层之后我们都添加了FFNs和匈牙利损失,所有的FFNs共享参数。另外我们在每一个decoder层的FFNs之前使用了共享的layer-norm进行归一化。
实验
我们在COCO数据集上采用DETR获得了与Faster RCNN可比的检测性能。然后我们对模型结构和损失函数进行了分类实验。最终,实验表明DETR是一种易扩展的的模型,我们验证了DETR经过简单的扩展就可用于全景分割。代码和预训练权重见:https://github.com/facebookresearch/detr
数据集 COCO2017,以及全景分割数据集[24, 18]
实验细节 采用AdamW训练DETR, transformer的初始学习率设为, backbone的初始学习率设为, 权重衰减系数为。 所有的transformer的权重使用Xaiver初始化,backnone采用ImageNet预训练的ResNet模型(torchvision提供,并锁定bn层)。我们测试了两种不同的backbone:ResNet50和ResNet101. 对应的模型分别称之为DETR和DETR-R101. 沿用[21],我们同样在ResNet的最后一个stage上增加了dilation系数以及在该阶段的第一个卷积层中移除了stride=2的限制,其模型分别称之为DETR-DC5和DETR-DC5-R101(分别对应ResNet50和ResNet101).这种修改使最后输出特征的分辨率增加了两倍,提升了小目标的检测,但encoder中的自注意力机制的计算代价增加了16倍,最终导致计算资源消耗增加2倍以上。 表1给出了不同模型FLOPs的对比。
使用的数据增强包括尺度增广,将最小边限制在480~800,最长边小于1333.为了利用自注意力机制和编码器学习更好的全局关系,训练过程中我们还是用了随机裁剪增广,大约能提一个点的AP。具体而言,训练图像依0.5的概率随机裁剪为一个矩形块,然后再resize到800-1333. transformer训练时采用0.1的dropout参数。在推理时一些预测为空集。为了优化AP,我们使用置信度第二高的类别作为其类别,相对于直接剔除空集预测,这能提升AP约2个点。 其他的训练超参见补充材料A4. 在分离实验中,我们训练了300个epoch,其中学习率在200个epoch时下降10倍。 使用16块V100 卡,每张卡4张图像需要跑3天。和Faster RCNN对比的模型我们训练了500个epoch,在第400个epoch进行学习率衰减,最终相对于epoch300模型,AP提升了1.5个点。
与Faster RCNN的对比
Transformer一般使用Adam或者Adagrad训练较长的周期以及dropout, DETR同样。Faster RCNN则通过少量的数据增广使用SGD进行训练,且使用Adam和dropout并没有显著增益。尽管这些差异,我们仍希望强化Faster RCNN。 为了和DETR更好的对比,我们对Faster RCNN使用了GIoU和box损失,以及同样的crop增广以及更长的训练过程以提升结果。实验结果在表1中给出(+),以9x的训练调度,提升了大约1-2个点AP。为了让参数量可比,我们DETR中采用了6个encoder和decoder,以及8个宽度为256的注意力头。 和使用FPN的FasterRCNN类似,模型具有41.3M的参数量,其中ResNet-50和transformer分别占23.5M和17.8M。 尽管训练周期更长Faster RCNN和DETR都可能进一步提升性能,但我们能得出DETR在相同参数量下雨Faster RCNN在COCO验证集上取得了可比的42AP性能。
DETR在大目标APL上提升了7.8个点,但在小目标APs上减少了5.5个点。 DETR-DC5在相同的参数量上取得了更高的AP值,但是APs值依然低了很多。使用ResNet101作为backbone的FasterRCNN和DETR实验结果结论差不多。
分离实验
注意力机制是decoder中刻画不同目标特征关系的核心要素。在分离实验中,我们希望探索结构中的其他部件以及损失函数对性能的影响。我们选择ResNet50的DETR作为研究对象,该模型有41.3M的参数量,在长时和短时的训练周期中分别有40.6和42.0的AP值。和Faster RCNN -FPN雷速能获得28FPS的推理速度。
encoder层数影响 table2给出了不同encoder对于全局自注意力机制的重要性影响。不使用encoder,AP下降了3.9, 大目标甚至下降了6.0个AP。我们认为,利用全局信息推理,encoder能够更好的理清目标。Figure3中,我们可视化了最后一个encoder的注意力map,可以发现集中在image的若干点。encoder似乎已经分离了不同的实例,从而使decoder中目标抽取和定位更加简单。
decoder层数影响, 由于辅助损失函数,每个decoder层都会进行预测,我们直接评价每一层预测的精度,如图4所示,随着层数增加性能越来越好。凭借基于集合的损失,DETR不再需要NMS操作。为了验证这一典故,我们在每一层decoder上使用NMS,发现只有第一层性能提升较明显,其后随着层数增加NMS作用越来越小。我们认为其原因在于第一层尚未能全面计算输出元素之际爱你的相互关系,因此倾向于同一个目标预测多个结果,而随着层数增加相互关系更全面,也就不会产生重复预测,此时NMS用处可以忽略不计。
Fig6中我们可视化了decoder的attention,不同目标使用了不同颜色表示,可以发现decoder attention更加局部,表示其更倾向于目标极值点比如头部和腿部。我们认为经过encoder的全局注意力获得instance后,decoder只需要聚焦在边界部分以提取目标类别和边框。
FFN的重要性 我们尝试移除encoder中的所有FFN,法相参数量由28.7M降为10.8M,但其性能AP也将下了2.3个点,因此说明FFN对于获得较好性能很重要。FFN在transformers中可以认为是1x1的卷积层,使encoder更像attention增广的卷积网络。
pisitional编码的重要性。两种位置编码方式:空间位置编码和输出位置编码即目标queries。我们在Table3中给出了不同组合固定和学习的encodiing下的结果。输出位置编码是必须的,不可或缺的,因为我们尝试在decoder输入一次或者在每个decoder层上使用。在第一个实验中,我们全部移除空间位置编码,将输出编码只利用一次,有意思的的是模型依然获得了32AP,相对于baseline降低了7.8. 然后我们使用固定的sine空间位置编码,绕线相对于直接使用空间位置编码下降了1.4AP。
以上分离实验的结论:transformer部件中,全局的self-attention编码器,FFN, 多层解码器, 位置编码都对最终的目标检测性能至关重要。
loss分析
分析
图7给出了100个queries中的前20个预测目标的位置分布,不同的颜色标识不同尺度目标,可以发现不同的queries其实具有一定的位置鉴别性,也就是说训练得到的queries本质上可以负责不同位置不同尺寸的目标的预测。
COCO中的一些类在同一张图像中可能同类实例并不多,比如在训练集中不存在多于13个长颈鹿的图像,我们合成了一张图像包含了24个长颈鹿,图5可以发现也能够很好的检测,这说明我们的query并没有多少特定类别的信息。
全景分割
略。