【图像分块、图像分辨率固定要求、位置编码】

多数视觉编码器(如ViT)采用固定分辨率训练范式,限制了对任意图像分辨率的处理。主要原因在于分块和位置编码的限制。

图像是2维的,CNN可以直接用于处理2维信息。但是如果用注意力机制处理图像,如果将2维图像中的每个点视为一个token,则计算量太大。比如一个224*224的图像,则需要224*224*dim的矩阵来表示这张图。因此出现分块操作,分块将一张图像的一部分像素表示成一个token。这样只需要(224/patch)*(224/patch)*dim来表示一张图像。但是这样需要人为设定分块大小,而且由于位置编码的存在会使得图像编码器要求图像分辨率固定。


1. 分块策略的底层约束

  • Vision Transformers (ViTs) 的核心操作是将图像划分为固定尺寸的块(如16×16像素)。每个块被展平为向量后,需叠加可学习的位置编码(positional encoding)以保留空间信息。
  • 训练阶段:模型的位置编码参数矩阵维度为 N t r a i n × d N_{train} \times d Ntrain×d N t r a i n N_{train} Ntrain是训练时块数量, d d d是嵌入维度)。例如,若训练分辨率为224×224,块尺寸16×16,则块数 N t r a i n = 14 × 14 = 196 N_{train}=14×14=196 Ntrain=14×14=196,位置编码矩阵固定为196行。
  • 推理阶段:若输入图像分辨率不同于训练值(如448×448),块数将变为 N t e s t = 28 × 28 = 784 N_{test}=28×28=784 Ntest=28×28=784。此时模型需处理4倍于训练时的位置编码索引,但原始位置编码矩阵仅有196行,导致索引越界。

2. 现有解决方案

  • 图像缩放(Resizing):将任意分辨率图像缩放至固定尺寸(如224×224),虽能直接适配模型,但会导致高频细节丢失(如文字模糊、小物体失真)。这在医学影像、遥感等精细化任务中尤为致命。

  • 位置编码插值(Interpolation):通过双线性插值将训练好的位置编码扩展到新分辨率(如将196个编码插值到784个)。但插值后的编码未在训练中见过,可能破坏空间关系的建模,使模型性能显著下降(典型实验显示分类准确率下降3-5%)。

  • 相对位置编码(Dynamic Positional Encoding):采用相对位置编码或可学习插值机制。这类方法虽能缓解问题,但需重新设计模型架构,且增加训练复杂度(如DeiT-III需额外20%训练时间)。

  • 连续位置编码:Meta的FLOATER提出可微分连续位置编码函数,通过神经网络动态生成任意长度的位置编码。在ImageNet-1k上,FLOATER在512×512分辨率微调后top-1准确率达85.2%,逼近原生训练模型(85.4%)。

  • 混合分辨率训练:Google的FlexiViT在训练时随机采样块尺寸(12×12到20×20),使模型隐式学习尺度不变性。在COCO目标检测任务中,FlexiViT在640×640输入下mAP达54.1,超越固定块尺寸ViT的53.7。

  • 位置编码解耦:如VoRA利用LLM的序列建模能力,将图像视为变长token序列,通过双向注意力隐式建模空间关系,完全摒弃显式位置编码。实验显示其在384×384分辨率下相比ViT节省23%内存。


3. 分块处理的隐藏代价

  • 边缘效应(Edge Effects):当图像分辨率非块尺寸整数倍时,需进行填充(padding)或裁剪,导致边界信息损失。例如,处理512×512图像时若块尺寸为16×16,需填充至512×512(浪费0%像素)或裁剪至496×496(丢失3%边缘内容)。
  • 计算效率损失:以Swin Transformer为例,其层级下采样设计依赖严格的窗口划分。输入分辨率变化时,需动态调整窗口大小,导致GPU并行计算效率下降(实测吞吐量降低15-30%)。

位置编码插值(Positional Encoding Interpolation)

核心思想

在推理阶段,对预训练的位置编码矩阵进行数学插值,使其适配输入图像的分辨率变化。

实现步骤
  1. 训练阶段:以固定分辨率(如224×224)训练ViT,生成位置编码矩阵 P t r a i n ∈ R N t r a i n × d P_{train} \in \mathbb{R}^{N_{train} \times d} PtrainRNtrain×d,其中 N t r a i n = ( 224 / 16 ) 2 = 196 N_{train}= (224/16)^2=196 Ntrain=(224/16)2=196(块数), d d d为嵌入维度。
  2. 推理阶段
    • 输入图像分辨率变为 H × W H \times W H×W,分块后块数 N t e s t = ( H / p ) × ( W / p ) N_{test}=(H/p) \times (W/p) Ntest=(H/p)×(W/p),其中 p p p为块尺寸(如16)。
    • N t e s t > N t r a i n N_{test} > N_{train} Ntest>Ntrain,需将 P t r a i n P_{train} Ptrain 插值扩展至 P t e s t ∈ R N t e s t × d P_{test} \in \mathbb{R}^{N_{test} \times d} PtestRNtest×d
    • 插值方法
      • 双线性插值:将原始位置编码视为2D网格(如14×14),上采样到目标分辨率(如28×28)。
      • 傅里叶域插值:对位置编码进行傅里叶变换,在频域填充高频分量后逆变换回空间域。

动态位置编码(Dynamic Positional Encoding)

核心思想

设计位置编码生成机制,使其能够动态适应任意输入分辨率,无需依赖固定插值。

主要变体

2.1 相对位置编码(Relative Positional Encoding)

  • 原理:编码块之间的相对距离而非绝对位置。
    • 对于块 i i i j j j,位置编码 P i , j = f ( ∣ x i − x j ∣ , ∣ y i − y j ∣ ) P_{i,j}=f(|x_i-x_j|, |y_i-y_j|) Pi,j=f(xixj,yiyj),其中 f f f 为可学习函数。
  • 代表工作
    • Swin Transformer:采用可学习的相对位置偏置矩阵,窗口内计算局部相对位置。
    • Offset Encoding:为每个注意力头添加可学习的偏移量参数。

2.2 连续位置编码(Continuous Positional Encoding)

  • 原理:使用神经网络生成任意长度的位置编码。
    • 输入归一化后的坐标 ( x , y ) ∈ [ 0 , 1 ] 2 (x,y) \in [0,1]^2 (x,y)[0,1]2,输出对应位置编码 P ( x , y ) = M L P ( x , y ) P(x,y)=MLP(x,y) P(x,y)=MLP(x,y)
  • 代表工作
    • FLOATER(Meta, 2023):用隐式神经表示(INR)建模位置编码函数,支持任意分辨率。
    • DynamicViT(Google, 2022):轻量级CNN预测位置编码权重。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值