在多模态大语言模型(MLLM)早期探索中,视觉编码器普遍继承了经典视觉自监督(如 CLIP ViT)的设计范式——强制将所有输入图像裁剪或拉伸至固定的正方形分辨率(例如 $224 \times 224$ 或 $336 \times 336$)。然而,在面对真实的工业级视觉文档、高分辨率网页截屏、超宽幅财务报表以及极端长宽比(如 $1:5$ 或 $16:1$)的条形全景图时,这种粗暴的正方形假定带来了灾难性的信息损毁。
强行将非正方形图像等比例压缩为正方形,会引发几何各向异性畸变,导致密集字符被挤压变形而不可读;而若采用补零填充(Zero-Padding),又会将过半的计算与显存开销浪费在纯黑的无效像素上。为了彻底打破这一枷锁,AnyRes(Any Resolution)动态分块机制应运而生。通过在几何空间上动态求解最优网格切分,并结合二维空间拓扑坐标注入,AnyRes 实现了高保真、零畸变、全长宽比自适应的跨模态输入对齐。
固定分辨率的几何原罪与信息坍缩
在标准 ViT 处理流程中,图像被划分为 $14 \times 14$ 或 $16 \times 16$ 像素的固定大小 Patch。设输入分辨率为 $H \times W$,Patch 边长为 $P$,则生成的视觉 Token 总数为:
$$N_{\text{tokens}} = \frac{H}{P} \times \frac{W}{P}$$
当一张原本分辨率为 $1920 \times 480$(长宽比 $4:1$)的复杂表格被强行缩放至 $336 \times 336$ 时:
- 各向异性畸变(Anisotropic Distortion):水平方向被压缩了 $5.7$ 倍,而垂直方向仅压缩了 $1.4$ 倍。原本正方形的字符被挤压成长条状,字符笔画高度重叠,卷积或注意力层无法提取稳定的边缘特征。
- 高频 Nyquist 采样失真:密集文档中的英文单词或汉字字号通常只有数十个像素。一旦整体缩小,高频细节直接越过采样下限,在特征图中彻底湮灭为不可逆的模糊噪点。
原始长图 (1920x480, 4:1) ──► 强行挤压至 (336x336) ──► 字符挤压变形、高频信息归零 │ ▼ (AnyRes 动态网格方案) 自适应拆解为 4 个连续局部块 [Block 1][Block 2][Block 3][Block 4] (每个 336x336 原生提取) + 全局缩略图 (336x336 Overview) 提供全局宏观视野AnyRes 动态网格求解机制
AnyRes 的核心设计哲学是:永远不强行改变局部的原始物理比例,而是将整幅大图自适应地铺展在动态离散网格上。
1. 预设网格拓扑候选集(Grid Candidates)
系统预先定义一个受硬件计算预算约束的合法网格拓扑集合 $\mathcal{G}$。设单图允许的最大局部块数为 $N_{\max}$(通常在现代架构中设为 4 或 6):
$$\mathcal{G} = {(m, n) \in \mathbb{N}^+ \times \mathbb{N}^+ \mid m \times n \le N_{\max}}$$
例如当 $N_{\max} = 4$ 时,合法候选集包含:${(1, 1), (1, 2), (2, 1), (1, 3), (3, 1), (1, 4), (4, 1), (2, 2)}$。
2. 最优宽高比与尺度失真最小化
给定输入图像的原始物理尺寸 $(W, H)$,定义其原始长宽比为 $R = \frac{W}{H}$。为了找到最贴合当前图像的网格 $(m^, n^)$,算法在候选集中联合优化长宽比偏差与像素缩放惩罚:
$$(m^, n^) = \arg\min_{(m, n) \in \mathcal{G}} \left( \left| \ln\left(\frac{m}{n}\right) - \ln\left(\frac{W}{H}\right) \right| + \lambda \cdot \left| \frac{W \cdot H}{m \cdot n \cdot S^2} - 1.0 \right| \right)$$
其中 $S$ 为基础 ViT 的原生输入边长(如 336 像素)。这一对数优化目标确保了所选网格在最大程度逼近原始长宽比的同时,尽量保证局部块的有效利用率,杜绝不必要的插值模糊。
3. 双流特征聚合(Dual-stream Fusion)
选定最优网格 $(m^, n^)$ 后,图像处理分为两条并行的特征流:
- 局部微观流(High-res Patch Stream):将图像等比例缩放至 $(m^* \cdot S, n^* \cdot S)$,无缝切分为 $m^* \times n^*$ 个大小严格为 $S \times S$ 的子图像,分别送入 ViT 提取高分辨率局部特征。
- 全局宏观流(Overview Thumbnail Stream):无论原图长宽比如何,将整张图像通过双三次插值直接生成一张 $S \times S$ 的全局缩略图,同样送入 ViT 提取全局上下文。
全局流为模型提供了整幅画面的宏观布局与视线导引,而局部流则为模型提供了清晰可辨的微观像素证据。
空间坐标与换行分隔符注入
局部图像块被 ViT 独立编码为 Token 序列后,如果直接展平拼接并送入自回归语言模型,模型将面临严重的空间拓扑感知断裂。因为一维序列无法直接表达二维平面上的垂直邻接关系。
为了恢复图像的二维几何图景,现代 AnyRes 架构引入了两项空间显式锚定机制:
1. 结构化换行符 Token(<newline_token>)
在由 $m^$ 行、$n^$ 列构成的局部块网格中,当第 $i$ 行的所有切块 Token 序列发射完毕后,显式插入一个特殊的跨模态换行符:
$$\text{Sequence} = \dots [\text{Block}{i, n^*} \text{ Tokens}] \longrightarrow [\text{Token}{\text{newline}}] \longrightarrow [\text{Block}_{i+1, 1} \text{ Tokens}] \dots$$
这从序列语法上严格对齐了语言模型对“段落/行”的自回归注意力偏置,使模型能够建立从上至下的扫视习惯。
2. 二维相对网格偏置注入
将每个局部块在全局网格中的归一化坐标 $(u, v) = \left(\frac{x}{m^}, \frac{y}{n^}\right)$,通过小型 MLP 投射为连续的位置嵌入,直接累加至模态投影层输出的隐藏向量中:
$$\tilde{h}{i, j} = \text{MLP}{\text{proj}}(v_{i, j}) + \text{MLP}_{\text{coord}}\left(\frac{i}{m^}, \frac{j}{n^}\right)$$
# AnyRes 最优网格求解与动态切块核心实现 import math from typing import List, Tuple from PIL import Image class AnyResImageProcessor: def __init__(self, base_size: int = 336, max_patches: int = 4): self.base_size = base_size self.max_patches = max_patches # 构造全部合法的长宽比网格拓扑 self.candidate_grids = [] for m in range(1, max_patches + 1): for n in range(1, max_patches + 1): if m * n <= max_patches: self.candidate_grids.append((m, n)) def find_best_grid(self, original_width: int, original_height: int) -> Tuple[int, int]: orig_ratio = original_width / original_height best_grid = (1, 1) min_loss = float('inf') for (m, n) in self.candidate_grids: grid_ratio = m / n # 计算长宽比对数误差与面积利用率误差 ratio_loss = abs(math.log(grid_ratio) - math.log(orig_ratio)) target_area = m * n * (self.base_size ** 2) orig_area = original_width * original_height scale_loss = abs(math.log(target_area) - math.log(orig_area)) * 0.1 total_loss = ratio_loss + scale_loss if total_loss < min_loss: min_loss = total_loss best_grid = (m, n) return best_grid def process_image(self, image: Image.Image) -> Tuple[List[Image.Image], Image.Image, Tuple[int, int]]: w, h = image.size m, n = self.find_best_grid(w, h) # 1. 生成全局缩略图 overview = image.resize((self.base_size, self.base_size), Image.Resampling.BICUBIC) # 2. 生成局部高分辨率切块 target_w = m * self.base_size target_h = n * self.base_size resized_img = image.resize((target_w, target_h), Image.Resampling.BICUBIC) patches = [] for j in range(n): for i in range(m): box = (i * self.base_size, j * self.base_size, (i + 1) * self.base_size, (j + 1) * self.base_size) patch = resized_img.crop(box) patches.append(patch) return patches, overview, (m, n)工业级基准实测与精度飞跃
在权威密集视觉与文档图表理解基准上,对比固定分辨率基线与开启 AnyRes 动态切分($N_{\max}=4$)后的实测表现:
| 评估基准数据集 | 固定 336x336 基线 | 固定 448x448 基线 | AnyRes 动态网格分块 | 性能绝对提升 |
|---|---|---|---|---|
| DocVQA (文档精准问答) | 68.4% | 73.1% | 89.2% | +20.8% |
| ChartQA (复杂图表推理) | 61.2% | 65.8% | 79.5% | +18.3% |
| OCRBench (综合字符辨识) | 520 分 | 585 分 | 745 分 | +225 分 |
| InfoVQA (极端条幅信息图) | 42.1% | 47.5% | 68.7% | +26.6% |
实验数据呈现出压倒性的代际跨越:
- 在高度依赖细小字体与密集排版的DocVQA与ChartQA上,AnyRes 实现了约 20 个百分点的断崖式领先。
- 对于极端长宽比的InfoVQA条幅图,传统固定分辨率由于几何挤压导致近六成信息直接丢失,而 AnyRes 准确率直接跃升至 68.7%。
总结
视觉模态与语言模态的对齐,绝非单纯的矩阵相乘,而是两种完全不同的物理信息维度的融合。
AnyRes 机制深刻尊重了图像空间固有的各向异性与几何真实性。通过将离散的动态网格求解、高低频双流聚合以及二维拓扑坐标注入三者融为一体,AnyRes 成功拆除了束缚在视觉语言大模型头顶的固定分辨率枷锁,为多模态模型真正走向复杂的工业现实世界铺平了平坦的道路。