Распознавание рукописных чисел и текста

Вопрос или проблема

Я работаю над проектом, в котором я успешно обнаружил ячейки на табличном изображении, и в каждой ячейке я пытаюсь обнаружить написанные числа и тексты, но я уже много раз терпел неудачу, пробуя множество вариантов.

Здесь я прикрепил свою последнюю попытку, используя pytesseract, хотя я знаю, что pytesseract не подходит для распознавания рукописного текста. Но все же он распознает, например, 5 как 51 и 79 как 71.

!apt-get install -y tesseract-ocr
from google.colab.patches import cv2_imshow
import cv2
import pytesseract

def recognize_digit(image):
    # Предобработка изображения для OCR
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    clahe = cv2.createCLAHE(clipLimit=0.9, tileGridSize=(8, 8))
    equalized = clahe.apply(gray)
    threshold = cv2.threshold(equalized, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
    denoised = cv2.fastNlMeansDenoising(threshold, h=0)
    
    # Удаление горизонтальных линий
    horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (24,1))
    detect_horizontal = cv2.morphologyEx(threshold, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
    cnts = cv2.findContours(detect_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    for c in cnts:
        cv2.drawContours(image, [c], -1, (255,255,255), 5)
        cv2.drawContours(denoised, [c], -1, (0, 0, 0), 5)
        cv2.drawContours(threshold, [c], -1, (0, 0, 0), 5)
    
    # Удаление вертикальных линий
    vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,25))
    detect_vertical = cv2.morphologyEx(threshold, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
    cnts = cv2.findContours(detect_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    for c in cnts:
        cv2.drawContours(image, [c], -1, (255,255,255), 5)
        cv2.drawContours(denoised, [c], -1, (0, 0, 0), 5)
        cv2.drawContours(threshold, [c], -1, (0, 0, 0), 5)
    
    # Отображение предварительно обработанного изображения
    cv2_imshow(denoised)

    # Применение OCR с помощью Tesseract
    config = "--psm 7 --oem 3 -c tessedit_char_whitelist=0123456789"
    text = pytesseract.image_to_string(denoised, config=config)

    return text.strip()

# Чтение изображения
image_path="51.png"
image = cv2.imread(image_path)

# Определение области интереса (координаты желаемой области)
x, y, w, h = 4, 4, 800, 100

# Обрезка изображения по определенной области
roi = image[y:y+h, x:x+w]

# Распознавание рукописной цифры в обрезанной области
recognized_digit = recognize_digit(roi)

# Печать распознанной цифры
print("Распознанная цифра:", recognized_digit)

Ответ или решение

Распознавание рукописных цифр и текста: эффективные стратегии и подходы

В рамках вашего проекта по распознаванию рукописных чисел и текста из таблиц, вы столкнулись с многими трудностями, используя технологии, такие как pytesseract. Давайте детально рассмотрим проблему и предложим более надежные решения, которые позволят вам добиться лучших результатов.

1. Проблемы с использованием pytesseract для рукописных шрифтов

Хотя pytesseract является мощным инструментом для распознавания текста в изображениях, его эффективность в распознавании рукописного текста значительно ниже по сравнению с печатными. Причины включают:

  • Неполное распознавание: Ошибки в интерпретации, подобные "5" вместо "51" и "79" вместо "71", часто возникают из-за особенностей рукописного шрифта.
  • Малое количество данных для обучения: Модели pytesseract обучены на относительно ограниченных наборов данных, что может привести к снижению точности при работе с рукописными текстами.

2. Подходы к улучшению распознавания рукописного текста

Для повышения точности распознавания рукописных чисел и текста, рекомендуется рассмотреть другие методы и инструменты:

A. Использование нейронных сетей
  • Конволюционные нейронные сети (CNN): Разработка и обучение специализированной модели CNN для распознавания рукописных цифр и букв могут значительно улучшить результаты. Например, метод, основанный на архитектурах, таких как MNIST, показал свою эффективность при работе с рукописной информацией.

  • Transfer Learning: Использование моделей глубокого обучения, таких как TensorFlow или PyTorch, с предварительно обученными весами на более крупных наборах данных (например, IAM Handwriting Database) может значительно повысить качество распознавания.

B. Попробуйте специализированные решения
  • Google Cloud Vision API: Этот API разработан для анализа изображений и может выполнять распознавание текста с высокой точностью, включая рукописный текст. Интеграция данного сервиса может стать отличным решением для вашего проекта.

  • OCR для рукописного текста: Используйте инструменты, специально разработанные для распознавания рукописи, такие как MyTextInYourHandwriting, которые могут обеспечить лучшие результаты, чем стандартные OCR-решения.

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

Как вы уже начали делать в своем коде, важно прорабатывать изображение перед распознаванием. Некоторые шаги включают:

  • Улучшение контраста: Использование методов, таких как CLAHE (Contrast Limited Adaptive Histogram Equalization), для улучшения видимости текста.

  • Устранение шума: Применение фильтров и морфологических операций для удаления фонового шума и повышения контрастности знаков.

  • Нормализация: Приведение изображений к единому формату и размеру может помочь улучшить результаты распознавания.

3. Пример кода для использования CNN

Вот предварительный шаблон для использования CNN для распознавания рукописных цифр с учетом дополнительных данных и архитектуры:

import tensorflow as tf
from tensorflow import keras

# Загрузка и предобработка данных
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape((60000, 28, 28, 1)).astype('float32') / 255
x_test = x_test.reshape((10000, 28, 28, 1)).astype('float32') / 255

# Создание модели CNN
model = keras.models.Sequential([
    keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    keras.layers.MaxPooling2D((2, 2)),
    keras.layers.Conv2D(64, (3, 3), activation='relu'),
    keras.layers.MaxPooling2D((2, 2)),
    keras.layers.Flatten(),
    keras.layers.Dense(64, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

# Компиляция модели
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

# Обучение модели
model.fit(x_train, y_train, epochs=5)

# Оценка модели
test_loss, test_acc = model.evaluate(x_test, y_test)
print(f'Accuracy: {test_acc}')

Заключение

Распознавание рукописного текста представляет собой сложную задачу, но увеличение точности достигается за счет использования более специализированных инструментов и методов, таких как нейронные сети и предобработка изображений. Надеемся, что эти предложения помогут вам успешно продвинуться в вашем проекте и достичь желаемых результатов.

Оцените материал
Добавить комментарий

Капча загружается...