Vision Transformers (ViTs):使用 Transformer 模型的计算机视觉

在过去的几年里,变形金刚已经改变了机器学习中的 NLP 领域。 GPT 和 BERT 等模型在理解和生成人类语言方面树立了新的基准。现在同样的原理也被应用到计算机视觉领域。

Vision Transformers (ViTs):使用 Transformer 模型的计算机视觉

在过去的几年里,变形金刚已经改变了机器学习中的 NLP 领域。 GPT 和 BERT 等模型 在理解和生成人类语言方面树立了新的基准。 现在同样的原理也被应用到计算机视觉领域。计算机视觉领域的最新发展是视觉 变压器或 ViT。正如论文“An Image is Worth 16×16 Words: Transformers for Image Recognition at Scale”中详细介绍的, ViT 和基于 Transformer 的模型旨在取代卷积 神经网络(CNN)。Vision Transformers 是解决计算机问题的全新方式 想象。而不是依赖传统的卷积神经网络 (CNN)几十年来一直是图像相关任务的支柱, ViT 使用 Transformer 架构来处理图像。他们对待 图像补丁就像句子中的单词一样,允许模型学习 这些补丁之间的关系,就像它学习上下文中的上下文一样 文本段落。

与 CNN 不同,ViT 将输入图像划分为补丁,然后将它们序列化 转化为向量,并使用矩阵降低其维度 乘法。然后,变压器编码器将这些向量处理为 令牌嵌入。在本文中,我们将探讨视觉转换器和 它们与卷积神经网络的主要区别。是什么让 他们特别有趣的是他们了解全球的能力 图像中的模式,这是 CNN 难以解决的问题。

截屏2025-01-23 13.36.01.png

什么是视觉转换器?

视觉转换器使用注意力和转换器的概念来 处理图像——这类似于自然语言中的转换器 处理(NLP)上下文。然而,该图像不是使用标记,而是 分成补丁并作为线性嵌入序列提供。这些 补丁的处理方式与 NLP 中处理标记或单词的方式相同。

ViT 不是同时查看整个图片,而是进行剪切 将图像分成小块,就像拼图游戏一样。每一块都经过翻转 转化为描述其特征的数字列表(向量),然后 该模型会查看所有部件并找出它们之间的关系 彼此使用变压器机制。

与 CNN 不同,ViT 的工作原理是在 用于检测特定特征的图像,例如边缘图案。这是 卷积过程非常类似于打印机扫描 图像。这些滤镜滑过整个图像并突出显示 显着特征。然后网络堆叠多层 这些过滤器逐渐识别更复杂的模式。
使用 CNN,池化层可以减小特征图的大小。这些 层分析提取的特征以使预测有用 图像识别、目标检测等。然而,CNN 有一个固定的 感受野,从而限制了远程建模的能力

CNN 如何查看图像?image

ViT,尽管有更多参数,但使用自注意力机制 为了更好的特征表示并减少对更深层次的需求。 CNN 需要更深层次的架构才能实现类似的效果 表征能力,这会导致计算成本增加。

此外,CNN 无法捕获全局级别的图像模式,因为 他们的过滤器专注于图像的局部区域。要了解 整个图像或远程关系,CNN 依赖于堆叠许多层 并汇集,扩大视野。然而,这个过程可以 在逐步聚合细节时会丢失全局信息。

ViT,另一方面,将图像划分为多个补丁 被视为单独的输入标记。使用 self-attention,ViT 进行比较 同时所有补丁并了解它们之间的关系。这让他们 捕获整个图像的模式和依赖关系,而无需 一层一层地构建它们。

什么是归纳偏差?

在进一步讨论之前,了解归纳偏差的概念很重要。 归纳偏差是指模型对数据做出的假设 结构;在训练过程中,这有助于模型更加泛化 减少偏见。在 CNN 中,归纳偏差包括:

局部性:图像中的特征(如边缘或纹理)位于小区域内。二维邻域结构:附近的像素更有可能出现是相关的,因此过滤器对空间相邻区域进行操作。平移等方差:在图像的一个部分中检测到的特征,例如边缘,如果它们出现在其他部分,则保留相同的含义。

这些偏差使得 CNN 对于图像任务非常高效,因为它们 本质上是为了利用图像的空间和结构 属性。

视觉变换器 (ViT) 的图像特定归纳偏差比 CNN 少得多。在 ViTs 中:

全局处理:自注意力层在 整个图像,使模型捕捉全局关系 不受局部区域限制的依赖关系。最小 2D 结构:图像的 2D 结构 仅在开始时使用(当图像被划分为补丁时) 以及在微调期间(调整不同位置的嵌入) 决议)。与 CNN 不同,ViT 不假设附近的像素是 必然相关。学习的空间关系:位置嵌入 ViT 在初始化时不编码特定的 2D 空间关系。 相反,模型从数据中学习所有空间关系

Vision Transformers 如何工作

iamge

Vision Transformers 使用标准 Transformer 架构 专为一维文本序列而开发。为了处理 2D 图像,它们是 分为固定大小的较小块,例如 P P 像素,其中 被展平为向量。如果图像的尺寸为 H、W 和 C 通道,补丁总数为 N = H W / P P 有效 Transformer 的输入序列长度。这些扁平的补丁是 然后线性投影到固定维空间 D 中,称为补丁嵌入。

一个特殊的可学习令牌,类似于 BERT 中的 [CLS] 令牌,是 添加到补丁嵌入序列之前。该令牌学习一个 稍后用于分类的全局图像表示。 此外,位置嵌入被添加到补丁嵌入中以 对位置信息进行编码,帮助模型理解空间 图像的结构。

嵌入序列通过 Transformer 编码器传递,该编码器在两个主要操作之间交替:多头自注意力 (MSA) 和前馈神经网络(也称为 MLP 块)。每层都包含层归一化(LN) 在这些操作之前应用并添加剩余连接 之后要稳定训练。 Transformer 编码器的输出, 特别是 [CLS] 令牌的状态,用作图像的 表示。

将一个简单的头添加到最终的 [CLS] 标记中以进行分类 任务。在预训练期间,这个头是一个小型多层感知器 (MLP),而在微调时,它通常是单个线性层。这 架构允许 ViT 有效地建模全球关系 在补丁之间并充分利用图像自注意力的能力 理解。

在混合Vision Transformer模型中,而不是直接划分 原始图像分成补丁,输入序列来自特征图 由 CNN 生成。 CNN首先处理图像,提取 有意义的空间特征,然后用于创建补丁。 这些补丁被展平并投影到固定维度的空间中 使用与标准视觉相同的可训练线性投影 变形金刚。这种方法的一个特例是使用大小的补丁 1×1,其中每个补丁对应于单个空间位置 CNN 的特征图。

在这种情况下,特征图的空间维度为 展平,并将结果序列投影到 变压器的输入维度。与标准 ViT 一样, 添加分类标记和位置嵌入以保留 位置信息并实现全局图像理解。这 混合方法利用 CNN 的局部特征提取优势 同时将它们与全球建模能力相结合 变形金刚。

代码演示

这里是有关如何使用视觉变形金刚的代码块图片。

# Install the necessary libraries  pip install -q transformers
from transformers import ViTForImageClassification  from PIL import Image  from transformers import ViTImageProcessor
import requests  import torch
# Load the model and move it to ‘GPU’  device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')model = ViTForImageClassification.from_pretrained('google/vit-base-patch16-224')  model.to(device)
# Load the image to perform predictions  url = 'link to your image'  image = Image.open(requests.get(url, stream=True).raw)processor = ViTImageProcessor.from_pretrained('google/vit-base-patch16-224')  inputs = processor(images=image, return_tensors="pt").to(device)  pixel_values = inputs.pixel_values  # print(pixel_values.shape)

ViT 模型处理图像。它包括一个类似 BERT 的编码器和一个 线性分类头位于最终隐藏状态的顶部 [CLS] 令牌。

with torch.no_grad():    outputs = model(pixel_values)  logits = outputs.logits# logits.shapeprediction = logits.argmax(-1)  print("Predicted class:", model.config.id2label[prediction.item()])

这里是 使用 PyTorch 的基本 Vision Transformer (ViT) 实现。这 代码包括核心组件:补丁嵌入、位置编码、 和 Transformer 编码器。这可以用于简单分类 任务。

import torchimport torch.nn as nnimport torch.nn.functional as Fclass VisionTransformer(nn.Module):    def __init__(self, img_size=224, patch_size=16, num_classes=1000, dim=768, depth=12, heads=12, mlp_dim=3072, dropout=0.1):        super(VisionTransformer, self).__init__()                # Image and patch dimensions        assert img_size % patch_size == 0, "Image size must be divisible by patch size"        self.num_patches = (img_size // patch_size) ** 2        self.patch_dim = (3 * patch_size ** 2)  # Assuming 3 channels (RGB)                # Layers        self.patch_embeddings = nn.Linear(self.patch_dim, dim)        self.position_embeddings = nn.Parameter(torch.randn(1, self.num_patches   1, dim))        self.cls_token = nn.Parameter(torch.randn(1, 1, dim))        self.dropout = nn.Dropout(dropout)                # Transformer Encoder        self.transformer = nn.TransformerEncoder(            nn.TransformerEncoderLayer(d_model=dim, nhead=heads, dim_feedforward=mlp_dim, dropout=dropout),            num_layers=depth        )                # MLP Head for classification        self.mlp_head = nn.Sequential(            nn.LayerNorm(dim),            nn.Linear(dim, num_classes)        )        def forward(self, x):        # Flatten patches and embed        batch_size, channels, height, width = x.shape        patch_size = height // int(self.num_patches ** 0.5)        x = x.unfold(2, patch_size, patch_size).unfold(3, patch_size, patch_size)        x = x.contiguous().view(batch_size, 3, patch_size, patch_size, -1)        x = x.permute(0, 4, 1, 2, 3).flatten(2).permute(0, 2, 1)        x = self.patch_embeddings(x)                # Add positional embeddings        cls_tokens = self.cls_token.expand(batch_size, -1, -1)        x = torch.cat((cls_tokens, x), dim=1)        x = x   self.position_embeddings        x = self.dropout(x)                # Transformer Encoder        x = self.transformer(x)                # Classification Head        x = x[:, 0]  # CLS token        return self.mlp_head(x)# Example usageif __name__ == "__main__":    model = VisionTransformer(img_size=224, patch_size=16, num_classes=10, dim=768, depth=12, heads=12, mlp_dim=3072)    print(model)        dummy_img = torch.randn(8, 3, 224, 224)  # Batch of 8 images, 3 channels, 224x224 size    preds = model(dummy_img)    print(preds.shape)  # Output: [8, 10] (Batch size, Number of classes)

以上就是Vision Transformers (ViTs):使用 Transformer 模型的计算机视觉的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1355715.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月13日 19:24:36
下一篇 2025年12月13日 19:24:51

相关推荐

  • Uniapp 中如何不拉伸不裁剪地展示图片?

    灵活展示图片:如何不拉伸不裁剪 在界面设计中,常常需要以原尺寸展示用户上传的图片。本文将介绍一种在 uniapp 框架中实现该功能的简单方法。 对于不同尺寸的图片,可以采用以下处理方式: 极端宽高比:撑满屏幕宽度或高度,再等比缩放居中。非极端宽高比:居中显示,若能撑满则撑满。 然而,如果需要不拉伸不…

    2025年12月24日
    400
  • 如何让小说网站控制台显示乱码,同时网页内容正常显示?

    如何在不影响用户界面的情况下实现控制台乱码? 当在小说网站上下载小说时,大家可能会遇到一个问题:网站上的文本在网页内正常显示,但是在控制台中却是乱码。如何实现此类操作,从而在不影响用户界面(UI)的情况下保持控制台乱码呢? 答案在于使用自定义字体。网站可以通过在服务器端配置自定义字体,并通过在客户端…

    2025年12月24日
    800
  • 如何在地图上轻松创建气泡信息框?

    地图上气泡信息框的巧妙生成 地图上气泡信息框是一种常用的交互功能,它简便易用,能够为用户提供额外信息。本文将探讨如何借助地图库的功能轻松创建这一功能。 利用地图库的原生功能 大多数地图库,如高德地图,都提供了现成的信息窗体和右键菜单功能。这些功能可以通过以下途径实现: 高德地图 JS API 参考文…

    2025年12月24日
    400
  • 如何使用 scroll-behavior 属性实现元素scrollLeft变化时的平滑动画?

    如何实现元素scrollleft变化时的平滑动画效果? 在许多网页应用中,滚动容器的水平滚动条(scrollleft)需要频繁使用。为了让滚动动作更加自然,你希望给scrollleft的变化添加动画效果。 解决方案:scroll-behavior 属性 要实现scrollleft变化时的平滑动画效果…

    2025年12月24日
    000
  • 如何为滚动元素添加平滑过渡,使滚动条滑动时更自然流畅?

    给滚动元素平滑过渡 如何在滚动条属性(scrollleft)发生改变时为元素添加平滑的过渡效果? 解决方案:scroll-behavior 属性 为滚动容器设置 scroll-behavior 属性可以实现平滑滚动。 html 代码: click the button to slide right!…

    2025年12月24日
    500
  • 如何选择元素个数不固定的指定类名子元素?

    灵活选择元素个数不固定的指定类名子元素 在网页布局中,有时需要选择特定类名的子元素,但这些元素的数量并不固定。例如,下面这段 html 代码中,activebar 和 item 元素的数量均不固定: *n *n 如果需要选择第一个 item元素,可以使用 css 选择器 :nth-child()。该…

    2025年12月24日
    200
  • 使用 SVG 如何实现自定义宽度、间距和半径的虚线边框?

    使用 svg 实现自定义虚线边框 如何实现一个具有自定义宽度、间距和半径的虚线边框是一个常见的前端开发问题。传统的解决方案通常涉及使用 border-image 引入切片图片,但是这种方法存在引入外部资源、性能低下的缺点。 为了避免上述问题,可以使用 svg(可缩放矢量图形)来创建纯代码实现。一种方…

    2025年12月24日
    100
  • 如何让“元素跟随文本高度,而不是撑高父容器?

    如何让 元素跟随文本高度,而不是撑高父容器 在页面布局中,经常遇到父容器高度被子元素撑开的问题。在图例所示的案例中,父容器被较高的图片撑开,而文本的高度没有被考虑。本问答将提供纯css解决方案,让图片跟随文本高度,确保父容器的高度不会被图片影响。 解决方法 为了解决这个问题,需要将图片从文档流中脱离…

    2025年12月24日
    000
  • 为什么 CSS mask 属性未请求指定图片?

    解决 css mask 属性未请求图片的问题 在使用 css mask 属性时,指定了图片地址,但网络面板显示未请求获取该图片,这可能是由于浏览器兼容性问题造成的。 问题 如下代码所示: 立即学习“前端免费学习笔记(深入)”; icon [data-icon=”cloud”] { –icon-cl…

    2025年12月24日
    200
  • 如何利用 CSS 选中激活标签并影响相邻元素的样式?

    如何利用 css 选中激活标签并影响相邻元素? 为了实现激活标签影响相邻元素的样式需求,可以通过 :has 选择器来实现。以下是如何具体操作: 对于激活标签相邻后的元素,可以在 css 中使用以下代码进行设置: li:has(+li.active) { border-radius: 0 0 10px…

    2025年12月24日
    100
  • 如何模拟Windows 10 设置界面中的鼠标悬浮放大效果?

    win10设置界面的鼠标移动显示周边的样式(探照灯效果)的实现方式 在windows设置界面的鼠标悬浮效果中,光标周围会显示一个放大区域。在前端开发中,可以通过多种方式实现类似的效果。 使用css 使用css的transform和box-shadow属性。通过将transform: scale(1.…

    2025年12月24日
    200
  • 为什么我的 Safari 自定义样式表在百度页面上失效了?

    为什么在 Safari 中自定义样式表未能正常工作? 在 Safari 的偏好设置中设置自定义样式表后,您对其进行测试却发现效果不同。在您自己的网页中,样式有效,而在百度页面中却失效。 造成这种情况的原因是,第一个访问的项目使用了文件协议,可以访问本地目录中的图片文件。而第二个访问的百度使用了 ht…

    2025年12月24日
    000
  • 如何用前端实现 Windows 10 设置界面的鼠标移动探照灯效果?

    如何在前端实现 Windows 10 设置界面中的鼠标移动探照灯效果 想要在前端开发中实现 Windows 10 设置界面中类似的鼠标移动探照灯效果,可以通过以下途径: CSS 解决方案 DEMO 1: Windows 10 网格悬停效果:https://codepen.io/tr4553r7/pe…

    2025年12月24日
    000
  • 使用CSS mask属性指定图片URL时,为什么浏览器无法加载图片?

    css mask属性未能加载图片的解决方法 使用css mask属性指定图片url时,如示例中所示: mask: url(“https://api.iconify.design/mdi:apple-icloud.svg”) center / contain no-repeat; 但是,在网络面板中却…

    2025年12月24日
    000
  • 如何用CSS Paint API为网页元素添加时尚的斑马线边框?

    为元素添加时尚的斑马线边框 在网页设计中,有时我们需要添加时尚的边框来提升元素的视觉效果。其中,斑马线边框是一种既醒目又别致的设计元素。 实现斜向斑马线边框 要实现斜向斑马线间隔圆环,我们可以使用css paint api。该api提供了强大的功能,可以让我们在元素上绘制复杂的图形。 立即学习“前端…

    2025年12月24日
    000
  • 图片如何不撑高父容器?

    如何让图片不撑高父容器? 当父容器包含不同高度的子元素时,父容器的高度通常会被最高元素撑开。如果你希望父容器的高度由文本内容撑开,避免图片对其产生影响,可以通过以下 css 解决方法: 绝对定位元素: .child-image { position: absolute; top: 0; left: …

    2025年12月24日
    000
  • 为什么自定义样式表在 Safari 中访问百度页面时无法生效?

    自定义样式表在 safari 中失效的原因 用户尝试在 safari 偏好设置中添加自定义样式表,代码如下: body { background-image: url(“/users/luxury/desktop/wallhaven-o5762l.png”) !important;} 测试后发现,在…

    2025年12月24日
    000
  • CSS 帮助

    我正在尝试将文本附加到棕色框的左侧。我不能。我不知道代码有什么问题。请帮助我。 css .hero { position: relative; bottom: 80px; display: flex; justify-content: left; align-items: start; color:…

    2025年12月24日 好文分享
    200
  • HTML、CSS 和 JavaScript 中的简单侧边栏菜单

    构建一个简单的侧边栏菜单是一个很好的主意,它可以为您的网站添加有价值的功能和令人惊叹的外观。 侧边栏菜单对于客户找到不同项目的方式很有用,而不会让他们觉得自己有太多选择,从而创造了简单性和秩序。 今天,我将分享一个简单的 HTML、CSS 和 JavaScript 源代码来创建一个简单的侧边栏菜单。…

    2025年12月24日
    200
  • 前端代码辅助工具:如何选择最可靠的AI工具?

    前端代码辅助工具:可靠性探讨 对于前端工程师来说,在HTML、CSS和JavaScript开发中借助AI工具是司空见惯的事情。然而,并非所有工具都能提供同等的可靠性。 个性化需求 关于哪个AI工具最可靠,这个问题没有一刀切的答案。每个人的使用习惯和项目需求各不相同。以下是一些影响选择的重要因素: 立…

    2025年12月24日
    300

发表回复

登录后才能评论
关注微信