📄
Unlimited OCR
百度开源:一次性解析数十页文档的 OCR 革命
🏢 百度出品
⚡ 单次前向传播
📖 数十页文档
⭐ 23K Stars
⚡ 单次前向传播
📖 数十页文档
⭐ 23K Stars
💡 一句话概括:Unlimited OCR 是百度开源的革命性 OCR 模型,通过创新的注意力机制,实现单次前向传播解析数十页文档,告别传统逐页处理的低效方式。
🌟 项目背景
近年来,以 DeepSeek OCR 为代表的端到端 OCR 模型再次将 OCR 技术推向风口浪尖。使用大语言模型(LLM)作为解码器,可以让模型利用语言的前验分布,提升 OCR 性能。
但问题也同样明显:
⚠️ 传统痛点:随着输出序列变长,累积的 KV 缓存会推高内存消耗,并逐渐减慢生成速度——这与人类在长距离抄写任务中表现出的效率下降形成鲜明对比。
Unlimited OCR 正是为了解决这个问题而生!
🧠 核心技术:R-SWA
Unlimited OCR 以 DeepSeek OCR 为基线,提出了一个关键创新——
Reference Sliding Window Attention (R-SWA)
🎯
常数 KV 缓存
整个解码过程保持恒定
⚡
降低计算成本
减少注意力计算开销
📄
单次前向传播
数十页文档一次完成
🔄
通用解析机制
适用于 OCR/ASR/翻译
技术原理
R-SWA 将解码器中的所有注意力层替换为引用的滑动窗口注意力机制:
- ✅ 参考机制:维护一个固定的参考窗口,记录关键信息
- ✅ 滑动窗口:只关注当前窗口内的信息,避免全局计算
- ✅ 常数缓存:无论文档多长,KV 缓存大小保持不变
- ✅ 高效解码:避免传统 LLM 解码器的内存爆炸问题
📊 项目数据
| 指标 | 数值 |
|---|---|
| ⭐ GitHub Stars | 23,136 |
| 🍴 Forks | 2,362 |
| 🐛 Open Issues | 74 |
| 📜 语言 | Python |
| 📜 许可证 | MIT |
| 📄 论文 | arXiv:2606.23050 |
🎯 核心优势:支持 32K 最大长度,单次前向传播即可转录数十页文档!
✨ 主要特性
1️⃣ 单次前向传播解析多页文档
传统 OCR 需要逐页处理,而 Unlimited OCR 可以:
✅ 一次处理:数十页 PDF 或图片,单次前向传播完成
✅ 格式保留:保持原始文档的布局和格式
✅ 高速处理:常数级内存消耗,不受文档长度影响
2️⃣ 多种推理方式
| 方式 | 适用场景 | 特点 |
|---|---|---|
| Transformers | 简单部署、快速上手 | 原生 Huggingface 支持 |
| vLLM | 生产环境、高并发 | Docker 部署、OpenAI 兼容 |
| SGLang | 灵活定制、流式输出 | 自定义 Logit Processor |
3️⃣ 双模式支持
🎨 Gundam 模式
base_size=1024, image_size=640, crop_mode=True
适合单张图片,更快处理
📄 Base 模式
base_size=1024, image_size=1024, crop_mode=False
适合多页文档,保留完整信息
🚀 快速开始
安装依赖
torch==2.10.0 torchvision==0.25.0 transformers==4.57.1 Pillow==12.1.1 matplotlib==3.10.8 einops==0.8.2 pymupdf==1.27.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='your_image.jpg', output_path='your/output/dir', base_size=1024, image_size=640, crop_mode=True, max_length=32768, save_results=True, )
多页 PDF 处理
import tempfile, 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 # 多页处理 model.infer_multi( tokenizer, prompt='<image>Multi page parsing.', image_files=pdf_to_images('your_doc.pdf', dpi=300), output_path='your/output/dir', image_size=1024, max_length=32768, save_results=True, )
🐳 Docker 部署
vLLM 官方提供了 Docker 镜像,支持两种 CUDA 版本:
CUDA 13.0
CUDA 12.9
CUDA 12.9
# 默认版本 (CUDA 13.0) docker pull vllm/vllm-openai:unlimited-ocr # Hopper GPU 版本 (CUDA 12.9) docker pull vllm/vllm-openai:unlimited-ocr-cu129
📚 相关链接
Unlimited OCR 代表了 OCR 技术的新方向——从逐页处理到一次性解析,让文档数字化变得更加高效。
📄
Welcome the Era of One-shot Long-horizon Parsing.
一次解析,无限可能。
