Распознавание текста на изображениях — давно решённая задача, но скорость и гибкость готовых инструментов по-прежнему оставляют желать лучшего. Разработчик собрала собственный OCR-пайплайн на базе моделей PaddleOCR, сконвертировав их в формат ONNX и запустив через OnnxRuntime. Результат: инференс в 4 раза быстрее стандартного PaddleOCR-фреймворка и в 2 раза быстрее готового ONNX-решения от разработчиков Paddle.

Выбор базового движка был нетривиальным. Tesseract — проверенный open-source инструмент, но без поддержки GPU, что делает его неприемлемым для сервисов с высокой нагрузкой. EasyOCR популярен и поддерживает рукописные шрифты, однако тянет за собой PyTorch весом в несколько гигабайт и потребляет много оперативной памяти при параллельной обработке. OmniParser использует YOLO для поиска объектов интерфейса, а затем извлекает текст — избыточная архитектура для задачи простого чтения документа. PaddleOCR выиграл по трём параметрам: скорость на CPU и GPU, точность на русско-английских текстах и нативная совместимость с ONNX.

МетрикаPaddleOCREasyOCR
WER (ошибок на слово)0,0560,12
CER (ошибок на символ)0,0160,03
ROUGE-1 (% общих слов с эталоном)97,5%95,6%
ROUGE-L (% общей последовательности)95,3%90,8%

По метрикам качества разрыв между PaddleOCR и EasyOCR существенный. WER (Word Error Rate, доля ошибочных слов) у Paddle — 0,056, у EasyOCR — 0,12. CER (Character Error Rate) — 0,016 против 0,03. ROUGE-L, измеряющий совпадение последовательностей с эталоном, — 95,3% против 90,8%. На практике это означает вдвое меньше ошибок при распознавании смешанных текстов.

PaddleOCR состоит из трёх последовательных нейросетей: cls (поворот), det (поиск текста), rec (распознавание символов).

Архитектура пайплайна состоит из трёх последовательных нейросетевых моделей. Первая — cls — свёрточная сеть, определяющая угол поворота изображения: 0°, 90°, 180° или 270°. Этот этап опционален: если документы заведомо ориентированы правильно, его можно пропустить, поскольку детектор самостоятельно справляется с отклонениями до 10 градусов. Вторая модель — det — детектор текстовых областей на базе ResNet с остаточными связями. Она строит карту вероятностей для каждого пикселя: «текст» или «фон». Метод дифференцируемой бинаризации (DB) затем выделяет прямоугольные области, где средняя вероятность наличия текста превышает порог 0,6. Третья модель — rec — дешифровщик символов, использующий связку трансформера SVTR и лёгкой свёрточной сети LCNet. LCNet быстро извлекает визуальные признаки, SVTR анализирует их в локальном и глобальном режимах, учась одновременно выделять буквы и понимать их порядок. На выходе — матрица вероятностей по символам словаря, из которой через argmax собирается итоговая строка.

Конвертация всех трёх моделей в ONNX освобождает пайплайн от зависимости от фреймворка PaddlePaddle. Веса, порядок операций и граф вычислений сохраняются в стандартизированном формате, который OnnxRuntime исполняет с оптимизациями под конкретное железо — CPU или GPU — без переписывания кода. Именно здесь и возникает основной прирост скорости по сравнению с запуском через оригинальный фреймворк.

Помимо скорости, кастомный пайплайн даёт контроль над постобработкой. Стандартный PaddleOCR возвращает фиксированный формат результата: нельзя, например, отфильтровать одиночные символы и оставить только текст крупных блоков, или сгруппировать области по смыслу для поиска заголовков документов. Собственная реализация позволяет добавлять такую логику на любом этапе пайплайна без модификации исходного кода фреймворка.