Python nhận dạng văn bản từ hình ảnh như thế nào?

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 triển khai PDF OCR trong python bằng công cụ Tesseract. Chúng ta sẽ đi qua các mô-đun sau

  • Tính năng OCR của Tesseract
  • Tiền xử lý cho OCR bằng OpenCV
  • Chạy Tesseract với CLI và Python
  • Hạn chế của động cơ Tesseract

Giới thiệu

OCR = Nhận dạng ký tự quang học. Nói cách khác, các hệ thống OCR chuyển đổi hình ảnh hai chiều của văn bản, có thể chứa văn bản được 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à

  • Tiền xử lý hình ảnh
  • Bản địa hóa văn bản
  • Phân đoạn nhân vật
  • Nhận dạng ký tự
  • xử lý bài đăng

Tất nhiên, các quy trình phụ trong danh sách trên có thể khác nhau, nhưng về cơ bản đây là các bước 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 của nó là xác định và ghi lại tất cả các từ duy nhất bằ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ỷ, các hệ thống nhận dạng ký tự quang học đã được sử dụng rộng rãi để cung cấp mục nhập văn bản tự động vào các hệ thống vi tính hóa. Tuy nhiên, trong suốt thời gian qua, các hệ thống OCR trực tuyến thông thường [như OCR khu vực] chưa bao giờ khắc phục được tình trạng không thể đọc nhiều hơn một số phông chữ và định dạng trang. Loại cách đều nhau theo tỷ lệ [bao gồm hầu như tất cả các bản sao 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 tác động cận biên đối với tổng số tài liệu cần chuyển đổi sang dạng kỹ thuật số

Quá 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 đề được đề cập ở trên thực sự tốt bằng cách sử dụng 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 giữa các mô hình sâu và bộ dữ liệu khổng lồ có sẵn công khai, các mô hình đạt được độ chính xác cao nhất trong các nhiệm vụ nhất định. Ngày nay, cũng có thể tạo dữ liệu tổng hợp với các phông chữ khác nhau bằng cách sử dụng các mạng đối nghịch chung và một số phương pháp 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, chẳng hạn như cảnh tự 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ệ này 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ư

  • đầu đọc biển số tòa nhà
  • số hóa hóa đơn
  • số hóa menu
  • số hóa thẻ căn cước

Có một vấn đề OCR trong tâm trí?

Lên lịch trình diễn

Công cụ OCR mã nguồn mở

Có rất nhiều phần mềm nhận dạng ký tự quang học 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 nguồn mở đã trở nên phổ biến đối với các nhà phát triển OCR. Mặc dù đôi khi việc triển khai và sửa đổi có thể gây khó khăn, nhưng không có quá nhiều giải pháp thay thế OCR mạnh mẽ và miễn phí trên thị trường trong thời gian dài nhất. Tesseract bắt đầu như một Ph. D. 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ở. 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

OCRopus - OCRopus là một hệ thống OCR nguồn mở cho phép đánh giá và sử dụng lại dễ dàng các thành phần OCR của cả nhà nghiên cứu và công ty. Tập hợp các chương trình phân tích tài liệu, không phải 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òn có một số tập lệnh để chỉnh sửa và chỉnh sửa sự thật cơ bản, đo tỷ lệ lỗi, xác định ma trận nhầm lẫn dễ sử dụng và chỉnh sửa

Ocular - Ocular hoạt động tốt nhất trên các tài liệu được in bằng cách ấn 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ử tiên tiến nhất. Các tính năng chính của nó là

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

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 vượt bậc 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 deep learning. Kiểm tra blog để tìm hiểu thêm tại sao. SwiftOCR là thư viện OCR nhanh và đơn giản sử dụng mạng thần kinh để 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ẽ tập trung vào Tesseract OCR và tìm hiểu thêm về cách thức hoạt động cũng như cách sử dụng của nó

Tesseract OCR

Tesseract là một Công cụ nhận dạng văn bản [OCR] nguồn mở, có sẵn trong Apache 2. 0 giấy phép. 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à khung thông qua các trình bao bọc có thể tìm thấy tại đâ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 có thể được sử dụng cùng với trình phát hiện 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

Luồng quy trình OCR để xây dựng API với Tesseract từ một bài đăng trên blog

Teseract 4. 00 bao gồm một hệ thống con mạng thần kinh 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ừ triển khai LSTM dựa trên Python của OCRopus nhưng đã được thiết kế lại cho Tesseract trong C++. Hệ thống mạng thần kinh 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 đổi [VGSL], ngôn ngữ này cũng có sẵn cho TensorFlow

Để nhận dạng một hình ảnh chứa một ký tự, chúng tôi thường sử dụng Mạng thần kinh chuyển đổi [CNN]. Văn bản có độ dài tùy ý là một chuỗi ký tự và các vấn đề như vậy được giải quyết bằ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 giỏi trong việc học các trình tự nhưng 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 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 trong Python, 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 thần kinh hồi quy LSTM trong C++, sử dụng thư viện Eigen để tính toán số

Quá trình Tesseract 3 OCR từ giấy

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

  • tìm từ
  • tìm đường
  • phân loại nhân vật

Việc tìm từ được thực hiện bằng cách sắp xếp các dòng văn bản thành các đốm màu và các dòng và vùng được phân tích để tìm cao độ cố định hoặc văn bản theo 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ự. Quá trình nhận dạng sau đó tiến hành như một quá trình hai lượt. Trong lượt đầu tiên, một nỗ lực được thực hiện để lần lượt nhận ra từng từ. Mỗi từ đạt yêu cầu được chuyển đến bộ phân loại thích ứng dưới dạng dữ liệu huấn luyện. Trình phân loại thích ứng sau đó có cơ hội nhận dạng văn bản chính xác hơn ở cuối trang

Hiện đại hóa công cụ Tesseract là nỗ lực làm sạch mã và thêm 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] theo từng dòng đưa vào mô hình LSTM và cho kết quả đầ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 bản trình bày mô hình LSTM

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ữ 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 sẵn có tại đây. Đừng quên chỉnh sửa biến môi trường “đường dẫn” và thêm đường dẫn tesseract. Để cài đặt Linux hoặc Mac, nó được cài đặt với một 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 nhập lệnh trong terminal hoặc cmd

image = cv2.imread['aurebesh.jpg']

gray = get_grayscale[image]
thresh = thresholding[gray]
opening = opening[gray]
canny = canny[gray]
5

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 này bằng cách sử dụng pip

image = cv2.imread['aurebesh.jpg']

gray = get_grayscale[image]
thresh = thresholding[gray]
opening = opening[gray]
canny = canny[gray]
6

Thư viện Tesseract được cung cấp cùng với một công cụ dòng lệnh tiện dụng có tên 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 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 của mình, 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 image_path 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 gõ như sau

image = cv2.imread['aurebesh.jpg']

gray = get_grayscale[image]
thresh = thresholding[gray]
opening = opening[gray]
canny = canny[gray]
7

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

image = cv2.imread['aurebesh.jpg']

gray = get_grayscale[image]
thresh = thresholding[gray]
opening = opening[gray]
canny = canny[gray]
8

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

image = cv2.imread['aurebesh.jpg']

gray = get_grayscale[image]
thresh = thresholding[gray]
opening = opening[gray]
canny = canny[gray]
9

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ỉ đang tìm cách OCR một vùng nhỏ, hãy thử một chế độ phân đoạn khác, sử dụng đối số --psm. Có 14 chế độ có sẵn có thể được tìm thấ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ố, gõ như sau

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
0

Ngoài ra còn có một đối số quan trọng hơn, chế độ công cụ OCR [oem]. Tesseract 4 có hai công cụ OCR — Legacy Tesseract engine và LSTM engine. Có bốn chế độ hoạt động được chọn bằng tùy chọn --oem
0    Chỉ công cụ cũ
1    Chỉ công cụ LSTM của mạng nơ-ron
2    Công cụ cũ + 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 dành cho trăn cũng đóng vai trò là 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 cho tesseract, vì nó có thể đọc tất cả các loại hình ảnh được thư viện hình ảnh Gối và Leptonica hỗ trợ, bao gồm jpeg, png, gif, bmp, tiff, v.v.

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

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 giảm độ chính xác đầu ra tesseract của bạn, bạn cần đảm bảo hình ảnh phù hợp

Điều này bao gồm thay đổi kích thước, nhị phân hóa, loại bỏ tiếng ồn, làm mờ, v.v.

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

________số 8_______

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

Hệ thống chữ viết Aurebesh

Sau khi tiền xử lý với đoạn 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 kết quả sau

Hình ảnh sau khi tiền xử lý

Đầ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 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

Nhận hộp xung quanh văn bản

Sử dụng Pytesseract, bạn có thể lấy thông tin hộp giới hạn cho kết quả OCR của mình bằng mã sau

Tập lệnh bên dưới sẽ cung cấp cho bạn thông tin hộp giới hạn cho từng ký tự được phát hiện bởi tesseract trong 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

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
1 sẽ rất hữu ích. Bạn có thể sử dụng hàm
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
1 với loại đầu ra được chỉ định bằng pytesseract
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
3

Có một vấn đề OCR trong tâm trí?

Lên lịch trình diễn

Chúng tôi sẽ sử dụng hình ảnh hóa đơn mẫu ở trên để kiểm tra kết quả đầ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 đầu ra sau -

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
4

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

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

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]
0

Đây là hình ảnh của 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 một ngày trong một 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ẽ khớp với các 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 mô-đun

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
5 và hàm
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
1 cho việc này

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]
1

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

Chế độ phân đoạn trang

Có một số cách một trang văn bản có thể được phân tích. 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    Tự động phân đoạn trang, 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. [Vỡ nợ]
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    Xử lý hình ảnh dưới dạng một dòng văn bản
8    Xử lý hình ảnh dưới dạng một từ
9    Xử lý hình ảnh như một từ duy nhất trong một vòng tròn
10    Xử lý hình ảnh dưới dạng một ký tự
11    Văn bản thưa thớt. Tìm càng nhiều văn bản càng tốt không theo thứ tự cụ thể
12    Văn bản rời rạc với OSD
13    Dòng thô. Xử lý hình ảnh dưới dạng một dòng văn bản, bỏ qua các bản hack dành riêng cho Tesseract

Để thay đổi chế độ phân đoạn trang của bạn, hãy thay đổi đối số

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
7 trong chuỗi cấu hình tùy chỉnh của bạn thành bất kỳ mã chế độ nào được đề cập ở trên

Phát hiện định hướng và kịch bản

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ả tập lệnh được viết trong đó. Hình ảnh sau đây -


sau khi chạy qua đoạn mã sau -

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]
2

sẽ in đầu ra sau

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]
3

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

Lấy hình ảnh này làm ví dụ -


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

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]
4

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

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]
5

Đầu ra sẽ trông như thế này

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]
6

ký tự 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 trắng các ký tự của mình [ở đây, chúng tôi chỉ sử dụng tất cả các ký tự chữ thường từ a đến z] bằng cách sử dụng cấu hình sau

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]
7

Đầu ra -

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]
8

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

Nếu bạn chắc chắn rằng một số ký tự hoặc biểu thức chắc chắn sẽ không xuất hiện 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 các ký tự đó vào danh sách đen bằng cách sử dụng cấu hình sau

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]
9

Đầu ra -

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] 
0

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 ngôn ngữ này vào thiết bị đầu cuối

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
8

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

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
9

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

Bạn có thể tải xuống tệp

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
0 cho ngôn ngữ bạn cần từ đây và đặt nó vào thư mục
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
1 [thư mục này phải giống với nơi thư mục
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
2 được cài đặt] và nó sẽ sẵn sàng để sử dụng

Lưu ý - Chỉ những ngôn ngữ có định dạng tệp

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
3 mới được hỗ trợ bởi tesseract

Để chỉ định ngôn ngữ mà bạn cần đầu ra OCR của mình, hãy sử dụng đối số

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
4 trong cấu hình trong đó LANG là mã 3 chữ cái cho ngôn ngữ bạn muốn sử dụng

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] 
1

Lấy hình ảnh này làm ví dụ -


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 -

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] 
2

và bạn sẽ nhận được đầu ra sau -

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] 
3

Lưu ý - Ngôn ngữ được chỉ định đầu tiên cho tham số

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
5 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ó tên là

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
6 có thể được cài đặt qua pip

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
7

Một lần nữa, mô-đun này không phát hiện ngôn ngữ của văn bản bằng hình ảnh mà cần nhập chuỗi để phát hiện ngôn ngữ từ. Cách tốt nhất để làm điều này trước tiên là 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 có trong đó, sử dụng

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
6 để tìm ngôn ngữ nào được bao gồm trong văn bản OCR rồi 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

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] 
4

Đ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

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] 
5

Mã ngôn ngữ được sử dụng bởi

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
6 tuân theo mã ISO 639-1. Để so sánh, vui lòng kiểm tra cái này và cái này. Chúng tôi thấy rằng ngôn ngữ được sử dụng trong văn bản là tiếng Anh và tiếng Tây Ban Nha thay thế

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

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] 
6

Lưu ý - 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. Điều này cũng có thể đánh lừa mô-đun langdetect khá nhiều

Sử dụng tessdata_fast

Nếu tốc độ là mối quan tâm chính đố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à 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à một sự thỏa hiệp về tốc độ/độ chính xác đối với những gì mang lại "giá trị đồng tiền" tốt nhất về tốc độ so với độ 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 đối với hầu hết thì không
  • Cấu hình mạng "đáng đồng tiền bát gạo" sau đó được số hóa để 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 vận chuyển như một phần của bản phân phối Linux, vd. Ubuntu 18. 04
  • Tinh chỉnh/đào tạo gia tăng sẽ KHÔNG thể thực hiện được từ các mô hình
    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
    
    0 này, 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ó công cụ OCR dựa trên LSTM mới được hỗ trợ. Công cụ kế thừa
    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
    
    1 không được hỗ trợ với các tệp này, vì vậy các chế độ OEM '0' và '2' của Tesseract sẽ không hoạt động với chúng

Để sử dụng các mô hình

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
2 thay vì
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
2, tất cả những gì bạn cần làm là tải xuống tệp dữ liệu ngôn 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
2 của bạn từ đây và đặt nó vào thư mục
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
1 của bạn

Bạn cần số hóa chứng từ, biên lai, hóa đơn nhưng lười mã hóa?

Lên lịch trình diễn

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

Teseract 4. 00 bao gồm một công cụ nhận dạng dựa trên mạng thần kinh mới mang lại độ chính xác cao hơn đáng kể cho hình ảnh tài liệu. Mạng lưới thần kinh yêu cầu dữ liệu đào tạo nhiều hơn đáng kể và đào tạo chậm hơn rất nhiều so với Tesseract cơ sở. Đối với các ngôn ngữ dựa trên tiếng 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 bao gồm khoảng 4500 phông chữ

Để chạy thành công Tesseract 4. 0 LSTM, bạn cần cài đặt Tesseract 4 và Công cụ đào tạo Tesseract 4 đang hoạt động, đồng thời có các tập lệnh đào tạo và các tệp dữ liệu được đào tạo bắt buộc trong các thư mục nhất định. Truy cập kho lưu trữ github để biết các tệp và công cụ

Teseract 4. 00 mất vài ngày đến vài tuần để đào tạo 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 lớp trên cùng - khỏi 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 bộ dữ liệu ImageNet. Mục tiêu là xây dựng một 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ó . 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 bộ dữ liệu khác mới 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 đủ lớn và đại diện cho vấn đề của mình. Tài nguyên tốt nhất để đào tạo từ đầu là theo dõi repo github này

Bạn có thể tìm thấy hướng dẫn về cách huấn luyện dữ liệu tùy chỉnh của mình và tạo tệp

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
3 tại đây, tại đây và tại đâ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 giữa văn bản nền trước và nền sau. Trên 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 có nhiễu trên nền. Chất lượng hình ảnh [kích thước, độ tương phản, ánh sáng] 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 tiền xử lý để cải thiện kết quả OCR, hình ảnh cần được chia tỷ lệ phù hợp, có độ tương phản hình ảnh càng nhiều càng tốt 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

Giới hạn Tesseract được tóm tắt 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 các hình ảnh bị ảnh hưởng bởi các tạo tác bao gồm che khuất một phần, phối cảnh bị bóp méo 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ữ nằm ngoài ngôn ngữ được đưa ra trong các đối số -l LANG, 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ụ: có thể không nhận ra rằng tài liệu chứa hai cột và có thể cố nối văn bản qua 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ề văn bản thuộc họ phông chữ 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 để thực hiện các tác vụ OCR

OCR với Nanonet

Nanonets OCR API 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 hay lo lắng về việc khớp các mẫu 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, thiết lập 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ã nào, 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 mình. Bạn cũng có thể lấy 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ợ máy học đượ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 mẽ

Sử dụng GUI. https. //ứng dụng. mạng nano. com/

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

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

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] 
7

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ừ

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

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] 
8

Bước 4. Tạo một mô hình mới

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] 
9

Ghi chú. Điều này tạo MODEL_ID mà bạn cần cho bước tiếp theo

Bước 5. Thêm Model Id làm Biến môi trường

image = cv2.imread['aurebesh.jpg']

gray = get_grayscale[image]
thresh = thresholding[gray]
opening = opening[gray]
canny = canny[gray]
0

Ghi chú. bạn sẽ nhận được YOUR_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

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
7 [tệp hình ảnh] và
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
8 [chú thích cho tệp hình ảnh]

image = cv2.imread['aurebesh.jpg']

gray = get_grayscale[image]
thresh = thresholding[gray]
opening = opening[gray]
canny = canny[gray]
1

Bước 7. Mô hình xe lửa
Khi Hình ảnh đã được tải lên, hãy bắt đầu đào tạo Mô hình

image = cv2.imread['aurebesh.jpg']

gray = get_grayscale[image]
thresh = thresholding[gray]
opening = opening[gray]
canny = canny[gray]
2

Bước 8. Nhận trạng thái mô hình
Mô hình mất ~2 giờ để đào tạo. Bạn sẽ nhận được email sau khi mô hình được đào tạo. Trong khi chờ đợi, bạn kiểm tra trạng thái của mô hình

image = cv2.imread['aurebesh.jpg']

gray = get_grayscale[image]
thresh = thresholding[gray]
opening = opening[gray]
canny = canny[gray]
3

Bước 9. Đưa ra dự đoán
Sau khi mô hình được đào tạo. Bạn có thể đưa ra dự đoán bằng cách sử dụng mô hình

image = cv2.imread['aurebesh.jpg']

gray = get_grayscale[image]
thresh = thresholding[gray]
opening = opening[gray]
canny = canny[gray]
4

Nanonet 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, đồng thời 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 đúng
  2. Theo dõi cái nào sai
  3. Chỉnh sửa những chỗ chưa 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 hình ả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ọ sử dụng mà không cần 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ệ

Có một vấn đề OCR trong tâm trí?

Lên lịch trình diễn

Phần kết luận

Giống như việc học sâu đã tác động đến hầu hết 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ý để đạt được độ chính xác nhận dạng văn bản chưa từng có, vượt xa các phương pháp xử lý hình ảnh và khai thác thông tin truyền thống bằng máy học

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 từ 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ị mờ 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 deep learning 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 phát [RNN]

Tesseract là công cụ hoàn hảo để quét các tài liệu sạch và có độ chính xác khá cao cũng như khả năng thay đổi phông chữ do quá trình đào tạo của nó rất toàn diện. Tôi muốn nói rằng Tesseract là một công cụ cần thiết 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

Làm cách nào để xác định văn bản trong một hình ảnh?

OCR hoặc Nhận dạng ký tự quang học , hoạt động bằng cách diễn giải văn bản trong hình ảnh và trích xuất văn bản đó dưới dạng bản sao có thể chỉnh sửa cho người dùng. Công nghệ này chứa nhiều loại biểu tượng, ký tự và số phù hợp với văn bản trên hình ảnh và hiển thị cho người dùng với độ chính xác cao.

Python xử lý dữ liệu hình ảnh như thế nào?

Hãy bắt đầu .
Bước 1. Nhập thư viện cần thiết. Gói Skimage cho phép chúng tôi xử lý hình ảnh bằng Python. .
Bước 2. Nhập hình ảnh. Khi chúng tôi có tất cả các thư viện, chúng tôi cần nhập tệp hình ảnh của mình vào python. .
Bước 3. Tìm số sao. .
Bước 4. Đã xác thực xem chúng tôi có chụp được tất cả các ngôi sao hay không

Phát hiện hình ảnh trong python là gì?

Công nghệ này có khả năng xác định các đối tượng tồn tại trong hình ảnh và video và theo dõi chúng . Nhận dạng đối tượng, còn được gọi là Phát hiện đối tượng, có nhiều ứng dụng khác nhau như nhận dạng khuôn mặt, nhận dạng phương tiện, đếm người đi bộ, phương tiện tự lái, hệ thống an ninh, v.v.

OCR trong Python là gì?

Nhận dạng ký tự quang học [OCR] với Tài liệu AI [Python]

Chủ Đề