12. 多模态模型的图像分辨率处理策略有哪些?Dynamic Resolution 是怎么做的?

整理多模态模型的图像分辨率处理策略,以及 Dynamic Resolution 的实现方式。

简单回答

图像分辨率处理是 VLM 工程中最影响实际效果的细节之一。固定分辨率(如统一 resize 到 224×224)实现简单但损失细节,特别是文档、图表等需要高清输入的场景效果极差。Dynamic Resolution(动态分辨率)的核心思路是:根据原图的宽高比和内容,把图片切成多个固定大小的 tile,每个 tile 分别编码,让模型能"看到"更多细节,同时适配不同尺寸的输入。InternVL、Qwen-VL、LLaVA-HD 等主流模型都采用了类似策略。

详细解答

固定分辨率的根本问题

早期 VLM(LLaVA 1.0)把所有输入图片统一 resize 到编码器接受的固定尺寸(通常 224×224)。这有两个问题:

信息损失:一张 1920×1080 的截图 resize 到 224×224,像素数缩小了 375 倍,其中的小字、图表数值、细节纹理基本消失不见。对于文档 OCR、图表理解、GUI 理解这类任务,固定低分辨率几乎让任务无法完成。

宽高比变形:不同图片有不同的宽高比,强制 resize 到正方形会导致图像内容变形,影响模型对物体形状的判断。

高分辨率策略 1:直接提升编码器分辨率

最简单的升级是使用更高分辨率的编码器(如 SigLIP 的 384 版本),或者在训练时用插值扩展位置编码支持更大的输入。代价是 Vision Transformer 的计算量和分辨率的平方成正比——分辨率从 224 升到 448,token 数量从 196 变成 784,计算量增加 4 倍,而 token 数增加也会显著增加输入 LLM 的 visual token 数,影响推理速度。

高分辨率策略 2:Tile 切分(Dynamic Resolution 的主流实现)

Dynamic Resolution 的核心思路是:不把整张图缩小到编码器尺寸,而是把图片切分成若干个"tile",每个 tile 分别过一遍编码器,再把所有 tile 的特征拼起来送给 LLM。

标准流程

第一步,根据原图尺寸和宽高比,确定最优的 tile 划分方案。比如原图是 1280×720,tile 大小是 448×448,则可以切成 2×1(宽方向 2 份,高方向 1 份)= 2 个 tile,加上一个缩略图(全图缩放到 448×448),共 3 个 tile。

第二步,每个 tile 独立通过 Vision Encoder 编码,得到若干 visual token。

第三步,所有 tile 的 visual token 按顺序拼接,加上空间位置标记(表明这个 tile 来自图片的哪个位置),送进 LLM。

动态体现在:tile 数量和划分方式不是固定的,而是根据每张图片的实际尺寸动态计算最合适的划分策略,避免对所有图片使用同一种处理方式。

InternVL 2.0 的 dynamic tile 策略支持 1~12 个 tile,以 448×448 的 InternViT 编码器为基准,每个 tile 产生 256 个 visual token,一张 12-tile 的图片最终有 256×12 = 3072 个 visual token 送进 LLM。这是处理高分辨率文档的关键设计。

Qwen-VL 用的是 NaViT(Native Resolution ViT)思路,训练时直接支持可变分辨率输入,不需要固定 tile 大小,灵活性更高,但实现复杂度也更大。

高分辨率策略 3:Any Resolution(AnyRes)

LLaVA-HD 和 LLaVA-NeXT 提出了 AnyRes 策略,比标准 Dynamic Tile 更灵活:

  • 预定义一组支持的分辨率网格(比如 {336×672, 672×336, 672×672, 1008×336, 336×1008})
  • 对于每张输入图片,选择最匹配其宽高比、同时 resize 变形最小的网格
  • 按网格切分成若干 tile,每个 tile 过编码器,拼接结果

AnyRes 的优势是对各种宽高比的图片都能高效处理,不浪费不必要的 tile(避免大量 padding 导致的计算浪费)。

Visual Token 压缩

Dynamic Resolution 的代价是 visual token 数量大幅增加,会拖慢 LLM 的推理速度。常见的 token 压缩方案包括:

Pixel Shuffle(像素重排):把相邻 2×2 的 spatial tokens 合并成一个 token(每个 token 的维度扩大 4 倍),token 数量变为原来的 1/4,轻量高效,InternVL 2.0 用了这个方法。

Average Pooling:对 spatial dimension 做平均池化,减少 token 数量,方法简单,但可能损失局部细节。

Resampler / Q-Former:用可学习的 query token 来聚合 visual token,压缩比更大,但需要额外的 Projector 参数和训练。

面试时可以这样答

固定分辨率把所有图片统一 resize 到 224×224 这类固定尺寸,文档、图表这种高细节图片基本无法正确处理,信息损失太大。Dynamic Resolution 的核心思路是把图片切成若干固定尺寸的 tile,每个 tile 分别过编码器,再拼起来送给 LLM,让模型能看到更多细节。

InternVL 用的是动态 tile 数(1~12 个),每个 tile 448×448 分辨率,根据原图尺寸和宽高比动态决定怎么切。12 个 tile 会产生 3000 多个 visual token,处理文档效果很好,但推理也更慢。

代价是 token 数量大幅增加,所以通常配合 token 压缩——比如 Pixel Shuffle 把相邻 4 个 spatial token 合成 1 个,token 数降到原来 1/4,推理速度恢复可接受范围。实际项目里高分辨率的 tile 数和 token 压缩比是个重要的效果/速度 trade-off,要根据任务类型和延迟预算来调。

常见追问

  1. Tile 切分时,tile 之间的边界处的信息会不会因为被切断而丢失?有没有 overlap 策略?
  2. visual token 数量对 LLM 推理延迟的影响有多大?怎么估算?
  3. 如果图片本身是超长的竖版图(比如手机截图),Dynamic Tile 策略怎么处理最合适?