[模型学习与对比]DETR和ViT

文章介绍了VisionTransformer(ViT)和DETR两种基于Transformer的深度学习模型。ViT将图像转换为序列数据用于分类任务,而DETR则利用Transformer进行端到端的目标检测,避免了传统目标检测中的后处理步骤。两者都涉及将图像序列化,但处理方式和应用场景有所不同,DETR的核心在于Decoder的学习过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一周本来想写ViT的原理来着,后来发现这东西和DETR好像没啥区别,就是特征提取方式和后处理的方式不大一样,中间都是原方不动套的TRM,于是就改成同时记录一下二者的原理、区别和联系。

由于我发现如果不结合代码,即便写完了记录,第二天睡醒后也忘的特干净,所以我决定把代码解读也写了,下一篇发。

  1. Vision Transformer(分类任务)

1.1 我们知道,TRM的输入是一些序列,在提出的伊始倍用来处理NLP任务(如翻译)。

图1 使用TRM处理翻译任务时的输入

那么很显然,若想要使用TRM处理图像数据,一个非常朴素的思想就是把图像展开,将图像数据转换为序列数据(序列数据可以是图片的像素对应值,然后将这个转换为输入token),也就如下图所示:

图2 将图片数据转换为序列数据

但此种处理方式会面临随着图像增大,模型计算时的复杂度呈平方级增长的问题。遇到这种问题,可以采用:1. 采用局部注意力机制,也即图2中,2只和7,39做交叉注意力,13只和27,11做交叉注意力;2. 改进attention公式,采用稀疏注意力机制;3. 等等各种方法。。。

1.2 在此之上,我们还可以考虑将图像中的间隔像素点和其邻域的其他像素点整合在一起,为一个token,再进行输入和后续操作,如下图所示。

图3 图像化整为零

1.3 在有了这个操作后,由于后续处理的流程几乎不变,基本上就是输入Transformer然后得到输出,下面,我们可以看一下ViT的流程图:

图4 ViT整体流程1

  1. 将图片切分为一个个的16×16的patch

  1. 这个部分是用来获取每一个patch的Embedding,这里包含两个小步骤:

  1. 将16×16的patch展平;

  1. 将得到的256长度的向量,映射为Transformer所需要的长度;

NB:很明显,这里可以通过线性层进行映射,也可以通过设置卷积核的方式直接得出Embedding

  1. 位置编码与第二部中获得的Embedding相加

  1. e. 也就是直接向TRM encoder的输入与输出,将得到的多个维数为768的向量的第一个作为分类输入,使用常规的多分类方法进行分类。

图5 ViT整体流程2

  1. DETR(目标检测)

2.1 DETR是一种端到端的目标检测手段,可在不使用比如anchor这些传统手艺的前提下直接生成检测框。对于我们提到的这些传统手艺,其主要依靠于人工经验与数据集特征来针对性设置,不具有普适性。

并且这些东西涉及到非常多的后处理操作,具体表现在于这些手段有很大几率会在同一个物体上生成一大堆冗余的框,这时候需要使用NMS等后处理操作,消除那些框。

2.2 DETR的基本思路在于,首先在训练的过程中,无论如何,直接通过TRM并行地生成N个预测框(论文中N=100),然后通过匈牙利算法去匹配预测框和Ground Truth的k个框,选出最贴近的k个预测框,选出来后,用这k个预测框再和ground truth的k个框计算Loss,从而进行模型更新。

图6 DETR模型匹配思路

2.3 DETR步骤与TRM在其中的作用

图7 DETR整体步骤1

图8 DETR过程示意

我们这里结合一个实例来理解一下。

  1. 特征提取

  1. 输入一个3通道,大小为800×1066的图像,然后通过一个CNN的backbone提取特征,其输出的size是2048×25×34。这里的25和34分别是之前800和1066的1/32,2048是输出的通道数;

  1. 然后再把这个向量通过一个Linear层,将其通道数映射为256,那么它的size也就变成256×25×34;

  1. 在此基础上,把这个向量和位置编码相加,位置编码的size也是256×25×34;

  1. 与位置编码相加后,把这个256×25×34的向量拉直,得到850×256的向量,在这里,256是Embedding的size。

  1. 将上一步得到的向量经过TRM encoder,在这个过程中,Encoder学习图像全局信息,图像中每一个由CNN提取的特征都会与其他特征做交互,从总体上知道物体的大致位置,保证一个物体只出一个框。

可以把Encoder理解成一个提取各种特征,然后等待Decoder来选秀的过程

图9 Encoder提取特征示意

  1. Decoder的输入是100个可学习的,size为256的Embedding,在这里充当TRM中query向量的角色,和Encoder中得到的特征不断地做Cross Attention,最终得到100个预测Embedding。

这里要着重说明一下,DETR的核心是Decoder,Decoder的核心是这100个输入的可学习向量,Decoer训练的过程可以理解成就是训练这100个query向量的过程。

非常有意思的一点在于,在作者的源码中,这100个可学习query向量都被初始化为0,然后加上位置编码作为输入,在此基础上对这100个向量进行学习。

另一个值得注意的点是,论文中提到的Decoder部分是M层的,但事实上,这M层的decoder只有一部分被重复了M次(图10红框部分);

图10 DETR与Decoder结构示意

  1. 出框最后的一步也是最常规的一步,通过添加FFN检测头来进行预测,这里是做两个预测,一个是物体出框预测(四个值,中心点坐标x, y, 以及框的width, height),一个是物体类别预测

  1. 在得到预测后,这100个预测框会和Ground Truth框一起通过匈牙利算法进行匹配,也就是2.2中和图7中所讲的内容;

  1. DETR与ViT对比

总体上我认为,DETR和ViT非常类似,都是针对于图像的任务,一个是图像分类,一个是目标检测二者区别主要在于将图像序列化的方式不同(当然,毕竟这二者是不同任务,后处理部分也肯定是不一样的,但是可以看到的是,后处理部分使用的都是很常规的分类或检测手段,因此这里不纳入本文的考虑)。

在这里要感谢以下的up:

  1. https://www.bilibili.com/video/BV1GB4y1X72R/?share_source=copy_web&vd_source=54a003f2fe57290ef9f347426cdb53c9

  1. https://www.bilibili.com/video/BV1Uu411o7oY/?share_source=copy_web&vd_source=54a003f2fe57290ef9f347426cdb53c9

  1. "未来"的经典之作ViT:transformer is all you need! - 小小将的文章 - 知乎https://zhuanlan.zhihu.com/p/356155277

  1. https://www.bilibili.com/video/BV1ZT411D7xK/?p=2&share_source=copy_web&vd_source=54a003f2fe57290ef9f347426cdb53c9

<think>好的,我现在要帮用户了解ViT模型的概念、原理应用。首先,我需要整理用户提供的引用内容,看看有哪些信息可以利用。 用户给的引用1到4都是关于ViT的,其中引用24提到了ViT的核心思想是将图像分成块,用Transformer处理。引用3详细描述了ViT的架构步骤,比如分块、线性嵌入、位置编码等。引用4还提到了CNN的对比,说明ViT的优势在于全局特征捕捉。 用户的问题是要了解ViT的介绍、原理应用。所以我的回答需要覆盖这三个方面。首先,介绍部分需要简明扼要,说明ViT是什么,传统CNN的不同。然后原理部分要分步骤讲解处理流程,可能包括分块、嵌入、位置编码、Transformer编码器等。应用部分需要举几个实际例子,比如分类、检测、跨模态任务等。 需要注意的是用户提到的系统级指令,比如数学公式要用$...$,独立公式用$$...$$,并且用中文回答。同时要生成相关问题。引用部分要在末尾添加标识,比如[^2]。 检查是否有遗漏的点,比如ViT的数学原理可能需要提到自注意力机制,但用户提供的引用中没有详细数学公式,可能需要根据已有的知识补充。例如,自注意力的公式可以写成:$Attention(Q, K, V) = softmax(\frac{QK^T}{\sqrt{d_k}})V$,但需要确认是否正确应用了格式。 另外,用户给的示例中的代码块,可能需要在ViT的代码实现部分添加一个简单的示例,比如Patch Embedding的实现,但引用3提到可以使用卷积操作,这点可以提及。 应用场景方面,引用1提到了分类、检测、分割跨模态任务,可以展开说明每个任务中ViT的应用方式。 最后生成的相关问题要围绕ViT的可能疑问,比如CNN的对比、位置编码的作用、训练数据需求等。 现在组织内容结构: 1. 模型介绍:定义、核心思想、CNN对比。 2. 核心原理:分步骤详细说明,包括图像分块、嵌入、位置编码、Transformer处理、分类头。 3. 数学原理:自注意力机制、位置编码的数学表达。 4. 应用场景:分类、检测分割、跨模态。 5. 代码示例:简单的Patch Embedding或Transformer层代码。 6. 相关问题:列举几个相关问题。 需要确保每个部分都引用正确的来源,比如分块处理来自引用24,架构步骤来自引用3,应用场景来自引用14。 可能遇到的问题:用户提供的引用中没有详细数学公式,需要自己补充,但要确保正确性。同时,注意用中文解释这些公式,保持清晰。 现在开始撰写回答,确保结构清晰,符合用户的要求。</think>### Vision Transformer (ViT) 模型详解 #### 一、模型概念核心原理 Vision Transformer(ViT)是一种基于Transformer架构的图像处理模型,**将图像拆分为小块序列并通过自注意力机制捕获全局特征**[^2]。传统卷积神经网络(CNN)相比,ViT的优势在于: 1. **全局特征捕捉**:通过Transformer的自注意力机制直接建模图像块间的全局关系[^4]; 2. **去卷积化**:无需逐层提取局部特征,简化了模型结构[^2]。 #### 二、核心架构工作原理 ViT的处理流程可分为以下步骤: 1. **图像分块** 输入图像被划分为固定大小的$N \times N$块(例如$16 \times 16$)。若图像尺寸为$H \times W$,则总块数为$\frac{H}{N} \times \frac{W}{N}$[^3]。 2. **块嵌入线性投影** 每个图像块展平为向量后,通过线性变换映射到$D$维空间: $$ z_0 = [x_{class}; x_1E; x_2E; \cdots; x_nE] + E_{pos} $$ 其中$E$为嵌入矩阵,$E_{pos}$为位置编码[^4]。 3. **Transformer编码器** 包含多头自注意力(MSA)前馈网络(FFN)模块: $$ z'_l = MSA(LN(z_{l-1})) + z_{l-1} \\ z_l = FFN(LN(z'_l)) + z'_l $$ $LN$表示层归一化,重复堆叠$L$次(如12层)[^3]。 4. **分类预测** 最终提取首个类别标记(Class Token)的特征,通过MLP头输出类别概率[^4]。 #### 三、数学原理详解 1. **自注意力机制** 核心公式为: $$ Attention(Q,K,V) = softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V $$ 其中$Q,K,V$分别由输入序列线性变换得到,$d_k$为维度缩放因子[^2]。 2. **位置编码** 采用可学习的1D位置编码,确保模型感知块的空间位置: $$ E_{pos} = [e_1; e_2; \cdots; e_n] \in \mathbb{R}^{(n+1)\times D} $$ #### 四、应用场景 1. **图像分类** 在ImageNet数据集上达到CNN相当甚至更优的准确率[^3]。 2. **目标检测分割** 如DETR模型ViTTransformer解码器结合,实现端到端检测[^1]。 3. **跨模态任务** 结合文本-图像对数据,用于CLIP等图文联合建模场景[^1]。 #### 五、代码示例(Patch Embedding实现) ```python import torch import torch.nn as nn class PatchEmbedding(nn.Module): def __init__(self, img_size=224, patch_size=16, in_chans=3, embed_dim=768): super().__init__() self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size) def forward(self, x): x = self.proj(x) # 输出形状: (B, D, H/p, W/p) x = x.flatten(2).transpose(1, 2) # 转换为(B, num_patches, D) return x ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Amigo_5610

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值