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 недель |







