Testo facilmente leggibile non riconosciuto da tesseract

Aug 16 2020

Ho utilizzato la seguente implementazione PyTorch di EAST (Efficient and Accurate Scene Text Detector) per identificare e disegnare riquadri di delimitazione attorno al testo in una serie di immagini e funziona molto bene!

Tuttavia, il passaggio successivo dell'OCR con cui sto provando pytesseractper estrarre il testo da queste immagini e convertirle in stringhe sta fallendo in modo orribile. Utilizzando tutte le possibili configurazioni di --oeme --psm, non riesco pytesseracta rilevare quello che sembra essere un testo molto chiaro, ad esempio:

Il testo riconosciuto si trova sotto le immagini. Anche se ho applicato il miglioramento del contrasto e ho anche provato a dilatare ed erodere, non riesco a far riconoscere il testo al tesseract. Questo è solo un esempio di molte immagini in cui il testo è ancora più grande e chiaro. Qualsiasi suggerimento su trasformazioni, configurazioni o altre librerie sarebbe utile!

AGGIORNAMENTO: dopo aver provato la sfocatura gaussiana + la soglia Otso, sono in grado di ottenere testo nero su sfondo bianco (apparentemente ideale per pytesseract) e ho anche aggiunto la lingua spagnola, ma non riesco ancora a leggere un testo molto semplice, ad esempio:

si legge come incomprensibile.

Le immagini di testo elaborate sono

e
e il codice che sto 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)

Risposte

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

Usa questi file di dati aggiornati.

Questa guida critica le prestazioni predefinite (e forse anche la precisione potrebbe risentirne):

Dati addestrati. Al momento della scrittura, il pacchetto APT tesseract-ocr-eng per Ubuntu 18.10 ha prestazioni terribili, probabilmente a causa di dati di addestramento corrotti.

Secondo il seguente test che ho eseguito, l'utilizzo dei file di dati aggiornati sembra fornire risultati migliori. Questo è il codice che ho usato:

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

Ho scaricato spa.traineddata (le tue immagini di esempio hanno parole spagnole, giusto?) in ./tessdata/spa.traineddata. E il risultato è stato:

ARMACIAS


E per la seconda immagine:

PECIALIZADA:


L'ho usato --psm 7perché qui dice che significa "Tratta l'immagine come una singola riga di testo" e ho pensato che avrebbe dovuto avere senso per le tue immagini di prova.

In questo Google Colab puoi vedere il test che ho fatto.