☰
InternVL2_5-78B动态高分辨率原理详解:dynamic_preprocess一行代码搞定OCR小字识别
2026/10/17 13:24:53 网站建设 项目流程

【免费下载链接】InternVL2_5-78B

项目地址:https://ai.gitcode.com/OpenGVLab/InternVL2_5-78B
点击查看免费下载

InternVL2_5-78B 是 OpenGVLab 推出的开源多模态大模型(MLLM),由 InternViT-6B 视觉编码器与 Qwen2.5-72B 语言模型融合而成。它的杀手锏是动态高分辨率:一张高清图可以被自动切成多块 448×448 的瓦片,让模型真正"看清"图片里的小字——只需一行dynamic_preprocess代码,文档 OCR、图表解析、密集文字识别都能轻松搞定。

为什么普通模型会把图里的小字"糊掉"?🤔

大多数视觉模型为了控制计算量,会把输入图像固定缩放到 224×224 或 448×448。一张包含密密麻麻文字的文档照片,经过这种粗暴压缩后,小字瞬间糊成一片,模型自然"看不见"。

InternVL2_5-78B 的思路完全不同——它采用**动态高分辨率(Dynamic High-Resolution)**策略:

  • ❌ 不做固定缩放,不强行压缩整张图
  • ✅ 根据图片宽高比,把图像分割成若干 448×448 像素的瓦片(tiles)
  • ✅ 每张瓦片保留原始细节,小字、公式、表格线都能清晰呈现

这套策略早在 InternVL 1.5 中提出,并在 2.0 / 2.5 中扩展到多图和视频场景。

上图就是仓库自带的测试图片 examples/image1.jpg(1000×747,约 4:3 横版),它正好用来演示瓦片切分的效果。

dynamic_preprocess 工作原理:5 步拆图解码 🔍

打开 README.md 中的dynamic_preprocess源码,整个流程可以概括为 5 步:

第 1 步:测量宽高比读取原图的orig_width / orig_height,得到 aspect_ratio。

第 2 步:枚举候选网格在min_num到max_num(默认最多 12)的范围内,枚举所有可能的i × j网格布局,例如(1,1)、(2,1)、(3,2)、(4,3)……

第 3 步:挑选最贴合的网格通过find_closest_aspect_ratio函数,找到与原图宽高比最接近的那个网格——这样缩放时图片几乎不变形、不裁边。

第 4 步:缩放并切块把整图缩放到448×i × 448×j,再均匀切成i×j块 448×448 的瓦片。 以 1000×747 的示例图为例:最接近的网格是4×3,切出12 块瓦片。

第 5 步:追加缩略图(thumbnail)若开启use_thumbnail=True,会额外添加一张 448×448 的全局缩略图。局部瓦片负责"看清细节",缩略图负责"把握全局"——二者结合,模型既不会漏掉版面结构,也不会错过角落的小字。

一行代码启用动态高分辨率 🚀

对新手来说,完全不用手写切图逻辑。仓库已封装好 load_image 函数,核心调用只有一行:

# 一行搞定:动态切图 + 缩略图 images = dynamic_preprocess(image, image_size=448, use_thumbnail=True, max_num=12) pixel_values = [transform(image) for image in images]

再配合build_transform完成归一化,就能直接喂给模型:

pixel_values = load_image('./examples/image1.jpg', max_num=12) response = model.chat(tokenizer, pixel_values, '<image>\n请识别图中的文字')

完整的推理示例(含多图、视频、批处理)都在 README.md 中,照着改路径即可运行。

关键参数速查表 ⚙️

参数默认值作用调参建议
image_size448每块瓦片的边长(像素)一般保持默认
max_num12单张图最多切多少块文档/密集小字场景可调大到 24
min_num1最少切块数大图可设为 2~4,避免整图被压成一块
use_thumbnailTrue是否追加全局缩略图需要理解版面/整体布局时保留

这些默认值也写在 config.json 中:max_dynamic_patch: 12、min_dynamic_patch: 1、force_image_size: 448、use_thumbnail: true。

幕后揭秘:切好的瓦片如何进入大模型 🧠

InternVL2_5-78B 遵循"ViT-MLP-LLM"三段式架构,瓦片的旅程是这样的:

  1. ViT 视觉编码器:每块 448×448 瓦片被切成 14×14 的小 patch,得到 32×32 = 1024 个视觉特征;
  2. Pixel Shuffle 下采样:在 modeling_internvl_chat.py 中,pixel_shuffle把相邻 2×2 的特征合并,token 数直接减少到 1/4——每块瓦片只需256 个视觉 token;
  3. MLP 投影 + LLM:投影后的特征与文本 token 拼接,送入 Qwen2.5-72B 统一理解与生成。

12 块瓦片 + 1 张缩略图 = 13 × 256 ≈3300 个视觉 token,这就是动态高分辨率"看得清"又"控得住成本"的秘密。处理多图或视频时,通过num_patches_list参数告诉模型每张图各占几块瓦片即可(见 README.md 的视频示例)。

OCR 小字识别实战技巧 💡

  • 密集文档调大max_num:发票、论文、代码截图建议max_num=16~24,瓦片越多细节越足;
  • 注意显存预算:瓦片数线性增加视觉 token 数,长图请配合 Flash Attention 与多卡部署(README 提供了split_model方案);
  • 保留缩略图:识别表格、图表时,缩略图帮助模型理解行列结构,减少串行错行;
  • 短视频逐帧切片:每帧同样走dynamic_preprocess(默认 448×448),示例视频见 examples/red-panda.mp4;
  • 多语言 OCR:InternViT 2.5 的增量预训练专门强化了多语言 OCR 与数学图表能力,中英文混排文档也能应对。

写在最后

一句话总结 InternVL2_5-78B 的动态高分辨率:测宽高比 → 选最贴合网格 → 切成 448×448 瓦片 → 加缩略图,一行dynamic_preprocess就全部搞定。想动手体验,克隆仓库后照着 README.md 的 Quick Start 加载模型,几分钟就能看到小字识别的效果。

【免费下载链接】InternVL2_5-78B

项目地址:https://ai.gitcode.com/OpenGVLab/InternVL2_5-78B
点击查看免费下载
上一篇:10分钟跑通WeChatFerry:微信自动回复实战指南
下一篇:CANN驱动DCMI认证证书API

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询