代码地址:https://github.com/facebookresearch/detr
论文小结
本文是Transformer结构应用于目标检测(OD)任务的开山之作。方法名DETE,取自De tection Tr ansformer。
作为2020年的论文,其表现精度在当时也不算高的,但为后面的DETE-based方法提供了基础。
DETR的模型架构设计,使用的是混合Transformer结构,即CNN+Transformer的结构,
与YOLO系列基于grid的预测对比,DETR经过transformer的decoder输出的是序列集。由于OD任务不需要自回归处理 ,所以decoder的输出可以并行处理,同时输出多个检测框。
transformer输出的是序列集,而OD任务所需要的最终结果也是一个边框集合,所以DETR是直接对结果进行的预测,即OD任务在此直接为集合预测问题 。
集合预测问题 ,在匹配损失 的时候,具有唯一性 。所以DETR的预测结果在合理的Loss作用下,是不需要NMS后处理 的。且在没有 anchor grid和anchor box的偏差预测 过程的情况下,DETR算法管道实现端到端训练和预测,丢弃了YOLO系列所需的融入先验知识的需求(anchor & nms)。
文中DETR对比的算法是Faster RCNN,是2015年的一篇论文,精度差不多,运行时间也差不多。小目标不如Faster RCNN,大目标好不少,最后mAP基本持平。
后续也有论文改进了transformer在小目标检测上精度不足的问题。
论文简介
现有大多数检测算法 ,都依赖于一些初始猜测。不管是基于proposal的二阶目标检测算法,还是anchor-based、anchor-free的一阶目标检测算法,都是没有直接去预测集合预测的 ,而是设计了一个替代的任务(回归和类别概率)来解决目标检测问题。
现代目标检测器的检测性能很受后处理步骤的影响,比如(1)密集预测边界框的消除;(2)anchor集合的额设计;(3)将目标分配给anchor的启发性方法;
DETR通过直接预测集合的方法来绕过这些"代理"任务,无需任何人工先验知识,实现端到端预测。
DETR的结构图如图1所示。其组件transformer-encoder将序列元素两两交互,其全局的交流有利于一些特别限制的集合预测,比如移除重复的预测结果。
DETR使用二分图匹配来计算端到端的几何损失,匹配的唯一性,也进一步限制了重复的预测结果。
和其他的集合集合预测方法对比,DETR的主要区别就在于使用了二分图匹配损失以及平行解码的transformer结构。之前的集合预测方法一般使用RNNs模型做自回归预测。
论文方法
由于transformer的decoder结构其输入输出维度保持不变,故当输入序列长度为 N N N,我们也能得到序列长度为 N N N的固定长度输出。本文DETR的输入序列命名为object quires ,是一组基于学习得来的参数,可视化如下[图 7 7 7](#图 7 7 7)所示。
损失计算
集合预测的训练难点在于如何结合GT来给预测目标打分。本文的损失计算策略 是先用二分图匹配方法,再对有目标(匹配成功)的bboxes计算损失。
将目标集合 y y y扩展到长度 N N N,不足长度的部分用 ∅ \varnothing ∅表示,意为无目标。预测集合 y ^ \hat{y} y^和GT集合 y y y的匹配,是寻找两个集合匹配的最低消耗,如公式 ( 1 ) (1) (1),其中 σ ( i ) \sigma(i) σ(i)是预测集合第 i i i个。
σ ^ = arg min σ ∈ G N ∑ i N L match ( y i , y ^ i ) (1) \hat{\sigma}=\mathop{\text{arg min}} \limits_{\sigma\in\mathscr{G}N}\sum_i^N\mathcal{L}{\text{match}}(y_i, \hat{y}_i)\tag{1} σ^=σ∈GNarg mini∑NLmatch(yi,y^i)(1)
匈牙利算法(Hungarian algorithm)是这个最佳匹配的一个较优解法。匹配消耗考虑类别预测和边框预测的综合损失。考虑第 i i i个预测的类别 c i c_i ci的预测概率为 p ^ σ ( i ) ( c i ) \hat{p}{\sigma(i)}(c_i) p^σ(i)(ci),则对应的匹配损失 为: L match ( y i , y ^ i ) = − I { c ≠ ∅ } p ^ σ ( i ) ( c i ) + I { c ≠ ∅ } L box ( b i , b ^ σ ( i ) ) \mathcal{L}{\text{match}(y_i,\hat{y}i)}=-\mathbb{I}{\{c\neq \varnothing\}}\hat{p}{\sigma(i)}(c_i)+\mathbb{I}{\{c\neq\varnothing\}}\mathcal{L}{\text{box}}(b_i,\hat{b}{\sigma(i)}) Lmatch(yi,y^i)=−I{c=∅}p^σ(i)(ci)+I{c=∅}Lbox(bi,b^σ(i))。
在使用匈牙利算法寻找到最佳匹配之后 ,我们定义的匈牙利损失如公式 ( 2 ) (2) (2)所示:其中 σ ^ \hat{\sigma} σ^在计算优化损失的第一步已经有了确定赋值;为类别平衡,当 c i = ∅ c_i=\varnothing ci=∅时,类别权重下降 10 10 10倍 :
L Hungarian ( y , y ^ ) = ∑ i = 1 N [ − log p ^ σ ( i ) ( c i ) + I { c ≠ ∅ } L box ( b i , b ^ σ ^ ( i ) ) ] (3) \mathcal{L}\text{Hungarian}(y,\hat{y})=\sum \limits{i=1}^N[-\text{log }\hat{p}{\sigma(i)}(c_i)+\mathbb{I}{\{c\neq\varnothing\}} \mathcal{L}\text{box}(b_i,\hat{b}{\hat{\sigma}}(i))]\tag{3} LHungarian(y,y^)=i=1∑N[−log p^σ(i)(ci)+I{c=∅}Lbox(bi,b^σ^(i))](3)
一般类别损失会使用log空间。但作者发现不用log空间时,分类损失和定位损失的值域相近,训练结果会更好一点。故后面使用 p ^ σ ( i ) ( c i ) \hat{p}_{\sigma(i)}(c_i) p^σ(i)(ci),而不是log概率。
当预测的集合和GT的空集 ∅ \varnothing ∅进行匹配时,其匹配消耗不依赖于预测,消耗为一个常数。
对于边框定位损失,在当时使用的是 L 1 \mathcal{L}1 L1损失,后面采用IoU损失。作者选择了 L 1 \mathcal{L}1 L1损失和IoU损失的结合。
模型架构
DETR的架构整体如下图2所示:经过decoder的处理后,使用FFN(feed forward network)做最终预测(类别和边框)。
DETR的CNN backbone,下采样倍数为 32 32 32倍,输出channel为 2048 2048 2048。对于应用于实时目标检测的transformer来说,这个channel还是比较大的,作者选择使用 Conv 1 × 1 \text{Conv}1\times1 Conv1×1压缩channel到 d d d,默认为256。将特征图 H 32 × W 32 × d \frac H{32}\times \frac W{32} \times d 32H×32W×d展开后( d × H W d\times HW d×HW)放入encoder中。位置编码是基于学习的。
文中默认配置 为encoder有 6 6 6个,decoder有 6 6 6个,multi-attention的head有 8 8 8个,hidden dim为 256 256 256。
encoder和decoder是标准的transformer结构,不同的地方在于decoder是并行解码 N N N个目标,而《Attention is all you need》中的transformer-decoder是自回归结构,同一时间只能预测输出序列的一个元素。
decoder的input embeddings必须不同来产生不同结果。这个input embeddings在DETR是学习来的,本文叫做object queires 。COCO中学习到的object queries如下图7所示,每个输入都检测一部分框。
FFNs ,本文采用的是 3 3 3层感知机 + ReLU激活函数 + 线性映射层。预测定位的结果是正则化的中心坐标以及框的宽高。分类的预测是使用Softmax函数处理,其中加一个特殊类 ∅ \varnothing ∅来表示无目标。
在训练中,DETR中每个transformer-decoder都添加一个辅助监督,所有预测分支的FFNs共享权重。添加一个额外的layer-norm,在每个decoder层FFNs的输入上应用。
DETR的pytorch实现如下图所示;
论文实验
训练相关参数和策略
训练数据集为COCO2017,训练集中平均每张图 7 7 7个实例,最多一张图为 63 63 63个实例。所以,在COCO上,DETR使用的 N = 100 N=100 N=100是完全足够的。
DETR使用AdamW优化器,transformer的初始 l r lr lr为 1 0 − 4 10^{-4} 10−4,backbone的初始 l r lr lr为 1 0 − 5 10^{-5} 10−5,这是因为backbone是使用ImageNet预训练的。transformer权重使用Xavier初始化。
DETR使用的两个backbone为ResNet-50和ResNet-101,对应的检测器模型为DETR 和DETR-101 。像《Fully convolutional instance-aware semantic segmentation》一样,在backbone的最后一个stge上增加dilation作用。同时在该stage的第一个Conv上移除stride的作用,以增加分辨率。以此策略对应的模型为DETR-DC5 和DETR-DC5-R101 ,Dilated C5 stage。该参数让分辨率扩大 2 2 2倍,因此改善了小目标的性能。推理消耗为 16 16 16倍的encoder(self-attention),整体消耗为 2 2 2倍计算消耗。
增强策略 上,使用尺度增强 (短边最少 480 480 480最多 800 800 800,长边最高 1333 1333 1333)。为帮助transformer-encoder的self-attention学习全局关系,作者使用随机裁剪增强 ,这带来了将近 1 1 1AP的提升。使用dropout增强策略 ,概率为0.1。
在推理时,有的slots会预测空类 ∅ \varnothing ∅。为了优化AP,这些slots用第二高的类别及其分数。这种操作带来了2个AP的改善。
消融实验,训练 300 300 300个epoch,在 200 200 200epoch时学习率下降 10 10 10倍。baseline模型在 16 16 16个V100 GPUs上训练 300 300 300个epoch,耗时 3 3 3天,每个GPU 4 4 4张图,故batchSize为 64 64 64。
与Faster RCNN相比,更长训练策略为 500 500 500个epoch, 400 400 400个epoch后下降学习率。 500 500 500个epcoh相比 300 300 300个epoch,能带来 1.5 1.5 1.5AP的提升。
其他参数: λ L 1 = 5 \lambda_{L1}=5 λL1=5, λ i o u = 2 \lambda_{iou}=2 λiou=2。Faster-RCNN+的边框回归损失使用GioU loss和L1的结合。
对比实验
DTER和Faster RCNN的对比实验如下表所示:
DETR中transformer-encoder层数的消融实验:encoder层数越高,AP越高。作者选择了 6 6 6。如果没有encoder,会降低 3.9 3.9 3.9AP,大目标降低 6.0 6.0 6.0AP,说明encoder还是重要的。
encoder的可视化(encoder最后一层的attention maps)看图像中的一些点。可以看出其中貌似已经完成实例分割了,可以在decoder简单地进行目标提取和定位。
在decoder中每层增加FFN来预测,见下图:每加一层decoder,AP和AP50都会上升。只有一个decoder层的解码能力比较多,容易产生多余的输出。随着decoder层数上升,NMS的作用下降。
decoder的attention可视化如下图所示,不同颜色表示不同预测目标的attention maps。可看出,decoder的注意力是比较局部的,它主要关注的是物体的四肢、头脚等。作者假设,encoder使用全局attention分离实例,而decoder仅需要关注端点以提取类和对象边界。
DETR有两种pos embeddings:(1)空间位置编码;(2)输出位置编码(object queries)。下表实验了一些组合:固定编码和可学习编码。输出位置编码是必要的,且不可移除的。
边框定位损失的消融实验: λ L 1 = 5 \lambda_{L1}=5 λL1=5, λ i o u = 2 \lambda_{iou}=2 λiou=2的组合下,GIoU损失和L1损失的结合是最佳的。
每个边框预测是其中的一个点。绿色是小框,蓝色是大的竖向的框,红色是大的横向的框。可以发现20个slots都有一条红的竖线在中间,应该是COCO数据集的实例表现问题。
训练集中同一张图像没有那么多实例的类别,在预测时也能有比较好的泛化。比如长劲鹿的图像,在COCO中最多一张图像13个实例,作者生成了个24实例的图像,也能准确预测。