Легко читаемый текст, не распознанный tesseract

#python #python-imaging-library #ocr #tesseract #python-tesseract

#python #python-imaging-library #распознавание текста #tesseract #python-tesseract

Вопрос:

Я использовал следующую реализацию PyTorch EAST (Efficient and Accurate Scene Text Detector) для определения и рисования ограничивающих рамок вокруг текста на ряде изображений, и это работает очень хорошо!

Однако следующий шаг распознавания, с помощью которого я пытаюсь pytesseract извлечь текст из этих изображений и преобразовать их в строки, терпит ужасную неудачу. Используя все возможные конфигурации --oem и --psm , я не могу pytesseract определить, что кажется очень четким текстом, например:

введите описание изображения здесь

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

ОБНОВЛЕНИЕ: Попробовав размытие по Гауссу пороговое значение Otso, я могу получить черный текст на белом фоне (по-видимому, это идеально для pytesseract), а также добавил испанский язык, но он по-прежнему не может читать очень простой текст — например:

img3

читается как тарабарщина.

Обработанные текстовые изображения — это img1 и img2 и код, который я использую:

 
img_path = './images/fesa.jpg'
img = Image.open(img_path)
boxes = detect(img, model, device)
origbw = cv2.imread(img_path, 0)

for box in boxes:
    
    box = box[:-1]
    poly = [(box[0], box[1]),(box[2], box[3]),(box[4], box[5]),(box[6], box[7])]
    x = []
    y = []

    for coord in poly:
        x.append(coord[0])
        y.append(coord[1])

    startX = int(min(x))
    startY = int(min(y))
    endX = int(max(x))
    endY = int(max(y))


    #use pre-defined bounding boxes produced by EAST to crop the original image 
    
    cropped_image = origbw[startY:endY, startX:endX]

    #contrast enhancement 

    clahe = cv2.createCLAHE(clipLimit=4.0, tileGridSize=(8,8))
    res = clahe.apply(cropped_image)

    text = pytesseract.image_to_string(res, config = "-psm 12")
    
    plt.imshow(res)
    plt.show()
    print(text)
  

Ответ №1:

Используйте эти обновленные файлы данных.

Это руководство критикует стандартную производительность (и, возможно, это также может повлиять на точность):

Подготовленные данные. На момент написания tesseract-ocr-eng APT package для Ubuntu 18.10 имеет ужасную производительность «из коробки», вероятно, из-за поврежденных обучающих данных.

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

 import pytesseract
from PIL import Image
print(pytesseract.image_to_string(Image.open('farmacias.jpg'), lang='spa', config='--tessdata-dir ./tessdata --psm 7'))
  

Я загрузил spa.traineddata (в ваших примерах изображений есть испанские слова, верно?) в ./tessdata/spa.traineddata . И результат был:

 ARMACIAS


  

И для второго изображения:

 PECIALIZADA:


  

Я использовал, --psm 7 потому что здесь говорится, что это означает «Обрабатывать изображение как единственную текстовую строку», и я подумал, что это должно иметь смысл для ваших тестовых изображений.

В этом колабе Google вы можете увидеть тест, который я провел.

Комментарии:

1. Это так странно — я в точности следовал этим указаниям, но для меня это фактически ухудшило ситуацию. Текст из изображения теперь не извлекается. Как может быть, что ваша версия работает, а моя нет? У меня последняя версия pytesseract и я только что загрузил самую последнюю версию spanish trained data

2. @the_darkside Я не уверен, почему ваша версия не работает. Я добавил ссылку на Google Colab, где вы можете посмотреть проведенный мной тест.