本系列文章采用先总体框架后技术细节的方式展开。
原论文:An image is worth 16x16 words: Transformers for image recognition at scale.
Github:google-research/vision_transformer
一、ViT 架构
总体上可以简单理解为:ViT是将Transformer架构引入到计算机视觉中。
Transformer最先在NLP领域提出,它处理序列数据有优势对于标准的Transformer模块,输入是token序列,一般是[num_token, token_dim]
。因此ViT的核心思想如下图 Vision Transformer(ViT)的架构图所示,它是通过将图像分割成一系列小块(patches)并视为序列化的token输入到Transformer编码器中,实现对图像特征的提取。
ViT工作流程:
- 将图像分割成固定大小的图像块(patches)
- 通过 Linear Projection of Flattened Patches 将每一个 patches 转换成Patch Embedding,然后添加位置编码,得到 Patch + Position Embedding。(每个图像块现在就像一个"单词",而整个图像被看作由这些"单词"组成的一句话。)
- 嵌入(Patch + Position Embedding)输入到Transformer编码器处理,输出每个图像块的更新特征表示,它不仅包含了图像块自身的特征,还包含了图像块之间的关联信息。
二、技术细节
让我们以ViT-B/32
模型为例,介绍在ViT模型中的数据流。
(注:B
是Base的缩写,作者根据设置参数大小训练了Base、Large、Huge等多种模型,32
是图像会被分割成多32×32
的图像块。如果是16
,就是分成16×16
)
1. 输入图像
假设输入的图像大小为224×224
像素。这个图像会被分割成多个固定大小的图像块。
在ViT-B/32
中,图像被分成32×32
的图像块(patch)。
对于一个224×224
的图像,可以被划分为(224 ÷ 32) × (224 ÷ 32) = 7 × 7
个图像块,也就是49
个图像块。
2. 图像块(Patches)展开和线性投影
- 每个图像块大小是
32×32
,展平后是32×32×3 = 3072
维的向量(假设输入图像是RGB格式)。此时向量的形状为49×3072
。 - 通过线性投影,每个3072维的向量被映射到768维的特征向量。最终得到的是
49×768
的向量。
(注:如果是ViT-B/16
,展平后是16×16×3 = 768
,也许很多人和我一样,有这样的疑惑,为什么ViT-B/32
和ViT-B/16
都是映射到7