Клиент попросил распознавать рукописные медицинские рецепты с фотографий — точность готовых решений не превышала 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»).
- Применение ансамбля моделей для распознавания сложных шрифтов.
- Аугментация данных: повороты, шум, размытие для улучшения устойчивости.
Как мы делаем: кейс распознавания медицинских рецептов
Развернём один реальный проект из нашей практики. Задача: принимать фото рецептов из мобильного приложения, распознавать название лекарства, дозировку и инструкцию. Проблемы: рукописный текст врачей, размытые снимки, наложение штампов.
Решение:
- Предобработка: CLAHE + бинаризация + удаление теней через морфологию.
- Детекция: дообученная PaddleOCR detection model на 2000 размеченных рецептах (разметка bbox).
- Распознавание: recognition model на основе PP-OCRv4, дообученная на 50000 синтетических рецептов (сгенерированы с разными почерками).
- Постобработка: словарь лекарств (10000 наименований) + LanguageTool для коррекции ошибок OCR + LLM для контекстной коррекции (путаница 0/O).
Результат: точность на тестовой выборке — 93% (Character Error Rate 0.07). Время обработки одного изображения — 1.5 секунды на CPU. Для сравнения: Tesseract 5 без дообучения дал бы около 40-50% на таких данных — наш пайплайн оказался в 2 раза точнее.
Процесс работы
Любой проект по OCR у нас проходит через 5 этапов:
- Аналитика: оценка данных, типичные дефекты, доменный словарь.
- Проектирование: выбор фреймворка, архитектура пайплайна (очереди, кеширование).
- Реализация: написание кода, дообучение моделей, интеграция с вашей системой.
- Тестирование: измерение точности на валидационной выборке, A/B тест на боевых данных.
- Деплой и поддержка: упаковка в Docker, REST API или gRPC, мониторинг метрик.
Что входит в работу
- Развёрнутая документация пайплайна с описанием всех компонентов.
- Обученная модель (weights + model card).
- Исходный код с инструкцией по запуску.
- Интеграция с вашим хранилищем (S3, MinIO) и очередями (RabbitMQ, Kafka).
- Обучение вашей команды работе с системой.
- Гарантия на точность (фиксируем метрики в договоре).
Сроки
| Задача | Срок |
|---|---|
| OCR через готовый фреймворк + API | 1–2 недели |
| Сложные документы с предобработкой | 2–4 недели |
| Кастомный шрифт / рукописный текст | 4–8 недель |
Стоимость рассчитывается индивидуально после анализа данных. Получите консультацию — оценим ваш проект за один день. Свяжитесь с нами, чтобы обсудить детали и примерную стоимость.







