Классический OCR мёртв. В Morana Labs мы ежедневно разворачиваем industrial ИИ и high-load инференс на edge-железе заказчиков, и видим это на каждой новой площадке. Вы пишете в консоли tesseract image.jpg stdout -l rus --psm 4, пытаясь настроить OCR распознавание документов, и ждёте чуда. Чуда не происходит. Тема нашего разбора — OCR в реальных условиях: плохие сканы, рукописный текст и печати, на которых ломается распознавание, если использовать устаревшие подходы.
На входе — скан ТОРГ-12. Его прогнали через дешёвый потоковый сканер, предварительно помяв в бардачке Газели. Поверх итоговой суммы стоит жирная синяя печать, а рядом кладовщик от руки набросал «принято с браком». Стандартный коробочный движок выдаёт вместо ИНН и суммы бессмысленный набор кириллицы и спецсимволов. Извлечение данных из сканов превращается в фарс. Конвейер встал.
Где классический OCR упирается в потолок
Любой классический движок базируется на гипотезе идеального контраста. Сначала отрабатывает алгоритм Отсу — ищет порог, чтобы разделить пиксели на чёрный текст и белый фон. На мятой бумаге неизбежно появляются градиентные тени от сгибов. Примитивная бинаризация заливает эти тени чёрным. Текст исчезает навсегда.
Дальше идёт поиск строк. Эвристика ищет горизонтальные линии пикселей. Синяя печать или размашистая подпись гелевой ручкой, перечёркивающая строку, фатально ломает эту логику. Машина считает пересечение текстов одним невероятно кривым символом. Базовый OCR не умеет разделять слои — для него всё это одна плоская картинка.
Нейросетевое извлечение: от букв к топологии документа
Пытаться распознать весь сложный документ одним проходом — дилетантство. Реальные документы требуют каскадного пайплайна и перехода от чтения пикселей к семантическому пониманию сцены. Мы больше не читаем текст слева направо. Сначала отрабатывает сегментатор (обычно легковесные вариации YOLO для edge-устройств). Его задача — найти не буквы, а семантические блоки: здесь таблица, здесь блок реквизитов, здесь печать. Печать в этой парадигме — не визуальный шум, который нужно отфильтровать любой ценой. Это независимый класс объекта. Если синий штамп накладывается на сумму, применяются генеративные сети или алгоритмы цветовой сегрегации. Синий канал отделяется от чёрного тонера лазерного принтера ещё до того, как кроп с суммой попадёт в модуль распознавания.
Рукописный текст требует специализированных архитектур типа CRNN (Convolutional Recurrent Neural Network), натренированных на небрежной кириллице. Тяжеловесный трансформер здесь зачастую избыточен: он сожрёт всю память GPU на локальном сервере, а нам нужен throughput и жёсткий реалтайм без отправки данных в облако. Таблицы — отдельная категория боли. Границы ячеек часто вообще не пропечатаны. Решение в лоб тут не работает. Парсинг таких структур сейчас делается через графовые нейросети или архитектуры семейства LayoutLM, где критически важен не только сам текст, но и пространственные координаты (bounding boxes) каждого слова относительно соседей. Топология документа становится важнее букв. Только так извлечённая каша символов собирается обратно в стройный JSON с парами ключ-значение.
Постобработка и контур ручной проверки
Вытащить сырой текст — только половина задачи. Данные обязаны быть консистентными. Если нейросеть выдала ИНН контрагента с уверенностью (confidence score) 98%, но этого номера нет в вашем справочнике ERP — алгоритм лжёт. Защита от таких галлюцинаций строится на жёстком пост-процессинге.
- Сверка со справочниками: Валидация критичных полей (ИНН, БИК, названия) с базами 1С через нечёткий поиск на базе расстояния Левенштейна или триграмм.
- Математическая логика: Простая проверка правил предметной области. Сумма по строкам таблицы обязана биться с итогом по документу с учётом НДС.
- Маршрутизация операторам: Сброс спорных случаев на человека по динамическому порогу уверенности модели.
Человек в этом контуре остаётся, но его роль меняется. Он больше не оператор ввода данных, он — валидатор аномалий. Если движок сомневается в распознанной цифре (confidence ниже 0.90) или математическая сверка не сошлась, на экран бухгалтера выводится не весь скан, а только конкретный вырезанный фрагмент. Одно нажатие клавиши подтверждает или корректирует символ. Система выдерживает пиковую нагрузку закрытия месяца, коммерческая тайна не покидает периметр предприятия, а данные в ERP попадают чистыми.