Texto fácilmente legible no reconocido por tesseract

Aug 16 2020

He usado la siguiente implementación PyTorch de EAST (Detector de texto de escena eficiente y preciso) para identificar y dibujar cuadros delimitadores alrededor del texto en varias imágenes y ¡funciona muy bien!

Sin embargo, el siguiente paso de OCR que estoy intentando pytesseractpara extraer el texto de estas imágenes y convertirlas en cadenas está fallando terriblemente. Usando todas las configuraciones posibles de --oemy --psm, no puedo pytesseractdetectar lo que parece ser un texto muy claro, por ejemplo:

El texto reconocido está debajo de las imágenes. Aunque apliqué la mejora del contraste y también intenté dilatar y erosionar, no puedo hacer que Tesseract reconozca el texto. Este es solo un ejemplo de muchas imágenes donde el texto es aún más grande y claro. ¡Cualquier sugerencia sobre transformaciones, configuraciones u otras bibliotecas sería útil!

ACTUALIZACIÓN: después de probar el desenfoque gaussiano + el umbral Otso, puedo obtener texto negro sobre fondo blanco (aparentemente, lo cual es ideal para pytesseract), y también agregué el idioma español, pero aún no puedo leer texto muy simple, por ejemplo:

se lee como un galimatías.

Las imágenes de texto procesadas son

y
el código que estoy usando:


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)

Respuestas

1 HernánAlarcón Aug 16 2020 at 11:48

Utilice estos archivos de datos actualizados.

Esta guía critica el rendimiento listo para usar (y tal vez la precisión también podría verse afectada):

Datos entrenados. En el momento de escribir este artículo, el paquete APT tesseract-ocr-eng para Ubuntu 18.10 tiene un rendimiento terrible desde el primer momento, probablemente debido a datos de entrenamiento corruptos.

De acuerdo con la siguiente prueba que hice, el uso de los archivos de datos actualizados parece proporcionar mejores resultados. Este es el código que usé:

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

Descargué spa.traineddata (sus imágenes de ejemplo tienen palabras en español, ¿verdad?) a ./tessdata/spa.traineddata. Y el resultado fue:

ARMACIAS


Y para la segunda imagen:

PECIALIZADA:


Lo usé --psm 7porque aquí dice que significa "Tratar la imagen como una sola línea de texto" y pensé que debería tener sentido para sus imágenes de prueba.

En este Google Colab puedes ver la prueba que hice.