当前位置: 首页 > news >正文

ViT 模型介绍(一)——综述

机器人所采用的大模型均为多模态大模型,输入至少为视觉图像及末端笛卡尔坐标系位姿,因此 ViT 算是基础模型之一

在计算机视觉领域,Vision Transformer (ViT) 是由谷歌团队于2020年提出的一个革命性研究成果,它成功挑战了自2012年AlexNet提出以来,卷积神经网络(CNN)在视觉任务中的主导地位

ViT 的核心创新在于将 Transformer 模型直接应用于图像处理任务,彻底打破了传统计算机视觉中依赖卷积神经网络的惯例

ViT的引入对计算机视觉与自然语言处理的融合起到了催化作用。越来越多的多模态任务开始采用Transformer架构作为共同的模型框架。例如,CLIP(Contrastive Language-Image Pretraining)和 Stable Diffusion 等模型,都在其设计中采用了预训练的ViT模型作为图像特征提取的核心组件

目录

1 将 Transformer 应用于计算机视觉任务的挑战

1.1 注意力层的计算复杂度

1.2 如何将二维图像转化为一维序列

1.3 如何与自注意力机制结合

2 基本架构与核心思想

2.1 图像分块

2.2 扁平化和线性变换

2.3 添加位置编码

2.4 Transformer 编码器

2.5 图像分类

3 ViT 相关开源项目

3.1 Google Research ViT GitHub

3.2 Hugging Face Transformers

3.3 Keras-ViT

3.4 Visual Transformers (vit) by Meta

3.5 DPT (Dense Prediction Transformer)

3.6 CLIP by OpenAI


1 将 Transformer 应用于计算机视觉任务的挑战

Transformer 架构可以看之前的笔记文章,其中最关键的 注意力机制(Attention Mechanism)的核心操作是计算输入元素之间的注意力分数

在计算机视觉中,应用 Transformer 面临着几个挑战,主要包括:

1.1 注意力层的计算复杂度

Transformer 中的注意力层计算的是输入元素之间的相似度,并根据这些相似度计算加权平均。具体来说,注意力层需要计算一个注意力矩阵,矩阵中的每个元素表示两个输入元素之间的注意力分数

注意力分数的计算复杂度为 $O(n^2)$,其中 n 是输入序列的长度。这个计算复杂度对于较长的输入序列来说是非常高的

在计算机视觉任务中,输入的图像分辨率通常很高,例如常见的224×224像素的图像,如果将每个像素作为一个元素,那么输入序列的长度就为224 × 224 = 50176,这已经非常庞大,注意力矩阵的计算量极其巨大

对于更大的图像(例如目标检测任务中的416×416像素,甚至视频分类中的800×800像素),计算复杂度将成倍增加,导致直接应用 Transformer 的计算成本难以接受。因此,如何有效地将注意力机制应用于高维图像是将 Transformer 引入计算机视觉的关键问题

1.2 如何将二维图像转化为一维序列

Transformer 最适合处理序列数据,而图像是二维数据。为了将图像输入到 Transformer 中,需要先将图像从二维结构转换为一维序列。最直观的做法是将图像的每个像素视为输入序列的元素,然后将图像拉平成一个长向量

然而,直接将一个高分辨率图像(例如224×224像素)拉直成一个长度为50176的向量,显然计算开销巨大,无法在当前计算资源下高效处理

因此,ViT等模型采用了图像块(patch)的方式,将图像切分成多个较小的块(如16×16像素),然后将每个图像块当作一个元素输入到 Transformer 中。这样既能减小计算量,也能保持图像的空间结构信息。

1.3 如何与自注意力机制结合

如何将注意力机制应用于图像计算就是将 Transformer 应用于计算机视觉领域的重点。最简单的方式就是直接将 CNN 与自注意力机制结合,首先用 CNN 提取特征图(Feature Map),然后将特征图的每个位置视为序列的一个元素,接着应用自注意力机制

自注意力机制的计算过程可以总结为三个步骤,更详细的可以查看之前的笔记文章:

  1. 相似度计算:对于输入的每个元素(通常是特征图中的某个位置),使用点积拼接感知机等方式计算它与其他元素的相似度,得到一个注意力权重

  2. 标准化:通过softmax函数对计算出的注意力权重进行标准化,使得所有权重的和为1,从而得到规范化的注意力分数

  3. 加权平均:将注意力分数与对应的value(值向量)进行加权求和,得到最终的输出特征

这种自注意力机制的优势在于其全局性。通过查询(Query)和赋值(Value)操作,它可以捕获特征图中的全局空间信息,适用于处理需要全局上下文理解的任务。

结合原因与思路:

传统的 CNN 只能处理局部信息,因为卷积操作本质上是局部感受野的操作,模型只能关注到卷积核周围的局部区域,无法有效地融合远距离的特征。而自注意力机制能够通过加权融合的方式,处理全局信息,因此在需要全局上下文理解的任务中,表现优于传统 CNN

举个例子:在图像的某个位置(如图像中的一个球体)和图像的其他位置(如另一个球体)之间,存在空间上的远距离关系。自注意力机制能够通过计算注意力权重,将远处的信息加权融合到当前位置的特征表示中,从而提高模型对全局上下文的理解能力

2 基本架构与核心思想

ViT 的架构可以简要总结为以下几个主要步骤:

图像分块 -> 扁平化和线性变换 -> 添加位置编码 -> Transformer 编码器 -> 图像分类

通过这几个步骤,成功将 Transformer 模型应用于图像分类任务,简单介绍一下:

2.1 图像分块

ViT 首先将输入的图像切分为多个固定大小的图像块(patch)。例如,对于一张224x224的图像,若每个块的大小为16x16,那么图像将被切割成14x14=196个块。每个块可以视为一个“词”或者说是一个序列的元素

2.2 扁平化和线性变换

每个图像块被扁平化为一维向量,并通过一个线性投影(即一个全连接层)映射到一个固定维度的向量空间。这些变换后的向量将作为输入送入 Transformer 模型

2.3 添加位置编码

由于 Transformer 模型本身不具备感知输入顺序的能力,因此 ViT 为每个图像块添加了位置编码(Positional Encoding),以保留块在原图中的空间位置信息。位置编码通常采用类似于 NLP 任务中使用的编码方式

2.4 Transformer 编码器

经过位置编码处理后,图像块的向量进入标准的 Transformer 编码器架构中。Transformer 编码器主要由自注意力机制和前馈神经网络组成,通过多层堆叠的自注意力层来捕捉图像块之间的长程依赖关系

2.5 图像分类

Transformer 输出的特征向量经过一个池化层(通常是取平均或最大池化)后,送入一个全连接层进行最终的分类

3 ViT 相关开源项目

3.1 Google Research ViT GitHub

Google Research发布了ViT的原始实现,包括详细的代码和预训练模型,帮助研究人员和开发者能够快速复现ViT的实验。

  • GitHub链接:ViT by Google Research

3.2 Hugging Face Transformers

Hugging Face 提供了一个强大的 Transformer 库,其中包括 ViT 模型的实现。该库支持与多个预训练模型进行交互,包括 ViT,并且集成了许多其他计算机视觉任务(如图像分类、目标检测等)

  • GitHub链接:Hugging Face Transformers
  • ViT模型页面:ViT Model on Hugging Face

3.3 Keras-ViT

如果使用 Keras 和 TensorFlow 架构,Keras-ViT 是一个 ViT 的开源实现,可以在 Keras 框架中使用 ViT 模型

  • GitHub链接:Keras-ViT

3.4 Visual Transformers (vit) by Meta

Meta AI(前 Facebook AI)也发布了自己的 ViT 实现,该项目提供了一个基于 Transformer 的计算机视觉框架,适用于多种任务

  • GitHub链接:Meta ViT

3.5 DPT (Dense Prediction Transformer)

DPT 是一个针对 Dense Prediction 任务(如深度估计和语义分割)优化的 ViT 版本,适合需要高精度视觉理解的应用

  • GitHub链接:DPT - Dense Prediction Transformer

3.6 CLIP by OpenAI

虽然 CLIP 是一个多模态模型,但它使用了基于 ViT 的图像编码器。OpenAI 开源了 CLIP 模型的代码,并提供了相关的预训练模型,可以用于图像-文本匹配等任务

  • GitHub链接:CLIP by OpenAI

相关文章:

  • VS2022配置FFMPEG库基础教程
  • 使用大语言模型(Deepseek)构建一个基于 SQL 数据的问答系统
  • DeepSeek行业应用实践报告-智灵动力【112页PPT全】
  • Layer2 扩容解决方案详解
  • 人工智能(AI):科技新纪元的领航者
  • 关于使用带elementplus前缀图标的步骤
  • vmvare kali如何配置桥接模式进行上网
  • vscode无法预览Markdown在线图片链接
  • 【机器学习】【KMeans聚类分析实战】用户分群聚类详解——SSE、CH 指数、SC全解析,实战电信客户分群案例
  • CSS笔记一
  • 0_关闭防火墙、设置静态IP
  • C++/JavaScript ⭐算法OJ⭐ 链表相交
  • C++ 游戏开发:从零到英雄的进阶之旅
  • [ComfyUI]Recraft贴图开源方案,实现服装印花自由
  • Debezium 报错:“The db history topic is missing” 的处理方法
  • Fences 5深度解析:一键打造超高效整洁桌面
  • QT中经常出现的用法:组合
  • iTHOR 虚拟环境简述
  • 使用matplotlib绘制柱状图并在下面使用表格显示数值
  • 【爬虫】request库
  • 沈阳犀牛云做网站怎么样/推广产品的软文怎么写
  • 哪些网站建设公司/营销型网站建设解决方案
  • gta5显示网站建设中/潍坊seo教程
  • 太原的网站建设公司哪家好/在线分析网站
  • 广西疫情最新消息环球网/seo实战视频
  • 我的网站wordpress/网络营销推广的特点