Как вы себе представляете работу OCR? Страничка сканируется, программа находит области с буквами, распознает их и выдает текст. Старый добрый Tesseract так и пашет. А вот новый baidu/Unlimited-OCR делает финт ушами: он буквы вообще не ищет. Он берет всю страницу как картинку, жмет ее в горстку визуальных токенов и скармливает языковой модели, которая разворачивает их обратно в структурированный текст. Звучит вроде как надругательство над здравым смыслом, но… работает, и еще как!

Сегодня коротко разложу: что предлагает рынку идейный наследник DeepSeek-OCR, как он устроен, что умеет и как запустить его у себя. Будет полезно всем, кто хочет распознавать многостраничные документы одним залпом.

Суть за 10 секунд

Unlimited-OCR — это вам не просто распознавалка букв, это end-to-end мультимодальная модель на 3B параметров с лицензией MIT. Она кодирует страницу документа в визуальные токены, а LLM-декодер превращает их в цельный Markdown с таблицами, формулами и прочими прелестями форматирования. Контекст до 32 000 токенов, поэтому возможен разбор длинного документа как единой связной задачи, а не кучки разрозненных страниц текста.

3B параметровРазмер

Компактная vision-language модель в BF16. В теории способна влезть на одну видеокарту.

MITЛицензия

Полностью открытая — можно брать в коммерцию без плясок с бубном.

32 768 токеновКонтекст

Хватает, чтобы распарсить многостраничный документ (около 40 страниц) или PDF за одну проходку.

Главная идея: оптическое сжатие

Если скармливать LLM длинный документ текстом, токены растут линейно с количеством слов: страница на 1 000 слов — это ~1400 токенов, десять страниц — уже 14 000. В общем, долго, дорого и нудно. А если ту же страницу закодировать как картинку, визуальный энкодер ужимает ее до фиксированного значения токенов (~256 на страницу), и не важно, сколько там текста, что уже интереснее с точки зрения экономии.

Наглядное представление: слева — во сколько токенов превратится страница, если кормить LLM текстом. Справа — во сколько, если закодировать ту же страницу как картинку (визуальные токены). Тянем ползунок — текст растет, а картинка почти нет
Наглядное представление: слева — во сколько токенов превратится страница, если кормить LLM текстом. Справа — во сколько, если закодировать ту же страницу как картинку (визуальные токены). Тянем ползунок — текст растет, а картинка почти нет

Профит двойной: документ обычно влезает в контекст целиком (отсюда название «Unlimited», хотя, конечно, это не совсем правда) и инференс дешевле — LLM обрабатывает сотни визуальных токенов вместо тысяч текстовых. Именно этот подход впервые применили в DeepSeek-OCR, а Unlimited-OCR, продвигает эту затею дальше в сторону длинных документов.

Самая сложная и похожая на магию деталь в этом всем R-SWA (Reference Sliding Window Attention). Смотрите. Ахиллесова пята любой авторегрессионной модели, которая генерирует большой результат — это KV-кеш. Decoder модели выдает результат токен за токеном и модели нужно помнить весь предыдущий контекст, чтобы сгенерировать следующий токен. В итоге при длинных контекстах кеш становится больше модели, занимает всю память и вы ловите ‘Out of Memory’. Unlimited-OCR решает эту проблему изящно: вместо хранения полной истории сгенерированного текста он держит опорную информацию о документе + ограниченное скользящее окно последних выходных токенов. За счет этого KV-кеш держится в рамках одного значения по мере генерации, а не растет вместе с длиной результата. Он почти как школьник: скользит глазами по тексту, понимая что читает сейчас, но уже не помня, что было в начале главы. Аналогия поверхностная, но тонкости работы R-SWA, пожалуй, заслуживают отдельной статьи.

Как работает: пайплайн

Технически это связка «глаза + мозг»: визуальный энкодер видит картинку, языковая модель пишет текст. Примерно так это выглядит по шагам:

Откуда корни

Авторы прямо благодарят DeepSeek-OCR, DeepSeek-OCR-2 и PaddleOCR. Точная начинка, как написано в каточке к GGUF-квантизации, — SAM+CLIP DeepEncoder vision tower with a DeepSeek-V2 MoE text decoder.

Режимы: gundam vs. base

Эта модель работает в двух режимах, которые вы увидите сразу при запуске:

  1. Gundam (base_size=1024, image_size=640, crop_mode=True) — картинку режут на тайлы по 640px. Подойдет для крупных сканов, страниц с плотной версткой и множеством мелких деталей вроде сносок мелким шрифтом.

  2. Base (base_size=1024, image_size=1024, crop_mode=False) — страница целиком в 1024 px без нарезки. Проще и быстрее. Многостраничные документы и PDF можно обрабатывать только в этом режиме.

Проще говоря: если текст мелкий и его много, выбирайте gundam. Обычная страница — base.

Что умеет

  1. Распознавать одиночные изображения. Преобразует скан или фото документа в Markdown.

  2. Обрабатывать многостраничные документы. Создает структурированные документы из последовательности картинок за один проход.

  3. Извлекать содержимое из PDF. Преобразует страницы PDF в изображения с настраиваемым DPI и извлекает из них структурированный текст.

  4. Читать документы на разных языках. Модель заявлена как multilingual, поэтому должна распознавать тексты на нескольких языках с сохранением структуры.

  5. Сохранять иерархию и форматирование. Модель выделяет таблицы, формулы и заголовки, а не превращает содержимое в простыню текста.

Как запустить

Вариант 1: transformers (быстро пощупать)

Сначала установите необходимые библиотеки (версии из карточки модели):

pip install torch==2.10.0 torchvision==0.25.0 transformers==4.57.1 \
  Pillow==12.1.1 einops==0.8.2 addict easydict pymupdf

Теперь сам код для обработки одной картинки:


from transformers import AutoModel, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained('baidu/Unlimited-OCR', trust_remote_code=True)
model = AutoModel.from_pretrained(
    'baidu/Unlimited-OCR',
    trust_remote_code=True,
    use_safetensors=True,
    torch_dtype=torch.bfloat16,
)
model = model.eval().cuda()

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,   # gundam-режим
    max_length=32768,
    no_repeat_ngram_size=35, ngram_window=128,
    save_results=True,
)

Результаты (Markdown и разметка) будут сохранены в папку, указанную в output_path. Команда document parsing означает задачу парсинга документа, где <image> — это место для вашей картинки.

⚠️ Про no_repeat_ngram_size=35

У OCR-моделей есть распространенная болячка — на длинном документе декодер может зациклиться и повторять один и тот же кусок до бесконечности. Чтобы этого избежать, я добавил no_repeat_ngram_size=35 и ngram_window (128 для одной картинки, 1024 для многостраничных) — это защита от сбоев. Если все равно получаете повторы, попробуйте изменить эти параметры.

Вариант 2: SGLang (для прода / API)

Если нужен сервер с OpenAI-совместимым API — модель поднимается через SGLang:

python -m sglang.launch_server --model-path baidu/Unlimited-OCR --trust-remote-code

После этого вы сможете отправлять обычные запросы на /v1/chat/completions, передавая картинку в content. Конкретные настройки (порт, размер контекста, tp) и пример запроса есть в описании модели.

Что выбрать

Transformers: подойдет, чтобы быстро проверить модель на паре картинок. SGLang: лучше использовать, когда нужна высокая производительность и API для больших нагрузок. Он поддерживает пакетную обработку и эффективно использует GPU. Для простой пакетной обработки PDF хватит и скрипта на transformers, запущенного в цикле.

Насколько хорош

По уважаемому OmniDocBench v 1.5 модель выдает 93,23%. На бенчмарке ParseBench (llamaindex) результаты более смешанные: средний балл — 46.17: сильна в извлечении самого текста (Text Content 86.81), но проседает на сохранении форматирования (Text Formatting 0.97). То есть текст она достанет хорошо, а вот со сложным оформлением пока есть проблемы, все-таки это еще совсем молодая модель, а не вылизанный продакшен-комбайн.

Когда брать

Unlimited-OCR — отличный выбор, если надо дешево и локально распарсить кучу документов или PDF в текст, особенно длинных. Если критична идеальная верстка таблиц — тестируйте на своих данных и сравнивайте с PaddleOCR или облачными OCR.

Итого

В общем тренд такой: OCR превращается из квеста «найди буквы» в квест «прочитай глазами». Если раньше нам нужно было распознать страницу как набор текстовых областей, конкретизировать их, а уже потом собрать из них какую-то логику, то теперь мы сначала получаем представление о структуре документа целиком, а потом нанизываем на него текстовую конкретику в токенах. Unlimited-OCR — дешевый открытый способ пощупать этот свежий подход. Можно качать HuggingFace и гонять свои PDF-ки.

Встретимся в новых сериях ML-изысканий для самых ИИ-любознательных.