目标检测算法回顾之Transformer based篇章

2024-03-18 11:40

本文主要是介绍目标检测算法回顾之Transformer based篇章,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于Transformer的目标检测方法

  • (一)引言
  • (二)概述
  • (三)发展轴预览
  • (四)CNN-backbone系列
    • 4.1 DETR
      • 与CNN-based的区别
      • DETR的网络结构
      • DETR的评价
    • 4.2 Deformable DETR
      • 4.2.0 Deformable DETR对DETR的问题分析与改进思路
      • 4.2.1 Deformable DETR的注意力机制
      • 4.2.2 Deformable DETR的多尺度
      • 4.2.3 Deformable DETR评价
      • 4.2.4 Deformable DETR总结
    • 4.3 UP-DETR
      • 4.3.1 背景
      • 4.3.2 pretext的定义
      • 4.3.2 multi-learning
      • 4.3.3 multi-query
      • 4.3.4 UP-DETR流程
      • 4.3.5 UP-DETR评价
  • (五)Transformer-backone系列
    • 5.1 YOLOS
      • 5.1.1 背景
      • 5.1.2 YOLOS的架构(在VIT上的改进)
      • 5.1.3 YOLOS的分析
    • 5.2 VitDet
      • 5.2.1 背景
      • 5.2.2 思路
      • 5.2.3 分析
  • (六)总结与思考
    • DETR系列
      • Object query的思考
      • Positional embedding的思考
    • ViT系列

在这里插入图片描述
说明:本文仅供学习

(一)引言

前面小组同学介绍其他专题时也介绍了Transformer在当中的应用。Transformer的确是近年来比较火的一个专题。最开始它是应用在NLP领域。从研究的数据来看,近几年来在CV、语音视频、多模态等领域的研究发表非常地迅猛。其中,在CV领域上的Transformer一般统称为Vision Transformer, 简称Vit。
在这里插入图片描述

(二)概述

同样的,Transformer在目标检测的研究也发表了很多paper. 左边是今年五月更新的一篇综述整理的有关Transformer的目标检测模型(中科院、东南大学等),右边是各模型在COCO数据集上的SOTA表。虽然这篇综述是在今年五月更新的(今年五月是第三版,第一版是在去年8月,如果没有记错的话),但它实际也没有把最新的一些相对比较火的模型涵盖进去(比如Swin Transformerv2,YOLOF, VitDet等)。
在这里插入图片描述

(三)发展轴预览

在这里插入图片描述

(四)CNN-backbone系列

4.1 DETR

与CNN-based的区别

既然是讲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的网络结构

  • (1)DETR 首先使用CNN backbone来提取图像特征,将其展平(flatten)后加入空间位置编码(spatial positional encoding)得到序列特征,作为Transformer encoder的输入。原文利用ResNet提取特征图,但特征图转成特征序列后,图像就失去了像素的空间分布信息,所以Transformer就引入空间的位置编码。
    在这里插入图片描述
  • (2)其次,encoder接收展开后的图像深度特征图并做self-attention机制的处理,得到特征图上每个instance的attention(编码后的特征)。Transformer 中的attention机制具有全局感受野,可以建立图像序列的上下文关系,从而进行特征图的全局分析。也就是说在DETR的视角下,目标检测不再是单独预测多个感兴趣的物体,而是从全局上将检测出所有目标所构成的整体作为目标。作者在消融实验中指出,即使不给encoder添加任何位置编码,最终的AP也只比完整的DETR下降了1.3个点。
    在这里插入图片描述
  • (3)然后,decoder部分则接收来自encoder的输出结果和一组可学习的object queries,最终输出预测结果的集合。
    在这里插入图片描述
    有关object query的理解
    • 其中,object queries是可学习的embedding,与当前输入图像的内容无关(不由当前图像内容计算得到)。对object queries的理解可以有多个角度。首先,它随机初始化,并随着网络的训练而更新,因此隐式建模了整个训练集上的统计信息。
    • 其次,object query可以看成是adaptive anchor,是对anchor的编码。每个query对应图像中的一个物体实例( 包含背景实例)。因此,object query的数量一般设置要远大于数据库中一张图像内包含的最多物体数。可以发现,不同于Faster RCNN, RetinaNet等方法在特征的每个像素上构建稠密的anchor不同,detr只用少量稀疏的anchor(object queries)做预测。
    • object query通过cross-attention(decoder)从编码器输出的序列中对特定物体实例的特征做聚合(即让该可学习object queries中的每个元素可以捕获原图像中不同位置与大小特征等的物体信息。),又通过self-attention(encoder)建模该物体实例域其他物体实例之间的关系。
    • 论文中对不同object query在COCO数据集上输出检测框的位置做了统计(如左图所示),可以看不同object query是具有一定位置倾向性的。绿色表示小物体,红色表示水平的大物体,蓝色表示竖直的大物体。可见不同的 Object Query 确实实现了想要去查询不同地方出现的小物体,比如左下,右边,右上等等。但是对于大物体而言,大家检测出来的定位是相近的。
    • 此外,论文实验结果指出:可以跳过第一解码器层中的第一自注意力层。
  • (4)最后,FFN基于特征聚合后的object queries预测边界框的标准化中心坐标,高度和宽度,而线性层使用softmax函数预测类别标签。由于object queries并不像anchors那样密集铺开的,所以DETR使用匈牙利算法(二分图匹配算法)对predictions和ground truth boxes进行最佳匹配,从而实现label assignment。也就是对所有可能的匹配做排序,DETR将一种匹配下模型的总定位和分类损失作为评判标准,损失越低,匹配越佳。注意,该匹配过程是不回传梯度的。
    在这里插入图片描述
    匈牙利算法的理解
    匈牙利算法就是一种用增广路径求二分图最大匹配的算法,核心是寻找增广路径。算法的时间复杂度为O(NM),其中N为二分图左边的顶点数,M为二分图中边的数目。
    基本步骤:1.首先从任意一个未被配对的点 u开始,从点u的边中任意选一条边(假设这条边是u->v)开始配对。如果此时点V还没有被配对,则配对成功,此时便找到了一条增广路(只不过这条增广路比较简单)。如果此时点v已经被配对了,那就要尝试进行“连锁反应”。如果尝试成功了,则找到一条增广路,此时需要更新原来的配对关系。这里要用一个数组match来记录配对关系,比如点v与点u配对了,就记作match[v]=u。配对成功后,记得要将配对数加1。配对的过程我们可以通过深度优先搜索来实现,当然广度优先搜索也可以。2.如果刚才所选的边配对失败,要从点u的边中再重新选一条边, 进行尝试。直到点u配对成功,或者尝试过点u所有的边为止。3.接下来继续对剩下没有被配对的点一一进行配对, 直到所有的点都尝试完毕,找不到新的增广路为止。

DETR的评价

DETR优点:

  • 简洁优雅的训练方式
  • 无需任何后处理,实现简单

DETR缺点:

  • 收敛速度慢,训练时间长。在 COCO 基准上,DETR 需要 500 个 epoch 才能收敛,这比 Faster R-CNN 慢了 10 到 20 倍。
  • 小物体检测性能差。对于 DETR 来说,高分辨率的特征图将带来不可接受的计算复杂度和内存复杂度。
  • object query的设计不是很合理。
    在这里插入图片描述

4.2 Deformable DETR

4.2.0 Deformable DETR对DETR的问题分析与改进思路

在这里插入图片描述

Deformable DETR对DETR的问题分析

  • 问题分析1:收敛速度慢。在初始化时transformer中每个query对所有位置(所有的key)给予几乎相同的权重,这使得网络需要经过长时间的训练将attention收敛到特定的区域,即有稀疏有意义的区域。
  • 问题分析2:对小物体的检测性能不佳,由于transformer中attention机制随着图像中像素数目的增加呈平方增长,使用大的特征图输入encoder的代价极其高昂。因此,DETR只采用32倍下采样的特征图作为输入,导致其对小物体的检测性能不佳。
    上面两个问题都来源于Transformer需要多的、冗余的像素进行处理。那既然是这样子的话,我们是否可以让Transformer在下采样的同时学习到更多更有效的区域呢?

Deformable DETR对DETR的改进思路

  • 解决方法:基于上述思考,由于Deformable conv是处理稀疏位置的一种有效机制,所以Deformable DETR提出了一种可变性注意模块(deformable attention),使Transformer去关注有意义的区域。由于模型只需要关注稀疏的采样点,其收敛速度显著提升。同时,由于每个query只需要对稀疏的key做聚合,模型的运算量和显存消耗显著下降,这使得Deformable Attention能够在可控的计算消耗下利用图像的多尺度特征。也就同时解决了上述的两个问题。

4.2.1 Deformable 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)。

4.2.2 Deformable DETR的多尺度

可形变注意力可以考虑小的采样位置集作为一个 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具有很强的相关性,也加速了训练的收敛。

4.2.3 Deformable DETR评价

  • 一些说明

    • “ DC5”表示消除ResNet的C5阶段的步幅,而改为增加2。
    • “ DETR-DC5 +”表示对DETR-DC5进行了一些修改,包括使用Focal Loss进行边界框分类以及将目标查询数增加到300。
      在这里插入图片描述
  • 快速收敛性与计算内存高效性
    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 不会提高性能。

4.2.4 Deformable DETR总结

  • 与DETR的attention weights区别
    DETR中attention weights是通过query和key内积得到的,而Deformable DETR是用query学习到的,这样就没有了原始Transformer中key和value的区分。与其说是选了一些key的subset做self-attention,不如说就是deformable conv的增强版。
  • DeformAttn位置选择和deformable cnn的不同点
    deformable cnn是在正常的cnn kernel点上分别预测偏移量,deformAttn则是在当前一个点上直接预测多个偏移量。

4.3 UP-DETR

4.3.1 背景

DETR通常需要大量的训练时间,大规模的标注数据集。这一点其实和ViT很像,由于transformer的global attention,它们缺少inductive biases,这使得基于transformer的方法通常要依赖大规模的标注数据集。在DETR中,作为检测器的transformer模块是没有经过训练的(这与ViT不同,但经过与训练的模型一般在小数据集上能够体现更好的性能)。但在实际应用中,我们不一定拥有大规模的标注数据,所以我们能否利用无监督的预训练来提升DETR中Transformer的收敛速度呢?要知道无监督预训练的关键在于设计pretext任务(代理任务,Pretext可以理解为是一种为达到特定训练任务而设计的间接任务)。在这里插入图片描述
但现有的CNN与Transformer方法并不适用于目标检测任务(如上下图的右子图,DETR主要关注空间定位学习(边缘/形状的归纳偏好),而不是基于图像实例或基于聚类的对比学习(内部/纹理的归纳偏好)。而且cv都是连续像素构成语义,而nlp一般是离散的token,,所以直接把MoCo那一套对比学习搬过不太可行)。
在这里插入图片描述

4.3.2 pretext的定义

所以,为实现无监督与训练DETR,UP-DETR提出了一种random multi-query localization(随机查询patch检测)的pretext task来预训练DETR中的object query,以此来预训练Transformer的定位能力。

  • 具体而言,从给定图像中随机crop patches,得到该补丁对应框的坐标,长宽,再将这个补丁作为query,进行一些简单的数据增强变换,输入到 DETR的decoder中,而添加位置编码后的图像特征输入到encoder,模型的目标变成了给定patch找他们在原图中的位置。通过这种方式,它构成一个无监督预训练的形式。最后,对于一个无监督训好的DETR,只要输入patch,它天然就能做到如下图的无监督定位patch的功能(不需要额外的nms后处理),当然这个patch还能支持数据增强和尺度变换。从这个预训练任务的角度来说,一个patch是不是object本身没有任何先验。

4.3.2 multi-learning

  • 前面提到pretext任务是基于定位展开的,但目标检测任务是定义与分类的耦合。这两个任务有不同的归纳偏好,比如定位更关注于物体的边角轮廓,而分类可能更关注于纹理、材质等等。因此,pretext任务的设计缺少对分类判别性的考虑。为避免query patch检测的预训练破坏分类性能,UP-DETR讲目标检测任务解耦从而进行多任务的学习,即冻结预训练的CNN backbone,并利用patch特征重构损失来保持Transformer的特征识别能力(保留上下文构建的特征语义性)。在实验中,我们发现,固定已经预训练好的CNN权重对于后面transformer的预训练和UP-DETR在下游目标检测中的表现有着至关重要的作用。
  • 同时,考虑到输出头通常是分类和定位两个分支,我们在这里额外构造了一个 名为 feature reconstruction的分支,设计它的初衷是希望 经过CNN后得到的特征和 经过transformer之后特征 它们之间应该具有一致的判别性。值得注意的是,这个分支更多的是出于结构上的完整,本质上,它并没有带来额外的判别性信息。实验中,我们也发现了,对于下游目标检测任务,起决定性作用的还是固定预训练的CNN权重。
    在这里插入图片描述

4.3.3 multi-query

在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矩阵来控制不同对象查询之间的交互。对象查询组都是人工分配的。但是,在下游目标检测任务中,对象查询之间没有显式的组分配。因此,为了模拟目标检测的下游任务,作者在预训练过程中随机打乱所有对象查询的排列。

4.3.4 UP-DETR流程

首先,利用冻结参数的CNN backbone提取视觉特征 。然后,将位置编码添加到特征映射中,并传递到DETR中的Transformer编码器。对于随机裁剪的查询patch,用具有全局平均池化(GAP)的CNN主干网络提取patch特征,然后将其与目标查询相加之后输入到Transformer的解码器中。在预训练过程中,解码器预测与查询patch的位置相对应的边界框。(CNN 参数在整个模型中是共享的。)其中,Transformer在无任何人工标注的大规模数据集上进行无监督预训练;整个模型使用标注的数据进行微调,这与下游任务上的原始DETR相同。

4.3.5 UP-DETR评价

  • 优点
    • 首次将无监督方法用于DETR,有利于小数据发展DETR的可能
      UP-DETR通过random query patch detection的预训练任务,将DETR中transformer模块进行无监督的预训练。
    • 提供了更加合理的query设计思路
  • 缺点
    • 非端到端
    • 小物体检测性能差,复杂度高
      UP-DETR由于attention复杂度限制,只能做基于single-scale的特征图,没有办法直接拓展到multi-scale。这使得UP-DETR在大物体上非常的好,但在小物体上也还是存在瓶颈。

(五)Transformer-backone系列

5.1 YOLOS

5.1.1 背景

  • 第一点,以CNN作为backbone的transformer检测系列:在前面讲的DTER系列都使用随机初始化的Transformer对CNN特征进行编码和解码,这并未揭示预训练Transformer在目标检测中的可迁移性(比如前面大家讨论的transformer在ImageNet上与训练是否可以迁移到其他领域?)。
    在这里插入图片描述

在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目标检测任务中?

  • 第二点,先前以ViT作为backbone的transformer检测系列:ViT-FRCNN是第一个使用预训练的ViT作为R-CNN目标检测器的主干。然而,这种设计无法摆脱对卷积神经网络(CNN)和强2D归纳偏差的依赖,因为ViT-FRCNN将ViT的输出序列重新解释为2D空间特征图,并依赖于区域池化操作(即RoIPool或RoIAlign)以及基于区域的CNN架构来解码ViT特征以实现目标级感知。
    在这里插入图片描述
    因此,Transformer能否以最少的2D空间结构从纯粹的序列到序列的角度进行2D目标识别?这也是YOLOS致力解决的问题所在。

5.1.2 YOLOS的架构(在VIT上的改进)

YOLOS 结合了 DETR 的编码器-解码器颈部和 ViT 的仅编码器主干,来重新设计仅编码器的检测器。在这里插入图片描述
左上图说明:显示前十个[DET] token在COCO 验证集所有图像上的所有框预测。(蓝、绿、红分别代表小、中、大的目标)。

(1)YOLOS 删除了用于图像分类的 [CLS] 标记,并将一百个随机初始化的检测 [DET] 标记添加到用于对象检测的输入补丁嵌入序列中。
(2)ViT 中使用的图像分类损失被替换为二分匹配损失,以执行类似于 DETR 的对象检测。这可以避免将ViT的输出序列重新解释为2D特征图,并防止在标签分配期间手动注入启发式和对象2D空间结构的先验知识。

所以,不同的[DET] token对目标位置和大小敏感,而对目标类别不敏感。即YOLOS在不知道确切的空间结构和几何形状的情况下执行任何维度的物体检测是可行的。

5.1.3 YOLOS的分析

一些说明:不同模型的缩放策略: width scaling (w), uniform compound scaling (dwr) and fast scaling (dwr).
在这里插入图片描述
YOLOS的优点:

  • 与CNN-backbone对比,在Tiny模型方面,YOLOS-Ti取得比高度优化CNN作为骨干时更佳的性能。
  • 与DETR对比,YOLOS探索了在ImageNet-1k数据集上预训练的标准ViT到COCO目标检测任务上的可迁移性。证明了预训练的仅编码器的ViT的可迁移性 。此外,DETR在图像特征和对象查询之间使用解码器-编码器注意(交叉注意),并在每个解码器层对辅助解码损失进行深度监督,而YOLOS始终只查看每个层的输入序列,在操作方面不区分patch token和[DET] token 。

YOLOS的缺点:

  • 相比如分类任务,YOLOS需要用更长的序列来进行目标检测以及其他密集预测任务。
  • YOLOS自注意操作复杂度与序列长度成二次关系,因此不适用于更大的模型

5.2 VitDet

5.2.1 背景

前面讲的one-stage模型和anchor-free模型精度的替身都需要依赖多尺度的特征提取来提高检测的精度。所以FPN在目前检测任务算是标配。FPN 的动机就是将早期高分辨率的特征和后期更强的特征结合起来。这在 FPN 中是通过自上而下(top-down)和横向连接来实现的。如果主干网络不是分层网络,那么 FPN 动机的基础就会消失,因为主干网络中的所有特征图都具有相同的分辨率。
在这里插入图片描述
而对于原始的ViT来说,由于没有下采样,所以无法像CNN那样应用不同分辨率的特征图,而且对高分辨率图像的检测效率也比较低,所以像Swin Transformer, ViT Mask-RCNN就在ViT模型中重新引入了分层的结构设计,逐级下采样。虽然这样子的确取得了成功,但做目标检测就一定需要FPN吗?可不可以消除对主干网络的分层约束,并使用普通主干网络进行目标检测呢?
在这里插入图片描述

5.2.2 思路

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 嵌入不一定会丢弃信息。

5.2.3 分析

由于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 assignmentOTA等)机制,以及特征匹配与分配机制等的改进与扩展。

DETR系列

Object query的思考

对于object query,怎么样编码更精确及合适数量的query才能使更快速的get 到想要的feature?

  • object query的数量?
    越少的query会导致各个query的搜索范围变大,并且难以检测同一位置的多个目标;过多的query又会导致难以抑制多个query收敛到同一物体的情况。
  • object query的编码?
    方法:加入先验知识,无监督训练策略…
    例子:Anchor DETR直接将anchor point的位置编码为object query,DAB DETR将anchor box(包括位置长宽4个维度)编码为object query。
  • object query与image feature的对齐?
    由于object query和image feature间(位置上的和语义上的)不对齐,导致Transformer decoder中的Cross-attention layer难以精确地匹配到待检测物体所对应的特征区域,object query也因此采集到了很多除目标物体以外的无关特征,最终导致DETR收敛缓慢。所以,需要通过不同的方法限制了object query的采样区域,使得网络能够更快的地聚焦于物体区域,从而加速了训练。

Positional embedding的思考

由于需要精准定位物体,DETR必须能够很好地编码特征的绝对/相对位置关系。因此,目前也有许多研究是从Positional embedding展开的。比如有添加相对位置编码的embedding,主要是从NLP衍生到2D图像

ViT系列

而将Transformer作为backbone的目标检测方法很容易被引入到其他如R-CNN等模型中去完成更多密集型的预测任务。在Trannsformer-backbone中更多考虑的是attention机制及multi-scale,multi-stage的设计。如多层级的PVT可以从高到低处理不同分辨率下的图像特征,而如SWIN-Transformer通过滑窗的attention机制可以在避免计算量平方型增长的情况下同样实现短程和长程依赖关系的描述。其中,基于ViT的Transformer模型更多的需要预训练。

这篇关于目标检测算法回顾之Transformer based篇章的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/822226

相关文章

可视化实训复习篇章

前言: 今天,我们来学习seaborn库可视化,当然,这个建立在Matplotlib的基础上,话不多说,进入今天的正题吧!当然,这个是《python数据分析与应用》书中,大家有需求的可以参考这本书。 知识点: Matplotlib中有两套接口分别是pyplot和pyylab,即绘图时候主要导入的是Matplotlib库下的两个子模块(两个py文件)matplotlib.pyplot和matp

代码随想录算法训练营:12/60

非科班学习算法day12 | LeetCode150:逆波兰表达式 ,Leetcode239: 滑动窗口最大值  目录 介绍 一、基础概念补充: 1.c++字符串转为数字 1. std::stoi, std::stol, std::stoll, std::stoul, std::stoull(最常用) 2. std::stringstream 3. std::atoi, std

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别

转发来源:https://swift.ctolib.com/ooooverflow-chinese-ocr.html chinese-ocr 基于CTPN(tensorflow)+CRNN(pytorch)+CTC的不定长文本检测和识别 环境部署 sh setup.sh 使用环境: python 3.6 + tensorflow 1.10 +pytorch 0.4.1 注:CPU环境

大林 PID 算法

Dahlin PID算法是一种用于控制和调节系统的比例积分延迟算法。以下是一个简单的C语言实现示例: #include <stdio.h>// DALIN PID 结构体定义typedef struct {float SetPoint; // 设定点float Proportion; // 比例float Integral; // 积分float Derivative; // 微分flo

3月份目标——刷完乙级真题

https://www.patest.cn/contests/pat-b-practisePAT (Basic Level) Practice (中文) 标号标题通过提交通过率1001害死人不偿命的(3n+1)猜想 (15)31858792260.41002写出这个数 (20)21702664840.331003我要通过!(20)11071447060.251004成绩排名 (20)159644

LeetCode 算法:二叉树的中序遍历 c++

原题链接🔗:二叉树的中序遍历 难度:简单⭐️ 题目 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1] 提示: 树中节点数目在范围 [0, 100] 内 -100 <= Node.

【Java算法】滑动窗口 下

​ ​    🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 🦌一.水果成篮 题目链接:904.水果成篮 ​ 算法原理 算法原理是使用“滑动窗口”(Sliding Window)策略,结合哈希表(Map)来高效地统计窗口内不同水果的种类数量。以下是详细分析: 初始化:创建一个空的哈希表 map 用来存储每种水果的数量,初始化左右指针 left

ROS2从入门到精通4-4:局部控制插件开发案例(以PID算法为例)

目录 0 专栏介绍1 控制插件编写模板1.1 构造控制插件类1.2 注册并导出插件1.3 编译与使用插件 2 基于PID的路径跟踪原理3 控制插件开发案例(PID算法)常见问题 0 专栏介绍 本专栏旨在通过对ROS2的系统学习,掌握ROS2底层基本分布式原理,并具有机器人建模和应用ROS2进行实际项目的开发和调试的工程能力。 🚀详情:《ROS2从入门到精通》 1 控制插

算法与数据结构面试宝典——回溯算法详解(C#,C++)

文章目录 1. 回溯算法的定义及应用场景2. 回溯算法的基本思想3. 递推关系式与回溯算法的建立4. 状态转移方法5. 边界条件与结束条件6. 算法的具体实现过程7. 回溯算法在C#,C++中的实际应用案例C#示例C++示例 8. 总结回溯算法的主要特点与应用价值 回溯算法是一种通过尝试各种可能的组合来找到所有解的算法。这种算法通常用于解决组合问题,如排列、组合、棋盘游