Texte facilement lisible non reconnu par tesseract
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 pytesseract
d'extraire le texte de ces images et de les convertir en chaînes - échoue horriblement. En utilisant toutes les configurations possibles de --oem
et --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
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
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 7
parce 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.