Texte facilement lisible non reconnu par tesseract

Aug 16 2020

J'ai utilisé l' implémentation PyTorch suivante d' EAST (Efficient and Accurate Scene Text Detector) pour identifier et dessiner des cadres de délimitation autour du texte dans un certain nombre d'images et cela fonctionne très bien !

Cependant, la prochaine étape de l'OCR avec laquelle j'essaie pytesseractd'extraire le texte de ces images et de les convertir en chaînes - échoue horriblement. En utilisant toutes les configurations possibles de --oemet --psm, je ne parviens pas pytesseractà détecter ce qui semble être un texte très clair, par exemple :

Le texte reconnu se trouve sous les images. Même si j'ai appliqué une amélioration du contraste et essayé de dilater et d'éroder, je n'arrive pas à faire en sorte que tesseract reconnaisse le texte. Ceci n'est qu'un exemple parmi de nombreuses images où le texte est encore plus grand et plus clair. Toutes les suggestions sur les transformations, les configurations ou d'autres bibliothèques seraient utiles !

MISE À JOUR : Après avoir essayé le flou gaussien + le seuillage Otso, je suis capable d'obtenir du texte noir sur fond blanc (apparemment, ce qui est idéal pour pytesseract), et j'ai également ajouté la langue espagnole, mais il ne peut toujours pas lire le texte très clair - par exemple :

se lit comme du charabia.

Les images de texte traitées sont

et
et le code que j'utilise:


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)

Réponses

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

Utilisez ces fichiers de données mis à jour.

Ce guide critique les performances prêtes à l'emploi (et peut-être que la précision pourrait également être affectée):

Données formées. Au moment d'écrire ces lignes, le package APT tesseract-ocr-eng pour Ubuntu 18.10 a de terribles performances prêtes à l'emploi, probablement à cause de données de formation corrompues.

Selon le test suivant que j'ai effectué, l'utilisation des fichiers de données mis à jour semble fournir de meilleurs résultats. C'est le code que j'ai utilisé:

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

J'ai téléchargé spa.traineddata (vos exemples d'images contiennent des mots espagnols, n'est-ce pas ?) sur ./tessdata/spa.traineddata. Et le résultat était :

ARMACIAS


Et pour la deuxième image :

PECIALIZADA:


J'ai utilisé --psm 7parce qu'ici il est dit que cela signifie "Traiter l'image comme une seule ligne de texte" et j'ai pensé que cela devrait avoir un sens pour vos images de test.

Dans ce Google Colab , vous pouvez voir le test que j'ai fait.