Vision Transformer

Vision Transformer

导读

以下是几个在相关工作中比较知名的项目:

  • DETR(End-to-End Object Detection with Transformers),使用Transformers进行物体检测和分割。
  • Vision Transformer (AN IMAGE IS WORTH 16X16 WORDS: Transformer FOR IMAGE RECOGNITION AT SCALE),使用Transformer 进行图像分类。
  • Image GPT(Generative Pretraining from Pixels),使用Transformer进行像素级图像补全,就像其他GPT文本补全一样。
  • End-to-end Lane Shape Prediction with Transformers,在自动驾驶中使用Transformer进行车道标记检测

常用transformer的结构

在CV中采用Transformer的相关工作中主要有两种模型架构。一种是纯Transformer结构,另一种是将CNNs/主干网与Transformer相结合的混合结构。

  • 纯Transformer
  • 混合型:(CNNs+ Transformer)

Vision Transformer是基于完整的自注意力的Transformer结构没有使用CNN,而DETR是使用混合模型结构的一个例子,它结合了卷积神经网络(CNNs)和Transformer。

Vision Transformer(ViT)首次在主流分类基准上实现了类似甚至更高的性能。本节全面回顾了 2021 年 6 月之前发布的 40 多个 Transformer 主干,并根据其动机和实现将它们分为六类,如下图 5 所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DfSfs2TS-1657698313547)(https://github.com/theprofessor249/TUKU/img/202207131030407.jpeg)]

首先介绍了 ViT,用于图像分类的原始视觉 Transformer。然后讨论了 Transformer Enhanced CNN 方法,该方法利用Transformer来增强CNN主干的远程依赖性。Transformer 具有很强的全局建模能力,但在早期忽略了局部信息。因此,CNN Enhanced Transformer 方法利用适当的卷积归纳偏置来增强 Transformer,而 Local Attention Enhanced Transformer 方法重新设计补丁分区和注意力块以增强 Transformer 的局部性并保持无卷积架构。此外,CNN 在性能和计算效率方面从经验上受益于分层和深层结构。受此启发,提出了 Hierarchical Transformer 和 Deep Transformer 方法。前者用金字塔茎代替固定分辨率的柱状结构,而后者防止注意力图过于平滑并增加其在深层的多样性。

Vision Transformer简介

Vision Transformer(ViT)将纯Transformer架构直接应用到一系列图像块上进行分类任务,可以取得优异的结果。它在许多图像分类任务上也优于最先进的卷积网络,同时所需的预训练计算资源大大减少(至少减少了4倍)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YNgdQXW5-1657698313549)(https://github.com/theprofessor249/TUKU/img/202207130939913.png)]

  • Vision Transformer模型结构

它们是如何将图像分割成固定大小的小块,然后将这些小块的线性投影连同它们的图像位置一起输入变压器的。然后剩下的步骤就是一个干净的和标准的Transformer编码器和解码器。

在图像patch的嵌入中加入位置嵌入通过不同的策略在全局范围内保留空间/位置信息。在本文中,他们尝试了不同空间信息编码方法,包括无位置信息编码、1D/2D位置嵌入编码和相对位置嵌入编码。

  • 注意事项

输入的patch尺寸越小,计算模型就越大,这是因为输入的patch数目N = HW/P*P,其中(H,W)为原始图像的分辨率,P为patch图像的分辨率。这意味着14 x 14的patch比16 x 16的图像patch在计算上更昂贵。

  • 模型性能VS数据集大小

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tNTfTmRC-1657698313550)(https://github.com/theprofessor249/TUKU/img/202207130953717.png)]

了数据集大小对模型性能的影响。当预训练数据集的大小较小时,ViT的表现并不好,当训练数据充足时,它的表现优于以前的SOTA。

Vision Transformer的模型结构详解

总体架构

下图是原论文中给出的关于Vision Transformer(ViT)的模型框架。简单而言,模型由三个模块组成:

Linear Projection of Flattened Patches(Embedding层)

Transformer Encoder(图右侧有给出更加详细的结构)

MLP Head(最终用于分类的层结构)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-olfDO7X2-1657698313550)(https://github.com/theprofessor249/TUKU/img/202207131135424.png)]

Vision transformer模型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-34ufg7v8-1657698313551)(https://github.com/theprofessor249/TUKU/img/202207131141613.png)]

ViT-B/16模型

架构细节

  • Embedding层

对于标准的Transformer模块,要求输入的是token(向量)序列,即二维矩阵[num_token, token_dim],如下图,token0-9对应的都是向量,以ViT-B/16为例,每个token向量长度为768。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AjBASJuL-1657698313552)(https://github.com/theprofessor249/TUKU/img/202207131336728.png)]

对于图像数据而言,其数据格式为[H, W, C]是三维矩阵明显不是Transformer想要的。所以需要先通过一个Embedding层来对数据做个变换。如下图所示,首先将一张图片按给定大小分成一堆Patches。以ViT-B/16为例,将输入图片(224x224)按照16x16大小的Patch进行划分,划分后会得到( 224 / 16 ) 2 = 196 (224/16)^2=196个Patches。接着通过线性映射将每个Patch映射到一维向量中,以ViT-B/16为例,每个Patche数据shape为[16, 16, 3]通过映射得到一个长度为768的向量(后面都直接称为token)。[16, 16, 3] -> [768]

在代码实现中,直接通过一个卷积层来实现。 以ViT-B/16为例,直接使用一个卷积核大小为16x16,步距为16,卷积核个数为768的卷积来实现。通过卷积[224, 224, 3] -> [14, 14, 768],然后把H以及W两个维度展平即可[14, 14, 768] -> [196, 768],此时正好变成了一个二维矩阵,正是Transformer想要的。

在输入Transformer Encoder之前注意需要加上[class]token以及Position Embedding。 在原论文中,作者说参考BERT,在刚刚得到的一堆tokens中插入一个专门用于分类的[class]token,这个[class]token是一个可训练的参数,数据格式和其他token一样都是一个向量,以ViT-B/16为例,就是一个长度为768的向量,与之前从图片中生成的tokens拼接在一起,Cat([1, 768], [196, 768]) -> [197, 768]。然后关于Position Embedding就是之前Transformer中讲到的Positional Encoding,这里的Position Embedding采用的是一个可训练的参数(1D Pos. Emb.),是直接叠加在tokens上的(add),所以shape要一样。以ViT-B/16为例,刚刚拼接[class]token后shape是[197, 768],那么这里的Position Embedding的shape也是[197, 768]。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AxrDeezS-1657698313553)(https://github.com/theprofessor249/TUKU/img/202207131338008.png)]

  • Transformer Encoder层

Transformer Encoder其实就是重复堆叠Encoder Block L次,下图是我自己绘制的Encoder Block,主要由以下几部分组成:

Layer Norm,这种Normalization方法主要是针对NLP领域提出的,这里是对每个token进行Norm处理,之前也有讲过Layer Norm不懂的可以参考链接
Multi-Head Attention,这个结构之前在讲Transformer中很详细的讲过,不在赘述,不了解的可以参考链接
Dropout/DropPath,在原论文的代码中是直接使用的Dropout层,在但rwightman实现的代码中使用的是DropPath(stochastic depth),可能后者会更好一点。
MLP Block,如图右侧所示,就是全连接+GELU激活函数+Dropout组成也非常简单,需要注意的是第一个全连接层会把输入节点个数翻4倍[197, 768] -> [197, 3072],第二个全连接层会还原回原节点个数[197, 3072] -> [197, 768]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xcCWWAeU-1657698313554)(https://github.com/theprofessor249/TUKU/img/202207131348861.png)]

  • MLP Head层

上面通过Transformer Encoder后输出的shape和输入的shape是保持不变的,以ViT-B/16为例,输入的是[197, 768]输出的还是[197, 768]。注意,在Transformer Encoder后其实还有一个Layer Norm没有画出来,后面有我自己画的ViT的模型可以看到详细结构。**这里我们只是需要分类的信息,所以我们只需要提取出[class]token生成的对应结果就行,即[197, 768]中抽取出[class]token对应的[1, 768]。接着我们通过MLP Head得到我们最终的分类结果。**MLP Head原论文中说在训练ImageNet21K时是由Linear+tanh激活函数+Linear组成。但是迁移到ImageNet1K上或者你自己的数据上时,只用一个Linear即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zp2NlyPY-1657698313555)(https://github.com/theprofessor249/TUKU/img/202207131344986.png)]

transformer混合模型—Hybrid

Hybrid混合模型,就是将传统CNN特征提取和Transformer进行结合。下图绘制的是以ResNet50作为特征提取器的混合模型,但这里的Resnet与之前讲的Resnet有些不同。首先这里的R50的卷积层采用的StdConv2d不是传统的Conv2d,然后将所有的BatchNorm层替换成GroupNorm层。在原Resnet50网络中,stage1重复堆叠3次,stage2重复堆叠4次,stage3重复堆叠6次,stage4重复堆叠3次,但在这里的R50中,把stage4中的3个Block移至stage3中,所以stage3中共重复堆叠9次。

通过R50 Backbone进行特征提取后,得到的特征矩阵shape是[14, 14, 1024],接着再输入Patch Embedding层,注意Patch Embedding中卷积层Conv2d的kernel_size和stride都变成了1,只是用来调整channel。后面的部分和前面ViT中讲的完全一样,就不在赘述。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2SJpjxbC-1657698313556)(https://github.com/theprofessor249/TUKU/img/202207131406074.png)]

transformer在分类中的用途

  1. 最初的Vit

ViT 是 Transformer 在图像分类中的第一个骨干。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ATgbeHko-1657698313557)(https://github.com/theprofessor249/TUKU/img/202207131009284.jpeg)]

  1. Transformer 增强的 CNN

Transformer 有两个关键部分:MHSA 和 FFN。最近,Cordonnier 等人已经证明卷积层可以通过具有足够头数的 MHSA 来近似。Dong等人已经表明,MHSA 可能在没有跨层连接和 FFN时对“token一致性”具有很强的归纳偏置。因此,Transformer 在理论上具有比 CNN 更强大的建模能力。然而,它不可避免地具有沉重的计算成本,特别是对于浅层,由自注意力机制带来,随着特征分辨率的二次方增长。与之前基于注意力的方法类似,一些方法尝试将 Transformer 插入 CNN 主干或用 Transformer 层替换部分卷积块。例如 VTs 和 BoTNet。

  1. CNN 增强 Transformer

归纳偏差可以表示为一组关于数据分布或解空间的假设,其在卷积中的表现是局部性和方差平移。局部性侧重于空间上接近的元素,并将它们与远端隔离。平移不变性表明在输入的位置之间重复使用相同的匹配规则 [97]。由于局部邻域内的协方差很大,并且在整个图像中趋于逐渐平稳,这些卷积偏差可以有效地处理图像数据。然而,强大的偏差也限制了 CNN 具有足够数据集的上限。最近的工作试图利用适当的卷积偏差来增强 Transformer 并加速其收敛。 这些应用可以概括如下:软近似(DeiT、ConViT)、直接局部性处理( CeiT、LocalViT)、位置编码的直接替换(CPVT、ResT)和结构组合(Early Conv. 、CoAtNet)。

  1. 局部注意力增强的transformer

ViT 将输入图像视为一个补丁序列。这种粗糙的补丁嵌入过程忽略了语言和图像之间的差距,这可能会破坏图像的局部信息。作为局部提取器,卷积通过相对固定的滤波器聚合特征。这种模板匹配过程可以有效地处理大多数小数据集,但在处理大型数据集时面临表示的组合爆炸。与卷积相比,局部注意力机制可以根据局部元素之间的关系动态生成注意力权重。为了增强局部特征提取能力并保留无卷积结构,一些工作(Swin Transformer、 TNT block、Twins、T2T-ViT)尝试通过局部自注意力机制来适应补丁结构。随后作者对一些 ViT 变体进行了简要阐述,分别是:TNT、Swin Transformer、Twins& ViL和 VOLO。

  1. 分层 Transformer

由于 ViT 在整个网络中以固定分辨率继承了原始的柱状结构,因此它忽略了细粒度特征,并带来了昂贵的计算成本。继分层 CNN 之后,最近的工作(CvT、PVT、ViL、T2T-ViT、PiT)将类似的结构应用于 Transformer 中。

  1. 深度 Transformer

经验,增加模型的深度使网络能够学习更复杂的表示。最近的工作将这种深度结构应用于 Transformer 并进行大量实验,通过分析跨 patch(Diverse Patch)和跨层(Refiner、DeepViT)的相似性以及残差块(CaiT)的贡献来研究其可扩展性。在深度 Transformer 中,更深层的特征往往不太具有代表性(注意力崩溃,由 DeepViT 发现),并且 patch 被映射到难以区分的潜在表示(补丁过度平滑,由 Diverse Patch 发现)。为了弥补上述限制,这些方法也多方面提出了相应的解决方案。本文简要介绍了CaiT、DeepViT & Refiner和 Diverse Patch。

  1. 有自监督学习的 Transformers

自监督 Transformers 在 NLP 中取得了成功,但受监督的预训练 Transformers 仍占据 CV 领域的主导地位。最近的工作还试图在生成性(iGPT、BEiT)和辨别性(MoCo v3、DINO)中为视觉 Transformer 设计各种自监督学习方案。

  • transformer模型的更改部分

大多数结构改进的方法针对特定模型尺寸、问题或特定输入分辨率进行优化;局部性对于 Transformer 来说是不可或缺的,VOLO 和 Swin 分别在分类和密集预测任务中占主导地位;卷积 patch 化茎(即使用卷积生成patch,如 )和早期卷积阶段(CoAtNet)显著提高了 Transformer 的精度,尤其是在大型模型上,因为这样的组合可以为浅层的细粒度局部特征提供相互帮助;

在视觉 Transformer 的开发过程中,最常见的问题是 Transformer 是否可以取代卷积。通过回顾过去一年的改善历史,没有性能不足的迹象。视觉 Transformer 已经从一个纯粹的结构回归到一个混合的形式,全局信息逐渐回归到一个与局部信息混合的阶段。 虽然 Transformer 可以等价于卷积,甚至比卷积具有更好的建模能力,但这种简单有效的卷积运算足以处理底层的局部性和低级语义特征。在未来,两者结合的思想将推动图像分类的更多突破。

Transformer在检测中的用途

用于目标检测的视觉 Transformer,它可以分为两类:作为颈部(neck)的 Transformer 和作为主干(backbone)的 Transformer。颈部检测器主要是基于 Transformer 结构的一种新表示,称为目标查询,即一组学习的参数均等地聚合全局特征。这些方法尝试在提高收敛速度或改进性能方面提供最佳融合范式。除了专门为检测任务设计的各种颈部外,一部分骨干检测器也考虑了特定的策略。最后,本文比较了它们之间的性能,然后分析了 Transformer 检测器的一些潜在的改进。

  • Transformer 颈部

作者首先回顾 DETR,这是最开始的一个 Transformer 检测器,它提供了一个新的表示目标查询,将对象检测制定为一个集合预测问题。由于其对小物体的准确性低和收敛速度慢,人们从三个方面努力改进这种 Transformer 检测器:稀疏注意力、空间先验和结构重设计。此外,本文还回顾了自监督的应用。

最初的检测器:DEtection with TRansformer (DETR)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mHhpu6uf-1657698313559)(https://github.com/theprofessor249/TUKU/img/202207131042795.jpeg)]

DETR是第一个端到端的 Transformer 检测器,它消除了手工设计的表示和非极大值抑制(NMS)后处理,通过引入目标查询和集合预测直接检测所有对象。具体地,DETR 使用编码器-解码器 Transformer 作为颈部,以及使用 FFN 作为预测头(如上图所示)。

稀疏注意力的 Transformer

在 DETR 中,解码器嵌入和全局特征之间的密集交互会消耗大量计算资源并减慢 DETR 的收敛速度。因此,一些努力旨在设计依赖于数据的稀疏注意力来解决这个问题,例如 Deformable DETR 和 ACT。接着作者描述了在稀疏注意力中的几个重要改进:Deformable DETR、ACT、SMCA、Conditional DETR、Two-Stage Deformable DETR 和 Efficient DETR。

重新设计结构的 Transformer

除了聚焦于交叉注意力的改进外,一些工作还重新设计了仅编码器的结构来直接避免解码器的问题。例如,TSP 继承了集合预测的思想,并放弃了解码器和目标查询。YOLOS 结合了 DETR 的编码器-解码器颈部和 ViT 的仅编码器主干,来重新设计仅编码器的检测器。

自监督学习的 Transformer 检测器

受到自然语言处理中取得成功的预训练 Transformer 的启发,Dai 等人提出无监督预训练DETR(UP-DETR)从三个方面辅助监督训练:

  1. 从给定图像中随机裁剪的一个 path 分配给所有目标查询。解码器的目标是定位 patch 位置。

  2. 为了避免在预训练中对定位的过度偏见,提出了一个辅助重建任务来保留有判别性的特征。

  3. 基于单个查询 patch,多查询定位将多个 patch 分配给不同的目标查询,以模仿多目标检测任务并加速收敛。每个 patch 查询都是通过掩码注意力和目标查询混洗独立预测的。

UP-DETR 在小数据集上比 DETR 获得了更高的精度和更快的收敛速度,甚至在训练数据充足的情况下性能更好。

  • Transformer 骨干

作者在本文中回顾了许多用于图像分类的基于 Transformer 的主干。这些主干可以很容易地合并到各种框架中(例如,MaskR-CNN、RetinaNet、DETR 等)来执行密集预测任务。除了一般的改进外,它们中的一部分也有利于改进密集预测任务。层次结构将 Transformer 构造为一个从高分辨率到低分辨率的过程来学习多尺度特征,如 PVT。局部增强结构将主干构建为局部到全局的组合,以有效地提取短程和长程的视觉依赖性并避免二次计算开销,例如 Swin-Transformer、ViL 和 Focal Transformer。下表3在密集预测任务中比较了基于视觉 Transformer 框架的模型。基于 Transformer 的主干比当前 CNN 模型的性能高 2-6.8%,这证明了 Transformer 在密集预测方面的有效性。

DETR

简介

DETR是第一个成功地将Transformer作为pipeline中的主要构建块的目标检测框架。它与以前的SOTA方法(高度优化的Faster R-CNN)的性能匹配,具有更简单和更灵活的pipeline。

Transformer 应用于图像分类后,本章学习 Transformer 应用于图像目标检测的开山之作 – DEtection TRansformer,其大大简化了目标检测的框架,更直观。

DETR 是 Facebook 团队于 2020 年提出的基于 Transformer 的端到端目标检测,没有非极大值抑制 NMS 后处理步骤、没有 anchor 等先验知识和约束,整个由网络实现端到端的目标检测实现,大大简化了目标检测的 pipeline。其原始论文为 《End-to-End Object Detection with Transformers》。结果在 COCO 数据集上效果与 Faster RCNN 相当,在大目标上效果比 Faster RCNN 好,且可以很容易地将 DETR 迁移到其他任务例如全景分割。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3F344IrW-1657698313560)(https://github.com/theprofessor249/TUKU/img/202207130954299.png)]

DETR结构

DETR结合CNN和Transformer的pipeline的目标检测,流程:

  1. CNN被用来学习图像的二维表示并提取特征
  2. CNN的输出是扁平化的,并辅以位置编码,以馈入标准Transformer的编码器
  3. Transformer的解码器通过输出嵌入到前馈网络(FNN)来预测类别和包围框

DETR 分为四个部分,首先是一个 CNN 的 backbone,Transformer 的 Encoder,Transformer 的 Decoder,最后的预测层 FFN。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C6C7KzeP-1657698313561)(https://github.com/theprofessor249/TUKU/img/202207131452406.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BJiXf3kO-1657698313562)(https://github.com/theprofessor249/TUKU/img/202207131501239.png)]

具体步骤:
**a.**利用CNN提取图像特征,backbone可以使用主流的图像编码网络例如ResNet50等
b.编码-解码的transformer,encoder中带有position encoding,decoder中输入了object queries(随机向量,其个数决定了输出个数)
c.用来预测最终目标的前馈网络FFN,一个简单的三层前馈网络
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5nWaXob5-1657698313563)(https://github.com/theprofessor249/TUKU/img/202207131526056.png)]

DETR细节

  • CNN Backbone

提取特征

  • Transformer Encoder

经过 Backbone 后,将输出特征图 reshape 为 C × H W C \times HWC×HW,因为 C = 2048 C = 2048C=2048 是每个 token 的维度,还是比较大,所以先经过一个 1 × 1 1 \times 11×1 的卷积进行降维,然后再输入 Transformer Encoder 会更好。此时自注意力机制在特征图上进行全局分析,因为最后一个特征图对于大物体比较友好,那么在上面进行 Self-Attention 会便于网络更好的提取不同位置不同大物体之间的相互关系的联系,比如有桌子的地方可能有杯子,有草坪的地方有树,有一个鸟的地方可能还有一个鸟等等。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0sGebPvy-1657698313564)(https://github.com/theprofessor249/TUKU/img/202207131506390.png)]

  • Transformer Decoder

Transformer Decoder 也有几个地方需要着重强调。首先就是如何考虑同时进行一个集合预测?之前讲分类的时候都是给一个 class token,因为只进行一类预测。那么现在同时进行不知道多少类怎么办呢?因为目标预测框和输入 token 是一一对应的,所以最简单的做法就是给超多的查询 token,超过图像中会出现的目标的个数(在过去也是先生成 2000 个框再说)。所以在 DETR 中,作者选择了固定的 N = 100 个 token 作为输入,只能最多同时检测 100 个物体。据闻,这种操作可能跟 COCO 评测的时候取 top 100 的框有关。输入 100 个 decoder query slots (Object Query),并行解码N个object,对应的 Transformer decoder 也就会输出 100 个经过注意力和映射之后的 token,然后将它们同时喂给一个 FFN 就能得到 100 个框的位置和类别分数(因为是多分类,所以类别个数是 K + 1,1 指的是背景类别)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TpaUepp9-1657698313565)(https://github.com/theprofessor249/TUKU/img/202207131509770.png)]

与 ViT 他们不同的另外一点是,DETR 的 Decoder 也加了 Positional Encoding。这个思想其实也很自然。当作图像分类是,其实 class token 就一个,对应整个图片,那么自然无需 positional encoding,自己把整个图都占全了。但是在做目标检测时,可能会希望不同的 Object Query 是不是对应图像中不同的位置会好一些。那么按照这个思想,Object Query 自然就是 positional encodings,也就是我就是要查询这里的物体,你预测出来的就是对应的如果有物体的话就是它的类别和位置。

Decoder 每一层的输出结果也经过参数共享的最后的那个 FFN 进行预测并计算loss,实现 深监督

  • FFN

最后的 FFN 是由具有 ReLU 激活函数且具有隐藏层的 3 层线性层计算的,或者说就是 1 × 1 1 \times 11×1 卷积。FFN 预测框标准化中心坐标,高度和宽度,然后使用 softmax 函数激活获得预测类标签。

最终网络的大致推理过程如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yU5SyErl-1657698313566)(https://github.com/theprofessor249/TUKU/img/202207131519903.png)]

相关资源链接

最新最全 | 视觉 Transformer 综述

https://blog.51cto.com/u_15298598/5262882

计算机视觉中的Transformer

https://blog.csdn.net/qq_42722197/article/details/112793157

Vision Transformer(vit)网络详解

https://www.bilibili.com/video/BV1Jh411Y7WQ?spm_id_from=333.999.0.0&vd_source=28d6f1e8d9c5fefad9c4d048fd161cf9

干货!2022讲得最清晰的【Transformer核心项目DETR目标检测训练】整体网络架构与注

https://www.bilibili.com/video/BV1eL411V7TP?p=5&vd_source=28d6f1e8d9c5fefad9c4d048fd161cf9

源码解析目标检测的跨界之星DETR(一)、概述与模型推断

https://www.jianshu.com/p/85e75a03da65

课程介绍:DETR原理与代码精讲

https://www.bilibili.com/video/BV1pa411C7wo?spm_id_from=333.337.search-card.all.click&vd_source=28d6f1e8d9c5fefad9c4d048fd161cf9

https://ke.qq.com/course/3030772?_wv=2147487745#term_id=103148482

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vision Transformer(ViT)是一种基于Transformer架构的深度学习模型,用于处理计算机视觉任务。它将图像分割成一系列的图像块,并将每个图像块作为输入序列传递给Transformer编码器。每个图像块通过一个线性投影层转换为向量表示,并与位置嵌入向量相结合,然后输入到Transformer编码器中进行处理。Transformer编码器由多个自注意力层和前馈神经网络层组成,用于学习图像中的全局和局部特征。最后,通过一个线性分类器对编码器的输出进行分类。 Vision Transformer的优点是能够在没有使用传统卷积神经网络的情况下,实现对图像的高质量特征提取和分类。它在一些计算机视觉任务上取得了与传统方法相媲美甚至更好的性能,例如图像分类、目标检测和语义分割等任务。 以下是一个使用Vision Transformer进行图像分类的示例代码[^1]: ```python import torch import torch.nn as nn from torchvision import transforms from torchvision.models import resnet50 from vit_pytorch import ViT # 加载预训练的Vision Transformer模型 model = ViT( image_size = 224, patch_size = 16, num_classes = 1000, dim = 768, depth = 12, heads = 12, mlp_dim = 3072, dropout = 0.1, emb_dropout = 0.1 ) # 加载预训练的权重 model.load_from('vit_weights.pth') # 图像预处理 transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 加载图像并进行预处理 image = Image.open('image.jpg') image = transform(image).unsqueeze(0) # 使用Vision Transformer进行图像分类 output = model(image) _, predicted_class = torch.max(output, 1) # 输出预测结果 print('Predicted class:', predicted_class.item()) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值