Note
VLM 如何处理高分辨率图像?
整理图像切块、动态分辨率等思路及视觉细节与计算量之间的权衡。
在 VLM 的应用中,如何处理高分辨率的输入图像?这会带来哪些计算和模型设计上的挑战?
处理高分辨率图像是当前VLM领域的一个重要挑战,因为标准的视觉编码器(如ViT)通常被设计用于处理低分辨率的固定尺寸输入(例如224x224或336x336)。
带来的挑战:
- 计算量爆炸: Vision Transformer (ViT) 将图像分割成固定大小的图块(Patches)。输入图像的分辨率如果从224x224增加到448x448,边长变为2倍,图块数量会变为4倍。而自注意力机制的计算复杂度与输入序列长度(即图块数量)的平方成正比,这意味着计算量会变为原来的16倍,这是不可接受的。
- 位置编码失效: 预训练好的ViT的位置编码是针对特定数量的图块进行学习或设计的。输入更高分辨率的图像会导致图块数量增加,超出现有的位置编码范围,导致模型无法理解图块的相对位置。
- 显存占用剧增: 更多的图块意味着更长的序列,在Transformer的每一层都需要存储巨大的激活值,导致显存占用急剧增加。
处理方法:
目前主要有以下几种策略来处理高分辨率图像:
-
切片-编码-拼接(Slicing-based approach):
- 方法: 将高分辨率图像切割成多个重叠或不重叠的低分辨率子图(例如,切成4个或6个224x224的图块)。将每个子图独立地送入标准的视觉编码器提取特征,最后将所有子图的特征拼接或融合起来,作为LLM的视觉输入。
- 代表模型: LLaVA-1.5 的部分实现思路。
- 优点: 简单有效,可以直接利用预训练好的低分辨率模型。
- 缺点: 破坏了图像的全局结构,模型难以理解跨越不同切片的物体。
-
可变分辨率图块(Variable-size Patches):
- 方法: 保持图块数量不变,但根据输入分辨率动态调整每个图块的大小。例如,对于高分辨率图像,使用更大的图块尺寸。
- 优点: 保持了固定的序列长度,避免了计算量爆炸。
- 缺点: 大图块会丢失局部细节信息,需要对模型进行相应的预训练或微调。
-
多尺度特征融合(Multi-scale Feature Fusion):
- 方法: 设计一个可以处理高分辨率图像的视觉编码器(如Swin Transformer),并从其不同层级提取多尺度的特征图。然后通过一个特征金字塔网络(FPN)或类似结构将这些特征融合,再送入一个适配器模块(Adapter)转换成固定长度的序列给LLM。
- 代表模型: Fuyu-8B, Monkey。
- 优点: 能够在保留细节的同时兼顾全局信息。
- 缺点: 需要更复杂的视觉主干网络和适配器设计。