Advertisement

End-to-End Object Detection with Transformers

阅读量:

End-to-End Object Detection with Transformers

image-20210302144739175

会议:2020 ECCV

论文:https://arxiv.org/abs/2005.12872

代码:https://github.com/facebookresearch/detr

创新点:

  • \作者摒弃了基于anchor、NMS等这种需要手工设计的模块,和R-CNN系列、YOLO系列,以及其他anchor-free的方法都不同,减少检测器对先验性息和后处理的依赖,做到了真正的end2end。
  • 使用类似机器翻译的序列预测思想,利用了transformer,其中的self- attention允许模型抑制重复的预测,跳出了目标检测的传统方法。
    image-20210318160627735

Instruction

将目标检测任务转化为一个序列预测(set prediction)的任务,没有使用two-stage方法的proposals,没有使用YOLO系列的先验框,也没有用到NMS。

总体的思路是 :首先将图像输入到CNN中提取特征,特征+位置信息叠加后输入到tranformer中,输出固定个数的预测结果(一个GT对应一个预测结果)。训练过程中,用到了匈牙利算法和二分图匹配。

作者提出了DETR模块,使用transformer编码-解码器结构和二分图匹配的方法,由输入图像直接得到预测结果序列。transformer结构引入了自注意力机制,它的作用是在一个序列中,显式建模元素之间的所有成对的一种对应关系,使这些结构特别适合于一系列的预测。DETR一次性预测所有的object,整体的模型进行端到端训练,损失函数是在预测和GT上进行二分图匹配。因为是在集合上进行预测,为每一个预测结果分配一个GT,所以可以实现并行计算。

存在的问题

  1. DETR对大目标检测效果比较好,因为self-attention更关注全局信息,而对小目标检测效果比较差。可能的原因是transformer做的是全局运算
  2. 训练时间长,16张V100卡要在COCO上训练500个epochs,5天,性能才可以比肩Faster R-CNN。

集合预测

目前没有权威性的深度学习模型用来做集合预测,通常的策略就是设计一个基于匈牙利算法的loss,来做一个预测和GT之间的二分图匹配。

Transformer和并行解码

Transformer是一个用于机器翻译的自注意力机制模块,它通过扫描所有的序列来获得全局信息,优势是全局计算和perfect memory(可以理解为保存全局信息,以及占用内存小),所以它比RNN更适合长序列。

作者将transformer和并行解码结合起来,平衡计算成本和全局计算能力的trade-off,取一个合适的权重。

目标检测

无论是two-stage还是one-stage,先验anchor都很影响检测的结果,作者直接去掉了这些需要手动设计的预检测模块,不在先验anchor上进行预测,而是直接通过一组absolute box直接预测输入图片。

The DETR model

集合预测中的两个关键元素:

  1. loss是一个集合,其中的元素是每个预测与GT之间的匹配
  2. 模型架构可以预测一组objects并建模它们之间的关系
集合预测损失函数

DETR输出N(通常比实际目标个数要多)个预测结果,一个主要的困难就是给预测的目标打分,包括类别、位置、尺寸。
image-20210326111315772

  • y:GT的集合,如果不足N个,则用\emptyset补齐
  • \hat{y}:N个预测的集合

为了实现这个二分图匹配,需要找到损失最小的匹配顺序\hat\theta,匹配过程用到了匈牙利算法。

  • \mathcal{L}_{match}:两个集合完成匹配时的损失

匹配成本考虑了:类别预测、预测和GT之间的相似性预测。GT集合中的每个元素可以被视为y_i=(c_i,b_i)c_i是一个类别标签(也可能是\emptyset),b_i \in [0,1]^4代表GT中心点相对于整个图像的位置(归一化后的),以及物体高度、宽度相对于图像的大小。完成匹配之后的损失函数是
image-20210317150633638

p是类别为c的概率,分类部分采用了较差熵损失;预测框定义为b,鉴于常用的L1 loss对于较大的估计和较小的估计有着相似的权重,又加入了尺度不变性的GIoU
image-20210318160522629

DETR结构

网络架构:
image-20210318160619964

  1. backbone:CNN
  2. 一个编码-解码的transformer
  3. 一个简单的前馈神经网络FFN做最后的预测

1. backbone

利用CNN,将size为3\times W_0 \times H_0的输入图片,变成2048 \times \frac{W_0}{32} \times \frac{H_0}{32}的feature map

2. transformer encoder
img

因为transformer要求输入的是一个序列,所以首先用一个1 x 1的卷积核做一个flatten的操作,将featrue map的每个通道做成一维向量,也就是c \times HW

每个encoder结构都由(multi-head self- attention+前馈网络FFN)构成。因为transformer具有排列不变性,也就是输入顺序不影响结果,所以加入一个空间位置编码。
image-20210326103808816

作者将编码器最后一层的output做了可视化,encoder的attention已经分离了实例,可以简化decoder对对象的提取和定位。

关于Multi-head attention和Multi-head self-attention的区别:Multi-head attention的输入:Key、Value序列是相等的,而Query序列与Key、Value矩阵不相等。Multi-head self-attention的输入:Query序列与Key、Value矩阵都相等。后者可以看作是前者的特殊case。

3.transformer decoder

将encoder得到的预测序列,也加上空间位置编码之后,输入到decoder中,并行解码。

在使用 transformer 处理图片类的输入的时候,一定要注意position的问题,在输入中内嵌入位置信息,这样得到的输出才能与原来的信息对应起来。
image-20210326104306879

同样地,作者将decoder的结果可视化,它的attention是局部的,更关注物体的四肢等细节,也就是说,在encoder通过全局注意力分离实例后,decoder更侧重于提取类别和对象边界。

4. FFN

最后的预测 = 带有d维隐藏层的3层感知器 + 线性投影层 + ReLU

FFN预测框的标准化中心坐标,高度和宽度w.r.t. 输入图像,线性层使用softmax函数预测类标签。

Experiments

image-20210318170028241

DETR-DC5表示在主干网络(默认Resnet-50)的最后一个stage加了个空洞卷积并减少了个pooling层实现分辨率增大一倍,可以提高对小目标的检测能力。DETR-R101表示backbone选取Resnet-101。

一些训练trick:通过随机裁剪做数据增强,AP涨了1个点;对于没有被预测出类别的,使用它置信度第二高的类别(这里的置信度是用transformer预测出来的,还是KM算法的权重?),AP涨了2个点;使用500个epochs训练,但在400个epochs之后learning rate衰减,AP涨了1.5个点。

DETR框架虽然简洁,但效果与经典方法faster rcnn不相上下,其中DETR对于大目标的检测效果有所提升,但在小目标的检测中表现较差。该文提出的方法十分新颖,使用类似机器翻译的序列预测思想,打破了目标检测的传统思想,减少检测器对先验性息和后处理的依赖,使目标检测框架更加简洁的同时获得了与faster rcnn相媲美的效果。

该方法的不足表现在训练阶段,需要的时间和硬件资源需求较大,因此训练的难度还是挺大的。

匈牙利算法

匈牙利算法是基于图论提出来的,用于匹配,它解决的是二分图的最大匹配问题。在计算机视觉中多用于目标跟踪,end2end这篇论文把预测和GT看为一个二分图,在训练模型的过程中,做预测和GT的匹配,后续用来计算loss,从而寻求最大匹配。

下面是几个基本的概念。

交替路 :从一个未匹配点出发,依次经过非匹配边、匹配边、非匹配边…形成的路径叫交替路。

增广路 :从一个未匹配点出发,走交替路,如果途径另一个未匹配点(出发的点不算),则这条交替路称为增广路。增广路有一个重要特点:非匹配边比匹配边多一条。因此,研究增广路的意义是改进匹配 ,只要把增广路中的匹配边和非匹配边的身份交换即可,这样匹配边就会比原来多一条啊,如此迭代下去,就能找到最大匹配。

匈牙利算法 就是不停地寻找增广路来增加图中的匹配边,直到达到最大匹配,先到先得,能让就让。匈牙利算法的要点如下:

从左边第 1 个顶点开始,挑选未匹配点进行搜索,寻找增广路。

1)如果经过一个未匹配点,说明寻找成功。更新路径信息,匹配边数 +1,停止搜索。

2)如果一直没有找到增广路,则不再从这个点开始搜索。事实上,此时搜索后会形成一棵匈牙利树。我们可以永久性地把它从图中删去,而不影响结果。

由于找到增广路之后需要沿着路径更新匹配,所以我们需要一个结构来记录路径上的点。DFS 版本通过函数调用隐式地使用一个栈,而 BFS 版本使用 prev 数组。

在CV问题中,匈牙利算法对于模型预测的准确率要求很高,因为它将每个待匹配对象的地位视为相同的,在这个前提下求解最大匹配。但在实际的检测问题中,每个预测对象不可能是相同权重的,所以可以设定一个较高的阈值,只将置信度较高的匹配边送到匈牙利算法中。(KM算法可以解决带权二分图的最优匹配问题,这里不讨论。)

全部评论 (0)

还没有任何评论哟~