Чек-лист
кодовое словоОцифровка

Unlimited-OCR: как распознать целую книгу за один проход

Ставишь открытую модель Unlimited-OCR от Baidu и распознаёшь многостраничный PDF целиком за один проход - без нарезки на куски. Ниже ссылки, установка одной командой и готовый скрипт.

Содержание5 глав
  1. 01Почему эта модель, а не обычный OCR
  2. 02Установка одной командой
  3. 03Распознай первый PDF
  4. 04Что ещё она умеет
  5. 05Проверь себя

Что это

Почему эта модель, а не обычный 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

01
Положи PDF рядом со скриптом
Назови файл your_doc.pdf или поменяй имя в последней строке скрипта
02
Сохрани скрипт как ocr_pdf.py
Скрипт переводит каждую страницу в картинку на 300 dpi и отдаёт все страницы модели одним запросом. При первом запуске модель скачается с Hugging Face
03
Запусти
python ocr_pdf.py - результат ляжет в папку output
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

Режимы
Для одной картинки два режима: gundam - base_size=1024, image_size=640, crop_mode=True; base - base_size=1024, image_size=1024, crop_mode=False. Для пачки страниц и PDF - только base.

Финал

Проверь себя

  • Открыл репозиторий baidu/Unlimited-OCR на GitHub и модель на Hugging Face
  • Проверил, что есть видеокарта NVIDIA с CUDA - своя или облачная
  • Поставил пакеты: pip install torch transformers pymupdf
  • Сохранил скрипт ocr_pdf.py и положил рядом свой PDF
  • Запустил python ocr_pdf.py и дождался загрузки модели
  • Открыл папку output и проверил текст всех страниц
  • Попробовал одну картинку через infer