百度开源 Unlimited-OCR:一次识别整篇文档,告别逐行扫描时代
已打包好,国内可直接网盘下载源码: 夸克网盘(提取码:dcWH)
拿到一份 50 页的 PDF 合同,需要把关键条款摘出来,结果 OCR 工具只能一行一行识别,识别完还要手动拼回段落结构,格式全乱了。
或者更惨------扫描的发票、表格、手写笔记混在一起,传统 OCR 直接放弃治疗,识别出来的东西像天书。
百度最近开源的 Unlimited-OCR,就是冲着这些痛点来的。GitHub 上线不到两个月,已经拿下 21000+ Star,热度直接拉满。

它到底能干什么?
简单说,Unlimited-OCR 做的事情是一次性把整页甚至整份文档识别出来,不是逐行扫描,而是直接理解文档的版面结构,输出带格式的完整内容。
核心能力:
- 单页高精度识别:支持 gundam(裁切增强)和 base 两种模式,单张图片最高支持 1024 分辨率
- 多页连续识别:多张图片或 PDF 一次性送入,跨页内容自动关联
- 版面结构保留:标题、段落、表格、列表等结构信息不丢失
- PDF 直出:内置 PyMuPDF 转换,PDF 直接进,Markdown 出来
这跟传统 OCR 的区别在哪?传统方案是"识别文字 → 后处理排版",Unlimited-OCR 是"理解版面 → 输出结构化内容",思路完全不同。

快速上手:5 分钟跑起来
环境准备
推荐 Python 3.12 + CUDA 12.9,依赖如下:
bash
pip install torch==2.10.0 torchvision==0.25.0
pip install transformers==4.57.1
pip install Pillow==12.1.1 matplotlib==3.10.8
pip install einops==0.8.2 addict==2.4.0 easydict==1.13
pip install pymupdf==1.27.2.2 psutil==7.2.2
单张图片识别
python
import torch
from transformers import AutoModel, AutoTokenizer
model_name = 'baidu/Unlimited-OCR'
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoModel.from_pretrained(
model_name,
trust_remote_code=True,
use_safetensors=True,
torch_dtype=torch.bfloat16,
)
model = model.eval().cuda()
# gundam 模式:裁切增强,适合复杂版面
model.infer(
tokenizer,
prompt='<image>document parsing.',
image_file='contract_page1.jpg',
output_path='./output',
base_size=1024, image_size=640, crop_mode=True,
max_length=32768,
no_repeat_ngram_size=35, ngram_window=128,
save_results=True,
)
两种模式怎么选?
| 模式 | base_size | image_size | crop_mode | 适用场景 |
|---|---|---|---|---|
| gundam | 1024 | 640 | True | 单页复杂版面,表格、多栏混排 |
| base | 1024 | 1024 | False | 多页文档,简单版面 |
多页 PDF 识别
这才是 Unlimited-OCR 的杀手级功能------多页文档一次性解析:

python
import os
import tempfile
import fitz # PyMuPDF
def pdf_to_images(pdf_path, dpi=300):
doc = fitz.open(pdf_path)
tmp_dir = tempfile.mkdtemp(prefix='pdf_ocr_')
mat = fitz.Matrix(dpi / 72, dpi / 72)
paths = []
for i, page in enumerate(doc):
out = os.path.join(tmp_dir, f'page_{i+1:04d}.png')
page.get_pixmap(matrix=mat).save(out)
paths.append(out)
doc.close()
return paths
# PDF → 图片列表 → 多页解析
model.infer_multi(
tokenizer,
prompt='<image>Multi page parsing.',
image_files=pdf_to_images('contract.pdf', dpi=300),
output_path='./output',
image_size=1024,
max_length=32768,
no_repeat_ngram_size=35, ngram_window=1024,
save_results=True,
)
注意多页模式只能用 base 配置(image_size=1024),ngram_window 也要调大到 1024,防止跨页内容重复。
生产部署:vLLM + Docker
单卡推理够用,但生产环境肯定要上 vLLM 加速。官方已经提供了 Docker 镜像,开箱即用:
bash
# CUDA 13.0
docker pull vllm/vllm-openai:unlimited-ocr
# Hopper GPU (CUDA 12.9)
docker pull vllm/vllm-openai:unlimited-ocr-cu129
启动后直接走 OpenAI 兼容 API,对接现有系统零成本。
SGLang 部署:高并发场景
如果并发量更大,SGLang 是另一个选择。它支持流式输出和自定义 logit processor,适合批量处理:

bash
# 安装 SGLang
uv venv --python 3.12
source .venv/bin/activate
uv pip install wheel/sglang-0.0.0.dev11416+g92e8bb79e-py3-none-any.whl
uv pip install kernels==0.11.7
uv pip install pymupdf==1.27.2.2
# 启动服务
python -m sglang.launch_server \
--model baidu/Unlimited-OCR \
--served-model-name Unlimited-OCR \
--attention-backend fa3 \
--page-size 1 \
--mem-fraction-static 0.8 \
--context-length 32768 \
--enable-custom-logit-processor \
--disable-overlap-schedule \
--skip-server-warmup \
--host 0.0.0.0 \
--port 10000
批量推理脚本也准备好了:
bash
# 图片目录批量处理
python infer.py \
--image_dir ./examples/images \
--output_dir ./outputs \
--concurrency 8 \
--image_mode gundam
# PDF 批量处理
python infer.py \
--pdf ./examples/document.pdf \
--output_dir ./outputs \
--concurrency 8 \
--image_mode gundam
跟 DeepSeek-OCR 有什么区别?
Unlimited-OCR 明确说了是站在 DeepSeek-OCR 肩膀上往前走了一步。关键差异:
1. 长文档能力
DeepSeek-OCR 主要处理单页,Unlimited-OCR 原生支持多页连续解析,跨页内容自动衔接。这是最大的区别。
2. 重复抑制
引入了 no_repeat_ngram_size + ngram_window 机制,长文本生成时不会出现重复段落。这个参数很关键------单页用 128,多页用 1024。
3. 裁切增强模式
gundam 模式通过裁切策略提升复杂版面的识别精度,这是 DeepSeek-OCR 没有的。
4. 生态支持
百度云、ModelScope、vLLM、SGLang、ms-swift 全都接上了,部署路径比 DeepSeek-OCR 丰富得多。

实战踩坑记录
坑 1:显存不够
模型用的是 bfloat16 精度,单卡至少需要 40GB 显存(A100/A800 级别)。显存不够的话,考虑用 vLLM 的量化部署或者百度云 API。
坑 2:ngram 参数调错
单页场景 ngram_window=128 就够,多页必须调到 1024。调小了会出现段落重复,调大了影响生成速度。别偷懒用默认值。
坑 3:PDF DPI 选择
pdf_to_images 里的 DPI 参数,300 是推荐值。200 以下识别精度明显下降,600 以上显存占用翻倍但精度提升有限。别盲目拉高。
坑 4:输出格式处理
模型输出可能包含 <|det|> 标记(版面检测信息),需要后处理去掉:

python
import re
DET_RE = re.compile(r'<\|det\|>([^<\s]+)(?:\s*\[[^\]]*\])?\s*<\|/det\|>(.*)', re.DOTALL)
def remove_det(raw: str) -> str:
blocks = []
cur = None
for line in raw.splitlines():
line = line.rstrip()
if not line:
continue
m = DET_RE.match(line)
if m:
category, content = m.group(1).strip(), m.group(2).strip()
if category == 'image':
continue
if cur is not None:
blocks.append(cur)
cur = [content] if content else []
continue
if cur is None:
cur = []
cur.append(line)
if cur is not None:
blocks.append(cur)
return '\n\n'.join('\n'.join(b) for b in blocks).strip()
适用场景总结
| 场景 | 推荐配置 | 说明 |
|---|---|---|
| 合同/法律文档 | gundam + 单页 | 版面复杂,需要精确识别 |
| 学术论文 | base + 多页 | 格式统一,跨页引用多 |
| 发票/收据 | gundam + 单页 | 表格密集,精度优先 |
| 书籍扫描 | base + 多页 | 页数多,需要连续解析 |
| 手写笔记 | gundam + 单页 | 手写体识别需要裁切增强 |
写在最后
Unlimited-OCR 的意义不只是"又一个 OCR 工具",它代表了一个方向:从逐行识别到整页理解。当模型能直接理解文档结构,OCR 就不再是"识别文字"的活,而是"理解文档"的活。
对于开发者来说,MIT 协议 + 多种部署方案 + 完善的生态支持,上手成本很低。如果你在做文档处理相关的项目,值得认真试试。
项目地址:https://github.com/baidu/Unlimited-OCR
论文:https://arxiv.org/abs/2606.23050
HuggingFace 模型:https://huggingface.co/baidu/Unlimited-OCR
已打包好,国内可直接网盘下载源码: 夸克网盘(提取码:dcWH)