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

Aug 16 2020

Я использовал следующую реализацию PyTorch из ВОСТОКА (эффективный и точного Scene Text Detector) , чтобы идентифицировать и использовать габаритный прямоугольник вокруг текста в ряде изображений , и она работает очень хорошо!

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

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

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

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

Обработанные текстовые изображения

и
и код , я использую:


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 HernánAlarcón Aug 16 2020 at 11:48

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

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

Обученные данные. На момент написания APT-пакет tesseract-ocr-eng для 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 Colab вы можете увидеть мой тест.