Выбор и настройка OCR моделей: Chandra, OlmOCR-2, fine-tuning пайплайны | AiManual
AiManual Logo Ai / Manual.
18 Янв 2026 Гайд

Выбор и настройка open-source OCR моделей: полное руководство по современным пайплайнам

Подробное руководство по выбору, настройке и fine-tuning open-source OCR моделей. Сравнение Chandra, OlmOCR-2, практические пайплайны для production.

OCR в 2024: почему Tesseract больше не вариант

До сих пор используете Tesseract? Сочувствую вашей команде поддержки. Современный OCR - это не просто распознавание символов. Это понимание структуры документа, извлечение сущностей, работа с таблицами и формулами. И все это должно работать локально, без отправки ваших договоров в облака третьих стран.

Главная ошибка новичков - пытаться одну модель заставить делать все. Chandra не будет читать формулы, OlmOCR-2 задумается над рукописным текстом, а Mistral заблудится в таблице. Выбирайте под задачу.

Матрица выбора: какая модель для чего

Забудьте про "лучшую" модель. Здесь как с инструментами - молотком гвозди забивать, отверткой винты крутить. Вот что у нас есть в 2024:

Модель Сильные стороны Слабые места VRAM минимум
Chandra (Microsoft) Структура документа, многоязычность, таблицы Только английская документация, тяжелая 8GB
OlmOCR-2 Научные статьи, формулы LaTeX, сложная верстка Медленная, требует много памяти 12GB
Mistral OCR 3 Рукописный текст, низкое качество сканов Плохо с таблицами, слабая структура 6GB
Donut (Samsung) Document QA, end-to-end обучение Требует тонкой настройки под данные 4GB

Вот простой алгоритм выбора. Задайте себе четыре вопроса:

  1. Что за документы? Сканы договоров с печатями или научные PDF с формулами?
  2. Что на выходе? Просто текст или структурированный JSON с bounding boxes?
  3. Какое железо? Одна карта 8GB или кластер с 4x A100?
  4. Нужен ли fine-tuning? Или хватит out-of-the-box?

Если ответ на четвертый вопрос "да" - готовьтесь к боли. Но продуктивной боли.

Fine-tuning vs Out-of-the-box: когда что выбирать

Здесь все просто. Есть три сценария:

Сценарий 1: Out-of-the-box достаточно

Ваши документы похожи на то, на чем модель тренировалась. Стандартные договоры, счета-фактуры, научные статьи из arXiv. Chandra для первых двух, OlmOCR-2 для третьего. Не усложняйте.

Сценарий 2: Нужен легкий fine-tuning

Документы имеют специфический шрифт, но общую структуру. Медицинские рецепты с рукописными пометками, технические чертежи. Берете Mistral OCR 3 и дообучаете на 500-1000 своих образцов.

Сценарий 3: Полный fine-tuning

Уникальные документы, которых нет в открытых датасетах. Архивные рукописи, специфические бланки, документы с повреждениями. Здесь нужен Donut или полный перетрен Chandra с нуля.

💡
Перед fine-tuning проверьте, не решит ли проблему простая предобработка изображений. Иногда увеличение контраста и удаление шума дает +15% к точности без обучения.

Практический пайплайн: от выбора модели до production

1 Оценка задачи и данных

Сначала собираем все типы документов, которые будем обрабатывать. Не три образца, а реальную выборку из production. Смотрим на:

  • Качество сканов (300 DPI или фото с телефона?)
  • Языки (только русский или мультиязычные?)
  • Структуру (таблицы, формулы, рукописные пометки?)
  • Объем (десятки в день или миллионы архивных?)

2 Быстрое прототипирование

Берем 2-3 модели-кандидата и запускаем на 100 случайных документах. Не смотрите на accuracy - он врет. Смотрите на:

# Пример оценки качества
from sklearn.metrics import f1_score
import json

# Загружаем результаты OCR и ground truth
def evaluate_ocr(results, ground_truth):
    # CER (Character Error Rate) - главная метрика
    cer = calculate_cer(results['text'], ground_truth['text'])
    
    # F1 для извлечения сущностей (если нужно)
    entities_f1 = f1_score(
        extract_entities(results['structured']),
        extract_entities(ground_truth['structured'])
    )
    
    # Время обработки на документ
    processing_time = results['processing_time']
    
    return {
        'cer': cer,
        'entities_f1': entities_f1,
        'speed': processing_time
    }

CER ниже 0.05 (5% ошибок) - хорошо. Выше 0.1 - ищем другую модель или готовимся к fine-tuning.

3 Подготовка данных для обучения

Самая скучная и самая важная часть. Вам нужно:

  • 1000+ размеченных образцов для легкого fine-tuning
  • 10000+ для полного переобучения
  • Разметка в формате модели (bounding boxes + текст)

Нет размеченных данных? Есть два пути:

Не пытайтесь размечать вручную 10000 документов. Используйте слабо контролируемое обучение: запустите базовую модель, проверьте 10% результатов, исправьте ошибки, дообучите, повторите.

Или возьмите готовые инструменты из нашей статьи про автоматизацию разметки данных.

4 Fine-tuning: практические шаги

Вот как выглядит процесс для Chandra (аналогично для других):

# Конфигурация обучения Chandra
from transformers import VisionEncoderDecoderModel, Seq2SeqTrainingArguments

model = VisionEncoderDecoderModel.from_pretrained(
    "microsoft/chandra-ocr-base"
)

# Замораживаем энкодер изображений на первых эпохах
for param in model.vision_model.parameters():
    param.requires_grad = False

# Тренировочные аргументы
training_args = Seq2SeqTrainingArguments(
    output_dir="./chandra-finetuned",
    per_device_train_batch_size=4,  # Зависит от VRAM
    num_train_epochs=10,
    learning_rate=5e-5,
    warmup_steps=500,
    logging_dir='./logs',
    prediction_loss_only=True,
    save_steps=1000,
    eval_steps=1000,
    logging_steps=100,
)

# Важно: используйте аугментацию данных
# Повороты, изменение контраста, добавление шума
# Это предотвратит переобучение

Совет: первые 2-3 эпохи тренируйте только декодер. Потом размораживайте весь модель. Экономит время и память.

5 Оптимизация для production

Обученная модель - это полдела. Теперь нужно:

  • Квантование до FP16 или INT8 (ускоряет в 2-3 раза)
  • Оптимизация графа через ONNX или TensorRT
  • Кэширование эмбеддингов для похожих документов
  • Балансировка нагрузки между CPU/GPU
# Пример квантования модели
torch_model = model.to('cpu')
torch_model.eval()

# Конвертация в ONNX
import torch.onnx
dummy_input = torch.randn(1, 3, 224, 224)
torch.onnx.export(
    torch_model,
    dummy_input,
    "model_optimized.onnx",
    opset_version=13,
    input_names=['input'],
    output_names=['output']
)

# Дальше используем ONNX Runtime
# В 1.5-2 раза быстрее PyTorch

Распространенные ошибки и как их избежать

Ошибка 1: Обучение на слишком маленьком датасете

500 документов - это мало. Результат: модель переобучится на шум. Решение: аугментация + слабо контролируемое обучение.

Ошибка 2: Игнорирование предобработки

Кормите модели сырые сканы с тенями, поворотами, низким контрастом. Результат: низкая точность. Решение: стандартный пайплайн предобработки для всех документов.

Ошибка 3: Не тестирование на edge cases

Тестируете только на чистых документах. В production приходят фото с телефона, сканы с печатями, архивные документы. Результат: сломанный production. Решение: тестовая выборка должна отражать реальность.

Ошибка 4: Погоня за accuracy вместо CER

Accuracy считает слово целиком. CER считает символы. "Договор" vs "ДогоВор" - accuracy 0%, CER 12.5%. Решение: всегда используйте CER как основную метрику.

Интеграция в существующие системы

OCR редко работает изолированно. Вот типичные сценарии:

Сценарий A: RAG для документов

Распознаете документы, создаете эмбеддинги, кладете в векторную БД. Здесь важно сохранять структуру (заголовки, абзацы) для качественного чанкинга. Подробнее в статье про локальный RAG.

Сценарий B: Автоматизация workflows

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

Сценарий C: Анализ научных статей

Извлечение формул, ссылок, библиографии. Только OlmOCR-2 справится. Но готовьтесь к долгой обработке.

Что в будущем? Мультимодальные модели и не только

Тренд очевиден: OCR сливается с VLM (Vision-Language Models). Скоро мы будем не просто распознавать текст, а задавать вопросы по документам: "Какая сумма в пункте 4.2?", "Когда срок оплаты?", "Есть ли подпись на последней странице?".

Но сегодняшние VLM часто ломаются на сканах. Пока OCR + LLM раздельно работают надежнее.

Мой прогноз: через год появятся модели размером 3-7B параметров, которые будут делать OCR и Document QA одновременно. И работать на одной карте 8GB. Пока используйте проверенные решения.

Чеклист для запуска

  • [ ] Определили типы документов и требования к точности
  • [ ] Протестировали 2-3 модели на репрезентативной выборке
  • [ ] Посчитали CER (должен быть < 0.1 для out-of-the-box)
  • [ ] Подготовили датасет для fine-tuning (если нужно)
  • [ ] Настроили пайплайн предобработки изображений
  • [ ] Оптимизировали модель для production (квантование, ONNX)
  • [ ] Протестировали на edge cases (плохие сканы, печати, повороты)
  • [ ] Настроили мониторинг качества в production (CER на реальных данных)

Главный совет: начинайте с простого. Возьмите out-of-the-box модель, протестируйте на реальных данных. Если точность устраивает - не усложняйте. Fine-tuning - это недели работы, а не дни. Но когда нужен - он того стоит.