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ố
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
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
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ố
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
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]
5Và 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]
6Thư 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]
9Theo 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
0Ngoà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
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ư -
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
Đầ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
3Có 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
4Sử 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àyimport 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]
1Như 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ênPhá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]
2sẽ 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]
3Chỉ 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]
4Bạ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]
6ký 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]
8Nhâ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]
0Phá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
9trong đó 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ụngLư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ụngimport 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]
1Lấ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]
2và 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]
3Lư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ínhThậ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 pipCAE 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
7Mộ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ấyGiả 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]
5Mã 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]
6Lư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
0 này, vì chúng là số nguyên 8 bitGALACTIC 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
- 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
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úngGALACTIC 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
Để 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ạnBạ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 đâyChú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]
7Bướ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]
8Bướ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]
9Ghi 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]
0Ghi 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]
1Bướ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]
2Bướ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]
3Bướ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]
4Nanonet 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
- Theo dõi dự đoán đúng
- Theo dõi cái nào sai
- Chỉnh sửa những chỗ chưa chính xác
- Xóa những cái sai
- Điền vào các dự đoán còn thiếu
- Lọc hình ảnh với phạm vi ngày
- 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