Văn bản dễ đọc không được tesseract nhận dạng

Aug 16 2020

Tôi đã sử dụng triển khai PyTorch sau đây của EAST (Trình dò ​​văn bản cảnh hiệu quả và chính xác) để xác định và vẽ các hộp bao quanh văn bản trong một số hình ảnh và nó hoạt động rất tốt!

Tuy nhiên, bước tiếp theo của OCR mà tôi đang thử pytesseractđể trích xuất dạng văn bản những hình ảnh này và chuyển đổi chúng thành chuỗi - đang thất bại khủng khiếp. Sử dụng tất cả các cấu hình có thể có của --oem--psm, tôi không thể pytesseractphát hiện ra những gì có vẻ là văn bản rất rõ ràng, ví dụ:

Văn bản được nhận dạng nằm bên dưới hình ảnh. Mặc dù tôi đã áp dụng tăng cường độ tương phản và cũng cố gắng làm giãn nở và ăn mòn, tôi không thể làm cho tinh hoàn nhận dạng được văn bản. Đây chỉ là một ví dụ về nhiều hình ảnh mà văn bản thậm chí còn lớn hơn và rõ ràng hơn. Bất kỳ đề xuất nào về chuyển đổi, cấu hình hoặc các thư viện khác sẽ hữu ích!

CẬP NHẬT: Sau khi thử làm mờ Gaussian + đặt ngưỡng Otso, tôi có thể nhận được văn bản màu đen trên nền trắng (có vẻ là lý tưởng cho pytesseract) và cũng đã thêm ngôn ngữ Tây Ban Nha, nhưng nó vẫn không thể đọc văn bản rất đơn giản - ví dụ:

đọc như vô nghĩa.

Các hình ảnh văn bản xử lý được

và mã Tôi đang sử dụng:


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)

Trả lời

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

Sử dụng các tệp dữ liệu cập nhật này .

Hướng dẫn này chỉ trích hiệu suất ngoài hộp (và có thể độ chính xác cũng có thể bị ảnh hưởng):

Dữ liệu được đào tạo. Tại thời điểm viết bài, gói APT tesseract-ocr-eng dành cho Ubuntu 18.10 có hiệu suất hoạt động quá khủng khiếp, có thể là do dữ liệu đào tạo bị hỏng.

Theo thử nghiệm sau đây mà tôi đã làm, việc sử dụng các tệp dữ liệu được cập nhật dường như mang lại kết quả tốt hơn. Đây là mã tôi đã sử dụng:

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

Tôi đã tải xuống spa.traineddata (hình ảnh ví dụ của bạn có các từ tiếng Tây Ban Nha, phải không?) ./tessdata/spa.traineddata. Và kết quả là:

ARMACIAS


Và đối với hình ảnh thứ hai:

PECIALIZADA:


Tôi đã sử dụng --psm 7vì ở đây nó nói rằng nó có nghĩa là "Coi hình ảnh như một dòng văn bản duy nhất" và tôi nghĩ điều đó sẽ có ý nghĩa đối với hình ảnh thử nghiệm của bạn.

Trong Google Colab này, bạn có thể thấy bài kiểm tra tôi đã làm.