DeepSeek-OCR-2动态分辨率揭秘:(0-6)×768切块+1024全局视图如何平衡精度与视觉Token成本
【免费下载链接】DeepSeek-OCR-2Visual Causal Flow项目地址: https://gitcode.com/gh_mirrors/de/DeepSeek-OCR-2
DeepSeek-OCR-2是 DeepSeek 开源的文档 OCR 模型,它最聪明的成本控制手段就是动态分辨率:把任意尺寸的图片自适应地拆成 0~6 块 768×768 局部切块,再加 1 张 1024×1024 全局视图,把视觉 Token 稳稳压在256~1120之间。这篇文章带你彻底看懂这套机制如何"既读得清小字,又不烧 Token"。
🤔 为什么文档 OCR 需要动态分辨率?
用大模型做 OCR 时,图片要先变成视觉 Token再进模型,而 Token 是按"字"计费算成本的。固定分辨率有两大硬伤:
- 整图缩小到 1024 硬塞:一页 A4 文档塞进 1024×1024,细字直接糊成马赛克,识别率暴跌;
- 整图切满全分辨率小块:Token 数量随页面尺寸无上限膨胀,8K 长图轻松吃掉上万个 Token,显存和延迟双杀。
动态分辨率的目标很明确:小图少花 Token,大图锁死 Token 上限,同时保住文字细节。
⚙️ (0-6)×768 + 1024 的三步拆解流程
这套机制的核心实现在 image_process.py 的dynamic_preprocess函数中,由 config.py 里的几个常数驱动:
BASE_SIZE = 1024 # 全局视图尺寸 IMAGE_SIZE = 768 # 局部切块尺寸 MIN_CROPS = 2 # 最小切块数 MAX_CROPS = 6 # 最大切块数(硬上限)第 1 步|比例感知:选最接近原图的 i×j 网格
程序先算出原图宽高比,然后在所有满足2 ≤ i×j ≤ 6的网格组合中,挑选与原始比例差距最小的那个。也就是说:横长的图就切 3×2,竖长的图就切 2×3,绝不变形拉伸。
第 2 步|局部视图:最多 6 块 768×768 高清切片
选定网格后,原图被等比缩放到i×768 × j×768,再均匀切成 768×768 的正方形切片,交给视觉编码器精细"逐字认读"。如果原图本身就很小(宽、高均 ≤ 768),则直接跳过切块——这就是标题里"(0-6)"中0的由来:小图一分钱切块成本都不花。
第 3 步|全局视图:一张 1024×1024 的"版面地图"
与此同时,整页图片会被整体缩放填充成一张1024×1024的全局视图。它分辨率不高,但保留了完整的版面信息:标题在哪、段落顺序如何、有没有表格和图片。局部切片负责"看清每个字",全局视图负责"看懂整页结构",两者各司其职。
上图即官方论文中的 DeepEncoder V2 架构:左侧 80M 的 SAM 分词器做非因果特征提取,右侧用 500M 的 Qwen2 语言模型以因果方式充当视觉编码器,这正是模型名"Visual Causal Flow"的由来,完整推导可阅读 DeepSeek_OCR2_paper.pdf。
🧮 视觉 Token 成本账:从 256 到 1120
Token 数量由 deepseek_ocr2.py 中的get_num_image_tokens精确计算,规则非常干净:
- 视觉特征以16×16 像素为 patch,再经4 倍下采样;
- 1024 全局视图 → (1024/16)/4 = 16,即 16×16 =256 个 Token;
- 每块 768 切片 → (768/16)/4 = 12,即 12×12 =144 个 Token。
| 输入图片 | 局部切块数 | 视觉 Token 总量 |
|---|---|---|
| ≤768×768 小图 | 0 块 | 256 |
| 中等文档(约 3 块) | 3 块 | 256 + 3×144 =688 |
| 大文档(触顶 6 块) | 6 块 | 256 + 6×144 =1120 |
(模型还会追加 1 个视图分隔 Token,用于区分局部与全局特征。)
关键在最后一行:无论页面多大,Token 上限被MAX_CROPS = 6死死锁在 1120。不做上限的朴素切块方案,处理 8K 长页面可能需要 60+ 块、近万 Token;而这里的成本从第一天起就可预测、可预算。
⚖️ 为什么这个组合恰好是平衡点?
- 全局低清 + 局部高清,精度不妥协:文字识别靠 768 高清切片,版面理解靠 1024 全局图,"字"和"结构"两条信息链路都不缺;
- 小图极致省钱:768 以内的小图只消耗 256 个视觉 Token,比正文 Token 还便宜,适合批量处理截图、票据;
- 上限封顶,成本可控:切块数 2~6 由
MIN_CROPS/MAX_CROPS约束,批量推理时显存占用稳定,config.py 中还提供了MAX_CONCURRENCY等并发旋钮; - 比例自适应,杜绝拉伸伪影:网格始终贴合原始宽高比,避免文字被压扁变形导致识别错误。
🚀 快速上手:三条命令跑通
环境要求:CUDA 11.8 + PyTorch 2.6.0 + vLLM 0.8.5。
git clone https://gitcode.com/gh_mirrors/de/DeepSeek-OCR-2 conda create -n deepseek-ocr2 python=3.12.9 -y pip install -r requirements.txt方式一:vLLM 推理(推荐,支持流式输出)
cd DeepSeek-OCR2-master/DeepSeek-OCR2-vllm python run_dpsk_ocr2_image.py # 图片识别 python run_dpsk_ocr2_pdf.py # PDF 并发处理方式二:HuggingFace Transformers 推理
动态分辨率的三个核心参数在 run_dpsk_ocr2.py 中一目了然:
res = model.infer(tokenizer, prompt=prompt, image_file=image_file, base_size=1024, image_size=768, crop_mode=True)两种常用 Prompt(见 config.py):
- 文档转 Markdown:
<image>\n<|grounding|>Convert the document to markdown. - 自由 OCR(保留原始顺序):
<image>\nFree OCR.
📂 机制在源码里的位置一览
| 想了解什么 | 去哪里看 |
|---|---|
| 1024/768/切块上下限配置 | config.py |
| 动态切块与网格选择逻辑 | process/image_process.py |
| 视觉 Token 数量精确计算 | deepseek_ocr2.py |
| 局部/全局特征融合与分隔 Token | deepseek_ocr2.py |
| HF 推理入口 | run_dpsk_ocr2.py |
| vLLM 图片推理入口 | run_dpsk_ocr2_image.py |
| 论文原文 | DeepSeek_OCR2_paper.pdf |
写在最后
DeepSeek-OCR-2 的动态分辨率本质上是一次Token 经济学的设计:用"1 张 1024 全局图 + 最多 6 块 768 高清图"的组合拳,让视觉 Token 花费从"随图片大小无限膨胀"变成"256 起步、1120 封顶"的固定区间。对于要批量处理文档、又在意推理成本的团队来说,这套机制值得直接抄进自己的多模态管线里。
【免费下载链接】DeepSeek-OCR-2Visual Causal Flow项目地址: https://gitcode.com/gh_mirrors/de/DeepSeek-OCR-2
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考