Texto facilmente legível não reconhecido pelo tesseract

Aug 16 2020

Usei a seguinte implementação PyTorch do EAST (detector de texto de cena eficiente e preciso) para identificar e desenhar caixas delimitadoras em torno do texto em várias imagens e funciona muito bem!

No entanto, a próxima etapa do OCR com a qual estou tentando pytesseractextrair o texto dessas imagens e convertê-las em strings - está falhando terrivelmente. Usando todas as configurações possíveis de --oeme --psm, não consigo pytesseractdetectar o que parece ser um texto muito claro, por exemplo:

O texto reconhecido está abaixo das imagens. Embora eu tenha aplicado o aprimoramento de contraste e também tentado dilatar e erodir, não consigo fazer com que o tesseract reconheça o texto. Este é apenas um exemplo de muitas imagens em que o texto é ainda maior e mais claro. Quaisquer sugestões sobre transformações, configurações ou outras bibliotecas seriam úteis!

ATUALIZAÇÃO: Depois de tentar o desfoque gaussiano + limiar Otso, consigo obter texto preto em fundo branco (aparentemente o que é ideal para pytesseract) e também adicionei o idioma espanhol, mas ainda não consigo ler texto muito simples - por exemplo:

lê como rabiscos.

As imagens de texto processadas são

e
o código que estou 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)

Respostas

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

Use esses arquivos de dados atualizados.

Este guia critica o desempenho imediato (e talvez a precisão também possa ser afetada):

Dados treinados. No momento em que escrevo, o pacote APT tesseract-ocr-eng para Ubuntu 18.10 tem um desempenho terrível, provavelmente devido a dados de treinamento corrompidos.

De acordo com o seguinte teste que fiz, usar os arquivos de dados atualizados parece fornecer melhores resultados. Este é o código que usei:

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

Baixei spa.traineddata (suas imagens de exemplo têm palavras em espanhol, certo?) para ./tessdata/spa.traineddata. E o resultado foi:

ARMACIAS


E para a segunda imagem:

PECIALIZADA:


Usei --psm 7porque aqui diz que significa "Trate a imagem como uma única linha de texto" e achei que isso deveria fazer sentido para suas imagens de teste.

Neste Google Colab você pode ver o teste que fiz.