OCR dựa trên nền tảng Deep Learning để nhận dạng văn bản trong hình ảnh cảnh tự nhiên ( Phần 2)

Đăng bởi: Admin | Lượt xem: 797 | Chuyên mục: Machine Learning

Bài viết này đề cập đến nhận dạng ký tự quang học (OCR) để nhận dạng chữ cái hoặc văn bản trong hình ảnh cảnh tự nhiên. Chúng ta sẽ tìm hiểu về lý do tại sao nó là một vấn đề khó khăn, các cách tiếp cận được sử dụng để giải quyết và code đi cùng với nó.


Tổng quan

Trong thời đại số hóa này, việc lưu trữ, chỉnh sửa, lập chỉ mục và tìm kiếm thông tin trong tài liệu kỹ thuật số dễ dàng hơn nhiều so với việc dành hàng giờ để cuộn qua các tài liệu được in / viết tay / đánh máy.

Và hơn nữa, việc tìm kiếm thứ gì đó trong một tài liệu phi kỹ thuật số lớn không chỉ tốn thời gian mà còn có khả năng chúng ta bỏ lỡ thông tin trong khi cuộn tài liệu theo cách thủ công. May mắn cho chúng ta, máy tính đang trở nên tốt hơn mỗi ngày khi thực hiện các nhiệm vụ mà con người nghĩ rằng chỉ mình mới có thể làm.

Trích xuất văn bản từ hình ảnh có nhiều ứng dụng.

Một số ứng dụng là nhận dạng hộ chiếu, nhận dạng biển số tự động, chuyển đổi văn bản viết tay thành văn bản kỹ thuật số, chuyển đổi văn bản đánh máy sang văn bản kỹ thuật số, v.v.

Code

Trong phần trước, ta đã tìm hiểu lý thuyết cách OCR nhận diện văn bản, ở phần này ta sẽ thực hành một số ví dụ nhận diện văn bản trong tự nhiên

Chúng ta sẽ sử dụng một số hình ảnh để hiển thị cả phát hiện văn bản bằng phương pháp EAST và nhận dạng văn bản với Tesseract 4. Chúng ta hãy xem hoạt động phát hiện và nhận dạng văn bản trong đoạn mã sau. Bài viết ở đây đã chứng tỏ là một nguồn hữu ích trong việc viết mã cho dự án này.

##Loading the necessary packages

import numpy as np

import cv2

from imutils.object_detection import non_max_suppression

import pytesseract

from matplotlib import pyplot as plt

Đang tải các gói

#Creating argument dictionary for the default arguments needed in the code.

args = {"image":"../input/text-detection/example-images/Example-images/ex24.jpg", "east":"../input/text-detection/east_text_detection.pb", "min_confidence":0.5, "width":320, "height":320}

Tạo từ điển đối số với một số giá trị mặc định

Ở đây, chúng ta đang làm việc với các gói thiết yếu. Gói OpenCV sử dụng mô hình EAST để phát hiện văn bản. Gói tesseract dành cho nhận dạng văn bản trong hộp giới hạn. Đảm bảo rằng bạn có phiên bản tesseract> = 4. Có một số nguồn có sẵn trực tuyến để hướng dẫn cài đặt tesseract.

Tạo một từ điển cho các đối số mặc định cần thiết trong code. 

  • image: Vị trí của hình ảnh đầu vào để phát hiện và nhận dạng văn bản.
  • east: Vị trí của tệp có mô hình máy dò EAST được đào tạo trước.
  • min-cònidence: Điểm xác suất tối thiểu cho độ tin cậy của hình dạng hình học được dự đoán.
  • width: Chiều rộng hình ảnh phải là bội số của 32 để mô hình EAST hoạt động tốt.
  • height: Chiều cao hình ảnh phải là bội số của 32 để mô hình EAST hoạt động tốt.
#Give location of the image to be read.

#"Example-images/ex24.jpg" image is being loaded here.



args['image']="../input/text-detection/example-images/Example-images/ex24.jpg"

image = cv2.imread(args['image'])



#Saving a original image and shape

orig = image.copy()

(origH, origW) = image.shape[:2]



# set the new height and width to default 320 by using args #dictionary. 

(newW, newH) = (args["width"], args["height"])



#Calculate the ratio between original and new image for both height and weight.

#This ratio will be used to translate bounding box location on the original image.

rW = origW / float(newW)

rH = origH / float(newH)



# resize the original image to new dimensions

image = cv2.resize(image, (newW, newH))

(H, W) = image.shape[:2]



# construct a blob from the image to forward pass it to EAST model

blob = cv2.dnn.blobFromImage(image, 1.0, (W, H),

       (123.68, 116.78, 103.94), swapRB=True, crop=False)

Đang xử lý hình ảnh

# load the pre-trained EAST model for text detection

net = cv2.dnn.readNet(args["east"])



# We would like to get two outputs from the EAST model.

#1. Probabilty scores for the region whether that contains text or not.

#2. Geometry of the text -- Coordinates of the bounding box detecting a text

# The following two layer need to pulled from EAST model for achieving this.

layerNames = [

      "feature_fusion/Conv_7/Sigmoid",

      "feature_fusion/concat_3"]

Đang tải mô hình EAST được đào tạo trước và xác định các lớp đầu ra

#Forward pass the blob from the image to get the desired output layers

net.setInput(blob)

(scores, geometry) = net.forward(layerNames)

Chuyển tiếp hình ảnh thông qua mô hình EAST

## Returns a bounding box and probability score if it is more than minimum confidence

def predictions(prob_score, geo):

       (numR, numC) = prob_score.shape[2:4]

       boxes = []

       confidence_val = []



       # loop over rows

       for y in range(0, numR):

              scoresData = prob_score[0, 0, y]

              x0 = geo[0, 0, y]

              x1 = geo[0, 1, y]

              x2 = geo[0, 2, y]

              x3 = geo[0, 3, y]

              anglesData = geo[0, 4, y]



              # loop over the number of columns

              for i in range(0, numC):

                    if scoresData[i] < args["min_confidence"]:

                           continue



                    (offX, offY) = (i * 4.0, y * 4.0)



                    # extracting the rotation angle for the prediction and computing the sine and cosine

                    angle = anglesData[i]

                    cos = np.cos(angle)

                    sin = np.sin(angle)



                    # using the geo volume to get the dimensions of the bounding box

                    h = x0[i] + x2[i]

                    w = x1[i] + x3[i]



                    # compute start and end for the text pred bbox

                    endX = int(offX + (cos * x1[i]) + (sin * x2[i]))

                    endY = int(offY - (sin * x1[i]) + (cos * x2[i]))

                    startX = int(endX - w)

                    startY = int(endY - h)



                    boxes.append((startX, startY, endX, endY))

                    confidence_val.append(scoresData[i])



       # return bounding boxes and associated confidence_val

       return (boxes, confidence_val)

Chức năng giải mã hộp giới hạn từ dự đoán mô hình EAST 

Trong ví dụ này, chúng ta chỉ giải mã các hộp giới hạn ngang. Giải mã các hộp giới hạn xoay từ điểm số và hình học phức tạp hơn.

# Find predictions and  apply non-maxima suppression

(boxes, confidence_val) = predictions(scores, geometry)

boxes = non_max_suppression(np.array(boxes), probs=confidence_val)

Nhận hộp giới hạn cuối cùng

Bây giờ chúng ta đã nhận được các hộp giới hạn . Chúng ta muốn xem các hộp giới hạn trên hình ảnh và có thể trích xuất văn bản từ các hộp giới hạn được phát hiện ta sử dụng tesseract.

##Text Detection and Recognition



# initialize the list of results

results = []



# loop over the bounding boxes to find the coordinate of bounding boxes

for (startX, startY, endX, endY) in boxes:

       # scale the coordinates based on the respective ratios in order to reflect bounding box on the original image

       startX = int(startX * rW)

       startY = int(startY * rH)

       endX = int(endX * rW)

       endY = int(endY * rH)



       #extract the region of interest

       r = orig[startY:endY, startX:endX]



       #configuration setting to convert image to string. 

       configuration = ("-l eng --oem 1 --psm 8")

    ##This will recognize the text from the image of bounding box

       text = pytesseract.image_to_string(r, config=configuration)



       # append bbox coordinate and associated text to the list of results

       results.append(((startX, startY, endX, endY), text))

Tạo danh sách với tọa độ hộp giới hạn và văn bản được nhận dạng trong các hộp

Phần trên của mã đã lưu trữ tọa độ hộp giới hạn và văn bản được liên kết trong một danh sách. Chúng ta sẽ thấy nó trông như thế nào trên hình ảnh.

Trong trường hợp này, ta đã sử dụng một cấu hình cụ thể của tesseract. Có nhiều tùy chọn có sẵn cho cấu hình tesseract.

l: language (ngôn ngữ) , chọn tiếng Anh trong đoạn mã trên.

OEM (Chế độ OCR Engine):
0 :động cơ kế thừa.
1 :mạng lưới thần kinh LSTM động cơ duy nhất.
2 :động cơ kế thừa + LSTM.
3 :Mặc định, dựa trên những gì có sẵn.


psm (Chế độ phân đoạn trang):
0 :Định hướng và phát hiện tập lệnh (OSD).
1 :Phân đoạn trang tự động với OSD.
2 :Phân đoạn trang tự động, nhưng không có OSD hoặc OCR. (không được triển khai)
3 :Phân đoạn trang hoàn toàn tự động, nhưng không có OSD. (Mặc định)
4 :Giả sử một cột văn bản có kích thước thay đổi.
5 :Giả sử một khối thống nhất của văn bản được sắp xếp theo chiều dọc.
6 :Giả sử một khối văn bản thống nhất.
7 :Coi hình ảnh là một dòng văn bản duy nhất.
8 :Coi hình ảnh là một từ đơn.
9 :Coi hình ảnh là một từ đơn trong một vòng tròn.
10 :Coi hình ảnh là một ký tự đơn.
11 :Văn bản thưa thớt. Tìm càng nhiều văn bản càng tốt theo thứ tự cụ thể.
12 :Văn bản thưa thớt với OSD.
13 :Đường thô. Hãy coi hình ảnh là một dòng văn bản duy nhất, bỏ qua các bản hack dành riêng cho Tesseract.


Chúng a có thể chọn cấu hình Tesseract cụ thể trên cơ sở dữ liệu hình ảnh của mình

#Display the image with bounding box and recognized text

orig_image = orig.copy()



# Moving over the results and display on the image

for ((start_X, start_Y, end_X, end_Y), text) in results:

       # display the text detected by Tesseract

       print("{}\n".format(text))



       # Displaying text

       text = "".join([x if ord(x) < 128 else "" for x in text]).strip()

       cv2.rectangle(orig_image, (start_X, start_Y), (end_X, end_Y),

              (0, 0, 255), 2)

       cv2.putText(orig_image, text, (start_X, start_Y - 30),

              cv2.FONT_HERSHEY_SIMPLEX, 0.7,(0,0, 255), 2)



plt.imshow(orig_image)

plt.title('Output')

plt.show()

Hiển thị hình ảnh với hộp giới hạn và văn bản được nhận dạng


Các kết quả

Mã trên sử dụng mô hình OpenCV EAST để phát hiện văn bản và tesseract để nhận dạng văn bản. PSM cho Tesseract đã được đặt tương ứng với hình ảnh. Điều quan trọng cần lưu ý là Tesseract thường yêu cầu một hình ảnh rõ ràng để hoạt động tốt.

Trong triển khai hiện tại của chúng ta, không xem xét các hộp giới hạn xoay do sự phức tạp của nó để thực hiện. Nhưng trong kịch bản thực tế nơi văn bản được xoay, đoạn mã trên sẽ không hoạt động tốt. Ngoài ra, bất cứ khi nào hình ảnh không rõ ràng, tesseract sẽ gặp khó khăn để nhận ra văn bản chính xác.

Một số đầu ra được tạo thông qua mã trên là:

 

Mã này có thể cung cấp kết quả tuyệt vời cho cả ba hình ảnh trên. Văn bản rõ ràng và nền phía sau văn bản cũng đồng nhất trong những hình ảnh này.

 

Mô hình thực hiện khá tốt ở đây. Nhưng một số bảng chữ cái không được nhận dạng chính xác. Bạn có thể thấy rằng các hộp giới hạn hầu hết là chính xác

 

Các mô hình thực hiện khá tốt ở đây. Nhưng một số văn bản trong hộp giới hạn không được công nhận chính xác. Số 1 không được phát hiện, có một nền không đồng nhất ở đây, có thể tạo ra một nền thống nhất sẽ giúp ích cho trường hợp này. Ngoài ra, 24 không được giới hạn trong hộp.

 

Có vẻ như phông chữ cách điệu với bóng trong nền đã ảnh hưởng đến kết quả trong trường hợp trên.

Chúng ta không thể mong đợi mô hình OCR chính xác 100%. Tuy nhiên, chúng ta vẫn đạt được kết quả tốt với mô hình EAST và Tesseract. Thêm nhiều bộ lọc để xử lý hình ảnh sẽ giúp cải thiện hiệu suất của mô hình.

Bạn cũng có thể tìm mã này cho dự án này trên kernel Kaggle để tự mình thử nó.


OCR với Nanonets

API OCR của Nanonets cho phép bạn xây dựng các mô hình OCR dễ dàng. Bạn có thể tải lên dữ liệu của mình, chú thích nó, đặt mô hình để đào tạo và chờ nhận dự đoán thông qua giao diện người dùng dựa trên trình duyệt.

1. Sử dụng GUI: https://app.nanonets.com/

Bạn cũng có thể sử dụng Nanonets-OCR- API bằng cách thực hiện theo các bước bên dưới:

2. Sử dụng API NanoNets: https://github.com/NanoNets/nanonets-oc-sample-python

Dưới đây, chúng tôi sẽ cung cấp cho bạn hướng dẫn từng bước để đào tạo mô hình của riêng bạn bằng API Nanonets, trong 9 bước đơn giản.

Bước 1: Sao chép Repo

git clone https://github.com/NanoNets/nanonets-ocr-sample-python

cd nanonets-ocr-sample-python

sudo pip install requests

sudo pip install tqdm

Bước 2: Nhận Khóa API miễn phí

Nhận Khóa API miễn phí từ https://app.nanonets.com/#/keys

Bước 3: Đặt khóa API làm Biến môi trường

export NANONETS_API_KEY=YOUR_API_KEY_GOES_HERE

Bước 4: Tạo mô hình mới

python ./code/create-model.py

Lưu ý: Ở bước này ta tạo ra MODEL_ID mà bạn cần cho bước tiếp theo

Bước 5: Thêm Id mẫu làm biến môi trường

export NANONETS_MODEL_ID=YOUR_MODEL_ID

Bước 6: Tải lên dữ liệu

Thu thập hình ảnh của đối tượng bạn muốn phát hiện. Khi bạn đã có sẵn tập dữ liệu trong thư mục images(tệp hình ảnh), hãy bắt đầu tải lên tập dữ liệu.

python ./code/upload-training.py

Bước 7: Mô hình đào tạo

Khi Hình ảnh đã được tải lên, hãy bắt đầu đào tạo Mô hình

python ./code/train-model.py

Bước 8: Lấy trạng thái mẫu

Mô hình mất ~ 30 phút để đào tạo. Bạn sẽ nhận được email khi mô hình được đào tạo. Trong khi đó, bạn kiểm tra trạng thái của mô hình

watch -n 100 python ./code/model-state.py

Bước 9: Đưa ra dự đoán

Một khi mô hình được đào tạo. Bạn có thể đưa ra dự đoán

python ./code/prediction.py PATH_TO_YOUR_IMAGE.jpg

vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!



Khóa học liên quan

Khóa học: Machine Learning

AI - Machine Learning cơ bản
Số bài học:
Lượt xem: 10379
Đăng bởi: Admin
Chuyên mục: Machine Learning