Распознавание документов перестало быть задачей Tesseract: открытые VLM-модели выдают markdown с разметкой блоков. Сравниваем реальные загрузки и размеры весов и показываем два пути запуска — 76 МБ на CPU и 6,7 ГБ на GPU.
Два года назад «OCR локально» означало Tesseract с ручной предобработкой. В 2026 году открытые модели распознают страницу целиком и возвращают markdown с заголовками, таблицами, порядком чтения и координатами блоков — причём часть из них работает на CPU без PyTorch. Ниже — карта моделей по фактическим загрузкам и размерам весов, требования к железу и команды запуска.
api/models/<repo>?blobs=true), бенчмарк Indra OCR — из карточки модели и её репозитория. Своих замеров точности мы не делали: там, где вендор цифр не публикует, это прямо написано.Классический OCR — конвейер из трёх независимых моделей: детекция строк, распознавание символов, разметка структуры. Ошибка на любом шаге не исправляется дальше. VLM-подход решает задачу одним проходом: страница подаётся как изображение, модель возвращает текст вместе с разметкой, а порядок чтения и таблицы она выучила на разметке документов, а не на правилах.
Практическая разница видна на сложных страницах. Таблица с объединёнными ячейками, колонтитул, рукописная пометка на полях, повёрнутый скан — для конвейера это отдельные флаги и костыли, для VLM — часть одной задачи. Цена — требования к памяти и склонность моделей иногда «додумывать» текст, особенно на повреждённых сканах.
Расклад сил понятен: два лидера примерно равны — байдусовский Unlimited-OCR (2,13 млн загрузок, 4852 лайка) и DeepSeek-OCR (2,09 млн, 3450 лайков). Третья строка у GLM-OCR от zai-org с 2,65 ГБ весов — заметно компактнее лидеров при 1,7 млн загрузок. Ниже идут две модели Datalab: surya-ocr-2 (686 млн параметров) и chandra-ocr-2 (5,3 млрд), обе под лицензией OpenRAIL.
| Модель | Параметры | Веса | Лицензия | Загрузки / лайки |
|---|---|---|---|---|
| baidu/Unlimited-OCR | 3,34 млрд | 6,67 ГБ | MIT | 2,13 млн / 4852 |
| deepseek-ai/DeepSeek-OCR | — | — | — | 2,09 млн / 3450 |
| zai-org/GLM-OCR | 1,33 млрд | 2,65 ГБ | MIT | 1,70 млн / 2168 |
| datalab-to/surya-ocr-2 | 686 млн | — | OpenRAIL | 1,48 млн / 132 |
| datalab-to/chandra-ocr-2 | 5,30 млрд | — | OpenRAIL | 1,45 млн / 568 |
| deepseek-ai/DeepSeek-OCR-2 | 3,39 млрд | 6,78 ГБ | Apache-2.0 | 550 тыс. / 1139 |
| dots-studio/dots.ocr | 3,04 млрд | — | MIT | 583 тыс. / 1341 |
| nanonets/Nanonets-OCR2-3B | 3,75 млрд | — | не указана | 278 тыс. / 517 |
| datalab-to/indra-ocr | 7,3 млн (все модели) | 76 МБ | OpenRAIL-M (веса) | 3,6 тыс. / 338 |
Любая из этих моделей работает не с PDF напрямую, а с изображениями страниц. Поэтому пайплайн всегда одинаковый по структуре, отличается только шаг распознавания — CPU-модель на ONNX или VLM на GPU.
Считаем от фактических размеров файлов, а не от маркетинговых обещаний. Веса в bf16 занимают столько же, сколько весит файл модели, плюс запас на активации и кэш внимания — для длинного документа он растёт вместе с числом токенов.
| Вариант | Веса | RAM / VRAM | Скорость | Когда выбирать |
|---|---|---|---|---|
| Indra OCR (ONNX, CPU) | 76 МБ | единицы ГБ RAM | ≈44 стр/с на 32 ядрах | массовая оцифровка, нет GPU, десятки языков |
| GLM-OCR | 2,65 ГБ | ≈6–8 ГБ VRAM | зависит от батча | компромисс между качеством и памятью |
| DeepSeek-OCR-2 | 6,78 ГБ | ≈8–12 ГБ VRAM | один проход на страницу | сложные таблицы и формулы |
| Unlimited-OCR | 6,67 ГБ | ≈8–12 ГБ VRAM, vLLM — больше | vLLM для потока | длинные документы, пачки страниц |
| chandra-ocr-2 | 5,30 млрд параметров | ≈12–16 ГБ VRAM | медленнее лидеров | рукописный текст, деградировавшие сканы |
Начните с CPU-варианта, если задача — текст, сканы и печатные документы. Он ставится одной командой и не требует ни видеокарты, ни PyTorch: внутри ONNX Runtime, OpenCV и pypdfium2.
pip install indra-ocr
indra-ocr paper.pdf
indra-ocr *.pdf --out results/
indra-ocr scan.png --format json
GPU-путь нужен, когда документы сложные: формулы, таблицы с объединёнными ячейками, плохие сканы. Ниже — минимальный пример для Unlimited-OCR из официальной карточки модели, с режимами gundam (одна страница, кроп) и base (многостраничный документ).
from transformers import AutoModel, AutoTokenizer
import torch
name = 'baidu/Unlimited-OCR'
tok = AutoTokenizer.from_pretrained(name, trust_remote_code=True)
model = AutoModel.from_pretrained(name, trust_remote_code=True,
use_safetensors=True, torch_dtype=torch.bfloat16).eval().cuda()
# одна страница: base_size=1024, image_size=640, crop_mode=True
model.infer(tok, prompt='<image>document parsing.', image_file='page.jpg',
output_path='out/', base_size=1024, image_size=640, crop_mode=True,
max_length=32768, save_results=True)
# многостраничный PDF: сначала рендер страниц в PNG (PyMuPDF, 300 dpi)
model.infer_multi(tok, prompt='<image>Multi page parsing.', image_files=pages,
output_path='out/', image_size=1024, max_length=32768,
no_repeat_ngram_size=35, ngram_window=1024, save_results=True)vllm/vllm-openai:unlimited-ocr, отдельный тег под Hopper с CUDA 12.9). Для потока документов это правильнее, чем скрипт на transformers: батчи, очередь и совместимый с OpenAI API.| Симптом | Причина | Что делать |
|---|---|---|
| Мелкий текст распознаётся с ошибками | низкий dpi при рендере PDF | поднять dpi до 250–300, проверить поворот страницы |
| Таблицы превращаются в кашу | модель уровня текстового OCR без разметки блоков | брать VLM-модель или просить JSON с блоками |
| Процесс падает по памяти на длинном PDF | кэш внимания растёт с числом страниц в одном проходе | резать на пачки по 3–5 страниц, снижать max_length |
| В выводе появляются выдуманные фразы | VLM достраивает текст на повреждённом скане | сверять критичные поля с исходником, снижать температуру |
| Модель не ставится из-за кастомного кода | нужен trust_remote_code для архитектуры из репозитория | доверять только проверенному репозиторию и фиксировать ревизию |
Единого публичного лидерборда OCR-моделей нет, и это главная сложность выбора. Официальные цифры публикует Datalab для Indra OCR: 66,7 балла на OmniParseBench (71,4 с флагом --math), тогда как полный пайплайн PP-StructureV3 от PaddleOCR набирает 58,4. По текстовому компоненту Indra даёт 46,7 против 35,8 у текстовых моделей PP-OCR и 19,3 у Tesseract. Это данные вендора на его собственном наборе — читать их как «в среднем по рынку» нельзя.
| Метрика OmniParseBench | Indra OCR | PP-StructureV3 | PP-OCR (текст) | Tesseract |
|---|---|---|---|---|
| Общий балл | 66,7 | 58,4 | — | — |
| Общий балл с --math | 71,4 | — | — | — |
| Текстовый компонент | 46,7 | — | 35,8 | 19,3 |
| Handwriting | 25,2 | — | — | — |
Для остальных моделей карточки на Hugging Face содержат описание, формат и лицензию, но не воспроизводимый прогон по единому набору. Поэтому при выборе разумно делать собственный мини-тест: 20–30 страниц именно ваших документов, с ручной проверкой чисел, дат и таблиц. Это дешевле, чем перебирать модели по обзорам.