
Unlimited-OCR: как распознать целую книгу за один проход
Ставишь открытую модель Unlimited-OCR от Baidu и распознаёшь многостраничный PDF целиком за один проход - без нарезки на куски. Ниже ссылки, установка одной командой и готовый скрипт.
Содержание5 глав
Что это
Почему эта модель, а не обычный OCR
Обычные OCR-модели режут длинный документ на куски и теряют нить между страницами. Unlimited-OCR читает весь документ целиком, хоть целую книгу, за один проход. Сделана на основе DeepSeek-OCR и на длинных документах сильно его обгоняет.
- 3 миллиарда параметров, но за один проход работают только 500 миллионов - поэтому модель лёгкая
- Reference Sliding Window Attention (R-SWA): читает локально, но держит контекст всего документа
- Из коробки берёт одну картинку, пачку страниц или целый PDF
- Открытая, лицензия MIT
Шаг 1
Установка одной командой
Короткий вариант из ролика - три пакета:
pip install torch transformers pymupdf
Минимальный набор: PyTorch, Transformers и PyMuPDF для PDF
Если что-то не заводится - ставь ровно те версии, на которых модель проверяли авторы:
pip install torch==2.10.0 torchvision==0.25.0 transformers==4.57.1 Pillow==12.1.1 matplotlib==3.10.8 einops==0.8.2 addict==2.4.0 easydict==1.13 pymupdf==1.27.2.2 psutil==7.2.2
Версии из карточки модели на Hugging Face
Шаг 3
Распознай первый PDF
import os
import tempfile
import fitz # PyMuPDF
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()
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
# Multi page / PDF работает только в режиме base (image_size=1024)
model.infer_multi(
tokenizer,
prompt='<image>Multi page parsing.',
image_files=pdf_to_images('your_doc.pdf', dpi=300),
output_path='output',
image_size=1024,
max_length=32768,
no_repeat_ngram_size=35, ngram_window=1024,
save_results=True,
)
ocr_pdf.py - весь PDF за один проход
Шаг 4
Что ещё она умеет
Пачка страниц, которые уже лежат картинками, - передай список файлов в тот же infer_multi:
model.infer_multi(
tokenizer,
prompt='<image>Multi page parsing.',
image_files=['page1.png', 'page2.png', 'page3.png'],
output_path='output',
image_size=1024,
max_length=32768,
no_repeat_ngram_size=35, ngram_window=1024,
save_results=True,
)
Несколько страниц-картинок
Одна картинка - скан, скриншот, фото страницы - через infer:
model.infer(
tokenizer,
prompt='<image>document parsing.',
image_file='your_image.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,
)
Одна картинка, режим gundam
Финал
Проверь себя
- Открыл репозиторий baidu/Unlimited-OCR на GitHub и модель на Hugging Face
- Проверил, что есть видеокарта NVIDIA с CUDA - своя или облачная
- Поставил пакеты: pip install torch transformers pymupdf
- Сохранил скрипт ocr_pdf.py и положил рядом свой PDF
- Запустил python ocr_pdf.py и дождался загрузки модели
- Открыл папку output и проверил текст всех страниц
- Попробовал одну картинку через infer


