代码地址:https://github.com/facebookresearch/detr
论文小结
本文是Transformer结构应用于目标检测(OD)任务的开山之作。方法名DETE,取自Detection Transformer。
作为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所示。
损失计算
集合预测的训练难点在于如何结合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的输入上应用。
论文实验
训练相关参数和策略
训练数据集为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实例的图像,也能准确预测。