基于Transformer的目标检测-DETR

1,679 阅读6分钟

关月:基于Transformer的目标检测-DETR

关月:基于Transformer的目标检测-Conditional DETR

关月:基于Transformer的目标检测-DAB-DETR

关月:基于Transformer的目标检测-DN-DETR

整体结构

DETR首次将Transformer应用到了目标检测任务中,上图是一个DETR的整体结构。图像会先经过一个传统的CNN抽出图像特征来,然后再将CNN的输出直接送到Transformer网路中,Transformer会直接输出一组预测的集合,每个预测包含框的中心点坐标、宽高以及框的类别,然后通过一个二分图匹配策略将预测框和GT框一一匹配用来计算Loss。

上面的图更详细一些,首先先将原始图片输入CNN网络中表征为【B, C, H, W】, 然后【H,W】维度拉平【B, C, H*W】再加上位置编码信息一起送入encoder中,进一步提取全局的特征,Decoder将固定数量的object queries(object queries是可学习的)加上encoder的输出作为输入,最后每个object query 最终会得到一个decoder embdding,然后输入到一个共享的前馈神经网络(FFN)中,这个FFN可以预测框的类别和坐标。最后就是得到的这些框怎么和GT进行匹配,DETR使用的是匈牙利匹配算法,做法就是令预测框和GT框是一一匹配的,GT框不够用会用no object来补全,然后对所有可能的匹配做排序,将损失最低的作为最终的匹配,这个损失就是指的目标检测中使用的位置损失和类别的损失。

整体结构分为3部分:

1、传统CNN,用于提取图片局部特征

2、Transformer 结构,Encoder提取图片全局特征和 Decoder 做预测

3、Bipartite Matching Loss 来训练网络

与NLP Transformer对比

下面是DETR Transformer内部的一个结构

encoder里是一个自注意力机制,输入为Image Feature和位置编码,这里和NLP中Transformer Encoder是一样的,只不过NLP输入的是文本Embedding。

Decoder里首先是一个Self Attention, Key Value Query是都是decoder embedding + object queries ,Value没有加object queries,它认为K V加入位置信息就足够了。Decoder embedding是decoder每一层的输出,在第一层初始为一个全0的向量;然后是一个Cross-Attention,在cross attention中 decoder embedding + learnable queries作为Query, Encoder的输出作为Key和Value,这里和NLP中transformer的结构是一致的。

最终得到Decoder的输出,经过FFN预测出物体的 bounding box 的位置和类别。

下面是对Attention机制的输入输出的总结:

  • Encoder 中 self attention

Key:Image Features + Positonal Embeding==上面图的Spatial positional encoding(空间位置编码)

Query:Image Feature + Positonal Embeding==上面图的Spatial positional encoding(空间位置编码)

Value:Image Feature

通过transformer的 self-attention 建模全局关系对 feature 进行增强

  • Decoder Cross-Attention

Key:Image Features + Positonal Embeding==上面图的Spatial positional encoding(空间位置编码)

Value:Image Feature

Query:可学习的query + Decoder Embeddings(初始化为全0)

Cross- attention 中有若干 queries,每个 query 去由 encoder feature 构造的 key 中进行查询,找到跟物体有关的区域,将这些区域的 feature 提取出来。

  • Decoder Self-Attention

Key:可学习的query + Decoder Embeddings(初始化为全0)

Value:可学习的query + Decoder Embeddings(初始化为全0)

Query:可学习的query + Decoder Embeddings(初始化为全0)

Self-attention 则在不同的 query 之间进行交互,实现类似 NMS 的效果。

左边是NLP Transformer的一个结构图,比如一个翻译任务,输入一个英文句子,encoder里面是self attention, 提取句子特征在Decoder中初始的时候输入一个文本起始加上文本的位置编码 输入到self attention中,然后得到的句子特征会和encoder的输入进行一个cross attention,对应一下 Encoder的输入Image Feature对应了文本的embedding,文本的位置编码对应了图像的embedding ,在decoder中,比如输入的这个起始符的embedding对应了初始化全0的decoder embedding , object query对应了起始符的embddding。这两个Transformer中不同的是 DETR同时输入N个query,送到Transformer中,同时得到N个Set prediction,也就是N个集合预测,NLP中是一个词一个词的输进去。

再回过来看,可以将object query 看作是一个可学习的目标的位置编码,与当前输入图像的内容无关,随机初始化,并随着网络的训练而更新,隐式建模了整个训练集上的anchor的统计信息。

因为预测出的是一个集合,DETR使用匈牙利算法(二分图匹配算法)对predictions和ground truth boxes进行最佳匹配,从而实现label assignment。也就是对所有可能的匹配做排序,DETR将一种匹配下模型的总定位和分类损失作为评判标准,损失越低,匹配越佳。注意,该匹配过程是不回传梯度的。

关于Object Query的理解

  • object queries是可学习的embedding,与当前输入图像的内容无关(不由当前图像内容计算得到),随机初始化,并随着网络的训练而更新,因此隐式建模了整个训练集上的统计信息。
  • object query可以看成是adaptive anchor,是对anchor的编码。每个query对应图像中的一个物体实例。因此,object query的数量一般设置要远大于数据库中一张图像内包含的最多物体数。
  • object query通过cross-attention(decoder)从编码器输出的序列中对特定物体实例的特征做聚合(即让该可学习object queries中的每个元素可以捕获原图像中不同位置与大小特征等的物体信息),又通过self-attention(encoder)建模该物体实例域其他物体实例之间的关系。
  • 论文中对不同object query在COCO数据集上输出检测框的位置做了统计,可以看不同object query是具有一定位置倾向性的。绿色表示小物体,红色表示水平的大物体,蓝色表示竖直的大物体。可见不同的 Object Query 确实实现了想要去查询不同地方出现的小物体,比如左下,右边,右上等等。但是对于大物体而言,大家检测出来的定位是相近的。

  • 此外,论文实验结果指出:可以跳过第一解码器层中的第一自注意力层。

优缺点

优点

不需要anchor,不需要nms后处理。

Transformer关注全局信息,能建模更加长距离的依赖关系,而CNN关注局部信息,全局信息的捕捉能力弱

缺点:

  • 收敛速度慢,训练时间长。在 COCO 数据集上,DETR 需要 500 个 epoch 才能收敛,比 Faster R-CNN 慢了 10~20 倍。
  • 小物体检测性能差。高分辨率的特征图为Transformer的Attention机制带来不可接受的计算复杂度和内存复杂度。
  • object query设置不合理,它应该是一个位置编码,应该引入一些位置信息