Все статьи
· 5 мин чтения

Unlimited-OCR от Baidu: OCR, который читает страницу как картинку 📄👁️

Разбираю baidu/Unlimited-OCR — 3B vision-language модель для распознавания документов в духе DeepSeek-OCR. Как работает оптическое сжатие, что умеет, режимы gundam/base, и как запустить через transformers и SGLang. С интерактивом.

Unlimited-OCR от Baidu: OCR, который читает страницу как картинку 📄👁️

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

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

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

Unlimited-OCR — это не распознавалка букв, а vision-language модель на 3B параметров (лицензия MIT). Она кодирует страницу документа в визуальные токены (оптическое сжатие, ~в 10 раз компактнее текста), а LLM-декодер превращает их в Markdown — с таблицами, формулами и многостраничными PDF. Контекст до 32K токенов, поэтому «long-horizon parsing» целых документов за один проход.

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

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

MITЛицензия

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

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

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


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

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

Потыкай — увидишь, как расходятся текстовые и визуальные токены:

🗜️ Оптическое сжатие: текст → картинка
Слева — во сколько токенов превратится страница, если кормить LLM текстом. Справа — во сколько, если закодировать ту же страницу как картинку (визуальные токены). Тяни ползунок: текст растёт, картинка — почти нет.
📝 Текстовые токены1 120
🖼️ Визуальные токены256
×4.4
во столько раз меньше токенов через картинку
800 слов

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


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

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

⚙️ Как Unlimited-OCR читает страницу
Это не «распознавалка букв», а vision-language модель: картинка кодируется в визуальные токены, а LLM разворачивает их обратно в текст. Смотри по шагам:
📄
Картинка
👁️
Vision-энкодер
🔢
Визуальные токены
🧠
LLM-декодер 3B
📝
Markdown
1/5Страница или PDF масштабируется (base 1024px / gundam 640px с нарезкой на тайлы).
Шаг 1/5
💡Откуда корни

Авторы прямо благодарят DeepSeek-OCR, DeepSeek-OCR-2 и PaddleOCR. То есть Unlimited-OCR — не магия из ниоткуда, а развитие линейки vision-OCR с оптическим сжатием. Точную начинку (какой именно энкодер и декодер) карточка модели не раскрывает, но архитектурно это тот же подход «картинка → визуальные токены → LLM».


Режимы: gundam vs base

У модели два режима подачи картинки, и это первое, с чем столкнёшься на запуске:

GGundam (base_size=1024, image_size=640, crop_mode=True) — картинку режут на тайлы по 640px. Больше деталей для плотных и крупных сканов.
BBase (base_size=1024, image_size=1024, crop_mode=False) — страница целиком в 1024px, без нарезки. Проще и быстрее.
📑Многостраничные и PDF идут только в base-режиме.

Грубое правило: плотный мелкий текст — gundam, обычная страница — base.


Что умеет

1Парсинг одной картинки — скан, фото документа → Markdown
2Многостраничные документы — последовательность картинок за один проход
3PDF напрямую — конвертит в картинки с настраиваемым DPI и парсит
4Мультиязычность — модель помечена как multilingual
5Структура — таблицы, формулы, заголовки, а не просто плоский текст
⚠️⚠️ Зачем no_repeat_ngram_size=35

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


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

Вариант 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

Сам инференс одной картинки:

import torch
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. Промпт <image>document parsing. — это задача парсинга документа; токен <image> — место, куда подставляется картинка.

Вариант 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 — чтобы за 5 минут проверить на паре картинок. SGLang — когда нужен throughput и API под нагрузку (он же даёт батчинг и нормальную утилизацию GPU). Для разовой пакетной обработки PDF хватит и transformers-скрипта в цикле.


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

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

💡Когда брать

Unlimited-OCR — отличный выбор, если надо дёшево и локально распарсить кучу документов/PDF в текст, особенно длинных (контекст 32K + оптическое сжатие — его конёк). Если критична идеальная вёрстка таблиц — тестируй на своих данных и сравни с PaddleOCR / облачными OCR.


TL;DR

1Что это: Baidu Unlimited-OCR, 3B vision-language модель, MIT, в духе DeepSeek-OCR
2Фишка: оптическое сжатие — страница как картинка в ~256 визуальных токенов вместо тысяч текстовых
3Умеет: картинки, многостраничные доки, PDF, мультиязык, таблицы/формулы; контекст 32K
4Запуск: transformers (model.infer) или SGLang-сервер с OpenAI API; режимы gundam/base

Тренд понятен: OCR превращается из «найди буквы» в «vision-language модель, которая читает страницу глазами». Unlimited-OCR — дешёвый открытый способ это пощупать. Качай с HuggingFace и гоняй свои PDF. 🫡