Transformer在计算机视觉中的应用

作者: Daisy丶 | 来源:发表于2021-06-26 19:47 被阅读0次

    2018Google AI研究院提出了一种预训练模型BERT,该模型在11项NLP任务中夺得SOTA结果,而BERT取得成功的一个关键因素是Transformer的强大作用。Transformer改进了RNN最被人诟病的训练慢的缺点,利用self-attention机制实现快速并行。并且Transformer可以增加到非常深的深度,充分发掘DNN模型的特性,提升模型准确率。由此Transformer也开始走进不同领域深度学习算法工程师们的视野。本文从Transformer的基础原理和在一些领域的代表性论文来总结对Transformer在计算机视觉领域中的应用。

    BERT

    Transformer 基本原理

    Transformer这一结构的概念本身可以追溯到Google2017年的一篇论文Attention Is All You Need。该论文首次没有使用LSTMRNN结构来构建NLP任务的神经网络,也没有像FAIR一样通过CNN来实现自然语言翻译,而是仅使用Attention模块堆叠就能够出色的完成相关的任务。Google给这个多层Attention堆叠的结构起名为Transformer。由下图可以看出,一个标准的Transformer由一个encoder和一个decoder组成,encoder包括一个自注意力层和一个前馈神经网络,decoder包括一个自注意力层、一个编码-解码注意力层和一个前馈神经网络。

    transformer

    Transformer中比较重要的几个结构是Scaled Dot-Product AttentionMulti-Head AttentionPosition-wise Feed-Forward NetworksPositional Encoding

    Scaled Dot-Product Attention通过QKVembedding后的数据进行Attention的计算,其分别对应的是QueryKeyValue

    Multi-Head Attention则是通过h个不同的线性变换对QKV进行投影,最后将不同的attention结果拼接起来。

    Position-wise feed-forward networks这层主要是提供非线性变换。Attention输出的维度是[bszseq_len, num_headshead_size],第二个sub-layer是个全连接层,之所以是position-wise是因为过线性层时每个位置i的变换参数是一样的。

    Transformer抛弃了RNN,而RNN最大的优点就是在时间序列上对数据的抽象,所以文章中作者提出两种Positional Encoding的方法,将encoding后的数据与embedding数据求和,加入了相对位置信息。

    attention

    一次self-attention的运算可以通过以下步骤完成:

    1. 从每个编码器的输入向量(每个单词的词向量)中生成三个向量。也就是说对于每个单词,我们创造一个查询向量Q、一个键向量K和一个值向量V。这三个向量是通过词嵌入与三个权重矩阵后相乘创建的。假设词向量x的大小为1x4,权重矩阵Wq的大小为4x3,其相乘后就可以得到大小为1x3的查询向量q

    2. 假设我们为第一个词Thinking计算自注意力向量,我们需要拿输入句子中的每个单词对Thinking打分。这些分数决定了在编码单词Thinking的过程中有多重视句子的其它部分。这些分数是通过打分单词(所有输入句子的单词)的键向量与Thinking的查询向量相点积来计算的。所以如果我们是处理位置最靠前的词的自注意力的话,第一个分数是q1k1的点积,第二个分数是q1k2的点积。

    3. 将分数除以8(8是论文中使用的键向量的维数64的平方根,这会让梯度更稳定。这里也可以使用其它值,8只是默认值),然后通过softmax传递结果。softmax的作用是使所有单词的分数归一化,得到的分数都是正值且和为1。这个softmax分数决定了每个单词对编码当下位置单词的贡献。显然,已经在这个位置上的单词将获得最高的softmax分数,但有时关注另一个与当前单词相关的单词也会有帮助。

    4. 将每个值向量乘以softmax分数,这里的直觉是希望关注语义上相关的单词,并弱化不相关的单词(例如,让它们乘以0.001这样的小数)。

    5. 对加权值向量求和,然后即得到自注意力层在该位置的输出。自注意力的另一种解释就是在编码某个单词时,就是将所有单词的表示(值向量)进行加权求和,而权重是通过该词的表示(键向量)与被编码词表示(查询向量)的点积并通过softmax得到。

      self-attention`

    Multi-Head Attention为每个头保持独立的查询/键/值权重矩阵,从而产生不同的查询/键/值矩阵。这些集合中的每一个都是随机初始化的,在训练之后,每个集合都被用来将输入词嵌入(或来自较低编码器/解码器的向量)投影到不同的表示子空间中。它扩展了模型专注于不同位置的能力并且给出了注意力层的多个“表示子空间”。

    multi-head-attention`

    为了理解输入单词的顺序,Transformer为每个输入的词嵌入添加了一位置个向量。这些向量遵循模型学习到的特定模式,这有助于确定每个单词的位置,或序列中不同单词之间的距离。这里的直觉是,将位置向量添加到词嵌入中使得它们在接下来的运算中,能够更好地表达的词与词之间的距离。论文中使用了sincos的方法进行位置编码,其中pos是位置,i是维度。

    sin\cos position1 position2

    视觉应用

    虽然Transformer结构在NLP领域得到了广泛的应用,但是在视觉领域的应用仍然有限。在视觉领域,attention或者是和CNN网络共同使用或者是代替CNN中特定的组件。想要将 Transformer应用到视觉任务中,我们首先需要构建一些类似于VGGResNet之类的backbone

    Backbone

    VIT

    github: Implementation of Vision Transformer, a simple way to achieve SOTA in vision classification with only a single transformer encoder, in Pytorch

    VIT(VISION TRANSFORMER)Google2020年提出的一种使用Transformer进行图像分类的backbone

    VIT在模型结构上保持了和原版Transformer相近。为将2D图像变成对应的1-D的序列patch embedding输入,对于一张图像 ,首先将其切分成为NPxPpatch,其中N=WH / P^2,最终获得NP^2 ⋅ C大小的矩阵。然后将图像拉平转化为一维的序列输入,并通过MLP层将其线性映射到一个固定的维度,实现embedding的效果。作者指出,图像块序列可以来自于原始图像,也可以来自于CNN的特征图。对于CNN特征图,甚至可以将区块大小设置为1*1。

    作者在经过Embedding后的序列的最前面加上了一个D维的class embedding,类似于BERT中的class token,在positional encoding之后一起作为 transformer encoder的输入。输出部分,VIT去掉了decoder的部分,encoder得到的特征直接送入MLP head,最后通过softmax进行分类处理。

    VIT result

    DeiT

    github: facebookresearch/deit: Official DeiT repository

    DeiT(Data-efficient Image Transformers)facebookresearch2021年提出的一种基于知识蒸馏来学习的image transformer。相比VITDeiT需要更少的数据和更少的计算资源就能生成高性能的图像分类模型。研究人员仅用一台 8-GPU 的服务器对 DeiT 模型进行 3 天训练,该方法就在 ImageNet 基准测试中达到了84.2%top-1 准确率,并且训练阶段未使用任何外部数据,该结果可以与顶尖的卷积神经网络媲美。

    perf

    DeiT首个重要的组件是其训练策略。研究者在最初用于卷积神经网络的现有研究基础上进行了调整与改进,并提出了一种基于蒸馏token的新型蒸馏流程,它的作用与class token相同,不过其目的在于复制教师网络估计的标签。实验结果表明,这种特定Transformer策略大幅度优于vanilla蒸馏方法。

    蒸馏流程如下图所示。研究者仅添加了一个新的蒸馏token,它通过自注意力层与class tokenpatch token交互作用。蒸馏token的作用与class token类似,不过前者的目的是复制教师网络预测的(硬)标签,而不是正确标签。Transformerclass token和蒸馏token输入均通过反向传播学得。

    ViTclass token类似,distillation token是在图像块序列后面加上的token。然后它经过transformer encoder之后的输出用于和teacher model 的输出计算loss。作者发现class tokendistillation token会收敛于不同的向量,cos距离为0.06,随着层数的加深,两者embedding的相似度逐渐上升,最终cos距离为0.93,说明他们希望得到相似但不相同的target。为了证明distillation token的有效是由于knowledge distillation的作用,而不是只由于多了一个token导致的,作者做了对比试验,不是在后面加distillation token,而是再加一个class token,发现他们最终收敛结果的相似性达到0.999,并且性能弱于前者,证明了加入distillation token的意义。

    DeiT result2

    TNT

    github:lucidrains/transformer-in-transformer: Implementation of Transformer in Transformer, pixel level attention paired with patch level attention for image classification, in Pytorch

    TNT是华为诺亚实验室在2021年提出的一种基于Transformer的网络架构。TNT通过内外两个Transformer联合提取图像局部和全局特征,通过堆叠TNT模块,研究者搭建了全新的纯Transformer网络架构。作者表示它的表现优于谷歌的ViTFacebookDeiT

    TNT网络主要由若干个TNT block堆叠构成。TNT block有 2 个输入,一个是pixel embedding,一个是patch embedding。对应地,TNT block包含 2 个标准的transformer block。对于输入的图像,TNTVIT一样将图像切块,构成patch序列。不过TNT不把patch拉直为向量,而是将patch看作像素(组)的序列。

    具体地说,TNT将图像转化成patch embedding序列和pixel embedding序列。图像首先被均匀切分成若干个patch,每个patch通过im2col操作转化成像素向量序列,像素向量通过pytorch unfold操作将patch转化成m个像素向量,然后用一个全连接层将m个像素向量映射为mpixel embedding。而patch embedding(包括一个 class token)是一组初始化为零的向量。对每个patch embedding加一个patch position encoding,对每个pixel embedding加一个pixel position encoding,两种 Position encoding在训练过程中都是可学习的参数。最终,TNT block 输出处理过后的pixel embeddingpatch embedding,最后通过一个MLP层输出结果。

    TNT patch result

    ViT G/14

    2021年,GoogleViT团队的几位成员又尝试将ViT模型进行扩展,使用到了包含30亿图像的JFT-3B数据集,并提出了参数量高达20亿参数的ViT变体模型ViT G/14,在ImageNet图像数据集上实现了新的SOTA Top-1准确率。论文主要研究了预训练ViT模型用于图像分类任务的迁移性能的扩展规则。特别是,研究者试验了从500万到20亿个参数不等的模型、从3000万到30亿个训练图像不等的数据集以及从低于 1TPUv3 核每天到超过10000个核每天的计算预算。其主要贡献是描述ViT模型的性能计算边界。

    result

    具体任务

    检测

    github: facebookresearch/detr: End-to-End Object Detection with Transformers

    DETRfacebookresearch2020年提出的一种基于Transformer的目标检测模型。整个DETR架构很容易理解,它包含三个主要组件:CNNbackbonetransformer的编码器-解码器和一个前馈网络。通过卷积backbone得到的feature map拉平成一维特征图,加上position信息之后送到基于Transformer的编码器。该编码器的输出是N个固定长度的embedding feature,其中N是模型假设的图像中的对象数,论文中N=100。基于Transformer的解码器借助自身和编码器-解码器注意机制将这些特征并行解码为边界框坐标。最后,前馈神经网络预测边界框的标准化中心坐标,高度和宽度,最后的线性层使用softmax函数预测类别标签。

    DETR DETR

    DETR有趣的地方在于,DETR给予一组固定的可学习的目标query集合,推理目标坐标和图片上下文直接输出最终的预测结果。也就是其一次性预测所有的目标,而不是先找出所有的候选框,然后通过手工设计的组件(编码先验锚框或者NMS处理)来过滤出真正的物体。从直觉上DETR的方式更接近人的识别方式,也可以将DETR视为一种No Anchor的方法。个人感觉是通过position embeddingquery代替了anchor

    图中的object queries是一组可以学习的变量的集合,从作者的代码中能够看出其是一个大小为100 × 2 × 256的变量。这里的100是个超参数,表示对于每张图片,预测100bboxes。设为100的原因是数据集中有90个类别,100刚好合适。object queries的意思就是告诉模型要100个实例,然后decoder根据得到特征的位置和显著性解码出100instance,其中部分是前景部分是背景,前景的就class loss+box loss,背景的就当背景。

    最后N个预测值与真值是如何对应的呢,文中通过匈牙利算法来实现的二分最大匹配。所谓二分的最大匹配,即保证预测值与真值实现最大的匹配,保证预测的N个实例(包括∅)按照位置与真值对应起来。实现一一对应之后,便能够利用分类Loss以及boundingbox Loss进行优化。这种一一对应的关系,同时也另一个好处是,不会多个预测值对应到同一个真实值上,然后再通过NMS进行后处理。

    分割

    github: Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers

    SETR是在CVPR 2021上提出的一种基于Transformer的语义分割模型。整体结构基本如下图所示,ViT作为encoder加上一个卷积组成的decoder,这个decoder也是常规的上采样加上跨特征融合。根据最后的实验结果,个人感觉文章证明了一次卷积特征叠加许多个transformer的情况下,配合巨量数据的pretrain,也能达到同类卷积分割模型的效果。不过这个Transformer的参数量和运行速度都与现有的语义分割模型相差很大,基本做不到实用的地步。

    SETR

    车道线检测

    github: liuruijin17/LSTR: This is an official repository of End-to-end Lane Shape Prediction with Transformers

    LSTR是在WACV 2021上提出的一种基于Transformer的车道线检测模型,能够在1080TI的显卡上实现420 FPS的检测速度。作者借助于对车道线曲线和相机内参的描述,采用多项式参数模型来描述车道线,并配以Bipartite Matching Loss函数,实现端到端训练,网络的目标成为预测几个参数,这无需后处理且降低了计算量。

    网络的backboneResNet18,通过8倍的下采样取得特征后送入一个Transformer模块,这一块基本和vit类似。使用Transformer的原因是,对于细长线条Transformer能学习更丰富的结构和上下文信息。LSTR预测的值并不是图片上的像素坐标,而是车道线近似为一条三次曲线后从道路到图片上的投影方程的参数,学到参数后通过y来计算x的位置。对于预测N条固定的曲线(N大于典型数据集中车道线数量的最大值),预测的曲线为H,真实曲线的像素排列为s ,真实曲线为LBipartite matching求的是预测曲线与真实曲线之间的距离,目标是使得距离之和最少(其中使用了Hungarian algorithm)。这种方法求解三次方程速度比较快,但是对水平线相当的不友好。

    LSTR LSTR-EN-DE result

    ReID

    github: michuanhaohao/AICITY2021_Track2_DMT: The 1st place solution of track2 (Vehicle Re-Identification) in the NVIDIA AI City Challenge at CVPR 2021 Workshop. (github.com)

    DMT是在CVPR 2021上提出的一种基于Transformer的车辆ReID模型,同时也是NVIDIA AI CITY Challenge 2021 Track2的冠军方案。具体结构没什么好说的,把去年的冠军方案的ResNet101backbone换成了VITloss和训练策略还是常规的ReID思路。此外作者还用到了UDA Training,即用聚类的方法给测试集分配伪标签然后用来训练。

    DMT

    除了TransformerbackboneUDA Training,在测试过程中还用到了Augmentation TestRe-RankingWeighted Tracklet FeaturesCamera VerificationInter-Camera FusionCamera and Orientation Bias 等技巧来提升测试结果。

    result

    Reference

    图解Transformer(完整版)_龙心尘-CSDN博客_transformer
    Attention Is All You Need
    BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
    An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
    Training data-efficient image transformers & distillation through attention
    Transformer in Transformer
    Scaling Vision Transformers
    End-to-End Object Detection with Transformers
    Rethinking Semantic Segmentation from a Sequence-to-Sequence Perspective with Transformers
    End-to-end Lane Shape Prediction with Transformers
    An Empirical Study of Vehicle Re-Identification on the AI City Challenge

    相关文章

      网友评论

        本文标题:Transformer在计算机视觉中的应用

        本文链接:https://www.haomeiwen.com/subject/eflusltx.html