说明:本文仅供学习
前面小组同学介绍其他专题时也介绍了Transformer在当中的应用。Transformer的确是近年来比较火的一个专题。最开始它是应用在NLP领域。从研究的数据来看,近几年来在CV、语音视频、多模态等领域的研究发表非常地迅猛。其中,在CV领域上的Transformer一般统称为Vision Transformer, 简称Vit。
同样的,Transformer在目标检测的研究也发表了很多paper. 左边是今年五月更新的一篇综述整理的有关Transformer的目标检测模型(中科院、东南大学等),右边是各模型在COCO数据集上的SOTA表。虽然这篇综述是在今年五月更新的(今年五月是第三版,第一版是在去年8月,如果没有记错的话),但它实际也没有把最新的一些相对比较火的模型涵盖进去(比如Swin Transformerv2,YOLOF, VitDet等)。
既然是讲Transformer在目标检测的模型,那必定要先介绍Transformer检测的开篇之作DETR。与前面的Anchor-based相比,虽然DETR是首个用Transformer来做目标检测的,但是它与前面提到的cnn-based的方法都是采用cnn作为主干网络用来提取图像特征,不同的是Anchor-based是对预定义的密集anchors进行分类和回归(image-to-boxes,对于anchor-free就是image-to-points或者说是pixels-to-boxes/image-to-regions),而DETR是把目标检测任务看作一种图像到集合(image-to-set)的任务,其中set的作用跟anchor-based中的anchor作用相类似。这个集合实际上就是一个可学习的位置编码(后面我们会讲到的解码器中输入的object queries)。
DETR 的网络结构很简单,分为三个部分:
第一部分是一个传统 CNN ,用于提取图片高纬特征;
第二部分是一个Transformer 结构,Encoder 和 Decoder 来提取 Bounding Box;
最后使用 Bipartite matching loss 来训练网络。
首先把一张3通道图片输入backbone为CNN的网络中,提取图片特征,然后结合位置信息,输入到transformer模型的编码器和解码器中,得到transformer的检测结果,每个结果就是一个box,其中每个box表示一个元组,包含物体的类别和检测框位置。
DETR优点:
DETR缺点:
Deformable DETR对DETR的问题分析
Deformable DETR对DETR的改进思路
原始Transformer中attention的问题在于它会查看feature map中所有的pixel位置,这种decoder embeddings和来自encoder输出的global features间的作用是稠密的,这给模型带来了很大的运算复杂度。
文章借鉴了deformable conv的思想,为每个query安排指定数量(远小于pixel数)的key,也就是说,deformable attention是在原有的attention机制中对于输入加入了可学习的扰动偏移项,使得该attention只需要关注feature maps中的部分关键内容,替代原有的需要对feature maps整体都进行关注的普通attention机制。更具体一点,它让encoder初始化的权重不再是统一分布,即对每一个query,之前关注所有的空间位置(所有位置作为key),现在只关注关注参考点(reference point)邻域内的部分key tokens(更有意义的、网络认为更包含局部信息的位置,少且固定数量位置作为key)。
在得到特征图x上的参考点p位置的特征向量 z q z_q zq之后,首先经过线性层变换预测得到三组偏移量offset,然后将三组偏移量添加到位置p上来得到采样后的位置,之后经过插值提取出对应位置的特征向量作为v;同时 z q z_q zq经过线性变换+softmax得到相似度矩阵,并和v做乘法得到最终output。
与DETR中的attention机制相比,公式上的区别在于图像特征是否有约束,也就 p q + Δ p m q k p_q+\Delta p_{mqk} pq+Δpmqk,这里 p q p_q pq是每个 query 都有的一个二维 reference point(二维的索引), Δ p m q k \Delta p_{mqk} Δpmqk是相对于 p q p_q pq的位置偏移, p q + Δ p m q k p_q+\Delta p_{mqk} pq+Δpmqk通常是小数,因此从特征图上索引特征时采用双线性插值的方式。
具体地,每个 query 会被映射到 R 3 M K R^{3MK} R3MK的特征空间(M 是 attention head 的数目,K 是我们预设的 key 的数目 ),前 2MK个通道编码采样的 offset(对 MK个 key 值分别有一对 offset),决定每一个 query 应该找哪些 key,最后 MK个通道,输出 keys 的贡献(不再用 key-query 交互来计算权重,直接输入 query 回归),且只对找到的 keys 的贡献进行归一化(后MK经过softmax后得到attention weight)。
可形变注意力可以考虑小的采样位置集作为一个 pre-filter 突出所有特征图的关键特征,并且可以自然地扩展到融合多尺度特征,这样多尺度可形变注意力本身就可以在多尺度特征图之间进行交换信息,不需要 FPN 操作。
将Transformer中的attention module替换为multi-scale deformable attention module。Encoder中的multi-scale feature maps来自于ResNet的C3到C5 stage,最后C5经过stride为2的3*3卷积得到C6。使用了multi-scale deformable attention module后就不需要FPN来融合不同尺度信息了。
在decoder中,只将cross-attention module替换为multi-scale deformable attention module,而self-attention module保持不变。对于每个query,reference point通过query embedding经过线性映射后接sigmoid函数得到。并且在detection head预测bounding box时,改为预测相对于reference point的偏移量。让检测头预测的bbox为相对参考点的相对偏移量,从而进一步降低优化难度。参考点作为初始的bbox center猜测。bbox head预测相对参考点的偏移量。这样,学习到的解码器注意力与预测的bbox具有很强的相关性,也加速了训练的收敛。
一些说明:
快速收敛性与计算内存高效性
deformable DETR 具有与 Faster R-CNN + FPN 和 DETR-DC5 相当的 FLOPs。 但是运行速度比 DETR-DC5 快得多(1.6 倍),仅比 Faster R-CNN + FPN 慢 25%。 DETR-DC5 的速度问题主要是由于 Transformer attention 中的大量内存访问。 deformable attention可以缓解这个问题,但代价是无序的内存访问。 因此,它仍然比传统卷积稍慢。
检测精度提升
使用多尺度输入代替单尺度输入可以有效提高检测精度AP +1.7%,尤其是在 小物体上APS +2.9% 。 增加采样点K的数量可以进一步提高0.9%的AP。 使用多尺度可变形注意力,允许不同尺度层之间的信息交换,可以带来额外 1.5% 的 AP 提升。 因为已经采用了跨层特征交换,所以添加 FPN 不会提高性能。
DETR通常需要大量的训练时间,大规模的标注数据集。这一点其实和ViT很像,由于transformer的global attention,它们缺少inductive biases,这使得基于transformer的方法通常要依赖大规模的标注数据集。在DETR中,作为检测器的transformer模块是没有经过训练的(这与ViT不同,但经过与训练的模型一般在小数据集上能够体现更好的性能)。但在实际应用中,我们不一定拥有大规模的标注数据,所以我们能否利用无监督的预训练来提升DETR中Transformer的收敛速度呢?要知道无监督预训练的关键在于设计pretext任务(代理任务,Pretext可以理解为是一种为达到特定训练任务而设计的间接任务)。
但现有的CNN与Transformer方法并不适用于目标检测任务(如上下图的右子图,DETR主要关注空间定位学习(边缘/形状的归纳偏好),而不是基于图像实例或基于聚类的对比学习(内部/纹理的归纳偏好)。而且cv都是连续像素构成语义,而nlp一般是离散的token,,所以直接把MoCo那一套对比学习搬过不太可行)。
所以,为实现无监督与训练DETR,UP-DETR提出了一种random multi-query localization(随机查询patch检测)的pretext task来预训练DETR中的object query,以此来预训练Transformer的定位能力。
在DETR的论文中,不同的object query关注不同的位置区域和框大小。因此,如何进行query patches 和object query之间的分配,以适应不同框的定位?UP-DETR提出了一种multi-query location的方法,利用object query shuffle和attention mask方法来解决。其中, deocder上的attention mask用来确保query之间框的预测独立,而object query shuffle用来确保embedding和query patch的随机性。为了满足查询patch的独立性,作者使用一个attention mask矩阵来控制不同对象查询之间的交互。对象查询组都是人工分配的。但是,在下游目标检测任务中,对象查询之间没有显式的组分配。因此,为了模拟目标检测的下游任务,作者在预训练过程中随机打乱所有对象查询的排列。
首先,利用冻结参数的CNN backbone提取视觉特征 。然后,将位置编码添加到特征映射中,并传递到DETR中的Transformer编码器。对于随机裁剪的查询patch,用具有全局平均池化(GAP)的CNN主干网络提取patch特征,然后将其与目标查询相加之后输入到Transformer的解码器中。在预训练过程中,解码器预测与查询patch的位置相对应的边界框。(CNN 参数在整个模型中是共享的。)其中,Transformer在无任何人工标注的大规模数据集上进行无监督预训练;整个模型使用标注的数据进行微调,这与下游任务上的原始DETR相同。
在20年的一篇CNN/transformer的对比论文中,发现:与CNN(CNN的归纳更加偏向纹理,虽然CNN也可以很好的归纳形状【The Origins and Prevalence of Texture Bias in Convolutional Neural Networks论文中,但是依赖于一些数据增强】)相比,MLP-Mixers和Vision Transformer更倾向于形状,而且许多Vision Transformer模型的表现类似于MLP-Mixers。
ViT可以将transformer直接作为backbone以纯序列到序列的角度来进行图像分类。要知道的是,ViT与CNN不同,它是对远程依赖关系和全局上下文信息进行建模,而不是对局部和区域级别的关系进行建模。此外,ViT缺乏像CNN那样的分层结构(multi-scale)来处理视觉实体规模的变化。那么ViT能做目标检测backbone吗?(ViT能不能够将预训练好的通用视觉表征从图像级识别转移到复杂得多的2D目标检测任务中?)
YOLOS 结合了 DETR 的编码器-解码器颈部和 ViT 的仅编码器主干,来重新设计仅编码器的检测器。
左上图说明:显示前十个[DET] token在COCO 验证集所有图像上的所有框预测。(蓝、绿、红分别代表小、中、大的目标)。
(1)YOLOS 删除了用于图像分类的 [CLS] 标记,并将一百个随机初始化的检测 [DET] 标记添加到用于对象检测的输入补丁嵌入序列中。
(2)ViT 中使用的图像分类损失被替换为二分匹配损失,以执行类似于 DETR 的对象检测。这可以避免将ViT的输出序列重新解释为2D特征图,并防止在标签分配期间手动注入启发式和对象2D空间结构的先验知识。
所以,不同的[DET] token对目标位置和大小敏感,而对目标类别不敏感。即YOLOS在不知道确切的空间结构和几何形状的情况下执行任何维度的物体检测是可行的。
一些说明:不同模型的缩放策略: width scaling (w), uniform compound scaling (dwr) and fast scaling (dwr).
YOLOS的优点:
YOLOS的缺点:
前面讲的one-stage模型和anchor-free模型精度的替身都需要依赖多尺度的特征提取来提高检测的精度。所以FPN在目前检测任务算是标配。FPN 的动机就是将早期高分辨率的特征和后期更强的特征结合起来。这在 FPN 中是通过自上而下(top-down)和横向连接来实现的。如果主干网络不是分层网络,那么 FPN 动机的基础就会消失,因为主干网络中的所有特征图都具有相同的分辨率。
而对于原始的ViT来说,由于没有下采样,所以无法像CNN那样应用不同分辨率的特征图,而且对高分辨率图像的检测效率也比较低,所以像Swin Transformer, ViT Mask-RCNN就在ViT模型中重新引入了分层的结构设计,逐级下采样。虽然这样子的确取得了成功,但做目标检测就一定需要FPN吗?可不可以消除对主干网络的分层约束,并使用普通主干网络进行目标检测呢?
ViTDet论文就是从这一方向出发,抛弃常见FPN的设计(YOLOF也是如此),利用原始的ViT架构从单尺度特征图构建简单的特征金字塔,即直接用ViT最后一层特征,对它做简单的上采样和下采样,就能重建出一个简单的FPN,而没有必要像CNN那样从不同stage抽取特征。也不需要像标准的FPN那样做top-down,bottom-up的特征融合,真的就简单粗暴的把最后一层的特征图(因为它应该具有最强大的特征)通过一组卷积或反卷积来得到不同尺度的特征图,达到跟FPN一样的性能。具体来说,他们使用的是尺度为 1/16(stride = 16 )的默认 ViT 特征图。
YOLOF论文:FPN 模块的主要增益来自于其分治优化手段,而不是多尺度特征融合,FPN 模块中存在高分辨率特征融合过程,导致消耗内存比较多,训练和推理速度也比较慢,对部署不太优化,如果想在抛弃 FPN 模块的前提下精度不丢失,那么主要问题是提供分治优化替代手段,所以YOLOF中就借鉴ASPP,RFBNet的思想,引入空洞卷积,来协助进行多级特征的捕获代替设计了Dilated Encoder 串联多个不同空洞率的模块以覆盖不同大小物体,最后通过作者提出了新的均匀匹配策略,(核心思想就是不同大小物体都尽量有相同数目的正样本)Uniform Matching的作用完成了整体SiMo的结构设计,从实验结果来看Uniform Matching 作用非常大,进一步说明该模块其实发挥了 FPN 的分治作用。Dilated Encoder 配合 Uniform Matching 可以提供额外的变感受野功能,有助于多尺度物体预测,其实简单来说是通过系化对于FPN的研究,根据FPN的思想提出了Dilated Encoder和Uniform Matching,实际上不是舍弃了FPN,是传承了FPN。
在分层主干网络中,上采样通常用横向连接进行辅助,但ViT通过实验发现,在普通 ViT 主干网络中横向连接并不是必需的,简单的反卷积就足够了。研究者猜想这是因为 ViT 可以依赖位置嵌入来编码位置,并且高维 ViT patch 嵌入不一定会丢弃信息。
由于ViT中的patch之间是没有重叠的(在每个patch,每个窗口内做attention无法得到全局的信息),所以需要通过一些手段让不同的patch之间进行信息交互。ViTDet并没有像Swin那样采用shift操作(跨层移动窗口),而是采用全局注意力(global propagation~=outer transformer)和卷积形式(window attention~= inner transformer)来做信息交互。(outer transformer和 ****inner transformer是transformer in transformer论文),实际上就是四个block在做完window atteion(每个block又会分成cell)之后再在最后一个阶段进行一个global propagation,这样简单的交互就可以把全局信息和局部信息的纳入学习之中,并且大量的减少了模型训练所需的内存和计算量。
具体操作:在ViTDet中使用了极少数(默认为 4 个)可跨窗口的块。研究者将预训练的主干网络平均分成 4 个块的子集(例如对于 24 块的 ViT-L,每个子集中包含 6 个),并在每个子集的最后一个块中应用传播策略。
目前基于Transformer的目标检测算法主要以DETR和ViT等系列为主展开,其中以DETR扩展的Transformer检测模型主要是在object query(加入先验知识)、attention机制(稀疏化,关注有意义的区域)及label assignment(OTA等)机制,以及特征匹配与分配机制等的改进与扩展。
对于object query,怎么样编码更精确及合适数量的query才能使更快速的get 到想要的feature?
由于需要精准定位物体,DETR必须能够很好地编码特征的绝对/相对位置关系。因此,目前也有许多研究是从Positional embedding展开的。比如有添加相对位置编码的embedding,主要是从NLP衍生到2D图像。
而将Transformer作为backbone的目标检测方法很容易被引入到其他如R-CNN等模型中去完成更多密集型的预测任务。在Trannsformer-backbone中更多考虑的是attention机制及multi-scale,multi-stage的设计。如多层级的PVT可以从高到低处理不同分辨率下的图像特征,而如SWIN-Transformer通过滑窗的attention机制可以在避免计算量平方型增长的情况下同样实现短程和长程依赖关系的描述。其中,基于ViT的Transformer模型更多的需要预训练。