【计算机视觉 | 目标检测】DETR风格的目标检测框架解读

时间:2022-01-18 01:16:40

一、前言

在最近的论文阅读中,我遇到了一个新的框架—DETR风格的框架。

【计算机视觉 | 目标检测】DETR风格的目标检测框架解读
对此,感觉不是很了解,这里总结一下。

二、理解

2.1 DETR的理解

DETR(DEtection TRansformer)是一种基于Transformer的端到端目标检测模型,由Facebook AI Research团队提出。它使用Transformer将目标检测任务转换为一种集合预测问题(set prediction),即将输入的图像和目标集合编码为两个集合,然后通过匹配这两个集合来预测目标的类别、位置和数量。

没有NMS后处理步骤、没有anchor,结果在coco数据集上效果与Faster RCNN相当,且可以很容易地将DETR迁移到其他任务例如全景分割。

引用知乎大佬的话来说,这种做目标检测的方法更合理:

对于一个没接触过任何检测知识的人,去设计检测的方法,更容易想到的应该是DETR类似的方法,而不是RCNN系列的方法,因为它更直接更本质。所以这篇文章的主要意义也便是—将检测方法回归到了本质。
最初的检测方法,无法直接获取到检测结果,所以用proposal + classifier方法,是一种曲线救国的策略。无论RCNN系列还是YOLO系列,都无法像生物一样,直接指出哪个位置是什么物体,而是用密集的先验,覆盖整幅图可能出现物体的部分,然后预测该视野区域的实例类别以及该视野区域所应做出的调整。打一个比方,就像是刺激战场,开着八倍镜,找敌人一样。
判断视野里面的类别—调整视野—判断视野里面的类别—调整视野—…
而DETR方法则是,不开镜的情况下,确认那个地方有敌人,然后开着八倍镜去锁定目标。
确认整幅图实例情况—调整具体实例的视野。

DETR模型的整体结构分为编码器和解码器两部分。

  • 编码器由一系列的Transformer编码层组成,用于提取图像中的特征信息。
  • 解码器则将编码器提取的特征信息与目标集合中的先验信息进行结合,最终生成目标的类别、位置和数量等信息。

总体思路是把检测看成一个set prediction的问题,并且使用Transformer来预测box的set。DETR 利用标准 Transformer 架构来执行传统上特定于目标检测的操作,从而简化了检测 pipeline。

【计算机视觉 | 目标检测】DETR风格的目标检测框架解读
DETR包含三个主要组件:

  • CNN骨干网
  • 编码器-解码器transformer
  • 一个简单的前馈网络

首先,CNN骨干网从输入图像生成特征图。

然后,将CNN骨干网的输出转换为一维特征图,并将其作为输入传递到Transformer编码器。该编码器的输出是N个固定长度的嵌入(向量),其中N是模型假设的图像中的对象数。

Transformer解码器借助自身和编码器-解码器注意机制将这些嵌入解码为边界框坐标。

最后,前馈神经网络预测边界框的标准化中心坐标,高度和宽度,而线性层使用softmax函数预测类别标签。

详细见下图:

【计算机视觉 | 目标检测】DETR风格的目标检测框架解读
DETR采用Transformer的自注意力机制来对输入进行编码,而不是使用传统的卷积神经网络。

这样做的好处是可以充分考虑整张图像中不同位置之间的关系,提高了模型对目标的感知能力和准确率。此外,DETR还使用了一个新的位置编码方法,称为Sinusoidal Positional Encoding,用于对不同位置的特征进行区分和定位。

与传统目标检测方法相比,DETR具有以下优点:

  • 高效性:DETR采用端到端的方式训练,无需使用繁琐的手工设计过程,因此模型训练和推理速度较快。
  • 灵活性:DETR的目标检测过程可以看作是对集合进行预测,因此可以灵活地处理各种数量和种类的目标。
  • 鲁棒性:DETR通过将目标检测问题转换为集合预测问题,避免了传统目标检测算法中的anchor设计等问题,从而具有更强的鲁棒性。

2.2 DETR的细致理解

2.2.1 Backbone

在DETR中,Backbone指的是在输入图片上提取特征的卷积神经网络(Convolutional Neural Network,CNN)。它负责将输入的图片经过一系列卷积、池化等操作,转换成特征图。这些特征图将作为编码器的输入,编码器再将其转换为定位和分类的对象特征。

DETR使用ResNet作为其Backbone,ResNet是一种非常深的卷积神经网络,能够学习到更加复杂的特征表示。DETR使用ResNet的前面几个卷积块(例如ResNet50中的前四个卷积块)来提取特征,并且通过一个降采样操作将特征图缩小到一定的尺寸。这样可以提高特征的表达能力,同时缩小特征图的尺寸,从而减少后续处理的计算量。

需要注意的是,DETR中的Backbone与传统的目标检测模型中的Backbone有所不同。在传统的目标检测模型中,Backbone通常指的是将输入图片经过卷积神经网络得到的特征图,而在DETR中,Backbone只是负责提取特征的卷积神经网络部分。特征图的生成则是通过Encoder和Decoder两个阶段完成的。

2.2.2 Transformer encoder

在DETR中,Transformer encoder被用作编码器(Encoder)模块,用于将图像编码为一组特征向量。

Transformer encoder由若干个Transformer block组成,每个Transformer block又由两个子层组成,分别是self-attention层和前向神经网络(feed-forward neural network)层。

Transformer encoder通过对输入特征进行多层处理,逐渐提取出特征的高级抽象表示,最终输出一组特征向量。在DETR中,这些特征向量被用于表示输入图像中的目标。

自注意力机制(self-attention)是Transformer encoder的关键组成部分,用于在特征向量之间建立全局上下文关系。在self-attention层中,每个特征向量都会与其它所有特征向量进行交互,以便在全局上下文中获取更准确的特征表示。

另一方面,前向神经网络(feed-forward neural network)层是Transformer block的另一个组成部分。它是由全连接层和非线性激活函数组成的,用于在局部特征表示上进行非线性变换。这样可以更好地学习局部特征之间的关系,从而更好地对目标进行定位和分类。

总之,DETR中的Transformer encoder是用于从图像中提取特征的关键组件,通过多层的self-attention和前向神经网络层对特征进行处理,最终输出一组高级抽象的特征向量,用于目标检测和定位。

2.2.3 Transformer decoder

在DETR中,Transformer decoder主要用于解码器的实现,将编码器得到的信息和预测的位置、类别等信息进行解码,从而得到最终的目标检测结果。

在具体实现上,DETR使用了一个由若干个Transformer decoder堆叠而成的结构。每个Transformer decoder由若干个Multi-Head Attention和Feedforward网络组成,其中每个Multi-Head Attention和Feedforward网络都是一个Transformer decoder中的基本构建单元。Multi-Head Attention用于进行编码器和解码器信息的交互,Feedforward网络用于提取特征和信息的变换。

具体来说,DETR的解码器包括两个主要的部分:Transformer decoder和位置嵌入(position embedding)。位置嵌入是一种特殊的嵌入方式,用于将目标位置信息转换为可被神经网络学习的形式。在DETR中,位置嵌入的维度与编码器输出的特征维度相同,因此可以与特征向量进行拼接,作为解码器的输入。

在解码器中,每个Transformer decoder都负责处理编码器输出特征和目标位置信息的交互。具体来说,每个解码器包括三个主要的部分:Multi-Head Attention、Feedforward网络和LayerNorm。在Multi-Head Attention中,编码器输出的特征和目标位置信息作为查询向量和键值向量,分别用于计算注意力权重。计算出的注意力权重与编码器输出特征进行加权求和,得到解码器的输入特征。在Feedforward网络中,解码器的输入特征进行变换和非线性映射,从而得到更高层次的特征表示。最后,在LayerNorm中进行归一化,得到最终的解码器输出特征,供下一层解码器或最终的预测使用。

总的来说,DETR中的Transformer decoder主要用于解码器的实现,实现了目标检测任务中目标位置和编码器特征的有效融合。通过使用Transformer decoder,DETR可以在不需要使用先验框或区域提议的情况下,实现端到端的目标检测。

2.2.4 Prediction feed-forward networks (FFNs)

在DETR中,Prediction feed-forward networks (FFNs)是指在解码器中使用的两个全连接层,用于将编码器和解码器之间的注意力层输出进行处理,以生成最终的目标检测结果。这两个全连接层被称为class predictor和box predictor。

class predictor接收来自注意力层的输出,并为每个可能的目标类别输出一个分数,以表示其属于该类别的概率。在训练期间,模型使用交叉熵损失来最小化这些预测与真实类别之间的差异。

box predictor接收来自注意力层的输出,并对每个检测框的位置和大小进行预测。具体来说,它输出四个值,分别表示左上角和右下角坐标的偏移量。在训练期间,模型使用平滑L1损失来最小化这些预测与真实边界框之间的差异。

这两个预测器以并行的方式工作,并且在生成最终的目标检测结果时,它们的输出被合并起来,形成一个元组,其中包含预测的类别分数和边界框坐标。这些预测结果会经过一个非极大抑制算法以去除重叠的框,并保留最终的检测结果。

2.2.5 Auxiliary decoding losses

在DETR中,为了提高目标检测的性能,使用了一些辅助的解码损失。这些辅助损失的作用是在训练过程中提供更多的监督信号,以帮助网络更好地学习目标检测任务。

具体来说,DETR中使用了两个辅助损失:

  1. 位置损失(Position loss):在解码器中,每个位置都有一个预测的位置向量。该位置向量和真实位置之间的距离可以作为一个位置损失,用于指导模型更好地学习目标的位置信息。
  2. 类别损失(Class loss):DETR中使用了交叉熵损失来衡量预测类别和真实类别之间的距离。该损失可以促使模型更好地区分不同类别的目标。

这些辅助损失可以在模型训练中与主要的目标检测损失一起使用,以提高模型性能。

2.3 更具体的结构

【计算机视觉 | 目标检测】DETR风格的目标检测框架解读

2.4 编码器的原理和作用

在目标检测任务中,编码器是深度学习模型的一部分,主要负责将输入的图像特征提取并编码为一组向量表示,通常称为“特征向量”或“特征嵌入”。编码器的作用是将图像中的信息转换为一组有意义且易于处理的数字特征,以便用于后续的目标检测任务。

通常,编码器采用卷积神经网络(Convolutional Neural Networks,CNN)的结构进行设计,通过多层卷积和池化操作,逐步提取图像中的抽象特征。这些抽象特征能够代表图像中的局部和全局信息,包括纹理、形状、颜色等,同时具有一定的平移不变性尺度不变性,使得它们适用于不同大小和位置的物体的检测。

在DETR(Detection Transformer)中,编码器是由Transformer编码器层组成的,这是一种基于自注意力机制(Self-Attention)的网络结构,能够捕获输入序列中的长程依赖关系,因此可以用于图像序列的编码。在DETR中,编码器将输入的图像划分为一系列图像块,对每个图像块进行特征提取和编码,生成一组图像块特征向量表示。

2.5 解码器的原理和作用

在目标检测任务中,解码器的作用是将编码器输出的特征图转换为目标框的位置和类别信息。具体来说,解码器接受编码器输出的特征图,并对其进行处理和解码,得到目标的位置和类别信息。

解码器通常包含一系列卷积层、池化层和全连接层,以及用于位置解码和类别预测的不同层。

  • 对于位置解码,解码器通常使用回归器来预测目标框的位置和大小,例如使用四个参数来表示目标框的左上角坐标、宽度和高度。
  • 对于类别预测,解码器使用分类器来预测每个目标框所属的类别。

在DETR中,解码器使用Transformer结构,将编码器的特征图转换为一组对象嵌入向量,并将其输入到Transformer解码器中。解码器通过多层自注意力机制来将特征图中的对象嵌入向量与目标框的位置和类别信息相结合,从而得到最终的检测结果。

在DETR中,解码器主要通过注意力机制(self-attention)来实现对编码器输出特征图的解码,从而得到目标的位置和类别信息。

具体来说,解码器在每个解码步骤中:

  1. 首先使用一个自注意力模块来对编码器输出特征图进行注意力计算;

  2. 然后将自注意力计算结果和编码器输出特征图的信息融合,得到解码器当前的输入;

  3. 接下来,解码器使用一个多层感知机(MLP)来对当前输入进行处理,得到目标类别的概率分布和位置信息的偏移量,进而得到最终的目标位置和类别信息。

值得注意的是,在DETR中,解码器是通过自注意力机制来获取不同目标之间的交互信息,从而实现全局推理。这种方式相比于传统的基于区域提取的目标检测方法,可以减少手工设计的模块,同时还能更好地处理目标之间的遮挡和重叠等问题,因此具有更好的鲁棒性和泛化能力。

三、注意力机制的理解

注意力机制是一种计算机视觉和自然语言处理等领域常用的技术,用于指导模型在输入数据中聚焦于重要的部分。

其基本思想是,将输入数据映射到一个高维空间中,在这个空间中计算每个输入位置的重要性分数,并根据分数的大小分配不同的权重。这样,模型就可以聚焦于那些具有更高重要性分数的输入位置,从而提高模型的性能。

在注意力机制中,有多种不同的实现方式,比较常见的有以下两种:

  1. 自注意力机制(self-attention):自注意力机制是指在同一序列中的每个元素之间进行注意力计算。具体来说,对于输入序列 X = [ x 1 , x 2 , . . . , x n ] X=[x_1, x_2, ..., x_n] X=[x1,x2,...,xn],其中每个 x i x_i xi 都表示一个向量,自注意力机制会对每个 x i x_i xi 计算一个对应的权重向量 w i w_i wi,并根据权重向量对输入序列进行加权求和,得到表示整个序列的向量 v v v。自注意力机制的目的是在同一序列中学习不同位置之间的依赖关系。
  2. 注意力机制(attention):注意力机制是指将两个不同的序列之间的注意力计算。具体来说,假设有两个输入序列 X = [ x 1 , x 2 , . . . , x n ] X=[x_1, x_2, ..., x_n] X=[x1,x2,...,xn] Y = [ y 1 , y 2 , . . . , y m ] Y=[y_1, y_2, ..., y_m] Y=[y1,y2,...,ym],其中每个 x i x_i xi y j y_j yj 都表示一个向量,注意力机制会对每个 x i x_i xi 计算一个对应的权重向量 w i w_i wi,并将其与 Y Y Y 进行加权求和,得到一个表示 X X X 中每个元素对 Y Y Y 的贡献的向量 v v v。注意力机制的目的是在不同序列之间学习相关性。