Czytelny tekst nierozpoznawany przez tesseract

Aug 16 2020

Użyłem następujący realizację PyTorch z WSCHODU (Sprawne i dokładne sceny Tekst Detector), aby zidentyfikować i wyciągnąć obwiedni wokół tekstu w wielu obrazach i działa bardzo dobrze!

Jednak następny krok OCR, z którym próbuję pytesseractwyodrębnić tekst z tych obrazów i przekonwertować je na ciągi - kończy się strasznym niepowodzeniem. Używając wszystkich możliwych konfiguracji --oemi --psm, nie jestem w stanie pytesseractwykryć czegoś, co wydaje się być bardzo czytelnym tekstem, na przykład:

Rozpoznany tekst znajduje się pod obrazami. Mimo że zastosowałem wzmocnienie kontrastu, a także spróbowałem rozszerzyć i erodować, nie mogę sprawić, by tesseract rozpoznał tekst. To tylko jeden przykład wielu obrazów, na których tekst jest jeszcze większy i wyraźniejszy. Wszelkie sugestie dotyczące transformacji, konfiguracji lub innych bibliotek byłyby pomocne!

AKTUALIZACJA: Po wypróbowaniu rozmycia Gaussa + progowania Otso, jestem w stanie uzyskać czarny tekst na białym tle (najwyraźniej jest to idealne rozwiązanie dla pytesseract), a także dodałem język hiszpański, ale nadal nie mogę czytać bardzo zwykłego tekstu - na przykład:

brzmi jak bełkot.

Przetworzone obrazy tekstowe to

i
oraz kod, którego używam:


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)

Odpowiedzi

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

Użyj tych zaktualizowanych plików danych.

Ten przewodnik krytykuje wydajność po wyjęciu z pudełka (i być może może to również wpłynąć na dokładność):

Przeszkolone dane. W chwili pisania tego tekstu pakiet APT tesseract-ocr-eng dla Ubuntu 18.10 ma straszną wydajność po wyjęciu z pudełka, prawdopodobnie z powodu uszkodzonych danych szkoleniowych.

Zgodnie z poniższym testem, który przeprowadziłem, używanie zaktualizowanych plików danych wydaje się zapewniać lepsze wyniki. Oto kod, którego użyłem:

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

Pobrałem spa.traineddata (Twój przykład obrazy mają hiszpańskich słów, prawda?) Do ./tessdata/spa.traineddata. Wynik był taki:

ARMACIAS


A dla drugiego obrazu:

PECIALIZADA:


Użyłem, --psm 7ponieważ tutaj jest napisane, że oznacza "Traktuj obraz jako pojedynczą linię tekstu" i pomyślałem, że powinno to mieć sens dla twoich obrazów testowych.

W tym Google Colab możesz zobaczyć test, który zrobiłem.