Nhận dạng kí tự quang học - OCR trên Raspberry PI

Chào các bạn hôm nay mình sẽ hướng dẫn các bạn làm thế nào để có thể trích xuất text từ hình ảnh có sẵn bằng kĩ thuật Nhận dạng kí tự quang học – OCR.


1. OCR là gì ?

OCR là một thuật ngữ viết tắt từ cụm từ Optical Character Recognition có thể dịch nôm na nó là Nhận dạng ký tự bằng quang học. Đây là công nghệ được áp dụng để trích xuất text trên một file ảnh thành định dạng text.

2. Ứng dụng

            OCR có rất nhiều ứng dụng xung quanh chúng ta như:

  • Chuyển file PDF sang WORD / TEXT
  • Đọc thông tin từ chứng minh nhân dân hoặc passport
  • Thậm chí là dùng trong chức năng dịch thông qua hình ảnh của Google Translate

3. Cài đặt các thư viện cần thiết

3.1 Cài đặt OpenCV

- Để cài đặt OpenCV, chúng ta cần cài đặt một số dependencies bằng các câu lệnh sau:

sudo apt-get install -y libcblas-dev libhdf5-dev libhdf5-serial-dev libatlas-base-dev libjasper-dev  libqtgui4  libqt4-test

sudo apt-get install libjpeg-dev libtiff5-dev libpng12-dev

sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

sudo apt-get install libxvidcore-dev libx264-dev

sudo apt-get install qt4-dev-tools

- Sau khi cài đặt thành công các dependencies. Bạn chỉ việc chạy câu lệnh sau để cài đặt OpenCV:

sudo pip3 install opencv-python

3.2 Cài đặt Tesseract-OCR và PyTesseract

- Để thực hiện Nhận dạng ký tự quang học trên Raspberry Pi, chúng ta phải cài đặt Tesseract OCR engine trên Pi bằng câu lệnh:

sudo apt-get install tesseract-ocr

- Sau đó, chúng ta đã cài đặt thành công Tesseract-OCR engine. Chúng ta tiếp tục cài đặt PyTesseract bằng pip. PyTesseract giúp chúng ta sử dụng Tesseract-OCR engine bằng Python. Cài đặt bằng câu lệnh:

sudo pip3 install pytesseract

4. Cấu hình Tesseract OCR để cải thiện kết quả

            Nhận dạng chữ trong hình ảnh là một việc không dễ. Tesseract OCR engine chỉ giúp chúng ta một phần. Vì đôi lúc, trong hình ảnh của bạn có chứa nhiễu, không rõ hoặc kích cỡ các chữ khác nhau, . . .

            Thật may mắn vì PyTesseract cho phép chúng ta cấu hình các thông số trong Tesseract OCR engine để làm tang độ chính xác của kết quả. Có 3 thông số chính dùng để cấu hình Tesseract OCR là:

  • language (-l)
  • OCR Engine Mode (--oem)
  • Page Segmentation Mode (--psm)

Bên cạnh tiếng Anh là ngôn ngữ mặc định, Tesseract hỗ trợ nhiều ngôn ngữ khác như Việt Nam, Hàn Quốc, Hindu, . . . Ở bài này, chúng ta sẽ dùng OCR với tiếng anh. Tuy nhiên, các bạn có thể tải các gói ngôn ngữ đã được tạo sẵn từ github chính chủ. Bạn chỉ việc download file *.traineddata và copy vào thư mục /usr/share/tesseract-ocr/4.0.0/tesseract-data là bạn có thể sử dụng ngôn ngữ mà bạn tải về nhé !

Ngôn ngữ được đặt bằng tham số -l và mã ngôn ngữ. Ví dụ: tiếng anh sẽ có mã là eng, Việt Nam là vie, Hàn Quốc là kor

Tham số tiếp theo là OCR Engine Mode, nó có bốn chế độ khác nhau. Mỗi chế độ sử dụng một thuật toán khác nhau để nhận dạng các ký tự từ hình ảnh. Theo mặc định, nó sử dụng thuật toán được cài đặt cùng với gói. Nhưng chúng ta có thể thay đổi nó để sử dụng LSTM hoặc Neural network. Bốn chế độ khác nhau được hiển thị bên dưới. Tham số được dùng là --oem. Vì vậy, để đặt nó ở chế độ 1, chỉ cần sử dụng --oem 1.

 

Tham số cuối cùng và quan trọng nhất là tham số về chế độ phân đoạn trang. Điều này rất hữu ích khi hình ảnh của bạn có quá nhiều chi tiết nền cùng với các ký tự hoặc các ký tự được viết theo hướng hoặc kích thước khác nhau. Có tổng cộng 14 chế độ phân đoạn trang khác nhau, tất cả chúng được liệt kê dưới đây. Tham số được dùng là --psm

 

5. OCR trên Raspberry PI

Hãy cùng nhau chạy thử đoạn code đơn giản sau:

import pytesseract

from PIL import Image

import cv2



img = cv2.imread('eng.png',cv2.IMREAD_COLOR) #Open the image from which charectors has to be recognized

#img = cv2.resize(img, (620,480) ) #resize the image if required



gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grey to reduce detials

gray = cv2.bilateralFilter(gray, 11, 17, 17) #Blur to reduce noise



original = pytesseract.image_to_string(gray, config='')

#test = (pytesseract.image_to_data(gray, lang=None, config='', nice=0) ) #get confidence level if required

#print(pytesseract.image_to_boxes(gray))



print (original)

Kết quả:

 

Tham khảo:

Bạn có thể xem thêm tại repository sau: https://gitlab.com/fpo-outsource/ocr-and-tts

Có thể bạn quan tâm ???