Разработка OCR-системы распознавания текста на изображениях

Клиент попросил распознавать рукописные медицинские рецепты с фотографий — точность готовых решений не превышала 60%. Типичная ситуация: OCR-пайплайн даёт сбой на наклонных или засвеченных снимках, а специфические термины (названия лекарств) искажаются. Мы — команда AI-инженеров с 5+ годами опыта в

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1460
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1314
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1013
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1275
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    727
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1019

Клиент попросил распознавать рукописные медицинские рецепты с фотографий — точность готовых решений не превышала 60%. Типичная ситуация: OCR-пайплайн даёт сбой на наклонных или засвеченных снимках, а специфические термины (названия лекарств) искажаются. Мы — команда AI-инженеров с 5+ годами опыта в компьютерном зрении, реализовавшая более 50 проектов по распознаванию текста — собрали кастомную OCR-модель, которая подняла точность до 93%. Рассказываем, как устроен современный OCR и как мы его адаптируем под бизнес-задачи.

OCR (Optical Character Recognition) — извлечение текста из изображений. Современный пайплайн состоит из трёх этапов: детекция текстовых областей → выпрямление текста (rectification) → распознавание символов. Каждый этап влияет на итоговую точность, и слабое звено в любом месте ухудшает результат. Мы используем PaddleOCR как базовый фреймворк в 80% проектов для кириллицы — он даёт лучший баланс скорости и качества среди open-source решений. Заказчики экономят до 40% бюджета на обработке документов благодаря автоматизации.

Какой OCR-фреймворк выбрать для кириллицы?

Мы перебрали все популярные open-source решения. Для русского языка у каждого свои сильные стороны:

  • PaddleOCR (PP-OCRv4) — точность 92.8% на ICDAR2015, лучшая поддержка кириллицы среди open-source. Подходит для production: быстро работает на CPU, легко дообучается.
  • EasyOCR — простой API, но для русского точность на 5-10% ниже, а скорость на CPU — в 2-3 раза медленнее.
  • TrOCR (Microsoft) — transformer-based, выдаёт CER 2.89% на печатном тексте. Но требует GPU, а для кириллицы нужно дообучение.
  • Tesseract 5 — классика, настраивается под любой шрифт, но без кастомного тренинга проигрывает PaddleOCR на сложных документах.
Фреймворк Кириллица Скорость (CPU) Лучший для
PaddleOCR Отличная Быстро Общий OCR, производство
EasyOCR Хорошая Медленно Прототипы
TrOCR Хорошая Средне Печатные документы
Tesseract 5 Хорошая Средне On-premise, кастомные шрифты

Согласно официальному бенчмарку, PaddleOCR показывает точность 92.8% на ICDAR2015 (PaddleOCR GitHub).

Почему важна предобработка изображений?

Качество OCR напрямую зависит от того, что подаётся на вход модели. Фотография с мобильного телефона — низкий контраст, шум, наклон. Мы применяем цепочку преобразований:

def preprocess_for_ocr(image: np.ndarray) -> np.ndarray: # Исправление наклона (deskewing) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) angle = detect_skew_angle(gray) if abs(angle) > 0.5: image = rotate_image(image, -angle) # Удаление шума denoised = cv2.fastNlMeansDenoisingColored(image, h=10) # Повышение контраста (CLAHE) lab = cv2.cvtColor(denoised, cv2.COLOR_BGR2LAB) l, a, b = cv2.split(lab) clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8)) l = clahe.apply(l) denoised = cv2.cvtColor(cv2.merge([l, a, b]), cv2.COLOR_LAB2BGR) return denoised 

Даже простой deskew поднимает accuracy на 3-5%. Для старых сканов с жёлтым фоном используем адаптивную бинаризацию — Otsu или Sauvola. Предобработка особенно критична для рукописного текста: она повышает точность распознавания на 15-20%.

Дополнительные методы повышения точности
  • Использование языковой модели для коррекции контекстуальных ошибок (например, путаница «0» и «O»).
  • Применение ансамбля моделей для распознавания сложных шрифтов.
  • Аугментация данных: повороты, шум, размытие для улучшения устойчивости.

Как мы делаем: кейс распознавания медицинских рецептов

Развернём один реальный проект из нашей практики. Задача: принимать фото рецептов из мобильного приложения, распознавать название лекарства, дозировку и инструкцию. Проблемы: рукописный текст врачей, размытые снимки, наложение штампов.

Решение:

  1. Предобработка: CLAHE + бинаризация + удаление теней через морфологию.
  2. Детекция: дообученная PaddleOCR detection model на 2000 размеченных рецептах (разметка bbox).
  3. Распознавание: recognition model на основе PP-OCRv4, дообученная на 50000 синтетических рецептов (сгенерированы с разными почерками).
  4. Постобработка: словарь лекарств (10000 наименований) + LanguageTool для коррекции ошибок OCR + LLM для контекстной коррекции (путаница 0/O).

Результат: точность на тестовой выборке — 93% (Character Error Rate 0.07). Время обработки одного изображения — 1.5 секунды на CPU. Для сравнения: Tesseract 5 без дообучения дал бы около 40-50% на таких данных — наш пайплайн оказался в 2 раза точнее.

Процесс работы

Любой проект по OCR у нас проходит через 5 этапов:

  1. Аналитика: оценка данных, типичные дефекты, доменный словарь.
  2. Проектирование: выбор фреймворка, архитектура пайплайна (очереди, кеширование).
  3. Реализация: написание кода, дообучение моделей, интеграция с вашей системой.
  4. Тестирование: измерение точности на валидационной выборке, A/B тест на боевых данных.
  5. Деплой и поддержка: упаковка в Docker, REST API или gRPC, мониторинг метрик.

Что входит в работу

  • Развёрнутая документация пайплайна с описанием всех компонентов.
  • Обученная модель (weights + model card).
  • Исходный код с инструкцией по запуску.
  • Интеграция с вашим хранилищем (S3, MinIO) и очередями (RabbitMQ, Kafka).
  • Обучение вашей команды работе с системой.
  • Гарантия на точность (фиксируем метрики в договоре).

Сроки

Задача Срок
OCR через готовый фреймворк + API 1–2 недели
Сложные документы с предобработкой 2–4 недели
Кастомный шрифт / рукописный текст 4–8 недель

Стоимость рассчитывается индивидуально после анализа данных. Получите консультацию — оценим ваш проект за один день. Свяжитесь с нами, чтобы обсудить детали и примерную стоимость.