Вопрос или проблема
Я работаю над проектом, в котором я успешно обнаружил ячейки на табличном изображении, и в каждой ячейке я пытаюсь обнаружить написанные числа и тексты, но я уже много раз терпел неудачу, пробуя множество вариантов.
Здесь я прикрепил свою последнюю попытку, используя 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}')
Заключение
Распознавание рукописного текста представляет собой сложную задачу, но увеличение точности достигается за счет использования более специализированных инструментов и методов, таких как нейронные сети и предобработка изображений. Надеемся, что эти предложения помогут вам успешно продвинуться в вашем проекте и достичь желаемых результатов.