关于 OCR 这个话题,我之前写过不少:
今天这篇要聊的东西可能是 OCR 领域近年来最大的范式转换,MinerU 团队用扩散模型重新定义了文档 OCR 的解码方式
MinerU:OCR 领域的扛把子
先说说 MinerU 这个项目在 OCR 圈子的地位
MinerU 由上海人工智能实验室的 OpenDataLab 团队开发,最初诞生于 InternLM 大模型的预训练数据处理过程中
做过 RAG 的朋友应该都知道,文档解析是 RAG 流水线上最关键的一环——你的知识库质量上限,就取决于你的文档解析能力
而 MinerU 几乎是开源文档解析工具的事实标准:
全格式覆盖:支持 PDF、图片、DOCX 输入,输出 Markdown 和 JSON
109 种语言的 OCR 支持
全平台兼容:Windows、Linux、Mac,CPU/GPU/NPU/MPS 都能跑
功能全面:自动去除页眉页脚页码、保留文档结构、提取表格公式、处理复杂多栏布局
刚刚,MinerU 发布了3.0.0 大版本更新——新增了原生 DOCX 解析、pipeline 后端在 OmniDocBench v1.5 上得分达到 86.2,上线了多 GPU 部署路由
更关键的是,MinerU 的 VLM 版本 MinerU2.5 在 OmniDocBench 等权威 Benchmark 上一直是各路 OCR 模型的对标基准。
新范式:用 Diffusion 重新思考 OCR
好了,铺垫完背景,来说今天的主角——MinerU-Diffusion
这是 MinerU 团队在 3 月 24 日放出的全新框架,论文标题非常到位:
Rethinking Document OCR as Inverse Rendering via Diffusion Decoding(将文档 OCR 重新定义为通过扩散解码的逆渲染问题)
一句话总结:把传统的自回归(从左到右一个字一个字吐)解码,换成了并行的扩散去噪解码
这个思路非常有意思
为什么自回归解码不适合 OCR?
现在主流的 OCR 方案,本质上都是一个路子:视觉编码器把图片变成特征,然后语言模型一个 token 一个 token 地从左到右生成文字
这个架构有三个致命问题:
1. 速度瓶颈
自回归解码是串行的——生成第 100 个 token 必须等前 99 个都完成。
文档越长,越慢,延迟线性增长。
2. 错误累积
前面错了一个,后面大概率跟着错。
就像多米诺骨牌,一倒一片。
对于长文档、复杂表格和公式这种动辄几千 token 的场景,这个问题尤为致命。
3. 依赖语言先验而非视觉证据
这是论文中最犀利的观察
自回归模型在解码时会不自觉地依赖"语义补全"——它更多是靠上下文猜接下来的字是什么,而非认真看图片上写的是什么
论文专门设计了一个Semantic Shuffle测试来证明这个问题:把文档中的单词打乱顺序,重新排版成图片,让模型去识别。
结果自回归模型的准确率随着打乱程度直线下跌,而扩散模型基本纹丝不动。
下图就是 Semantic Shuffle 测试的结果,可以清楚看到 AR(自回归)和 Diffusion(扩散)两种解码方式面对语义打乱时的表现差异:
这说明什么?自回归模型做 OCR 时有很大程度上是在"理解"文本然后"猜"出来的。而 OCR 的本质应该是忠实地"看"图片上写了什么,跟文字有没有语义无关。
MinerU-Diffusion 如何解题?
MinerU-Diffusion 的核心思想是:把 OCR 看作"逆渲染"
什么意思?文档渲染是:结构化文本 → 2D 图片
OCR 就是反过来:2D 图片 → 结构化文本
既然渲染过程不需要从左到右逐字生成,OCR 解码凭什么必须从左到右?
下图展示了自回归解码和扩散解码两种方式的对比:
基于这个洞察,MinerU-Diffusion 设计了三大核心技术:
1. Block-wise 分块扩散解码器
不搞全局的扩散(那样计算量太大),把输出序列分成若干个 Block。Block 内部用扩散并行生成,Block 之间保留粗粒度的自回归结构,兼顾了效率和全局一致性。
扩散解码的过程如下——黑色 token 是已确认的,红色 token 正在更新,黄色 token 是未处理的 mask,整个过程是并行推进的:
2. 不确定性驱动的两阶段课程学习
训练分两步走:
第一阶段:用大规模多样化数据建立基础能力(约 750 万样本)
第二阶段:通过多次推理找出模型"不确定"的硬骨头样本,人工精标后重点训练
这个策略非常聪明。扩散模型的训练比自回归更不稳定,数据利用效率也更低,分阶段先建立基本功、再专攻难点,是一个务实的工程选择。
下图展示了 MinerU-Diffusion 的训练架构——左侧是 mask 训练过程,右侧是 Block 注意力机制的结构:
3. 动态置信度调度
解码时,模型会根据每个 token 的置信度动态决定是否"落笔确认"。高置信的直接定了,低置信的继续去噪。这个阈值就像一个"旋钮",可以在速度和精度之间灵活调节。
跑分:快 3 倍,准确率不掉
直接看数据:
在 OmniDocBench v1.5 评测中(带 GT Layout),以 τ=0.97 动态解码对比:
指标
MinerU2.5 (自回归)
MinerU-Diffusion (扩散, τ=0.97)
Overall ↑
Text Edit ↓
Formula CDM ↑
Table TEDS ↑
吞吐量 TPS
Overall 分数几乎一模一样,但吞吐量接近 2 倍!
而且这还只是置信度阈值 0.97 的结果
调到 0.95(Overall 93.37,精度与 MinerU2.5 几乎无差),吞吐量达到 108.9 TPS,2.1 倍加速
再放到 0.6,164.8 TPS,3.26 倍加速,准确率仍然超过 90%
下面这张图非常直观地展示了精度-吞吐量的权衡曲线:
在公式识别和表格识别上,MinerU-Diffusion 也表现出色:
公式识别(UniMER-Test):CPE 91.6 / HWE 91.6 / SCE 92.0 / SPE 96.8,全面碾压 GPT-4o(CPE 82.7 / HWE 85.9 / SCE 87.8),每个指标都领先 4~9 分
表格识别(OCRBench v2):TEDS 81.18 / TEDS-S 88.66,跟一众 AR 模型不相上下
光看数字不过瘾,论文里给了大量的定性示例,非常直观
端到端文档解析效果
下面展示几种典型文档页面的完整识别结果,每组从左到右分别是:原始页面、布局检测结果、最终解析渲染输出。
学术论文页面——包含表格、图片、标题、公式等复杂元素,布局检测精确,解析结果完整保留了文档结构:
报纸版面——密集的多栏排版,阅读顺序正确恢复:
公式密集的试卷——大量数学公式精准识别为 LaTeX:
扩散解码的渐进生成过程
这组图更有意思——展示了扩散解码器在不同任务上是怎么"一步步去噪"的
上面是原始输入,下面是解码过程的可视化,可以看到 token 从 mask 状态逐步被确认的全过程。
布局检测的扩散解码——模型逐步确认页面各区域的位置和类别:
文本识别的扩散解码——文字从 mask 中并行"浮现"出来:
表格识别的扩散解码——表格结构和内容同步恢复:
公式识别的扩散解码——LaTeX 符号从噪声中逐步精确还原:
可以看到,扩散解码是全局并行推进的——不像自回归那样从左上角一路写到右下角,而是整个页面同时"显影"。这种解码模式天然适合文档这种二维空间结构。
模型规格与使用
MinerU-Diffusion-V1 是一个2.5B 参数的模型,支持四种任务:
Prompt 类型
功能
输出格式
Layout Detection
页面级布局解析
边界框 + 标签
Text Recognition
纯文本 OCR
原始 OCR 文本
Formula Recognition
公式提取
LaTeX
Table Recognition
表格提取
OTSL 结构化表格
支持三种推理引擎:HuggingFace Transformers、Nano-DVLM(单 GPU 推理)、SGLang(高性能服务化部署)。
快速上手
安装环境:
conda create -n dmineru python=3.12 -y
conda activate dminerupip install torch==2.8.0 torchvision==0.23.0 torchaudio==2.8.0 --index-url https://download.pytorch.org/whl/cu128
pip install "transformers>=4.52.1"
# flash-attn 需要单独安装预编译 wheel(需匹配 CUDA/PyTorch 版本)
wget https://github.com/Dao-AILab/flash-attention/releases/download/v2.8.3/flash_attn-2.8.3+cu12torch2.8cxx11abiFALSE-cp312-cp312-linux_x86_64.whl
pip install flash_attn-2.8.3+cu12torch2.8cxx11abiFALSE-cp312-cp312-linux_x86_64.whl
pip install -r requirements.txt
用 Transformers 跑一下:
import torch
from transformers import AutoModel, AutoProcessor, AutoTokenizer
model_id = "opendatalab/MinerU-Diffusion-V1-0320-2.5B"
image_path = "path/to/page.png"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
processor = AutoProcessor.from_pretrained(model_id, trust_remote_code=True, use_fast=False)
model = AutoModel.from_pretrained(
model_id, trust_remote_code=True,
torch_dtype=torch.bfloat16, low_cpu_mem_usage=True
).eval().to("cuda")
messages = [
{"role": "system", "content": [{"type": "text", "text": "You are a helpful assistant."}]},
{"role": "user", "content": [
{"type": "image", "image": image_path},
{"type": "text", "text": "\nText Recognition:"},
]},
]
prompt_text = processor.apply_chat_template(messages, add_generation_prompt=True)
if isinstance(prompt_text, tuple):
prompt_text = prompt_text[0]
inputs = processor(images=[image_path], text=prompt_text, truncation=True, max_length=4096, return_tensors="pt")
input_ids = inputs["input_ids"].to(torch.long).to("cuda")
pixel_values = inputs["pixel_values"].to(torch.bfloat16).to("cuda")
image_grid_thw = inputs.get("image_grid_thw")
if image_grid_thw isnotNone:
image_grid_thw = image_grid_thw.to(torch.long).to("cuda")
with torch.no_grad():
outputs = model.generate(
pixel_values=pixel_values,
image_grid_thw=image_grid_thw,
input_ids=input_ids,
mask_token_id=tokenizer.convert_tokens_to_ids("<|MASK|>"),
denoising_steps=32,
gen_length=1024,
block_length=32,
temperature=1.0,
remasking_strategy="low_confidence_dynamic",
dynamic_threshold=0.95,
tokenizer=tokenizer,
stopping_criteria=["<|endoftext|>", "<|im_end|>"],
)output_ids = outputs[0] if isinstance(outputs, tuple) else outputs
text = tokenizer.decode(output_ids[0], skip_special_tokens=False)
for stop in ("<|endoftext|>", "<|im_end|>"):
text = text.split(stop, 1)[0]
print(text.strip())
端到端页面解析也支持:
cd /path/to/MinerU-Diffusion
MODEL_PATH=/path/to/model \
IMAGE_PATH=/path/to/input-page.png \
OUTPUT_PATH=/path/to/output.md \
bash scripts/run_end2end.sh
HuggingFace 上也有 Gradio Demo 可以直接体验:MinerU-Diffusion Demo
这个项目的意义,在我看来不只是"一个更快的 OCR 模型"。它验证了一个根本性的观点——OCR 的本质是视觉任务,解码方式应该与任务本质对齐。自回归解码是语言模型的标配,但 OCR 不是语言生成——你是在读图片,不是在写文章。
MinerU 团队从 MinerU 到 MinerU2.5 再到今天的 MinerU-Diffusion,一路走来持续在 OCR 领域推动技术前沿。这次用 Diffusion 思路来解 OCR,确实是一步好棋。
制作不易,如果这篇文章觉得对你有用,可否点个关注。给我个三连击:点赞、转发和在看。若可以再给我加个,谢谢你看我的文章,我们下篇再见!
热门跟贴