DETR论文笔记
DETR-论文笔记
论文地址:https://arxiv.org/pdf/2005.12872v3.pdf
源码地址:https://github.com/facebookresearch/detr
DETR 是2020年ECCV 会议上的论文,也是至今2020年ECCV论文中被引用最多的一篇论文
2020年ECCV论文被引用第二多的是NeRF
DETR开启了一种新的目标检测范式
DETR的方法简化了检测流水线,消除了很多手工设计的组件
如:
- 非极大值抑制(NMS)
- Anchor的生成程序
- 少了这两个部分,可以少很多的超参数和计算,如Faster R-CNN中:
- 区分前景背景的两个IoU阈值超参数
- rpn,roi两次sample的样本数量超参数
- anchor的宽高比定义
- rpn,roi两次NMS的计算
DETR使用了Transformer的编码解码结构,使用了二部图匹配生成唯一预测
给定一组对象查询,DETR对对象和全局图像上下文之间的关系进行推理,并行输出最终的预测集。
目标检测的目标是预测每一个感兴趣的目标的边界框以及类别
现代检测器通过一种间接的方式来解决这个集合预测任务,通过在大量的提议框上定义代理回归和分类问题
如:Faster R-CNN, cascade R-CNN
或者使用Anchor的方式 Focal-Loss的网络,如RetinaNet
或者是window centers,如FCOS
它们的性能受到如何去除相近的交叠的重复预测的后处理步骤、锚点集的设计和将目标盒分配给Anchor的启发式方法的显著影响
这里提到了一个论文(Bridging the gap between anchor-based and anchor-free detection via adaptive training sample selection)
这篇论文中对比了不同anchor使用方式的性能对比
为了简化这些管道,DETR提出了一种直接集预测方法来绕过代理任务
我们通过将目标检测视为一个直接集的预测问题来简化训练管道。我们采用了一种基于变压器的编解码器结构,这是一种流行的序列预测结构
变压器的自我注意机制,明确地模拟了序列中元素之间的所有成对交互作用,使得这些架构特别适合于集合预测的特定约束,如删除重复的预测
更准确地说,DETR在大型对象上显示出了显著更好的性能,这一结果很可能是由变压器的非本地计算所实现的
但是它在小目标上的性能较低
我们的检测转换器一次预测所有对象,并使用一个集合损失函数端到端训练,该函数在预测对象和地面真实对象之间执行二部匹配
集合预测
集合预测任务的第一个困难是避免相近的重复
当前的很多的目标检测框架是使用了如非极大值抑制这种方式进行后处理
但是在直接的,集合预测框架中,不应该使用后处理
它们需要全局推理方案来建模所有预测元素之间的交互,以避免冗余。
对于恒定大小集预测,密集全连接网络是足够的,但代价高昂。一般的方法是使用自回归序列模型,如递归神经网络
通常的解决方案是基于匈牙利算法设计一个损失,以找到地面真实和预测之间的二分图匹配
这加强了排列不变性,并保证每个目标元素都有一个唯一的匹配
DETR model
直接集合预测的两个必备的组件:
- 一个预测Loss,它强制在预测和地面真值框之间进行唯一匹配
- 一个结构可以预测一组目标
目标检测集合预测Loss
DETR的解码器一次推断出一组固定大小的N个预测,其中N被设置为明显大于图像中的典型对象数量。
比如设置N为100,一张图片中不会有100个目标标注
训练的主要困难之一是对预测的物体(类别、位置、大小)进行评分。
我们的损失在预测对象和GT对象之间产生一个最优的二分图匹配,然后优化特定对象(边界框)损失
设gt的集合为:y
预测的集合为:
y
^
=
{
y
^
i
}
i
=
1
N
\hat{y}=\left\{\hat{y}_i\right\}_{i=1}^N
y^={y^i}i=1N
这里的N是设置成一定会大于一张图像中的gt数量的值
我们也认为y是一组大小为N的集合,其中填充了∅(没有对象)
为了找到这两个集合之间的二分图匹配,去寻找一个使得代价最低的一个排列:
σ ^ = arg min σ ∈ S N ∑ i N L match ( y i , y ^ σ ( i ) ) \hat{\sigma}=\underset{\sigma \in \mathfrak{S}_N}{\arg \min } \sum_i^N \mathcal{L}_{\text {match }}\left(y_i, \hat{y}_{\sigma(i)}\right) σ^=σ∈SNargmini∑NLmatch (yi,y^σ(i))
L
match
(
y
i
,
y
^
σ
(
i
)
)
\mathcal{L}_{\text {match }}\left(y_i, \hat{y}_{\sigma(i)}\right)
Lmatch (yi,y^σ(i)) 是预测和GT之间的匹配的代价
σ
∈
S
N
\sigma \in \mathbb{S}_N
σ∈SN 是全排列中的一个排列
使用匈牙利算法可以有效地计算出该最优解
匹配代价考虑了类别预测以及预测和GT之间的相似性
gt的表示为: y i = ( c i , b i ) y_i=\left(c_i, b_i\right) yi=(ci,bi) , 其中c表示类别,b是一个四个值的向量,包括了gt的中心坐标和框体的高度和宽度
二分图匹配做的事情,与Faster R-CNN中根据iou的大小将GT与提议框进行分配的作用是类似的
主要的区别是,DETR这种方式是找到一对一匹配的直接集预测没有重复
使用匈牙利算法进行二分图匹配的Loss定义为:
L
Hungarian
(
y
,
y
^
)
=
∑
i
=
1
N
[
−
log
p
^
σ
^
(
i
)
(
c
i
)
+
1
{
c
i
≠
∅
}
L
box
(
b
i
,
b
^
σ
^
(
i
)
)
]
\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 }}\left(b_i, \hat{b}_{\hat{\sigma}}(i)\right)\right]
LHungarian (y,y^)=i=1∑N[−logp^σ^(i)(ci)+1{ci=∅}Lbox (bi,b^σ^(i))]
其中对于 no object的对象,他的权重系数式0.1
这类似于Faster R-CNN训练过程如何通过子抽样来平衡正/负的提议框
bounding box Loss
上面公式中第二个部分包围盒相关的Loss
在之前的目标检测方案中,bounding box的来源,会有一些初始值,如在Faster R-CNN中,会在不同大小的特征图上生成非常多的anchor,后续网络的输出其实是这些anchor的修正
但是DETR与他们截然不同,它是直接预测出box的值
虽然这种方法简化了实现,但它提出了一个关于损失的相对缩放的问题
对于这个问题的处理方式是结合两种不同的Loss,同时计算L1 loss 和GIOU loss
GIOU Loss 是尺度不变的
因此Box相关的Loss定义为:
λ iou L iou ( b i , b ^ σ ( i ) ) + λ L 1 ∥ b i − b ^ σ ( i ) ∥ 1 \lambda_{\text {iou }} \mathcal{L}_{\text {iou }}\left(b_i, \hat{b}_{\sigma(i)}\right)+\lambda_{\mathrm{L} 1}\left\|b_i-\hat{b}_{\sigma(i)}\right\|_1 λiou Liou (bi,b^σ(i))+λL1∥∥∥bi−b^σ(i)∥∥∥1
这两个损失按批处理内对象的数量进行标准化
DETR的架构
DETR的结构有三个大部分
- 一个 CNN backbone 用于抽取图像的特征表示
- 一个使用了transformer的编码器解码器
- 一个FFN,前馈神经网络 给出最后的类别和Box信息的预测
DETR的代码实现很简单,基本可以认为随便找一个Backbone的实现,加上一个Transformer的实现就可以了
transformer encoder
在Backbone处理中,最后得到的通道数量是2048,特征图的大小是32倍下采样
在进入transformer之前,一个1x1的卷积先将2048的特征维度降为,降维后的特征维度用d表示
因此在backbone之后,在进入transformer之前的特征图为: z 0 ∈ R d × H × W z_0 \in \mathbb{R}^{d \times H \times W} z0∈Rd×H×W
在传入给encoder时将特征图拉成一个维度:得到的输入的长度为:d x HW
每个encoder由多头的自注意力模块和一个FFN前馈神经网络模块构成
由于变压器架构是排列不变的,我们用固定的位置编码来补充它
这个位置编码会给到每个encoder的输入中
transformer decoder
与原始变压器的不同之处在于,我们的模型在每个解码器层并行解码N个对象
在原始的Attention is all you need中transformer是使用一个自回归模型,每次预测一个元素的输出序列
由于解码器也是排列不变的,N个输入嵌入必须不同才能产生不同的结果。
这些输入嵌入是可学习的位置编码,我们将其称为对象查询,与编码器类似,我们将它们添加到每个注意层的输入中
N个对象查询被解码器转换为一个输出嵌入
然后,通过前馈网络将它们独立解码为box坐标和类别标签,最终得到N个最终预测
在这些嵌入上使用self-attetion,该模型使用它们之间的成对关系对所有对象进行全局推理,同时能够使用整个图像作为上下文
FFN
最终的预测是由一个具有ReLU激活函数和隐藏维数d的3层感知器和一个线性投影层计算的
FFN预测box的标准化中心坐标、高度和宽度,线性层使用softmax函数预测类标签
由于我们预测一个固定大小的N个边界框集,其中N通常比图像中感兴趣的对象数量大得多,因此使用一个额外的特殊类标签∅来表示槽内没有检测到任何对象
这个类在标准的对象检测方法中扮演着与“背景”类类似的角色
在解码器上使用 辅助loss 很有帮助,会帮助其得到正确的目标类别
在每一个decoder层后都使用了 prediction FFNs 和 匈牙利匹配Loss
实验
作者进行目标检测和全景分割实验,使用了COCO 2017数据集
在训练集的图片中一张图片平均有7个实例,最多有63个实例
使用了两个backone 一个是resnet-50, 一个是resnet-101
我们还通过在backbone的最后一个阶段添加一个扩展,并从该阶段的第一个卷积中删除一个步幅来提高特征分辨率
相应的模型分别被称为DETR-DC5和DETR-DC5-R101(扩张型C5阶段)
这种修改将分辨率提高了2倍,从而提高了小对象的性能,但代价是编码器的自我注意成本增加了16倍,导致计算成本总体增加了2倍
短边最小长度480,最长长度800,长边最长长度1333
为了通过编码器的自我注意来帮助学习全局关系,我们还在训练过程中应用了随机crop增强技术,提高了大约1个AP的性能。
一个训练图片以0.5的概率进行随机裁剪,裁剪一个随机的矩形,然后resize到800-1333
训练的Epoch为300,使用了16块V100,一张GPU4个图片,bs就是64,花费了3天的时间
Comparsion with Faster R-CNN
DETR使用了Adam, dropout
Faster R-CNN是使用了SGD和最小型的数据增强
Adam,dropout 会导致结果变好
因此在跟Faster R-CNN对比的时候,给Faster R-CNN也加了 GIoU,也使用了随机裁剪,以及更长的训练过程
在table中 3x是detectron2中的结果
带有+号结尾的是,是9x(109 epochs),以及使用了上述描述的增强方法,一共增加了1-2AP
这里的DETR,有 6个transformer,6个decoder, 宽度是256,8个注意力头
与使用FPN的快速R-CNN一样,该模型有41.3M的参数,其中23.5M在ResNet-50中,17.8M在变压器中
在执行推理的时候,有的slots会预测出empty class 也就是no object,为了提高成绩,将那些预测为no object的slots 使用其预测的第二高的分数的类别代替no object,并且也用对应的分数替换分数。这种方式会比将那些空slot直接过滤掉,会提高2个ap
对照实验
Number of encoder layers
我们假设,通过使用全局场景推理,编码器对于分解开对象是重要的
编码器似乎已经分离了实例,这可能简化了解码器的对象提取和定位
Number of decoder layers
在每个解码器层都使用了辅助loss,FFN被训练预测每个docoder层的输出
AP和AP50在每一层后都有所改善,在第一层和最后一层之间总共达到了非常显著的+8.2/9.5 AP的改善。DETR具有基于集的损失,不需要设计NMS
上图的意思就是说,在每个层后都加了辅助Loss后,不使用nms,也可以跟使用了nms达到相同的指标
这可以解释为这样一个事实,即转换器的单个解码层不能计算输出元素之间的任何相互关联,因此它容易对同一对象进行多个预测,因此nms会有帮助,帮助移除了多个预测
我们观察到,NMS带来的改善随着深度的增加而减少
在最后一层,我们观察到AP的一个小损失,因为NMS错误地消除了真正的积极预测
我们观察到解码器的注意是相当局部的,这意味着它主要关注物体的四肢,如头部或腿
我们假设,在编码器通过全局注意分离实例后,解码器只需要注意末端就可以提取类和对象边界
FFN 的重要性
这个FFN是指的transformer中的FFN,在网络之后输出类别和Box信息的FFN是必不可少的,因此并不是讨论那一个FFN
在transformer中的FFN 可以看作是1x1的卷积层,这样使得encoder 类似于 注意力聚合卷积网络(attention augmented convolutional,来至于一篇论文)
当尝试将FFN从transformer中移除,只保留attention结构。网络的参数量从41.3M下降到28.7M,并且在Transformer中只有10.8M
但是性能下降了2.3AP,因此可以认为transformer中的FFN至关重要
位置编码的重要性
在模型中有两种类型的位置编码:
- 空间位置编码
- 模型输出的位置编码
论文中进行了关于固定位置编码和可学习的位置编码两种实验
sine at input 指只将位置编码输入到第一层encoder,同理decoder也是
sine at attn 指将位置编码输入到每一层encoder,同理decoder也是
输出位置编码是必需的,不能删除,所以我们实验在decoder 输入传递一次,或者在每个decoder层添加
如果完全移除空间位置编码,那么会下降7.8AP
令人惊讶的是,我们发现在编码器中不传递任何空间编码只会导致AP小幅下降,下降1.3 AP
因此认为这些组件都对最后的检测有很大的贡献:
- 全局的自注意力的encoder
- transformer中的FFN
- decoder层使用的辅助loss
- 位置编码
Loss的消融实验
DETR一共使用了三个loss:
- 分类 loss
- bbox的L1oss
- GIoU loss
分类loss一定是不可缺少的,因此可以做实验对比两外两个loss的作用
分析
decoder 输出插槽的分析
选取100个slot中的20个进行分析
每一个点表示预测框体的中心点相对于图像的相对坐标(图像的尺寸被归一化成1x1)
绿色点表示小目标,红色表示水平形状(长方形)的框体,蓝色表示垂直类型的
每个slot都有偏好的图像区域以及目标的大小和形状
实例的泛化性
COCO中的一些类不能用同一图像中同一类的许多实例很好地表示
例如,在训练集中没有超过13只长颈鹿的图像
合成了一张有24个长颈鹿的图像并且可以很好的预测
这个实验证实了在每个对象查询中都没有很强的类专门化
没有见过一次性超过13只长颈鹿,但是可以预测出24只长颈鹿