论文地址:
End-to-End Object Detection with Transformers
Detr是Facebook提出来的一种目标检测结构,使用了一种基于transformer的全新网络结构,在没有使用以往的诸如yolo之类的算法的情况下就能取得相当不错的表现,再次印证了transformer的优越性能。
目录
Introduction
Set Prediction
DETR architecture
Backbone
Transformers and Parallel Decoding
Prediction feed-forward networks (FFNs)
实验结果
DETR for panoptic segmentation
对于Detr模型的评价
自己的做的一点工作
Detr处理的问题是目标检测问题。这类问题可以简化为预测图片中物体的包围盒。现有的针对这类问题的处理方法都往往比较复杂,包括 defining surrogate regression and classification problems on a large set of proposals [37,5], anchors [23], or window centers [53,46]. Detr提供了一种使用transformer的encoder-decoder结构来直接预测包围盒的方法:
Detr模型 先通过一个CNN的backbone网络对图片的进行特征提取,使用一个transformer的encoder-decoder结构直接获得N个固定数量的包围盒的预测。
本文的最主要贡献是使用bipartite matching loss来计算预测结果与ground truth之间的损失,以及使用transformer来代替之前复杂的处理流程。与gpt里面的encoder-decoder不同,这里的decoder是一次性预测所有的bounding box。
接下来就这两个关键问题进行介绍:
包围盒的检测也就是一个集合预测的问题。这类问题有时候会遇到集合交叠的问题:
以往处理这类问题的方法有Non Maximal Suppression。
同时由于Detr模型直接预测N个包围盒的位置,而实际图像里面往往只有很少的物体,所以就需要确定一种匹配的方法,来将物体包围盒的ground truth来与这N个预测进行匹配,没有匹配成功的直接作为背景进行padding。
由于多个包围盒构成了一个集合,所以模型预测出来的结果应当具有集合中的顺序不变性。
这里使用的匹配算法是匈牙利匹配算法,这个算法计算每对预测的包围盒和ground truth的包围盒的距离,采用使得距离之和最小的匹配方式来进行匹配:
注意这里的σ实际上是1~N的一个全排列。也就是每个配对的包围盒的标签对应关系。
那么具体是怎么计算这个距离的呢? 这里贴一段原文里面的计算公式:
具体来说,包围盒的距离由分类分数和距离分数所组成,总的配对目标就是最小化下面的值:
另外原文中提到,在ci是空集(也即是背景)的时候要将对数损失减小十倍,以平衡样本。空集与预测值之间的Lbox距离是一个常数,也就意味着这一部分实际上对匹配结果没有影响
这个Bounding box loss的计算方式如下,还是比较复杂的。具体的计算方式在作者代码的models\matcher.py里面,感兴趣的可以自己去看看。
预处理的backbone网络是一个对图片的维度进行变换的网络,通过卷积层来将图片的大小降低,通道提高。
Detr所使用的transformer结构其实与transformer里面的encoder-decoder非常相似:
Detr先将从backbone得到的C=2048的输入用1*1的卷积层进行降维,然后flatten后加入position embedding送入encoder中去。
在decoder的时候,使用0初始化object queries,再加上position embedding,可以这么理解:求取每一个position对应的patch与图片中的物体的embedding的相似度,使用position的query去查找对应的K有没有要查找的物体。
有几个需要注意的点:
1. Detr的encoder和decoder的position embedding是加在每一层multihead self-attention layer上的,而且只加在Q和K上,不加在V上,作者并没有给出这样做的原因,可能是因为Detr的任务与position密切相关,所以需要在每一层上都加。
2. 原版transformer里面的outputs在输入模型前需要加入attention mask,在预测的时候需要将预测出的当前token输入模型计算下一个token。而Detr的预测实际上是并行的,也不需要attention mask。
3. 在计算损失函数的时候,为了更块的训练,在decoder的每一层上都将中间结果送入FFN中计算损失函数:
作者还提到,Detr需要较长的训练时间。这是由于采用了transfomer结构造成的。
将Decoder的输出送入一个三层的FFN中,预测五个值:包围盒相对图片的中心xy坐标,包围盒相对于图片的height和width,以及包围盒的class label,也就是包围盒是否为背景。随后使用上面所讲的box loss就可以训练模型。
作者与Faster R-CNN做了比较,并做了大量的消融实验,证明了计算auxiliary losses的有用性。
同时也对position embedding做了消融实验最后得出sine at attn是最好的position embedding方式:
这里有一张比较有意思的图:
这里是encoder attention的可视化,可以看到encoder确实是注意到了图片中的不同部分
这里是decoder的可视化,可以看到即使对于重叠的动物的腿,detr依然能分的非常清除,这个效果还是很不错的。
另外对于decoder输入的100个slot,detr统计了它们所预测的包围盒的分布:
每个点的位置代表着包围盒的位置,点的颜色代表包围盒的大小,可以看出不同的slot负责图像中不同的部分,所有slot都有可能预测整个图片大小的包围盒,这与coco的数据分布有关。
作者还测试了面对数据集中从未出现过的数量的包围盒的模型泛化能力:
只需要对Detr做一点小小的修改,就可以将这个模型应用到全景分割的任务上:
为每一个预测出来的包围盒,使用一个panoptic head来生成图片对应的物体的二元分割。然后使用argmax求出每一个pixel最可能对应的物体。
训练的时候,有两种训练策略:可以同时训练两个head,也可以先训练预测box的head,再训练预测二元全景分割的head。
detr模型使用一种全新的方式处理了物体分割这个已经有了很成熟的算法的问题,而且出道即颠峰。可见transformer对于不同领域的问题都能解决的很好,有成为通用人工智能的无限潜力。
至于模型的缺点,作者也承认,对于小目标的检测效果并不出众。我认为使用transformer的结构在目前和未来是很难完全取代CNN的。这是因为现有的Vit模型都将图片分成一个固定大小的patch,而不能像CNN那样每一层有着不同的感受野,能获取图像不同尺寸特征的细节结构。因此我们需要一种能够感知图像不同resolution的特征的方法,而不是全都划分成同样大小的patch一刀切。
而且detr模型收敛速度慢,资源消耗多。使用transformer来处理图像往往都会遇到这种问题。
我认为未来的许多cv问题都可以尝试这种使用transformer作为中间层的处理方式,将重点放在输入层输出层以及其训练方法上。实践已经检验了这些方法的有效性。
在后面的swin-transformer中,直接将图片经过简单的全连接层处理就输入到transformer中,但是我们完全可以尝试更多的网络结构组合。
另外,我认为可以充分利用图像中的对称性,比如将图像左右翻转计算包围盒,然后将得到的包围盒再次翻转与原来的计算平均值。