摘要
论文:End-to-End Object Detection with Transformers
DETR是一个使用transformer进行目标检测的一篇论文。它的亮点在将transformer应用到了视觉任务,将NLP和CV任务之间打通了。DETR实现非常简单,不需要像faster-rcnn一样设计很复杂的结构,而且可以达到和faster-rcnn差不多的结果。
模型大致结构
模型的结构主要是两部分,首先是CNN的图片特征提取部分,然后是transformer的结构部分,经过transformer之后,就输出了目标检测的结果。模型输出的结果是固定的,也就是说最多检测一张图片中N个目标。
CNN输出的结果是一个的tensor,代表了图片提取出的feature map。将feature map变成的二维矩阵放到transformer中。
损失函数
transformer的输出是N个预测,N是一个固定值,这个N要比正常图片中可能出现的目标的数量大一些。数据的标注由两部分组成:一个是代表物体所属类别,一个是代表目标的矩形框。预测值同样由两个部分组成,,表示预测值的第个是个的概率,以及代表预测的bounding box。
然后来说说这个。因为产生了N个预测,那怎么知道每一个预测应该对应图中哪一个物体呢?faster-rcnn中的做法是计算IoU,IoU大于阈值则对应上了。这里是使用了另一种方法,将预测值和gt进行匹配的方法。首先有N个预测,因为真实目标的数量(gt)是小于N的,所以就需要padding,下面这张图里以N=5为例,假如gt只有两个,那么就需要三个来加入进来作为padding。就是预测值到gt的对应关系。这个对应关系要满足。这个最优化是用Hungarian algorithm算出来的。
找到对应关系之后,损失函数的计算公式就是
模型结构
CNN的输出是一个的三维tensor,将这个tensor展开成的二维矩阵喂给transformer encoder,从feature map变成transformer输入的过程用下面这张图比较好解释。transformer encoder的输入有个,同样要产生个输出,然后继续送给transformer decoder。
整体的结构图还是用论文中的图片比较好。transformeren encoder 的个输出,就会被送进transformer decoder。
encoder的输出作为decoder的一个输入,但是transformer的decoder应该还需要一个输入的,这个输入怎么办呢?在阅读理解问题中,encoder的输入是给的阅读材料,decoder的输入是问题,在汉译英任务中,encoder输入是汉语句子,decoder初始的输入是<start>的token,后面的每一步输入都是上一步的输出。在这篇论文中,decoder的输入是object queries,有N个输入object queries,产生N个预测值。
object queries应该是N个向量,这N个向量是随机初始化然后训练得到的。每一个object query都学到了一些东西,原论文中的图7显示了一些object query在做什么,比如第一行第一个就是在询问左下角有什么物体,第一行左数第二个就是在询问中间靠下的地方有什么,等等。其他的一些颜色看一下图片下面的注释就好。
为什么有用
论文中给出了一张效果图,左边的大象,会发现基本上attention注意到的点都是在大象边缘。transformer的注意力机制是特征图中所有的点两两之间都要计算attention值,因此相对于基于anchor的方法,这种方法在图片上的注意力更加灵活。比较值得注意的是下面这张图中红圈圈出来的部分。
画红线的地方是后面那只大象被遮挡住露出来的一小部分,attention一样看到了,展示了这种方法对遮挡物体非常强的适应性,也说明全局所有像素点之间进行attention是有用的。