7.3 高分辨率图像处理
核心问题: 如何处理高分辨率图像?有哪些方法和权衡?
在线 Notebook
对应的交互式版本可在 Google Colab 打开,统一使用方式见 第0章说明。
技术进步的逻辑链
固定低分辨率输入的限制
早期或固定低分辨率方案
├─ 文字变模糊
├─ 小物体消失
├─ 颜色信息丢失
└─ 空间关系不清应用场景:
- 文档理解(需要读取文字)
- 图表分析(需要看清数据)
- 医学图像(需要细节)
- 卫星图像(需要精度)
高分辨率处理的原理深度
信息论基础
为什么分辨率是关键?
根据奈奎斯特采样定理,要保留图像中的高频细节(如文字边缘、细线),采样率需要足够高。这里用它作为直觉解释,不把图像理解能力简化成纯采样问题。
直觉示例——A4 文档上的 8pt 文字:
字符边缘频率:约 8-12 线对/mm
所需最低采样率:16-24 像素/mm
224×224 分辨率下(A4 约 210×297mm):
实际采样率 ≈ 1 像素/mm → 远低于要求,文字模糊不可读
1024×1024 分辨率下:
实际采样率 ≈ 5 像素/mm → 细节保留明显改善,但仍依赖缩放算法和模型能力核心权衡:
- 高分辨率 → 细节保留好,计算成本高(patch 数平方增长)
- 低分辨率 → 计算快,但文字/细节不可辨
- 根本原因:ViT 的自注意力复杂度是 O(N²),N 随分辨率平方增长

图7.3a:动态分辨率处理——宽图、方图、高图分别按原始宽高比缩放到短边/长边 ≤ 1024px,避免拉伸失真。
代码文件: code/ch07_multimodal_llm/explainer_diagrams.py运行方式: python code/ch07_multimodal_llm/explainer_diagrams.py
动态分辨率的原理
为什么保持宽高比重要:
不保持宽高比(拉伸):
原始:2048×1024(宽高比2:1)
缩放到1024×1024(拉伸)
↓
图像变形,语义信息丢失
保持宽高比(缩放):
原始:2048×1024(宽高比2:1)
缩放到1024×512(保持宽高比)
↓
图像不变形,语义信息保留为什么中高分辨率常被作为工程折中点:
分辨率 | 细节保留 | 计算成本 | 性能 | 平衡度
-------|--------|---------|------|-------
224×224 | 低 | 1× | 低 | ✗
512×512 | 中 | 5× | 中 | ✓
768×768 | 中高 | 11× | 中高 | ✓
1024×1024 | 高 | 20× | 高 | ✓✓
2048×2048 | 很高 | 80× | 很高 | 成本高像素覆盖率的简化估算:
相对于原始图像的像素覆盖率:
224×224: 覆盖率 = (224/原始)² × 100%
如果原始是2048×2048,覆盖率 ≈ 1.2%
1024×1024:覆盖率 = (1024/2048)² × 100% = 25%
2048×2048:覆盖率 = 100%这里的比例只是像素覆盖率的直观估算,不等同于真实语义信息保留率。真实效果还取决于缩放算法、图像内容、压缩、模型视觉编码器和后续融合策略。
为什么动态分辨率有效:
自适应细节保留: 根据图像大小调整分辨率
- 小图像:尽量保持原大小
- 大图像:缩放到预算允许的中高分辨率,保留更多可识别细节
- 平衡:大多数图像保留足够的信息
计算成本可控: 不同图像的计算成本被控制在相近范围
- 小图像:计算成本低
- 大图像:缩放后计算成本相同
- 平均:计算成本可预测

图7.3b:图像分块策略——2048×2048 图像按 512×512 块、步长 256(50% 重叠)分割为 7×7=49 块;重叠区域由多块共同捕获以消除边界伪影。
代码文件: code/ch07_multimodal_llm/explainer_diagrams.py运行方式: python code/ch07_multimodal_llm/explainer_diagrams.py
图像分块的原理
为什么分块能减少细节损失:
原始图像(2048×2048):
像素预算 = 2048² pixels
分块处理(512×512,重叠50%):
块数 = ⌈(2048-512)/256⌉ + 1 = 7,共 7×7 = 49块
每块像素预算 = 512² pixels
每块大小 = 512×512 pixels(独立送入 ViT)
关键:非重叠区域以原始块形式送入模型,重叠区域产生冗余(用于边界连续性)
注意:重叠会使总处理像素增加,不是"语义信息量增加"重叠的作用:
无重叠(块之间相邻):
块1 ┌─────┐
└─────┐
块2 ┌─────┐
└─────┘
问题:块边界处的信息可能丢失
50%重叠(块之间有重叠):
块1 ┌─────────┐
└────┬────┘
块2 ┌─────────┐
└────┬────┘
优势:块边界处的信息被多个块捕获
结果:降低边界处细节丢失的概率特征融合的原理:
多个块的特征融合方式:
1. 平均融合(简单):
融合特征 = (特征1 + 特征2 + ... + 特征N) / N
问题:丢失空间信息
2. 加权融合(更好):
融合特征 = w₁×特征1 + w₂×特征2 + ... + wₙ×特征N
其中权重根据块的重要性分配
优势:保留空间信息
3. 注意力融合(更灵活):
融合特征 = Attention(特征1, 特征2, ..., 特征N)
优势:可以根据任务学习块之间的权重边界处理的原因:
问题:最后一行/列的块可能不足512×512
解决方案:
从图像末尾向前裁剪
例如:2048×2048图像
块1:(0, 0) 到 (512, 512)
块2:(256, 0) 到 (768, 512)
...
最后一块:(1536, 1536) 到 (2048, 2048)
这样保证所有块都是512×512自适应采样的原理
注意: 自适应采样是理论方案,目前主流多模态模型(Qwen2.5-VL、LLaVA-NeXT等)较少采用显式关键区域检测+非均匀采样,更多通过分块或动态分辨率实现高分辨率支持。
重要性采样的统计学原理:
均匀采样(所有像素相等):
采样率 = 1/4(采样25%的像素)
问题:重要的像素可能被遗漏
重要性采样(重要像素采样率高):
关键区域采样率 = 1/2(采样50%)
背景区域采样率 = 1/10(采样10%)
优势:保留关键信息,降低成本关键区域检测的方法:
方法1:基于梯度(检测边界)
梯度大 → 边界 → 关键区域
梯度小 → 平坦 → 背景区域
方法2:基于熵(检测信息量)
熵大 → 信息多 → 关键区域
熵小 → 信息少 → 背景区域
方法3:基于物体检测
检测物体位置 → 关键区域
其他位置 → 背景区域采样率分配的原理:
采样率 = 信息重要性 / 总信息量
例如:
文字区域:信息重要性 = 100 → 采样率 = 50%
物体区域:信息重要性 = 50 → 采样率 = 25%
背景区域:信息重要性 = 10 → 采样率 = 5%
总采样率 = (100×50% + 50×25% + 10×5%) / 160 ≈ 20%为什么这比均匀采样更好:
均匀采样(采样20%):
├─ 文字区域:采样20% → 信息丢失严重
├─ 物体区域:采样20% → 信息丢失
└─ 背景区域:采样20% → 信息丢失不严重
自适应采样(平均采样20%):
├─ 文字区域:采样50% → 信息保留好
├─ 物体区域:采样25% → 信息保留中等
└─ 背景区域:采样5% → 信息丢失可接受
结果:总体信息保留更好三种方案的根本权衡分析
为什么难以同时优化:
根据信息论的基本定理:
信息保留 = f(采样率)
计算成本 = g(采样率)
其中:
f(x) 是递增函数(采样率越高,信息保留越好)
g(x) 是递增函数(采样率越高,计算成本越高)
结论:很难同时最小化计算成本并最大化信息保留三种方案的权衡分析:
动态分辨率:
采样策略:均匀采样,但分辨率自适应
信息保留:中等(25-100%)
计算成本:中等(3-20×)
权衡:平衡
图像分块:
采样策略:均匀采样,分块处理
信息保留:高(取决于块大小、重叠比例和融合策略)
计算成本:高(16-80×)
权衡:优先信息保留
自适应采样:
采样策略:非均匀采样,重点采样关键区域
信息保留:中等(关键区域高,背景低)
计算成本:低(4-10×)
权衡:优先计算效率根本原因:
信息论的基本权衡:
I = H(X) - H(X|Y)
其中:
I:互信息(信息保留)
H(X):原始信息熵
H(X|Y):给定采样后的条件熵
要增加I(保留更多信息),必须增加采样率
增加采样率必然增加计算成本
这是采样和计算之间的基本权衡,工程上只能通过更好的模型结构和调度策略缓解,不能免费消除方案对比
方案1:动态分辨率(Dynamic Resolution)
思想: 根据图像内容调整分辨率
输入图像
↓
计算宽高比
↓
选择合适分辨率
├─ 小图像(<512×512):保持原大小
├─ 中等图像(512-1024):缩放到1024×1024
└─ 大图像(>1024):缩放到1024×1024
↓
ViT编码
↓
特征提取优点:
- ✓ 灵活适应不同大小
- ✓ 计算量相对稳定
- ✓ 实现简单
缺点:
- ✗ 仍然可能丢失细节
- ✗ 不支持超大图像
适用场景: 一般应用
代码示例:
方案2:图像分块(Image Tiling)
思想: 将大图像分成多个小块,分别处理后融合
原始图像(2048×2048)
↓
分块(每块512×512,重叠50%)
├─ 块1(0-512, 0-512)
├─ 块2(256-768, 0-512)
├─ 块3(512-1024, 0-512)
└─ ...共16块
↓
分别编码
├─ 块1特征
├─ 块2特征
└─ ...
↓
特征融合
├─ 全局特征
├─ 局部特征
└─ 上下文信息
↓
LLM处理优点:
- ✓ 支持更大尺寸图像
- ✓ 更好保留局部细节
- ✓ 支持超大图像
缺点:
- ✗ 计算量大(块数×编码时间)
- ✗ 需要特征融合
- ✗ 实现复杂
适用场景: 文档、图表、卫星图像
代码示例:
方案3:自适应采样(Adaptive Sampling)
思想: 重点采样关键区域,降低计算成本
原始图像
↓
检测关键区域
├─ 文字区域
├─ 物体区域
├─ 边界区域
└─ 背景区域
↓
分配采样率
├─ 关键区域:高分辨率
├─ 普通区域:中分辨率
└─ 背景区域:低分辨率
↓
采样和编码
↓
特征融合优点:
- ✓ 计算量最少
- ✓ 保留关键信息
- ✓ 成本最低
缺点:
- ✗ 需要关键区域检测
- ✗ 可能遗漏重要信息
- ✗ 实现最复杂
适用场景: 成本敏感的应用
方案选择指南
选择标准
| 因素 | 动态分辨率 | 图像分块 | 自适应采样 |
|---|---|---|---|
| 计算成本 | 中 | 高 | 低 |
| 细节保留 | 中 | 高 | 中 |
| 实现难度 | 低 | 中 | 高 |
| 推理速度 | 快 | 慢 | 最快 |
| 准确度 | 中 | 高 | 中 |
推荐方案
场景1:一般应用
推荐:动态分辨率
原因:平衡性能和成本场景2:文档/图表
推荐:图像分块
原因:需要尽量保留文字、刻度和表格边界等细节场景3:实时应用
推荐:自适应采样
原因:成本最低场景4:移动设备
推荐:动态分辨率 + 量化
原因:平衡性能和资源性能对比
计算成本
| 方案 | 图像大小 | 编码时间 | 显存占用 | 相对成本 |
|---|---|---|---|---|
| 动态分辨率 | 224×224 | 50ms | 1GB | 1× |
| 动态分辨率 | 1024×1024 | 150ms | 2GB | 3× |
| 图像分块 | 2048×2048 | 800ms | 4GB | 16× |
| 自适应采样 | 2048×2048 | 200ms | 1.5GB | 4× |
准确度对比
| 任务 | 动态分辨率 | 图像分块 | 自适应采样 |
|---|---|---|---|
| 文档理解 | 72% | 92% | 78% |
| 图表分析 | 68% | 89% | 75% |
| 一般VQA | 85% | 88% | 84% |
| 图像描述 | 82% | 84% | 81% |
Qwen2.5-VL 的高分辨率实现
Qwen2.5-VL 采用动态分辨率 + 自动分块的混合方案,直接衔接 7.2 介绍的架构:
输入图像
↓
短边/长边是否 ≤ 1024px?
是 → 直接缩放到最近的 28 的倍数(patch_size=14×2)
否 → 分块模式:切分为 448×448 的块,重叠约 20%,最多 20 块
↓
每块送入 ViT → 投影层 → 拼接 token 序列
总 token 数 ≈ 块数 × (448/14)² = 块数 × 1024
(最多 20 块 → 20480 visual tokens,含压缩后约 1280 tokens)| 场景 | 处理方式 | visual tokens 数 |
|---|---|---|
| 普通照片(≤1024px) | 单次 ViT | 256–1024 |
| 文档/高清图(>1024px) | 自动分块 | 1024–1280 |
| 多图输入 | 各图独立处理后拼接 | 取决于图数 |
代表性效果: 在 TextVQA 等需要读图中文字的任务上,高分辨率支持通常会带来明显收益。具体提升幅度依赖模型版本、输入分辨率、评测集和推理设置。
代码实验

图7.3:三种高分辨率处理方案对比——动态分辨率、图像分块、自适应采样的计算成本与准确度权衡。
代码文件: code/ch07_multimodal_llm/high_resolution_processing.py
运行方式: python code/ch07_multimodal_llm/high_resolution_processing.py
本节小结
高分辨率处理有三种主要方案:
- 动态分辨率 - 平衡性能和成本
- 图像分块 - 更好保留局部细节
- 自适应采样 - 最低成本
选择方案需要考虑:
- 任务需求
- 计算资源
- 准确度要求
- 延迟限制
下一节: 7.4 多模态应用
扩展阅读: 多模态应用进阶(多模态 RAG、文档理解技术栈)
