Paper Reading :End-to-End Object Detection with Transformers

Paper Reading :End-to-End Object Detection with Transformers

这是自己第一次写paper reading,花了比较长的时间,临近期末,忙到飞起。

该文章提出的图像中物体检测的思路是:首先用CNN提取图像特征然后用transfromer模型来检测物体,训练过程使用二分图匹配损失。与以前的物体检测框架相比,该文提出的框架想对要简单很多,工程实现简单且很少需要调超参数。

目标检测的任务简言之就是Where they are and what they are,论文提出的方法所得的一组结果,每个结果以一个盒子形式表示,代表一个元祖,包含物体的类别和物体包围框,即(class,bounding box)。

在这里插入图片描述
文章提出框架给出的预测结果数量是固定的,预测结果是N个(可以是很大),那么标注结果也要是N个(N表示最多能够检测的物体)。模型经过训练就能学会给出同样个数的无类别预测,因为如果给出了一个不应该得出的输出就要接受惩罚,惩罚就是二分图损失。

二分图匹配损失,当计算损失的时候,首先计算一个最佳匹配(论文当中提到了匈牙利算法),得到最佳匹配后就可以计算损失,损失函数记为L表示预测与标注的符合程度:
1.假设如果预测与标注都表示无类别,那么应该不存在损失值;
2.但是如果预测与标注的物体类别信息吻合;包围框也吻合的情况就非常好,损失值可能很小;
3.但是如果只是边界框吻合,但是类别信息不吻合,这就不太好了;或者反过来,又或者预测与标注都对不上,这是最差的情况。
怎么衡量这个匹配有多吻合,如果使用二分图匹配的话,其实就是想要得到一个最佳的匹配。左边的预测只对用唯一有个右边的标注,使得总体的损失最小,最佳对应关系,根据匹配计算损失(解决了之前提到的顺序问题),n表示最大可预测的物体个数,如果标准这边小于n那就用无物体信息去填充,这个思想很妙,只不过这依赖于预测和标准两边的个数都要是N,不过你也可以把N设的足够大能够覆盖所有可能的情况。

另外,类别损失函数用的是softmax的损失,也就是计算交叉熵(cross-entropy loss),而包围框的损失函数是L1损失的加权和和IOU损失,加上IOU损失是为了让损失函数不依赖于包围框的大小,主要思想是均衡两个包围框的重合度。损失函数的功能包括了,衡量预测和标注的类别吻合度,还有包围框的吻合度。但是计算损失的前提是首先有个匹配结果,不然的话没有办法计算损失函数。
在这里插入图片描述
骨干网是一个CNN,然后把CNN的输出特征与位置编码信息相结合,CNN提取的特征图可以看做是图像的缩小版,仍然具有一些图像的性质。然后把特征展开,因为Transformer的编码器模块只处理序列输入,所以需要把CNN特征变为一个序列。文章中的做法是,假设CNN提取的特征维度是(c,h,w),把特征展开成维度(c,wh)的序列。换句话说,有wh长度的序列,假设每个序列的长度是c=4,然后将其放入编码器,这样子编码器现在就可以将这个序列转换为相同长度的特征序列。

为什么使用transformer来处理图像特征序列?这里其实就是用到了注意力机制,序列中的每个位置都可以获得其他位置的信息,所以transformer的每一层,都能聚集下一层序列中的所有位置信息,Transformer模型的表达能力很强,如果你有一个序列,你想每个序列其他位置有信息交互,可以采用transformer模型,比如说NLP中一个很长的句子,上一句中的主语,在下语句中用代词指代,但是之间隔了很长的距离(中间隔了很多词),所以需要能建立起长距离依赖的模型。回到目标检测这个任务,文章认为也需要建模,长距离的依赖。

在这里插入图片描述
把编码器的输出输入到解码器中,所以可以认为这里的编码器在做特征的映射,也可以直接把CNN特征输出作为解码器的输入,但是可能经过编码器的效果更好。解码器的功能其实和编码器类似,但是还有一个来自编码器的额外输入,与bert不同,bert只含有编码器,这篇文章的模型和”attention is all you need”提到的模型更像,先过一个编码器,然后作为条件信息输入到解码器(因为是transformer模型,也就是输入的是序列,输出的也是序列)。这里编码器的输入序列文章当中叫做“object queries”,和文章“attention is all you need”不一样的是并不做自回归操作 ,比如输入的object queries这个输入序列,然后就可以得到同样长度的输出序列,然后输出序列直接给到分类器,得到预测类别和包围框,解码器输入的序列中的每个位置在经过解码器之后会得到一个对应的预测,可以表示一个物体或者表示无物体,(注意是:序列每个位置都可能对应一个预测包围框)。

那么解码器的输入“object queries”究竟输入的是什么呢?首先肯定是想把左侧的图像信息转换为右侧包围框的结果,那解码器的输入应该是什么呢?解码器的输入就是N个随机向量,然后得到N个输出,因为你想要得到N个预测(类别信息和包围框)。所以你要给解码器N个输入,相当于告诉解码器需要N个输出,然后每一步根据图片特征中包含的信息,就拿得到正确的预测,感觉这里的思想挺玄乎的。如果想要进一步了解transfromer架构,可以看论文的附录部分。

在这里插入图片描述
上图是论文附录中更详细的框架图,这里是图像特征输入,然后经过一个编码器(多头注意力和FFN),然后编码器的输出作为解码器的条件输入。一开始“object queries”是随机向量,将这些随机向量编码与该图像信息结合起来,因此可以认为这些随机输入经过解码器之后会被转换编码,然后与图像特征结合。此时,图片已经变成了一组特征向量,当编码“object queries”输入向量时,相当于去图像特征信息中查询,这就是transformer的机制,图像特征通过注意力机制的转换,得到包围框和类别的预测,这真的很难解释清楚。

首先你得了解注意力机制,当然这个框架最重要的部分是“解码器的输入’object queries’究竟是代表啥”,实际上输入object queries是随机向量,好像是要去学习n个不依赖与输入图片的不同物体的预测,这是最有趣的部分了。
在这里插入图片描述
这里不同的颜色指不同大小的包围框。这些“object”quries”各不相同,论文中设定“object queries”的长度是100。上图中可视化了其中20个(可视化了数据集中所有的预测包围框。就好比“训练n个不同的人从不同角度向模型提问(每一个人对不同的实物感兴趣,包括不同的类别信息和不同的区域,然后这些人都将输出他们对于他们感兴趣内容的最佳预测),比如其中第一个人只对图片左下角的区域感兴趣,第二个人只对图片中心的物体更感兴趣”。为了得到不同的预测框,相当于训练n个不同的人去提问问题,这个提问的过程就很像注意力机制,用注意力机制去关注图像特征的某一部分区域,得到一些信号,然后将这些信号和自己的信号合并做转换(对图像有更多的了解)。这个人就会再次询问,对图像中的更多部分都感兴趣(也就知道了关于图像的更多信息),从高层次来看,他可以反复再问其他问题,通过发送这些问题query向量,然后获得V向量,up to up laryer, 这个人可以问一些更细致的问题,比如说其他人对什么感兴趣,因为现在右N个不同的人会提问不同的问题,就这样训练这些人,让他们学会对真个数据集提问。

这些人的感兴趣的点都是不依赖于某张图像的,这种学习方式是全局的。序列当中的每个位置可以相互关注,序列中的每个位置都可以相互通信和协助来聚合图像中的信息,因此在每一层中,他们都可以相互交流。然后在下一层,又重复这个过程,然后达成共识比如说你已经知道左边已经有一只鸟了,我就去关注右边有啥吧,你已经预测了这只鸟,那我看看下有没有大象等等。所以可以看到transformer框架对于包围框的预测也很合适,这些不同的物体可以相互关注,因此,可以相互交流。

在进入论文实验部分解读之前,我想说下为什么transformer模型,尤其是编码部分,其实也是有很多大意义的。因为在输入编码器之前把图像的特征展开为HW长度的序列,然后需要想象一下transformer做了啥,对于序列当中的每个位置都可以从其他点收集信息,不过这也是transformer模型的缺点之一,通过二次注意力机制来完成。假设只有一个通道特征,展开为HW,建立横纵坐标都为wh的矩阵,这个矩阵可以告诉我序列当中哪个部分会对序列中其他部分感兴趣,刚开始训练汇总每个位置会关注自己,所以沿对角线的值都比较大,会得到一个(HW,H*W)二维矩阵,因为序列中每个位置可以关注序列中的其他位置,这就是注意力机制。

为什么对包围框的预测很有利呢?因为假设现在有一个矩阵,矩阵当中的每个点其实定义了一个包围框,因为这个点对应的横纵坐标表示图中的一个坐标,然后纵坐标对应图像中的另外一个坐标,这是一个注意力矩阵,意味着这两个点需要相互交流,其实两个坐标点已经可以表现一个包围框了,对每个独立的点进行分类其是否为包围框,因为注意力矩阵一个点定义了图像当中一个包围框,transformer对于这类的任务确实很适合。
和其他物体检测框架相比,比一些更加复杂的框架相比性能业不差,基于CNN的架构更加复杂,但是在训练时间上比较耗时。
在这里插入图片描述
论文中可视化了一些注意力矩阵,假设现在关注图中的这几个点,然后可视化注意力矩阵,可视化的注意力矩阵可以看到,实际上整个物体本身的位置都有被关注到。物体检测就有个问题就是遮挡问题,物体某些部分被其他物体遮挡了,但是从注意力矩阵看到,只关注了没别遮挡的部分,一个物体的注意力矩阵并不会与其他物体有重合。这就是这个框架给人留下深刻印象的部分,论文中也给出了其他例子,比如说扩展到了多个实例,训练的过程中从来没有多达24个长颈鹿的图片,但是预测的时候什么都能预测出来。
在这里插入图片描述
还有一个论文中当中最有趣的图片是,如图所示注意力的可视化,可以看到即使前面这个大象的包围框,其中后面大象的脚是被赋值蓝色。学会了辨别遮挡问题,这很难解释,但是通过这张图就可以很清晰的看到这些了,如何去区分两个右重叠的物体,但是后面物体的部分可能会出现在前面物体的包围框内。
在这里插入图片描述
同样看一下斑马图片的遮挡情况,可以看到每个斑马的注意力都关注到了正确的位置,比如后面这只斑马的脚被正确标为了黄色,这是非常厉害的。

整个框架很容易对每个像素做分类,比如说上图是coco数据集的可视化;也可以用于全景分割的任务(需要标记每个像素的类别),把图像输入到检测器,然后检测实例,拿到物体对应的注意力图,随后通过一个CNN将注意力图放大(因为注意力图比原图要小,所以需要重新放大)。最后就是对每个像素进行简单的分类,同样不用的人对不同的物体感兴趣,每个人负责分类他们对应的像素,然后把每个人的预测融合在一起,实验结果impressive。

文章的附录提供了代码(pytorch),同样也有提供预训练的模型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值