Note

VLM 如何处理高分辨率图像?

整理图像切块、动态分辨率等思路及视觉细节与计算量之间的权衡。

在 VLM 的应用中,如何处理高分辨率的输入图像?这会带来哪些计算和模型设计上的挑战?

处理高分辨率图像是当前VLM领域的一个重要挑战,因为标准的视觉编码器(如ViT)通常被设计用于处理低分辨率的固定尺寸输入(例如224x224或336x336)。

带来的挑战:

  1. 计算量爆炸: Vision Transformer (ViT) 将图像分割成固定大小的图块(Patches)。输入图像的分辨率如果从224x224增加到448x448,边长变为2倍,图块数量会变为4倍。而自注意力机制的计算复杂度与输入序列长度(即图块数量)的平方成正比,这意味着计算量会变为原来的16倍,这是不可接受的。
  2. 位置编码失效: 预训练好的ViT的位置编码是针对特定数量的图块进行学习或设计的。输入更高分辨率的图像会导致图块数量增加,超出现有的位置编码范围,导致模型无法理解图块的相对位置。
  3. 显存占用剧增: 更多的图块意味着更长的序列,在Transformer的每一层都需要存储巨大的激活值,导致显存占用急剧增加。

处理方法:

目前主要有以下几种策略来处理高分辨率图像:

  1. 切片-编码-拼接(Slicing-based approach):

    • 方法: 将高分辨率图像切割成多个重叠或不重叠的低分辨率子图(例如,切成4个或6个224x224的图块)。将每个子图独立地送入标准的视觉编码器提取特征,最后将所有子图的特征拼接或融合起来,作为LLM的视觉输入。
    • 代表模型: LLaVA-1.5 的部分实现思路。
    • 优点: 简单有效,可以直接利用预训练好的低分辨率模型。
    • 缺点: 破坏了图像的全局结构,模型难以理解跨越不同切片的物体。
  2. 可变分辨率图块(Variable-size Patches):

    • 方法: 保持图块数量不变,但根据输入分辨率动态调整每个图块的大小。例如,对于高分辨率图像,使用更大的图块尺寸。
    • 优点: 保持了固定的序列长度,避免了计算量爆炸。
    • 缺点: 大图块会丢失局部细节信息,需要对模型进行相应的预训练或微调。
  3. 多尺度特征融合(Multi-scale Feature Fusion):

    • 方法: 设计一个可以处理高分辨率图像的视觉编码器(如Swin Transformer),并从其不同层级提取多尺度的特征图。然后通过一个特征金字塔网络(FPN)或类似结构将这些特征融合,再送入一个适配器模块(Adapter)转换成固定长度的序列给LLM。
    • 代表模型: Fuyu-8B, Monkey。
    • 优点: 能够在保留细节的同时兼顾全局信息。
    • 缺点: 需要更复杂的视觉主干网络和适配器设计。