OCR: от классики до распознавания через LLM
Как из пикселей получить текст: классический OCR-пайплайн (бинаризация, сегментация, распознавание символов), современный DL-OCR с CRNN и CTC, и чтение документов мультимодальными LLM — с их главным риском, галлюцинациями.
Интуиция
Задача OCR (optical character recognition) звучит просто: на входе — картинка с текстом, на выходе — машиночитаемая строка. Но между «пикселями» и «буквами» — пропасть: буква на скане размазана, фон неравномерный, строка наклонена. Всю историю OCR можно рассказать как борьбу с этой пропастью тремя поколениями инструментов: правила и шаблоны → свёрточные сети → мультимодальные LLM.
Классический пайплайн (эпоха Tesseract)
Классика разбивает задачу на явные шаги:
- Препроцессинг. Картинку переводят в оттенки серого и бинаризуют: пиксели темнее порога — «чернила», светлее — «бумага». Порог можно подобрать автоматически (идея метода Otsu: выбрать порог, который лучше всего разделяет гистограмму яркостей на два кластера). Плюс выравнивание наклона (deskew).
- Сегментация. Страницу режут на строки, строки — на слова и символы. Простой приём — проекции: если просуммировать чёрные пиксели по каждому столбцу, пустые столбцы окажутся границами между символами.
- Распознавание символа. Раньше — сравнение с шаблонами (template matching) и рукописные признаки; затем — CNN-классификатор. Это буквально задача распознавания цифр из пикселей: вырезанный символ → класс.
- Пост-обработка. Языковая модель и словарь чинят одиночные ошибки: «6ЫЛО» → «БЫЛО», потому что слово «6ЫЛО» невозможно.
Современный DL-OCR
Глубокое обучение убрало самые хрупкие шаги. Современный пайплайн — два этапа:
- Детекция текста (идея CRAFT/EAST): свёрточная сеть находит на фото области с текстом — рамки строк и слов, под любым углом, на вывесках и чеках. Это задача detection, как в компьютерном зрении.
- Распознавание строки: CRNN + CTC. Свёртки скользят по строке и превращают её в последовательность признаков-«кадров», рекуррентный слой читает её слева направо, а CTC-лосс выравнивает кадры с буквами без посимвольной сегментации — той самой, что ломалась в классике на слипшихся буквах.
Такой стек (например, PaddleOCR, EasyOCR) быстрый, дешёвый и хорошо работает на печатном тексте даже с фото.
OCR через VLM: чтение с пониманием
Третье поколение — показать страницу мультимодальной LLM (как это устроено — в теме как LLM видят изображения). Модель «читает» документ целиком: понимает вёрстку, таблицы, поля формы, сноски, рукописные пометки — и может сразу вернуть структурированный JSON («номер счёта», «сумма», «дата»), это называется structured extraction. Не нужен ни отдельный детектор, ни правила парсинга таблиц.
Сравнение честное такое: классика и DL-OCR — быстро, дёшево, предсказуемо, отлично на чистых сканах, работает локально; VLM — понимает контекст и структуру, справляется с рукописью и сложной вёрсткой, но дороже, медленнее и галлюцинирует.
Практика: когда что выбрать
Рабочее правило — идти от документа и цены ошибки:
- Чистые сканы печатного текста, большие объёмы (архив договоров, книги) — классика или лёгкий DL-OCR: копейки за страницу, работает на CPU и локально, ошибки редки и заметны.
- Фото документов, чеки, вывески — DL-OCR с детекцией (CRAFT/EAST + CRNN): устойчив к наклону и фону, всё ещё дёшев.
- Сложная вёрстка, таблицы, рукопись, извлечение полей из разношёрстных шаблонов — VLM: она одна заменяет детектор, распознаватель и парсер структуры.
- Критичные данные (паспорта, платежи, медицина) — гибрид: дешёвый OCR читает пиксели, LLM выполняет пост-обработку (чинит ошибки, раскладывает по полям), а поверх — жёсткая валидация: контрольные цифры, форматы, сверка уверенности, эскалация на человека.
Гибрид «OCR + LLM-постобработка» хорош ещё и тем, что LLM видит только текст: у неё физически нет возможности «дочитать» несуществующие пиксели — худший сценарий чистого VLM-OCR устранён по построению.
- «Спроектируй распознавание паспортов/чеков» — пайплайн: детекция документа и полей → распознавание (классика/CRNN для печатных полей) → валидация (контрольные цифры, форматы дат, справочники) → ручная проверка при низкой уверенности. VLM — для сложной вёрстки, но с обязательной валидацией.
- «Почему VLM-OCR опасен для критичных данных?» — галлюцинации: модель уверенно «дочитывает» нечитаемое, ошибку не видно без сверки с источником.
- «Чем CRNN+CTC лучше посимвольной сегментации?» — распознаёт строку целиком, не требуя резать её на буквы; слипшиеся символы перестают быть проблемой.
- «Когда достаточно Tesseract?» — чистые сканы печатного текста, большие объёмы, требования по цене/приватности (всё локально).