Teks yang mudah dibaca tidak dikenali oleh tesseract

Aug 16 2020

Saya telah menggunakan implementasi PyTorch berikut dari EAST (Detektor Teks Adegan Efisien dan Akurat) untuk mengidentifikasi dan menggambar kotak pembatas di sekitar teks dalam sejumlah gambar dan itu bekerja dengan sangat baik!

Namun, langkah OCR berikutnya yang saya coba pytesseractuntuk mengekstrak teks dari gambar-gambar ini dan mengubahnya menjadi string - gagal total. Menggunakan semua kemungkinan konfigurasi --oemdan --psm, saya tidak pytesseractdapat mendeteksi apa yang tampak sebagai teks yang sangat jelas, misalnya:

Teks yang dikenali ada di bawah gambar. Meskipun saya telah menerapkan peningkatan kontras, dan juga mencoba melebarkan dan mengikis, saya tidak dapat bereaksi untuk mengenali teks tersebut. Ini hanyalah satu contoh dari banyak gambar di mana teksnya lebih besar dan lebih jelas. Setiap saran tentang transformasi, konfigurasi, atau pustaka lainnya akan sangat membantu!

PEMBARUAN: Setelah mencoba Gaussian blur + Otso thresholding, saya bisa mendapatkan teks hitam dengan latar belakang putih (tampaknya yang ideal untuk pytesseract), dan juga menambahkan bahasa Spanyol, tetapi masih tidak dapat membaca teks yang sangat sederhana - misalnya:

dibaca sebagai omong kosong.

Gambar teks yang diproses adalah

dan
dan kode yang saya gunakan:


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)

Jawaban

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

Gunakan file data yang diperbarui ini .

Panduan ini mengkritik performa out-of-the box (dan mungkin keakuratannya juga dapat terpengaruh):

Data terlatih. Pada saat penulisan, paket APT tesseract-ocr-eng untuk Ubuntu 18.10 memiliki kinerja luar biasa yang buruk, kemungkinan karena data pelatihan yang korup.

Menurut pengujian berikut yang saya lakukan, menggunakan file data yang diperbarui tampaknya memberikan hasil yang lebih baik. Ini adalah kode yang saya gunakan:

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

Saya mengunduh spa.traineddata (gambar contoh Anda memiliki kata-kata Spanyol, kan?) Ke./tessdata/spa.traineddata . Dan hasilnya adalah:

ARMACIAS


Dan untuk gambar kedua:

PECIALIZADA:


Saya menggunakan --psm 7karena di sini dikatakan bahwa itu berarti "Perlakukan gambar sebagai satu baris teks" dan menurut saya itu masuk akal untuk gambar uji Anda.

Di Google Colab ini Anda dapat melihat tes yang saya lakukan.