原文链接
PaperReader上搜索End-to-End Object Detection with Transform
原文笔记
What:(DETR) End-to-End Object Detection with Transformers
把目标检测这个任务直接看成是一个集合预测(把所有框视为一个集合)的问题(,把目标检测做成了一个端到端的框架,把之前特别依赖人的先验知识的部分都给删掉了,比如(NMS),还有就是生成anchor的部分
集合预测:
结社一张图像中有N个Object,那这N个object就是一个集合,DETR这个算法就是可以一次性从图像中预测出这个包含N个Object的集合
目标检测本来任务就是给定一个图像,预测一堆框,每个框不仅要知道的其坐标,还要知道框里包含物体的类别,这些框就是一个集合,不同的图像对应的集合也是不同的,给定一个图片,我要预测这个集合
主要贡献:1、把目标检测做成了一个端到端的框架,简化了目标检测的流程,之前的算法我们一般都要在最后得到的一堆预测框中做NMS,去删除冗余的预测框,或者是我们需要手工的去设计anchor,(以及生成几个anchor)这就需要我们使用一些先验知识。但是DETR就不需要做这些,他是一个端到端地网络。
2、利用了Transformer encoder-decoder的架构
3、提出了一个新的目标函数(是一个基于集合的全局损失),通过二分图匹配的方式,强制模型输出一组独一无二的预测,不会生成冗余的框(没有那么多冗余框,每个物体理想状态下就会生成一个框)(
4、decoder还有另外一个输入learned object query,类似anchor的意思,(给定这些object query之后,detr就可以对objects和图像的全局信息的关系进行推理,并行的直接的输出最终的预测结果,(通过不同的做注意力操作,从而让模型直接输出最后的一组预测框))(object queries是一个可以学习的参数,同时我们也用它来指定输出的预测框的个数,是通过他的尺寸来指定的,
5、对于所有预测框的输出是并行输出的,而不是串行输出的(这是符合直觉的,并行比串行更合适,并不是检测一个大物体之前必须先检测一个小物体,或者是从左到右进行检测,我们希望越快越好。Nlp需要顺序进行)
DETR的好处:
1、简单性:想法上简单,不需要一个特殊的library,只要硬件支持transformer或CNN,就一定支持detr,端到端的实现方案让目标检测任务更加简单了
2、性能:在coco数据集上,detr和一个训练非常好的faster RCNN基线网络取得了差不多的效果,模型内存和速度也和faster RCNN差不多
3、想法好,解决了目标检测领域很多痛点,写作好
4、别的任务:detr能够非常简单拓展到全景分割任务,它的效果也非常的好,detr能够非常简单拓展到其他任务上
Facebook research的代码一般都非常好
Why:
- 为什么端到端:从目标检测开始火到detr都很少有端到端的方法,大部分方法(无论是proposal based方法、anchor based方法、non-anchor based方法,最后都会生成很多预测框)最后都需要后处理操作(NMS,non-maximum suppression非极大值抑制)去除这些冗余的框,这就需要用到一些人工的先验知识,作者想尽可能地少用先验知识(基于锚点的方法也要用到先验知识)因为有了NMS模型调参就会变得复杂,而且即使训练好了一个模型部署起来也非常困难,所以一个简单的端到端的模型一直是目标检测模型所追求的,detr解决了这些痛点。
- 至于为什么要用Transformer:Transformer的encoder结构使得每个特征有全局交互信息,是他知道哪块是什么物体哪块又是另一个物体这样就理所应当只预测出一个框而不是预测出好多的框。
Challenge:
Idea:
Model:
Decoder下面的部分可以理解为是mutiheadselfattention在学习anchor的特征,decoder上边这个部分可以把它理解成它在拿到图像的全局特征信息和anchor的特征基础上,预测或是学习图像中的BoundingBox坐标以及物体的类别。
DETR训练流程:
- CNN提取特征
- 特征拉直,送到encoder-decoder中,encoder作用:进一步学习全局信息,为接下来的decoder,也就是做后出预测框做铺垫(encoder之后得到图像的全局信息)
- decoder生成框的过程:通过transformer的encoder获得全局感知的特征后,将此特征和object query(另一个向量,限定了模型输出框的个数,object的预测框)进行cross-attention的操作,得到预测框集合的输出(本文中将此超参数设置为100,无论是什么图片都会预测100个框。
- loss:二分图分配,计算100个预测的框和2个GT框的matching loss,决定100个预测框哪两个是独一无二对应到红黄色的GT框的,将匹配到的独一无二的框去计算目标检测的loss.
训练框架示意图:
我们将一张图像喂入DETR模型,我们会得到一百个预测框,其中会包括这一百个预测框的类别信息和坐标信息,这100这个数值它是一个超参数,因为大部分图像中的object的数量都不会超过一百个,所以就选择使用100,通过标注信息我们知道图像中有两个object,然后我们使用匈牙利算法从预测出的100个候选框中,筛选出两个预测框,这两个预测框和这两个标注框是一一对应的关系,最后我们再使用·这筛选出的两个预测框和这两个标注框一起去计算损失,反向传播去优化模型参数。
DETR预测过程:
与训练过程的1、2、3一致,第四步loss不需要,直接在最后的输出上用一个阈值卡一个输出的置信度,置信度比较大(>0.7的)保留,置信度小于0.7的当做背景物体
测试阶段框架示意图
在测试阶段用网络预测出100个预测框之后,我们将这100个预测框的类别的置信度,和类别置信度阈值进行对比,大于阈值的预测框我们保留,小于阈值的我们把它给排除掉
(通过训练阶段和测试阶段我们可以知道在DETR里我们使不用手动设计anchor的,也是没有用到NMS的)
结果
1、detr对大物体预测很准,归功于transformer,能进行全局建模(原来使用anchor的话就会受限于anchor大小)
2、缺陷:对小物体效果不好(多尺度、多特征,可以提高小物体的检测)
3、detr训练很慢,500个epoch(coco大多数模型一般训练几十个epoch就行)
主要代码
见下篇
参考: