⚠️ Alpha内测版本警告:此为早期内部构建版本,尚不完整且可能存在错误,欢迎大家提Issue反馈问题或建议。
Skip to content

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%

这里的比例只是像素覆盖率的直观估算,不等同于真实语义信息保留率。真实效果还取决于缩放算法、图像内容、压缩、模型视觉编码器和后续融合策略。

为什么动态分辨率有效:

  1. 自适应细节保留: 根据图像大小调整分辨率

    • 小图像:尽量保持原大小
    • 大图像:缩放到预算允许的中高分辨率,保留更多可识别细节
    • 平衡:大多数图像保留足够的信息
  2. 计算成本可控: 不同图像的计算成本被控制在相近范围

    • 小图像:计算成本低
    • 大图像:缩放后计算成本相同
    • 平均:计算成本可预测

图像分块与重叠示意

图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×22450ms1GB
动态分辨率1024×1024150ms2GB
图像分块2048×2048800ms4GB16×
自适应采样2048×2048200ms1.5GB

准确度对比

任务动态分辨率图像分块自适应采样
文档理解72%92%78%
图表分析68%89%75%
一般VQA85%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)单次 ViT256–1024
文档/高清图(>1024px)自动分块1024–1280
多图输入各图独立处理后拼接取决于图数

代表性效果: 在 TextVQA 等需要读图中文字的任务上,高分辨率支持通常会带来明显收益。具体提升幅度依赖模型版本、输入分辨率、评测集和推理设置。


代码实验

高分辨率处理方法对比

图7.3:三种高分辨率处理方案对比——动态分辨率、图像分块、自适应采样的计算成本与准确度权衡。

代码文件: code/ch07_multimodal_llm/high_resolution_processing.py
运行方式: python code/ch07_multimodal_llm/high_resolution_processing.py


本节小结

高分辨率处理有三种主要方案:

  1. 动态分辨率 - 平衡性能和成本
  2. 图像分块 - 更好保留局部细节
  3. 自适应采样 - 最低成本

选择方案需要考虑:

  • 任务需求
  • 计算资源
  • 准确度要求
  • 延迟限制

下一节: 7.4 多模态应用

扩展阅读: 多模态应用进阶(多模态 RAG、文档理解技术栈)

本教程采用 CC BY-NC-SA 4.0 许可协议