Trí thông minh dữ liệu tạo

Cách OCR với Tesseract, OpenCV và Python

Ngày:

Trong bài đăng trên blog này, chúng tôi sẽ cố gắng giải thích công nghệ đằng sau Công cụ Tesseract được sử dụng nhiều nhất, được nâng cấp với kiến ​​thức mới nhất được nghiên cứu về nhận dạng ký tự quang học.

Bài viết này cũng sẽ đóng vai trò là hướng dẫn / hướng dẫn cách thực hiện OCR trong python bằng cách sử dụng công cụ Tesseract. Chúng ta sẽ đi qua các mô-đun sau:

  • Các tính năng của Tesseract OCR
  • Tiền xử lý cho OCR bằng OpenCV
  • Chạy Tesseract với CLI và Python
  • Hạn chế của công cụ Tesseract

Giới thiệu

OCR = Optical Character Recognition. Nói cách khác, hệ thống OCR biến đổi hình ảnh hai chiều của văn bản, có thể chứa văn bản in bằng máy hoặc viết tay từ biểu diễn hình ảnh của nó thành văn bản có thể đọc được bằng máy. OCR là một quy trình thường bao gồm một số quy trình phụ để thực hiện chính xác nhất có thể. Các quy trình con là:

  • Xử lý trước hình ảnh
  • Bản địa hóa văn bản
  • Phân đoạn ký tự
  • Nhận dạng ký tự
  • Xử lý bài

Tất nhiên, các quy trình phụ trong danh sách trên có thể khác nhau, nhưng đây là những bước gần như cần thiết để tiếp cận nhận dạng ký tự tự động. Trong phần mềm OCR, mục đích chính là xác định và nắm bắt tất cả các từ duy nhất sử dụng các ngôn ngữ khác nhau từ các ký tự văn bản được viết.

Trong gần hai thập kỷ, hệ thống nhận dạng ký tự quang học đã được sử dụng rộng rãi để cung cấp tính năng nhập văn bản tự động vào các hệ thống máy tính. Tuy nhiên, trong tất cả thời gian này, thông thường OCR trực tuyến hệ thống (như OCR khu vực) chưa bao giờ vượt qua được việc họ không thể đọc nhiều hơn một số loại phông chữ và định dạng trang. Loại có khoảng cách theo tỷ lệ (bao gồm hầu như tất cả các bản sao bộ sắp chữ), phông chữ máy in laser, và thậm chí nhiều phông chữ máy đánh chữ không theo tỷ lệ, vẫn nằm ngoài tầm với của các hệ thống này. Và kết quả là, OCR thông thường chưa bao giờ đạt được nhiều hơn một tác động nhỏ đến tổng số tài liệu cần chuyển đổi sang dạng kỹ thuật số.

Quy trình nhận dạng ký tự quang học (Lịch sự)

Các công cụ OCR thế hệ tiếp theo giải quyết những vấn đề này thực sự tốt bằng cách sử dụng các nghiên cứu mới nhất trong lĩnh vực học sâu. Bằng cách tận dụng sự kết hợp của các mô hình sâu và bộ dữ liệu khổng lồ được công bố công khai, các mô hình đạt được độ chính xác hiện đại cho các nhiệm vụ nhất định. Ngày nay nó cũng có thể tạo dữ liệu tổng hợp với các phông chữ khác nhau sử dụng mạng đối thủ chung và một vài cách tiếp cận chung khác.

Nhận dạng ký tự quang học vẫn là một vấn đề thách thức khi văn bản xuất hiện trong môi trường không bị giới hạn, như cảnh thiên nhiên, do biến dạng hình học, nền phức tạp và phông chữ đa dạng. Công nghệ vẫn có tiềm năng to lớn do các trường hợp sử dụng khác nhau của OCR dựa trên học sâu như


Bạn có một vấn đề OCR trong tâm trí? Bạn muốn giảm chi phí nhập dữ liệu của tổ chức? Đi qua Ống nano và xây dựng các mô hình OCR để trích xuất văn bản từ hình ảnh or trích xuất dữ liệu từ các tệp PDF dựa trên AI PDF OCR!


Có rất nhiều nhận dạng ký tự quang học phần mềm có sẵn. Tôi không tìm thấy bất kỳ so sánh chất lượng nào giữa chúng, nhưng tôi sẽ viết về một số trong số chúng có vẻ thân thiện với nhà phát triển nhất.

Tesseract - một công cụ OCR mã nguồn mở đã trở nên phổ biến trong giới phát triển OCR. Mặc dù đôi khi có thể khó triển khai và sửa đổi, nhưng không có quá nhiều lựa chọn thay thế OCR miễn phí và mạnh mẽ trên thị trường trong thời gian dài nhất. Tesseract bắt đầu với tư cách là một Tiến sĩ. dự án nghiên cứu tại HP Labs, Bristol. Nó trở nên phổ biến và được HP phát triển từ năm 1984 đến 1994. Năm 2005 HP phát hành Tesseract như một phần mềm mã nguồn mở. Kể từ năm 2006, nó được phát triển bởi Google.

so sánh xu hướng google cho các công cụ OCR mã nguồn mở khác nhau

bạch tuộc - OCRopus là một hệ thống OCR mã nguồn mở cho phép cả nhà nghiên cứu và công ty đánh giá và sử dụng lại các thành phần OCR dễ dàng. Tập hợp các chương trình phân tích tài liệu, không phải là hệ thống OCR chìa khóa trao tay. Để áp dụng nó vào tài liệu của bạn, bạn có thể cần thực hiện một số xử lý trước hình ảnh và cũng có thể đào tạo các mô hình mới. Ngoài bản thân các tập lệnh nhận dạng, có một số tập lệnh để biên tập và sửa chữa sự thật cơ bản, đo lường tỷ lệ lỗi, xác định ma trận nhầm lẫn dễ sử dụng và chỉnh sửa.


Mắt - Ocular hoạt động tốt nhất trên các tài liệu được in bằng cách bấm tay, kể cả những tài liệu được viết bằng nhiều ngôn ngữ. Nó hoạt động bằng cách sử dụng dòng lệnh. Đây là một hệ thống OCR lịch sử hiện đại. Các tính năng chính của nó là:

  • Học không giám sát về phông chữ không xác định: chỉ yêu cầu hình ảnh tài liệu và một kho văn bản.
  • Khả năng xử lý các tài liệu nhiễu: viết mực không nhất quán, khoảng cách, căn chỉnh dọc
  • Hỗ trợ các tài liệu đa ngôn ngữ, bao gồm cả những tài liệu có khả năng chuyển mã cấp độ từ đáng kể.
  • Học không giám sát về các mẫu biến thể chính tả bao gồm cách viết cổ và tốc ký của máy in.
  • Phiên âm đồng thời, chung sang cả hình thức ngoại giao (nghĩa đen) và thông thường.

SwiftOCR - Tôi cũng sẽ đề cập đến công cụ OCR được viết bằng Swift vì đã có sự phát triển rất lớn nhằm thúc đẩy việc sử dụng Swift làm ngôn ngữ lập trình phát triển được sử dụng cho học sâu. Thủ tục thanh toán Blog của chúng tôi. để tìm hiểu thêm tại sao. SwiftOCR là một thư viện OCR nhanh chóng và đơn giản sử dụng mạng nơ-ron để nhận dạng hình ảnh. SwiftOCR tuyên bố rằng công cụ của họ hoạt động tốt hơn thư viện Tessaract nổi tiếng.

Trong bài đăng trên blog này, chúng tôi sẽ đưa tập trung vào Tesseract OCR và tìm hiểu thêm về cách thức hoạt động và cách sử dụng.


Khối lập phương OCR

Tesseract là một Công cụ nhận dạng văn bản (OCR) mã nguồn mở, có sẵn theo giấy phép Apache 2.0. Nó có thể được sử dụng trực tiếp hoặc (dành cho lập trình viên) sử dụng API để trích xuất văn bản in từ hình ảnh. Nó hỗ trợ nhiều loại ngôn ngữ. Tesseract không có GUI tích hợp, nhưng có một số có sẵn từ Trang bên thứ 3. Tesseract tương thích với nhiều ngôn ngữ lập trình và khuôn khổ thông qua các trình bao bọc có thể được tìm thấy Ở đây. Nó có thể được sử dụng với phân tích bố cục hiện có để nhận dạng văn bản trong một tài liệu lớn hoặc nó có thể được sử dụng kết hợp với bộ dò văn bản bên ngoài để nhận dạng văn bản từ hình ảnh của một dòng văn bản.

Quy trình OCR để xây dựng API với Tesseract từ blog đăng bài

Tesseract 4.00 bao gồm một hệ thống con mạng nơ-ron mới được định cấu hình làm trình nhận dạng dòng văn bản. Nó có nguồn gốc từ OCRopus 'LSTM dựa trên Python nhưng đã được thiết kế lại cho Tesseract trong C ++. Hệ thống mạng nơron trong Tesseract có trước TensorFlow nhưng tương thích với nó, vì có một ngôn ngữ mô tả mạng được gọi là Ngôn ngữ Đặc tả Đồ thị Biến (VGSL), cũng có sẵn cho TensorFlow.

Để nhận dạng một hình ảnh có chứa một ký tự, chúng tôi thường sử dụng Mạng thần kinh kết hợp (CNN). Văn bản có độ dài tùy ý là một chuỗi các ký tự và những vấn đề như vậy được giải quyết bằng cách sử dụng RNN và LSTM là một dạng RNN phổ biến. Đọc bài đăng này để tìm hiểu thêm về LSTM.


Công nghệ - Cách thức hoạt động

LSTM rất tốt trong việc học các chuỗi nhưng làm chậm lại rất nhiều khi số lượng trạng thái quá lớn. Có những kết quả thực nghiệm cho thấy tốt hơn là yêu cầu một LSTM học một chuỗi dài hơn là một chuỗi ngắn gồm nhiều lớp. Tesseract được phát triển từ mô hình OCRopus bằng Python, là một nhánh của LSMT trong C ++, được gọi là CLSTM. CLSTM là một triển khai của mô hình mạng nơron lặp lại LSTM trong C ++, sử dụng thư viện Eigen cho các tính toán số.

Quy trình Tesseract 3 OCR từ giấy

Legacy Tesseract 3.x phụ thuộc vào quy trình nhiều giai đoạn, nơi chúng ta có thể phân biệt các bước:

  • Tìm từ
  • Tìm dòng
  • Phân loại nhân vật

Việc tìm kiếm từ được thực hiện bằng cách tổ chức các dòng văn bản thành các đốm màu, các dòng và vùng được phân tích để tìm cao độ cố định hoặc văn bản tỷ lệ. Các dòng văn bản được chia thành các từ khác nhau tùy theo loại khoảng cách ký tự. Sau đó, công nhận sẽ tiến hành như một quá trình hai lần. Trong lần vượt qua đầu tiên, một nỗ lực được thực hiện để nhận ra lần lượt từng từ. Mỗi từ đạt yêu cầu được chuyển đến bộ phân loại thích ứng làm dữ liệu huấn luyện. Sau đó, trình phân loại thích ứng sẽ có cơ hội nhận dạng chính xác hơn văn bản ở dưới trang.

Hiện đại hóa công cụ Tesseract là một nỗ lực làm sạch mã và thêm một mô hình LSTM mới. Hình ảnh đầu vào được xử lý trong các hộp (hình chữ nhật) từng dòng đưa vào mô hình LSTM và đưa ra đầu ra. Trong hình ảnh dưới đây, chúng ta có thể hình dung nó hoạt động như thế nào.

Cách Tesseract sử dụng mô hình LSTM trình bày

Sau khi thêm một công cụ đào tạo mới và đào tạo mô hình với nhiều dữ liệu và phông chữ, Tesseract đạt được hiệu suất tốt hơn. Tuy nhiên, không đủ tốt để làm việc trên văn bản viết tay và phông chữ kỳ lạ. Có thể tinh chỉnh hoặc đào tạo lại các lớp trên cùng để thử nghiệm.


Cài đặt Tesseract

Cài đặt tesseract trên Windows thật dễ dàng với các tệp nhị phân được biên dịch trước được tìm thấy Ở đây. Đừng quên chỉnh sửa biến môi trường "đường dẫn" và thêm đường dẫn tesseract. Đối với cài đặt Linux hoặc Mac, nó được cài đặt với vài lệnh.

Sau khi cài đặt, hãy xác minh rằng mọi thứ đang hoạt động bằng cách gõ lệnh vào terminal hoặc cmd:

$ tesseract --version

Và bạn sẽ thấy đầu ra tương tự như:

tesseract 4.0.0
leptonica-1.76.0
libjpeg 9c : libpng 1.6.34 : libtiff 4.0.9 : zlib 1.2.8
Found AVX2
Found AVX
Found SSE

Bạn có thể cài đặt trình bao bọc python cho tesseract sau khi sử dụng pip.
$ pip install pytesseract

Thư viện Tesseract được vận chuyển với một công cụ dòng lệnh tiện dụng được gọi là tesseract. Chúng tôi có thể sử dụng công cụ này để thực hiện OCR trên hình ảnh và đầu ra được lưu trữ trong một tệp văn bản. Nếu chúng tôi muốn tích hợp Tesseract trong mã C ++ hoặc Python, chúng tôi sẽ sử dụng API của Tesseract.


Chạy Tesseract với CLI

Gọi công cụ Tesseract trên hình ảnh bằng đường dẫn hình ảnh và chuyển đổi hình ảnh thành văn bản, được viết từng dòng trong dấu nhắc lệnh bằng cách nhập như sau:

$ tesseract image_path stdout

Để viết văn bản đầu ra trong một tệp:

$ tesseract image_path text_result.txt

Để chỉ định tên mô hình ngôn ngữ, hãy viết phím tắt ngôn ngữ sau -l cờ, theo mặc định, nó sử dụng ngôn ngữ tiếng Anh:

$ tesseract image_path text_result.txt -l eng

Theo mặc định, Tesseract mong đợi một trang văn bản khi nó phân đoạn một hình ảnh. Nếu bạn chỉ muốn OCR một khu vực nhỏ, hãy thử một chế độ phân đoạn khác, sử dụng –Psm tranh luận. Có 14 chế độ có sẵn có thể được tìm thấy Ở đây. Theo mặc định, Tesseract hoàn toàn tự động hóa việc phân đoạn trang nhưng không thực hiện định hướng và phát hiện tập lệnh. Để chỉ định tham số, hãy nhập như sau:

$ tesseract image_path text_result.txt -l eng --psm 6

Ngoài ra còn có một đối số quan trọng nữa, chế độ động cơ OCR (oem). Tesseract 4 có hai động cơ OCR - động cơ Legacy Tesseract và động cơ LSTM. Có bốn chế độ hoạt động được chọn bằng cách sử dụng tùy chọn –oem.
0 Chỉ động cơ kế thừa.
1 Lưới thần kinh chỉ dành cho động cơ LSTM.
2 động cơ Legacy + LSTM.
3 Mặc định, dựa trên những gì có sẵn.

Kết quả của công cụ Tesseract OCR

OCR với Pytesseract và OpenCV

Pytesseract hoặc Python-tesseract là một công cụ OCR cho python cũng đóng vai trò như một trình bao bọc cho Công cụ Tesseract-OCR. Nó có thể đọc và nhận dạng văn bản trong hình ảnh và thường được sử dụng trong hình ảnh python ocr cho các trường hợp sử dụng văn bản.

Nó cũng hữu ích như một tập lệnh gọi độc lập để tesseract, vì nó có thể đọc tất cả các loại hình ảnh được hỗ trợ bởi thư viện hình ảnh Pillow và Leptonica, bao gồm jpeg, png, gif, bmp, tiff và các loại khác.

Đọc thêm thông tin về cách tiếp cận Python Ở đây. Mã cho hướng dẫn này có thể được tìm thấy trong này kho.

import cv2 
import pytesseract

img = cv2.imread('image.jpg')

# Adding custom options
custom_config = r'--oem 3 --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Tiền xử lý cho Tesseract

Để tránh tất cả các cách mà độ chính xác đầu ra tesseract của bạn có thể giảm xuống, bạn cần đảm bảo hình ảnh phù hợp được xử lý trước.

Điều này bao gồm thay đổi tỷ lệ, mã hóa nhị phân, loại bỏ tiếng ồn, giải mã, v.v.

Để xử lý trước hình ảnh cho OCR, hãy sử dụng bất kỳ hàm python nào sau đây hoặc làm theo Tài liệu OpenCV.

import cv2
import numpy as np

img = cv2.imread('image.jpg')

# get grayscale image
def get_grayscale(image):
    return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# noise removal
def remove_noise(image):
    return cv2.medianBlur(image,5)
 
#thresholding
def thresholding(image):
    return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]

#dilation
def dilate(image):
    kernel = np.ones((5,5),np.uint8)
    return cv2.dilate(image, kernel, iterations = 1)
    
#erosion
def erode(image):
    kernel = np.ones((5,5),np.uint8)
    return cv2.erode(image, kernel, iterations = 1)

#opening - erosion followed by dilation
def opening(image):
    kernel = np.ones((5,5),np.uint8)
    return cv2.morphologyEx(image, cv2.MORPH_OPEN, kernel)

#canny edge detection
def canny(image):
    return cv2.Canny(image, 100, 200)

#skew correction
def deskew(image):
    coords = np.column_stack(np.where(image > 0))
    angle = cv2.minAreaRect(coords)[-1]
     if angle < -45:
        angle = -(90 + angle)
    else:
        angle = -angle
    (h, w) = image.shape[:2]
    center = (w // 2, h // 2)
    M = cv2.getRotationMatrix2D(center, angle, 1.0)
    rotated = cv2.warpAffine(image, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_REPLICATE)
    return rotated

#template matching
def match_template(image, template):
    return cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED) 

Hãy làm việc với một ví dụ để thấy mọi thứ tốt hơn. Đây là hình ảnh ban đầu của chúng tôi trông như thế nào -

Hệ thống chữ viết Aurebesh

Sau khi xử lý trước với mã sau

image = cv2.imread('aurebesh.jpg')

gray = get_grayscale(image)
thresh = thresholding(gray)
opening = opening(gray)
canny = canny(gray)

và vẽ các hình ảnh kết quả, chúng tôi nhận được các kết quả sau.

Hình ảnh sau khi xử lý trước

Đầu ra cho hình ảnh gốc trông như thế này -

GALACTIC BASIC
(AUREBESH)

RE HFVMEVEIiZwoyv Ze
ABC DE F GH I JK LM
N—0- PQ RST Uv WX
2 | Ff 8 G& Pf fF § 5 op 7
ee
5, jf FF Ty ee ee
=
334 477 OED

Đây là kết quả đầu ra cho các hình ảnh được xử lý trước khác nhau trông như thế nào -

Hình ảnh cạnh Canny (không tốt lắm) -

CAE Cn Cae AS
(AUREBESE)

EA Na
oe SS
(Ne CI (ENE
a, ee oe ea
2
a a A: rc
|, |
a
Sear eo/e

ecm emclomt Cia cuoomct mi im

Hình ảnh được ngưỡng -

GALACTIC BASIC
(AVREBESH)
RS 7FVMeEVEi1iFf o£
A B C D EF GH IJ K LM
AOoder7Nnvroroava
N O P Q@R S$ TU VW XK Y¥ Z
7 ee For 8 Ro Pf F Boao om #
0 12 3 4 5 6 7 8 9 , . !
>» 1kr7 @ by FEN
2? S$ ( Por Foy of ee
ASGSANDIE
CH AE EO KH NG OO SH TH

Hình ảnh mở đầu -

GALACTIC BASIC
(AUREZEBELSH)
KEE VTMEUOU EB iw oN es
A BC D EF F @ H | J K LT Ww
AOGdrcrT7WTt HYOAVa4
WO P Q R BS T U VW WK y Z
i J
Oo 1 2 3 46 8 7 SC Ps,
VY ir- -rp,ptUuY?
a a a
AGoOAnNnoOID
CH AE BO KH ®@ OO SH TH

Lấy các hộp xung quanh văn bản

Sử dụng Pytesseract, bạn có thể nhận thông tin hộp giới hạn cho kết quả OCR của bạn bằng cách sử dụng .

Tập lệnh dưới đây sẽ cung cấp cho bạn thông tin hộp giới hạn cho mỗi ký tự được tesseract phát hiện trong quá trình OCR.

import cv2
import pytesseract

img = cv2.imread('image.jpg')

h, w, c = img.shape
boxes = pytesseract.image_to_boxes(img) 
for b in boxes.splitlines():
    b = b.split(' ')
    img = cv2.rectangle(img, (int(b[1]), h - int(b[2])), (int(b[3]), h - int(b[4])), (0, 255, 0), 2)

cv2.imshow('img', img)
cv2.waitKey(0)

Nếu bạn muốn các hộp xung quanh các từ thay vì các ký tự, hàm image_to_data sẽ có ích. Bạn có thể dùng image_to_data hàm với kiểu đầu ra được chỉ định bằng pytesseract Output.


Có một vấn đề OCR trong tâm trí? Bạn muốn số hóa hóa đơn, PDF hoặc biển số? Đi qua Ống nano và xây dựng OCR trực tuyến miễn phí mô hình miễn phí!


Chúng tôi sẽ sử dụng hình ảnh hóa đơn mẫu ở trên để kiểm tra đầu ra tesseract của chúng tôi.

import cv2
import pytesseract
from pytesseract import Output

img = cv2.imread('invoice-sample.jpg')

d = pytesseract.image_to_data(img, output_type=Output.DICT)
print(d.keys())

Điều này sẽ cung cấp cho bạn kết quả sau:
dict_keys(['level', 'page_num', 'block_num', 'par_num', 'line_num', 'word_num', 'left', 'top', 'width', 'height', 'conf', 'text'])

Sử dụng từ điển này, chúng ta có thể phát hiện từng từ, thông tin hộp giới hạn của chúng, văn bản trong chúng và điểm tin cậy cho từng từ.

Bạn có thể vẽ các ô bằng cách sử dụng mã bên dưới -

n_boxes = len(d['text'])
for i in range(n_boxes):
    if int(d['conf'][i]) > 60:
        (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
        img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

cv2.imshow('img', img)
cv2.waitKey(0)

Đây là hình ảnh của một hóa đơn mẫu.


Đối sánh mẫu văn bản

Lấy ví dụ về việc cố gắng tìm vị trí của ngày trong hình ảnh. Ở đây mẫu của chúng tôi sẽ là một mẫu biểu thức chính quy mà chúng tôi sẽ đối sánh với kết quả OCR của mình để tìm các hộp giới hạn thích hợp. Chúng tôi sẽ sử dụng regex mô-đun và image_to_data chức năng này.

import re
import cv2
import pytesseract
from pytesseract import Output

img = cv2.imread('invoice-sample.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
keys = list(d.keys())

date_pattern = '^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)dd$'

n_boxes = len(d['text'])
for i in range(n_boxes):
    if int(d['conf'][i]) > 60:
    	if re.match(date_pattern, d['text'][i]):
	        (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
	        img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

cv2.imshow('img', img)
cv2.waitKey(0)

Như mong đợi, chúng tôi nhận được một hộp xung quanh ngày hóa đơn trong hình ảnh.


Các chế độ phân đoạn trang

Có một số cách để phân tích một trang văn bản. Api tesseract cung cấp một số chế độ phân đoạn trang nếu bạn chỉ muốn chạy OCR trên một vùng nhỏ hoặc theo các hướng khác nhau, v.v.

Đây là danh sách các chế độ phân đoạn trang được hỗ trợ bởi tesseract -

0 Chỉ đị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.
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 văn bản được căn chỉnh theo chiều dọc thống nhất.
6 Giả sử một khối văn bản thống nhất.
7 Coi hình ảnh như một dòng văn bản.
8 Coi hình ảnh như một từ duy nhất.
9 Coi hình ảnh là một từ duy nhất trong vòng tròn.
10 Coi hình ảnh là một ký tự duy nhất.
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 Dòng thô. Coi hình ảnh như một dòng văn bản duy nhất, bỏ qua các bản hack dành riêng cho khối Tesseract.

Để thay đổi chế độ phân đoạn trang của bạn, hãy thay đổi --psm đối số trong chuỗi cấu hình tùy chỉnh của bạn cho bất kỳ mã chế độ nào được đề cập ở trên.


Phát hiện định hướng và tập lệnh

Bạn có thể phát hiện hướng của văn bản trong hình ảnh của mình và cũng như tập lệnh mà nó được viết. Hình ảnh sau -
hình ảnh
sau khi chạy qua đoạn mã sau:

osd = pytesseract.image_to_osd(img)
angle = re.search('(?<=Rotate: )d+', osd).group(0)
script = re.search('(?<=Script: )d+', osd).group(0)
print("angle: ", angle)
print("script: ", script)

sẽ in kết quả sau.

angle: 90
script: Latin

Chỉ phát hiện các chữ số

Lấy ví dụ hình ảnh này -
hình ảnh
Văn bản được trích xuất từ ​​hình ảnh này trông như thế này.

‘Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no 43876324
Dated 17%h Nov2018
Pono 76496234

Bạn chỉ có thể nhận ra các chữ số bằng cách thay đổi cấu hình thành như sau

custom_config = r'--oem 3 --psm 6 outputbase digits'
print(pytesseract.image_to_string(img, config=custom_config))

Đầu ra sẽ như thế này.

--

. 43876324
172018
0 76496234

Các ký tự trong danh sách trắng

Giả sử bạn chỉ muốn phát hiện một số ký tự nhất định từ hình ảnh đã cho và bỏ qua phần còn lại. Bạn có thể chỉ định danh sách các ký tự cho phép của mình (ở đây, chúng tôi đã sử dụng tất cả các ký tự viết thường chỉ từ a đến z) bằng cách sử dụng cấu hình sau.

custom_config = r'-c tessedit_char_whitelist=abcdefghijklmnopqrstuvwxyz --psm 6'
print(pytesseract.image_to_string(img, config=custom_config))

Đầu ra -

customername
roject
tnvoleeno
ated

alliumenergyservices
e
thovo

Nhân vật trong danh sách đen

Nếu bạn chắc chắn một số ký tự hoặc biểu thức chắc chắn sẽ không hiển thị trong văn bản của bạn (OCR sẽ trả về văn bản sai thay cho các ký tự trong danh sách đen), bạn có thể đưa vào danh sách đen các ký tự đó bằng cách sử dụng cấu hình sau.

custom_config = r'-c tessedit_char_blacklist=0123456789 --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Đầu ra -

Customer name Hallium Energy services
Project NEHINS-HIB-HSA
lavoice no
Dated %h Nov%
Pono

Phát hiện bằng nhiều ngôn ngữ

Bạn có thể kiểm tra các ngôn ngữ có sẵn bằng cách nhập vào thiết bị đầu cuối

$ tesseract --list-langs

Để tải xuống tesseract cho một ngôn ngữ sử dụng cụ thể

$ sudo apt-get install tesseract-ocr-LANG

trong đó LANG là mã ba chữ cái cho ngôn ngữ bạn cần. Bạn có thể tìm ra các giá trị LANG Ở đây.

Bạn có thể tải về .traindata tập tin cho ngôn ngữ bạn cần Ở đây và đặt nó vào $TESSDATA_PREFIX thư mục (điều này phải giống như nơi tessdata thư mục được cài đặt) và nó sẽ sẵn sàng để sử dụng.

Chú thích - Chỉ những ngôn ngữ có .traineddata định dạng tệp được hỗ trợ bởi tesseract.

Để chỉ định ngôn ngữ bạn cần đầu ra OCR, hãy sử dụng -l LANG đối số trong cấu hình trong đó LANG là mã gồm 3 chữ cái cho ngôn ngữ bạn muốn sử dụng.

custom_config = r'-l eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)

Lấy ví dụ hình ảnh này -
hình ảnh
Bạn có thể làm việc với nhiều ngôn ngữ bằng cách thay đổi tham số LANG như vậy -

custom_config = r'-l grc+tha+eng --psm 6'
pytesseract.image_to_string(img, config=custom_config)

và bạn sẽ nhận được kết quả sau:

Here’s some Greek:

Οδιο διστα ιμπεδιτ φιμ ει, αδ φελ αβχορρεανθ ελωκυενθιαμ, εξ εσε εξερσι γυ-
βεργρεν ηας. Ατ μει σολετ σριπτορεμ. ἴυς αλια λαβωρε θε. Σιθ κυωτ νυσκυαμ
τρασυνδια αν, ὠμνιυμ ελιγενδι τιν πρι. Παρτεμ φερθερεμ συσιπιαντὺυρ εξ ιυς,ναμ
%0790 แ ร เง ๑ ๕ 80 ๕ 6 ๑ อ 06 ส 0 เง น อ ๓ , πρω πρωπριαε σαεφολα ιδ. Ατ πρι δολορ νυ-
σκυαμ.

6 Thai

Here’s some Thai: ν᾿

ค อ ร ั ป ซั น จ ุ ้ ย โป ร ด ิ ว เซ อ ร ์ ส ถา ป ั ต ย ์ จ ๊ า บ แจ ็ ก พ ็ อ ต ม ้ า ห ิ น อ ่ อ น ซา ก ุ ร ะ ค ั น ถ ธ ุ ร ะ ฟิ ด ส ต า ร ์ ท ง ี ้ บ อ ย
ค อ ต อ ื ่ ม แป ร ั ส ั ง โฆ ค ํ า ส า ป แฟ น ซี ศิ ล ป ว ั ฒ น ธร ร ม ไฟ ล ท ์ จ ิ ๊ ก โก ๋ ก ั บ ด ั ก เจ ล พ ล ็ อ ต ม า ม ่ า ซา ก ุ ร ะ ด ี ล เล อ
ร ์ ซี น ด ั ม พ ์ แฮ ป ป ี ้ เอ ๊ ้ า ะ อ ุ ร ั ง ค ธา ต ุ ซิ ม ฟิ น ิ ก ซ์ เท ร ล เล ่ อ ร ์ อ ว อ ร ์ ด แค น ย อ น ส ม า พ ั น ธ์ ค ร ั ว ซอ ง ฮั ม อ า
ข่ า เอ ็ ก ซ์ เพ ร ส

Chú thích - Ngôn ngữ được chỉ định đầu tiên cho -l tham số là ngôn ngữ chính.

Thật không may, tesseract không có tính năng tự động phát hiện ngôn ngữ của văn bản trong hình ảnh. Một giải pháp thay thế được cung cấp bởi một mô-đun python khác được gọi là langdetect có thể được cài đặt thông qua pip.

$ pip install langdetect

Mô-đun này một lần nữa, không phát hiện ngôn ngữ của văn bản bằng hình ảnh nhưng cần đầu vào chuỗi để phát hiện ngôn ngữ từ đó. Cách tốt nhất để làm điều này là trước tiên sử dụng tesseract để nhận văn bản OCR bằng bất kỳ ngôn ngữ nào bạn có thể cảm thấy ở đó, sử dụng langdetect để tìm ngôn ngữ nào được đưa vào văn bản OCR và sau đó chạy lại OCR với các ngôn ngữ được tìm thấy.

Giả sử chúng tôi có một văn bản mà chúng tôi nghĩ là bằng tiếng Anh và tiếng Bồ Đào Nha.

custom_config = r'-l eng+por --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config)

from langdetect import detect_langs
detect_langs(txt)

Điều này sẽ xuất ra một danh sách các ngôn ngữ trong văn bản và xác suất của chúng.

[en:0.714282468983554, es:0.2857145605644145]

Các mã ngôn ngữ được sử dụng bởi langdetect tuân theo mã ISO 639-1. Để so sánh, vui lòng kiểm tra điều nàyđiều này. Chúng tôi thấy rằng ngôn ngữ được sử dụng trong văn bản thay vào đó là tiếng Anh và tiếng Tây Ban Nha.

Chúng tôi lấy lại văn bản bằng cách thay đổi cấu hình thành

custom_config = r'-l eng+spa --psm 6'
txt = pytesseract.image_to_string(img, config=custom_config)

Chú thích - Tesseract hoạt động kém khi, trong một hình ảnh có nhiều ngôn ngữ, các ngôn ngữ được chỉ định trong cấu hình bị sai hoặc hoàn toàn không được đề cập đến. Điều này cũng có thể gây hiểu nhầm cho mô-đun langdetect.


Sử dụng tessdata_fast

Nếu tốc độ là mối quan tâm lớn đối với bạn, bạn có thể thay thế các mô hình ngôn ngữ tessdata của mình bằng các mô hình tessdata_fast là các phiên bản số nguyên 8 bit của các mô hình tessdata.

Theo tessdata_fast github

Kho lưu trữ này chứa các phiên bản số nguyên nhanh của các mô hình được đào tạo cho Công cụ OCR mã nguồn mở Tesseract.

Các mô hình này chỉ hoạt động với công cụ LSTM OCR của Tesseract 4.

  • Đây là sự thỏa hiệp giữa tốc độ / độ chính xác về những gì mang lại "giá trị đồng tiền" tốt nhất về tốc độ và độ chính xác.
  • Đối với một số ngôn ngữ, điều này vẫn là tốt nhất, nhưng hầu hết thì không.
  • Cấu hình mạng “đáng đồng tiền nhất” sau đó đã được tăng cường để có tốc độ cao hơn.
  • Hầu hết người dùng sẽ muốn sử dụng các tệp dữ liệu được đào tạo này để thực hiện OCR và chúng sẽ được chuyển đi như một phần của các bản phân phối Linux, ví dụ. Ubuntu 18.04.
  • Tinh chỉnh / đào tạo gia tăng sẽ KHÔNG có thể từ những điều này fast mô hình, vì chúng là số nguyên 8 bit.
  • Khi sử dụng các mô hình trong kho lưu trữ này, chỉ công cụ OCR dựa trên LSTM mới được hỗ trợ. Di sản tesseract engine không được hỗ trợ với các tệp này, vì vậy các chế độ oem của Tesseract '0' và '2' sẽ không hoạt động với chúng.

sử dụng tessdata_fast mô hình thay vì tessdata, tất cả những gì bạn cần làm là tải xuống tessdata_fast tệp dữ liệu ngôn ngữ từ Ở đây và đặt nó bên trong $TESSDATA_PREFIX thư mục.


Cần số hóa tài liệu, biên lai hoặc hóa đơn nhưng quá lười để viết mã? Đi qua Ống nano và xây dựng các mô hình OCR miễn phí!


Đào tạo Tesseract trên dữ liệu tùy chỉnh

Tesseract 4.00 bao gồm một công cụ nhận dạng dựa trên mạng nơ-ron mới mang lại độ chính xác cao hơn đáng kể trên hình ảnh tài liệu. Mạng nơ-ron yêu cầu dữ liệu đào tạo nhiều hơn đáng kể và đào tạo chậm hơn nhiều so với Tesseract cơ sở. Đối với các ngôn ngữ gốc Latinh, dữ liệu mô hình hiện có được cung cấp đã được đào tạo trên khoảng 400000 dòng văn bản trải dài khoảng 4500 phông chữ.

Để chạy thành công hướng dẫn đào tạo Tesseract 4.0 LSTM, bạn cần có bản cài đặt hoạt động của Công cụ đào tạo Tesseract 4 và Tesseract 4, đồng thời có các tập lệnh đào tạo và tệp dữ liệu được đào tạo bắt buộc trong một số thư mục nhất định. Chuyến thăm repo github cho các tệp và công cụ.

Tesseract 4.00 mất vài ngày đến vài tuần để đào tạo lại từ đầu. Ngay cả với tất cả các dữ liệu đào tạo mới này, do đó đây là một số tùy chọn để đào tạo:

  • Tinh chỉnh - Bắt đầu với một ngôn ngữ được đào tạo hiện có, đào tạo trên dữ liệu bổ sung cụ thể của bạn. Ví dụ đào tạo về tập dữ liệu viết tay và một số phông chữ bổ sung.
  • Cắt bỏ lớp trên cùng - từ mạng và đào tạo lại lớp trên cùng mới bằng cách sử dụng dữ liệu mới. Nếu tinh chỉnh không hoạt động, đây rất có thể là lựa chọn tốt nhất tiếp theo. Sự tương tự tại sao điều này lại hữu ích, hãy lấy ví dụ về các mô hình được đào tạo trên tập dữ liệu ImageNet. Mục đích là xây dựng bộ phân loại mèo hoặc chó, các lớp thấp hơn trong mô hình có khả năng trừu tượng hóa mức thấp như các góc, đường ngang và dọc, nhưng các lớp cao hơn trong mô hình đang kết hợp các tính năng đó và phát hiện tai, mắt, mũi của mèo hoặc chó và như thế. Bằng cách chỉ đào tạo lại các lớp trên cùng, bạn đang sử dụng kiến ​​thức từ các lớp thấp hơn và kết hợp với tập dữ liệu mới khác của mình.
  • Đào tạo lại từ đầu - Đây là một cách tiếp cận rất chậm trừ khi bạn có một bộ đào tạo rất đại diện và đủ lớn cho vấn đề của bạn. Tài nguyên tốt nhất để đào tạo từ đầu là sau đây repo github.

Hướng dẫn về cách đào tạo trên dữ liệu tùy chỉnh của bạn và tạo .traineddata các tập tin có thể được tìm thấy Ở đây, Ở đâyỞ đây.

Chúng tôi sẽ không đề cập đến mã đào tạo sử dụng Tesseract trong bài đăng trên blog này.

Hạn chế của Tesseract

Tesseract hoạt động tốt nhất khi có sự phân đoạn rõ ràng của văn bản nền trước khỏi nền. Trong thực tế, có thể cực kỳ khó khăn để đảm bảo các kiểu thiết lập này. Có nhiều lý do khiến bạn có thể không nhận được đầu ra chất lượng tốt từ Tesseract như nếu hình ảnh bị nhiễu trên nền. Chất lượng hình ảnh (kích thước, độ tương phản, tia chớp) càng tốt thì kết quả nhận dạng càng tốt. Nó yêu cầu một chút xử lý trước để cải thiện kết quả OCR, hình ảnh cần được chia tỷ lệ thích hợp, có độ tương phản hình ảnh nhiều nhất có thể và văn bản phải được căn chỉnh theo chiều ngang. Tesseract OCR khá mạnh nhưng có những hạn chế sau.

Các giới hạn của khối Tesseract được tổng hợp trong danh sách.

  • OCR không chính xác như một số giải pháp thương mại có sẵn cho chúng tôi.
  • Không hoạt động tốt với hình ảnh bị ảnh hưởng bởi hiện vật bao gồm tắc một phần, phối cảnh méo mó và nền phức tạp.
  • Nó không có khả năng nhận dạng chữ viết tay.
  • Nó có thể thấy vô nghĩa và báo cáo đây là đầu ra OCR.
  • Nếu một tài liệu chứa các ngôn ngữ bên ngoài những ngôn ngữ đã cho trong đối số -l LANG, thì kết quả có thể kém.
  • Không phải lúc nào việc phân tích thứ tự đọc tự nhiên của tài liệu cũng tốt. Ví dụ: nó có thể không nhận ra rằng một tài liệu chứa hai cột và có thể cố gắng nối văn bản giữa các cột.
  • Bản quét chất lượng kém có thể tạo ra OCR chất lượng kém.
  • Nó không tiết lộ thông tin về phông chữ thuộc họ văn bản nào.

Tất nhiên, có một cách tốt hơn, đơn giản hơn và trực quan hơn nhiều để thực hiện các tác vụ OCR.


OCR với Nanonets

Sản phẩm API OCR của Nanonets cho phép bạn xây dựng các mô hình OCR một cách dễ dàng. Bạn không phải lo lắng về việc xử lý trước hình ảnh của mình hoặc lo lắng về các mẫu phù hợp hoặc xây dựng các công cụ dựa trên quy tắc để tăng độ chính xác của mô hình OCR của bạn.

Bạn có thể tải lên dữ liệu của mình, chú thích dữ liệu, đặ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 mà không cần viết một dòng mã, lo lắng về GPU hoặc tìm kiến ​​trúc phù hợp cho mô hình học sâu của bạn. Bạn cũng có thể có được các phản hồi JSON của từng dự đoán để tích hợp nó với các hệ thống của riêng bạn và xây dựng các ứng dụng hỗ trợ học máy được xây dựng dựa trên các thuật toán hiện đại và cơ sở hạ tầng mạnh.

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

Bạn cũng có thể sử dụng Nanonets-OCR API bằng cách làm theo các bước bên dưới: ‌

Bước 1: Sao chép Repo, Cài đặt phụ thuộc

git clone https://github.com/NanoNets/nanonets-ocr-sample-python.git
cd nanonets-ocr-sample-python
sudo pip install requests tqdm

Bước 2: Nhận Khóa API miễn phí của bạn
Nhận Khóa API miễn phí của bạn từ https://app.nanonets.com/#/keys

biển số-phát hiện-gif

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 ý: Điều này 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

Lưu ý: bạn sẽ nhận được YOU_MODEL_ID từ bước trước

Bước 6: Tải lên dữ liệu đào tạo
Dữ liệu đào tạo được tìm thấy trong images (tệp hình ảnh) và annotations (chú thích cho các tập tin hình ảnh)

python ./code/upload-training.py

Bước 7: Mô hình tàu hỏa
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 ~ 2 giờ để đà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

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 bằng mô hình

python ./code/prediction.py ./images/151.jpg

Nanonets và con người trong vòng lặp

‌‌Màn hình 'Trung bình' hỗ trợ quá trình chỉnh sửa và nhập và giảm gần 90% khối lượng công việc của người đánh giá thủ công và giảm 50% chi phí cho tổ chức.

Các tính năng bao gồm

  1. Theo dõi dự đoán là chính xác
  2. Theo dõi những cái nào sai
  3. Sửa lỗi cho những cái không chính xác
  4. Xóa những cái sai
  5. Điền vào các dự đoán còn thiếu
  6. Lọc ảnh với phạm vi ngày
  7. Nhận số lượng hình ảnh được kiểm duyệt so với những hình ảnh không được kiểm duyệt

Tất cả các trường được cấu trúc thành một GUI dễ sử dụng cho phép người dùng tận dụng công nghệ OCR và hỗ trợ làm cho nó tốt hơn khi họ đi, mà không phải nhập bất kỳ mã nào hoặc hiểu cách thức hoạt động của công nghệ.


Bạn có một vấn đề OCR trong tâm trí? Bạn muốn giảm chi phí nhập dữ liệu của tổ chức? Đi qua Ống nano và xây dựng các mô hình OCR để trích xuất văn bản từ hình ảnh or trích xuất dữ liệu từ các tệp PDF!


Kết luận

Giống như việc học sâu đã tác động đến gần như mọi khía cạnh của thị giác máy tính, điều này cũng đúng đối với nhận dạng ký tự và nhận dạng chữ viết tay. Các mô hình dựa trên học sâu đã quản lý để có được độ chính xác chưa từng có trong nhận dạng văn bản, vượt xa truyền thống khai thác thông tinxử lý hình ảnh học máy tiếp cận.

Tesseract hoạt động tốt khi hình ảnh tài liệu tuân theo các hướng dẫn tiếp theo:

  • Phân đoạn rõ ràng của văn bản nền trước khỏi nền
  • Căn chỉnh theo chiều ngang và chia tỷ lệ thích hợp
  • Hình ảnh chất lượng cao không bị nhòe và nhiễu

Bản phát hành mới nhất của Tesseract 4.0 hỗ trợ OCR dựa trên học sâu chính xác hơn đáng kể. Bản thân công cụ OCR được xây dựng trên mạng Bộ nhớ ngắn hạn dài (LSTM), một loại Mạng thần kinh tái diễn (RNN).

Tesseract hoàn hảo để quét các tài liệu sạch và đi kèm với độ chính xác khá cao và khả năng thay đổi phông chữ vì nó được đào tạo toàn diện. Tôi có thể nói rằng Tesseract là một công cụ phù hợp nếu nhiệm vụ của bạn là quét sách, tài liệu và văn bản in trên nền trắng sạch.


Đọc thêm

Cập nhật:
Rất nhiều người đã hỏi chúng tôi bằng cách nào họ có thể lấy ngày ở dạng văn bản hoặc sử dụng khi nó phát hiện ngày hoặc bất kỳ dữ liệu cụ thể nào khác để họ có thể thêm vào danh sách.
Đây là câu trả lời:
Trong mã để vẽ một hộp giới hạn xung quanh hộp ngày, bạn sẽ nhận thấy một đường phù hợp với mẫu regex với d['text']. Nó chỉ vẽ một hộp nếu mẫu phù hợp. Bạn có thể chỉ cần trích xuất các giá trị từ d['text'] khi mẫu phù hợp và nối chúng vào danh sách.

Cập nhật 2:
Để giải quyết các câu hỏi xung quanh OCR không phải tiếng Anh, chúng tôi đã cập nhật danh sách đọc thêm.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img

Trò chuyện trực tiếp với chúng tôi (chat)

Chào bạn! Làm thế nào để tôi giúp bạn?