OCR Text Recognition System Development

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1 servicesAll 1566 services
OCR Text Recognition System Development
Medium
~3-5 business days
FAQ
AI Development Areas
AI Solution Development Stages
Latest works
  • image_website-b2b-advance_0.png
    B2B ADVANCE company website development
    1215
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    852
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1041
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    823

System Development распознавания текста на изображениях (OCR)

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

Полный OCR-пайплайн

from paddleocr import PaddleOCR
import cv2
import numpy as np

class OCRPipeline:
    def __init__(self, lang: str = 'ru', use_gpu: bool = True):
        self.ocr = PaddleOCR(
            use_angle_cls=True,     # определение угла текста
            lang=lang,
            use_gpu=use_gpu,
            det_model_dir='./models/det',
            rec_model_dir='./models/rec',
            cls_model_dir='./models/cls'
        )

    def extract_text(self, image_path: str) -> list[dict]:
        result = self.ocr.ocr(image_path, cls=True)

        extracted = []
        for line in result[0]:
            bbox_points = line[0]   # 4 угловые точки
            text = line[1][0]
            confidence = line[1][1]

            extracted.append({
                'text': text,
                'confidence': confidence,
                'bbox': bbox_points,
                'bbox_rect': self._points_to_rect(bbox_points)
            })

        return extracted

    def extract_full_text(self, image_path: str) -> str:
        items = self.extract_text(image_path)
        # Сортируем по вертикальной позиции для правильного порядка
        items.sort(key=lambda x: x['bbox_rect'][1])
        return '\n'.join(item['text'] for item in items)

Сравнение OCR-фреймворков

PaddleOCR — лучший open-source вариант для кириллицы. Поддерживает 80+ языков. PP-OCRv4: Character Recognition Accuracy 92.8% на тесте ICDAR2015.

EasyOCR — простой API, хорошее качество для быстрого прототипирования. Слабее PaddleOCR по скорости.

TrOCR (Microsoft) — transformer-based OCR. Лучший для печатного текста, особенно документов. TrOCR-Large: CER 2.89% на IAM printed dataset.

Tesseract 5 — классика на базе LSTM. Бесплатный, хорошо настраивается для конкретных шрифтов и доменов.

Фреймворк Кириллица Скорость (CPU) Лучший для
PaddleOCR Отличная Быстро Общий OCR, производство
EasyOCR Хорошая Медленно Прототипы
TrOCR Хорошая Средне Печатные документы
Tesseract 5 Хорошая Средне On-premise, кастомные шрифты

Предобработка изображений

Качество 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)

    # Бинаризация (опционально для чёрно-белых документов)
    # gray = cv2.cvtColor(denoised, cv2.COLOR_BGR2GRAY)
    # _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

    return denoised

Training кастомной OCR-модели

Для специфических шрифтов, рукописного текста или нестандартных символов (технические обозначения, медицинские термины) — дообучение на кастомных данных.

Генерация тренировочных данных для Tesseract:

# Синтетическая генерация через trdg
trdg -c 10000 -w 5 -f 32 -l ru --output_dir data/

Для PaddleOCR: дообучение recognition model на датасете пар (cropped text image, label).

Постобработка: коррекция ошибок

После OCR применяем языковую коррекцию:

  • Проверка орфографии через pyspellchecker / LanguageTool
  • Domain-specific словари (названия лекарств, юридические термины)
  • LLM-based коррекция контекстных ошибок (путаница 0/O, l/1, etc.)
Задача Срок
OCR через готовый фреймворк + API 1–2 недели
Сложные документы с предобработкой 2–4 недели
Кастомный шрифт / рукописный текст 4–8 недель