目标检测领域的里程碑式的工作
DETR: Detection Transformers
文章题目:简单明了,包含两个关键词:端到端、transformer
目标检测领域:从目标检测开始火到detr都很少有端到端的方法,大部分方法最后至少需要后处理操作(NMS,non-maximum suppression非极大值抑制)。无论是proposal based方法、anchor based方法、non-anchor based方法,最后都会生成很多预测框,如何去除这些冗余的框就是NMS要做的事情。
问题:有了NMS,模型调参就会很复杂,而且即使训练好了一个模型,部署起来也非常困难(NMS不是所有硬件都支持)。所以一个简单的、端到端模型一直是大家梦寐以求的,而detr的出现解决了这些痛点。
一、Detr目标:
1、不需要proposal、不需要anchor,直接利用transformer这种全局建模的能力,把目标检测看做是集合预测问题
2、因为有了这种全局建模的能力,detr不会有那么多冗余框,最后出什么结果就是什么结果,不需要NMS做后处理,让模型的训练和部署简单不少
目的:不想让大家觉得目标检测是比图像分类难很多的任务,都可以用简单的,优雅的框架做出来
二、摘要
作者说,他们就是把目标检测的任务看成是一个集合预测问题:目标检测本来任务就是给定一个图像,预测一堆框,每个框不仅要知道的其坐标,还要知道框里包含物体的类别,这些框就是一个集合,不同的图像对应的集合也是不同的,给定一个图片,我要预测这个集合。
因此这篇文章就是把目标检测做成一个端到端的框架,把之前特别依赖人的先验知识的部分删掉了(NMS部分、anchor),一旦把这两个部分拿掉之后,我们也不用费尽心思设计这种anchor,最后不会出现这么多框,不会用到NMS,也不会用到很多超参去调。两个贡献:1、使用新的目标函数,通过二分图匹配的方式,强制模型输出一组独一无二的预测(没有那么多冗余框,每个物体理想状态下就会生成一个框)。2、另外使用encoder-decoder的架构。
两个小贡献:
1、decoder还有另外一个输入learned object query,类似anchor的意思(给定这些object query之后,detr就可以把learned object query和全局图像信息结合一起,通过不同的做注意力操作,从而让模型直接输出最后的一组预测框)
2、想法&&实效性:并行比串行更合适,并不是检测一个大物体前必须先检测一个小物体,或从左到右检测,我们希望越快越好
DETR的好处:
1、简单性:想法上简单,不需要一个特殊的library,只要硬件支持transformer或CNN,就一定支持detr
2、性能:在coco数据集上,detr和一个训练非常好的faster RCNN基线网络取得了差不多的效果,模型内存和速度也和faster RCNN差不多
3、想法好,解决了目标检测领域很多痛点,写作好
4、别的任务:全景分割任务上detr效果很好,detr能够非常简单拓展到其他任务上
三、引言
1、目标检测任务:对每一个感兴趣的物体,去预测一些框,和物体类别,就是一个集合预测问题。
2、现在大多数好用的目标检测器,都是用间接的方式去处理集合预测问题,(1)比如proposal方式(如RCNN系列工作),(2)anchor方式(YOLO系列,focal loss),non-anchor based方法(物体中心点center net,FCOS),他们都没有直接做集合预测任务,而是设计一个替代(回归、分类)解决目标检测问题。所有这些方法性能受限于后处理操作(NMS),由于用了anchor和NMS导致检测器都非常复杂,难以优化和调参。
3、端到端的思想已经在别的很多任务里大范围使用,而且使任务更加简单好用,我们不要先验知识,就是要用一个端到端网络。
detr流程(训练):
1、CNN提特征
2、特征拉直,送到encoder-decoder中,encoder作用:进一步学习全局信息,为近下来的decoder,也就是最后出预测框做铺垫。直观的解释为什么需要使用transformer encoder呢?如果使用了transformer encoder,那么每一个点或者说每一个特征就会跟着图片里面的其他的特征有交互了,这样大概就知道那块是那个物体,对于同一个物体就应该只出一个框而不是好多框,所以全局的建模有利于移除冗余的框。
3、decoder生成框的输出,当你有了图像特征之后,还会有一个object query(限定了你要出多少框),通过query和特征在decoder里进行自注意力操作,得到输出的框(文中是100,无论是什么图片都会预测100个框)
4、生成的100个框如何与ground truth这个框做匹配并计算 loss? :二分图匹配,如上图,我们计算100个预测的框和2个GT框的matching loss,决定100个预测框哪两个是独一无二对应到红黄色的GT框,用匹配的框去算目标检测的loss。而没有匹配到的98个框就会被标记为没有物体。
5、推理1、2、3一致,第四步loss不需要,直接在最后的输出上用一个阈值卡一个输出的置信度,置信度比较大(>0.7的)保留,置信度小于0.7的当做背景物体。
结果:
1、detr对大物体预测很准,归功于transformer,能进行全局建模(原来使用anchor的话就会受限于anchor大小)
2、缺陷:对小物体效果不好(多尺度、多特征,可以提高小物体的检测)后续改进:Deformable DETR
3、detr训练很慢,500个epoch(coco大多数模型一般训练几十个epoch就行)
检测效果:
detr由于使用transformer全局建模,没有用anchor,想检测多大物体就检测多大,所以检测大物体效果较好。detr框架太简单,没有多尺度特征,没有FPN,没有复杂的目标检测头,所以在小目标检测效果不好
四、相关工作
目标检测:
目前大多数的检测器是根据初始猜测做预测:
1、two-stage:初始猜测是中间的proposal
2、one-stage:初始猜测是anchor或物体中心点
最近一篇论文做了详细比较,发现他们的性能和刚开始的初始猜测非常相关,怎么做后处理对性能影响至关重要
怎么后处理:
1、集合思想:可学习的NMS方法、关系型网络,可以利用自注意力方法去处理物体之间的联系,得出独一无二的预测,就不需要后处理的步骤(性能较低)
解决:人工干预:手工设计的场景特征帮助模型学习,但是detr目标是想让目标检测任务更加简单,不希望用到过多人工先验知识
2、循环检测器:encoder-decoder:让detr工作主要原因:transformer
五、方法
分两块:1、基于集合的目标函数怎么做,作者如何通过二分图匹配把预测的框和GT框连接在一起,算得目标函数 2、detr具体模型架构
目标函数部分:
detr模型最后输出是一个固定集合,无论图片是什么,最后都会输出n个(本文n=100)预测框
问题:detr每次都会出100个输出,但是实际上一个图片的GT的bounding box可能只有几个,如何匹配?如何计算loss?怎么知道哪个预测框对应GT框?
作者这里把这个问题转换成了一个二分图匹配的问题:
二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。简而言之,就是顶点集V可分割为两个互不相交的子集,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻。
加权二分图匹配可以认为是有ABC三个工人,以及xyz三个工作,每个工人去做xyz工作的花费不同,如何去为每一个个人安排一个工作,使得最后我们的花费最低,可以使用遍历的方法,亦可以有很多高效的方法:匈牙利算法。
另外scipy包提供的linear sum assignment可以完成这个最优排列。detr论文里:代码也用的linear sum assignment函数来计算对应的匹配关系,只需要提供一个cost matrix矩阵就可以。a,b,c看成100个预测框,x,y,z看成GT框, cost matrix 损失矩阵未必都是正方形,最后丢到这个函数里面得到一个最优匹配。
那么对于目标检测任务,cost matrix 损失矩阵的值应该放些什么?loss包含两部分:分类loss、出框的准确度。所以也就是遍历所有的预测的框,那这些预测的框和gt框去算两个loss,然后把这个loss放到cost matrix矩阵 就可以了。这样就得到了对应gt的预测框(一对一),进而计算loss,梯度回传更新模型参数。
detr主体网络框架:
输入图片大小:3*800*1066(3:rgb),首先使用卷积网络获得特征:2048*25*34,然后降维变成256*25*34,然后给transformer添加位置信息:大小也是256*25*34,特征+位置作为transformer输入,特征拉直: 256*25*34 ==》 850*256,850就是序列长度,256是向量维度。后面的transformer encoder就跟普通的transformer encoder一样,输出==输出,仍然是850*256,接下来送入decoder里面。不同于一般的decoder,这里的object queries是一个可学习的,100*256大小的向量。在decoder里面做cross attension。输入 object queries ,另外一个输入是来自encoder的全局特征850*256.这两个去做自注意力操作,得到一个100*256的特征的decoder输出。最后添加一个检测头全连接层(FFN),获得类别预测(91类)和框预测(4:框的中心的+高度宽度),获得了100个框,利用匈牙利算法跟gt匹配,然后求loss,更新模型。
六、实验
检测效果:detr由于使用transformer全局建模,没有用anchor,想检测多大物体就检测多大,所以检测大物体效果较好。detr框架太简单,没有多尺度特征,没有FPN,没有复杂的目标检测头,所以在小目标检测效果不好。
下面的表格给出了 DETR 与基线 Faster RCNN 的定量性能对比。最上面一部分的 Faster RCNN 的性能结果是 Detectron2 的实现,之所以将 Faster RCNN 分成两部分,是因为 DETR 中使用了近年来很多新的训练 trick,如 GIoU loss、更强的数据增强策略、更长的训练时间,因此作者团队添加这些策略重新训练了 Faster RCNN,以作公平的对比。
近年来的新的训练策略对于目标检测模型的提升非常明显。对比表格的第一、第二部分,完全相同的模型,只是用了更优的训练策略,基本能稳定涨两个点。在同样的训练策略、网络规模大小的情况下,DETR 比 Faster RCNN 高 1-2 个点。对比表格的后两部分可以观察到这一点,DETR 对比基线的 Faster RCNN 还是还是有提升的。
DETR 在大物体的检测上远超 Faster RCNN,但是在小物体的检测上却也低了不少。
表格的后三列分别是小、中、大物体的检测性能,可以观察到 DETR 在大物体的检测上更出色,但是对于小物体的检测甚至远不如 Faster RCNN。大物体检测性能的提升得益于 Transformer 结构的全局建模能力,且没有预置的固定 anchor 的限制,因此预测框想多大就多大。而 DETR 在小物体上表现不佳,是因为本文中 DETR 的模型还是一个比较简单的模型,没有做很多针对目标检测的优化设计,比如针对小物体、多尺度的 FPN 设计。DETR 的网络结构还有待后续工作来改进。
表 1 detr和faster RCNN的对比,+表示用更好的训练策略把三个模型重新训练一遍
gflops参数:每秒进行的浮点运算次数,flops越小,模型越小,跑起来越快?X。如果更关心速度,比较fps
首先我们来看对于 Encoder 的可视化,下图展示了对于一组参考点的 Encoder 注意力热力图的可视化,即参考点对于图像中所有其他点自注意力值的大小。可以观察到,Transformer Encoder 基本已经能够非常清晰地区分开各个物体了,甚至热力图已经有一点实例分割的 mask 图的意思了。在有一定遮挡的情况下(左侧两头牛),也能够清楚地分开哪个是哪个。这种效果正是 Transformer Encoder 的全局建模能力所带来的,每个位置能够感知到图像中所有的其他位置。因此能够区分出图像中的不同物体,从而对于一个物体,尽量只出一个预测框。
通过前面的可视化,我们已经看到,Encoder 学习了一个全局的特征,基本已经能够区分开图中不同的物体。但是对于目标检测来说,大致地区分开不同的物体是不够的,我们还需要精确的物体的边界框坐标,这部分就由 Decoder 来做。
下图在 Decoder 特征中对每个不同的物体做了注意力的可视化,比如左图中的两头大象分别由蓝色和橙色表示。可以观察到,Decoder 网络中对于每个物体的注意力都集中在物体的边界位置,如大象的鼻子、尾巴、象腿等处。作者认为这是 Decoder 在区分不同物体边界的极值点(extremities),在 Encoder 能够区分开不同的物体之后,Decoder 再来关注不同物体边界的具体位置,最终精准地预测出不同物体的边框位置。因此,Encoder-Decoder 的结构是必要的,它们各司其职,一个都不能少。
扩展到全景分割任务
作者同时还将该网络应用于全景分割任务中.增加一个分割的head就可以。
结论
下图是20个object query可视化(n=100,这里只有20个)
object query 到底学了什么(绿色代表小的bounding box,红色代表大的横向bounding box,蓝色代表大的竖向bounding box)object query和anchor有些像,anchor是提前定一些bounding box,把预测和这些提前定好的bounding box对比,object query是可以学习的。以第一个 object query 来说:对于一个图片, object query 会去问图片的左下角有没有小物体,以及中间有没有横向的大物体。
为了说明端到端的 DETR 框架的简洁性,作者在论文末尾给出了 DETR 模型定义、推理的 “伪代码”,总共不到 50 行。之所以这里的伪代码要加引号,是因为其实这已经不算是伪代码了,而是直接可运行的 PyTorch 代码。当然这个版本缺少了一些细节,但也完全能够展现出 DETR 的流程了。该版本直接用来训练,最终也能达到 40 的 AP。读者可以对应伪代码再过一遍刚才介绍的 DETR 完成流程,体会一下一个端到端的目标检测框架有多幺简洁。
代码实现:
后续关于detr的改进工作:
1、Deformable DETR: Deformable Transformers for End-to-End Object Detection
2、Omni-DETR: Omni-Supervised Object Detection with Transformers、
3、UP-DETR: Unsupervised Pre-training for Object Detection with Transformers
4、PnP-DETR: Towards Efficient Visual Analysis with Transformers
5、SMAC-DETR
6、DAB-DETR: Dynamic Anchor Boxes are Better Queries for DETR
7、Accelerating DETR Convergence via Semantic-Aligned Matching
8、DN-DETR: Accelerate DETR Training by Introducing Query DeNoising