DETR
目前在目标检测中仍然需要许多手工设计的组件,例如非极大值抑制(NMS),基于人工经验生成的先验框等。DETR这篇文章通过将目标检测作为一个直接的集合预测问题,减少了人工设计组件的知识,简化了目标检测的流程。给定一组固定的可学习的目标查询,DETR推理目标和全局图像的上下文关系,由于DETR没有先验框的约束,因此对于较大的物体预测性能会更好。
模型主体框架
如图所示为DETR的主体框架,由于直接采用transformer结构,模型的计算量较大,因此DETR首先采用CNN卷积神经网络进行抽取特征,之后将提取的特征送Transformer的encoder结构中。decoder通过与特征交互形成数量为N的边界框,最终预测得到结果。
其中N的数据要大于一张图片上所含有所有物体的数量,在计算损失函数的时候,DETR首先采用匈牙利算法去寻找到正确的匹配方式。之后再去计算bbox和分类的损失值。由于
L
1
L_1
L1损失函数对于不同大小的边界框产生的误差不相同,因此我们采用了
G
I
o
U
G_{IoU}
GIoU损失函数去弥补这些误差。
DETR主要由三部分组成:CNN的主干网络、Transformer的encoder-decoder架构、FFN结构。
主干
针对于一张通道数大小为3的图片,首先经过CNN的骨干网络,得到一个通道数为2048,长宽分别为原始图像大小
1
32
\frac{1}{32}
321的特征图
f
∈
R
C
×
H
×
W
f \in R^{C\times H \times W}
f∈RC×H×W。
Transformer编码器
首先
1
×
1
1\times1
1×1卷积将高层激活图
f
f
f的通道维数从
C
C
C降低到更小的维度
d
d
d,生成一个新的特征图
z
0
∈
R
d
×
H
×
W
z_0 \in R^{d\times H\times W}
z0∈Rd×H×W,编码器期望一个序列作为输入,因此我们将
z
0
z_0
z0的空间维度压缩为一个维度,从而产生
d
×
H
W
d \times HW
d×HW的特征图。每个编码器层都有一个标准架构,由一个多头自注意力模块和一个前馈网络(FFN)组成。由于Transformer架构具有置换不变性(改变输入序列的顺序,输出的结果不发生改变),我们用维度大小相同的位置编码来弥补这个缺点,位置编码被添加到每个注意力层的输入中。
Transformer解码器
与标准的Transformer架构中的decoder不同,DETR没有采用掩码机制,因此N个预测的边界框可以同时输出。由于解码器仍然具有置换不变性,因此我们采用可学习的位置编码作为解码器的输入嵌入,并把它称为object query。通过多个层结构,该object query最终转变为输出的边界框,通过FFN结构,生成N个坐标点和分类的对象。
上图所示是模型Transformer的主要结构,来自CNN主干网络的图像特征被送到transformer编码器中,在每个多头自注意力机制中与空间位置编码相加作为多头自注意力机制的键和查询,其本身值(该步骤需要矩阵相乘,并不是一个直接的结果)。作为在解码器和编码器进行注意力机制计算之前,首先object query需要进行一个自注意力机制,该步骤是为了去除模型中的冗余框。
Object Query
上图是object query具象化后的结果,我们在N个边界框中选取20个得到上图所示的情况。其中绿色的原点表示是否含有小的边界框,红的的原点表示是否存在大的水平的边界框,蓝色的表示是否含有大的垂直的边界框。
20个边界框每个边界框的分布都不一样,因此针对与第一个query我们可以询问是否在左下角存在较小的物体,针对于第二个query我们可以询问是否在中间部分存在较小的物体。此时相当于是模型通过注意力机制针对该类问题自己学到的先验框。