Professional Documents
Culture Documents
3.1 VietOcr
· VietOCR Là giải pháp nhận dạng ký tự quang học (OCR) tập trung vào cải thiện độ
chính xác cho việc nhận dạng ký tự Tiếng Việt.
· Phát triển dựa trên lõi OCR Tesseract (Tesseract là công cụ OCR mã nguồn mở được
tài trợ bởi Google, được xem là một trong nhưng công cụ OCR tốt nhất hiện nay)
· Hỗ trợ tất cả các ngôn ngữ do Tesseract cung cấp, cho phép người dùng tải xuống tự
động và cài đặt các gói ngôn ngữ
· Hỗ trợ định dạng: PDF, TIFF, JPEG, GIF, PNG, BMP
· Hỗ trợ các công cụ xử lý ảnh: chỉnh nghiêng, xóa đường kẻ, tách trang...
· Khả năng xử lý hàng loạt
3.2 Quy Trình:
● Cài đặt VietOCR: pip install vietocr
● Nhập thư viện và khởi tạo: from vietocr import Tesseract ocr = Tesseract()
● Nhận dạng văn bản từ hình ảnh: text = ocr.ocr('path/to/image.jpg')
● Xử lý kết quả: for line in text: print(line)
● Tùy chỉnh cấu hình (tuỳ chọn)
● Xử lý lỗi và xử lý ngoại lệ (tuỳ chọn)
● Xử lý các trường hợp ngoại lệ hoặc xử lý lỗi nếu cần thiết, đặc biệt là đối với các ảnh
đặc biệt hoặc điều kiện khó khăn.
3.3 Sơ đồ tổng quan dự án
Đo lường độ chính xác (accuracy) của một mô hình máy học hay mô hình nhận dạng văn
bản, nhận dạng hình ảnh, hoặc bất kỳ nhiệm vụ nào khác thường được thực hiện thông qua
quy trình so sánh dự đoán của mô hình với nhãn thực tế (ground truth). Các bước để đo
lường độ chính xác:
1. Ma trận lỗi (Confusion Matrix):
Ma trận lỗi là một bảng hiển thị số lượng dự đoán đúng và sai cho từng lớp của mô hình. Nó
thường được sử dụng để đo lường độ chính xác và các thước đo hiệu suất khác như
precision, recall, và F1-score.
2. Độ chính xác (Accuracy):
3. Precision, Recall, và F1-score:
· Precision (độ chính xác): Tỉ lệ giữa số lượng dự đoán đúng và tổng số lượng dự đoán
positive.
· Recall (tính phủ): Tỉ lệ giữa số lượng dự đoán đúng và tổng số lượng thực tế positive.
· F1-score: Kết hợp giữa precision và recall để đo lường sự cân bằng giữa hai.
4. Area Under the Receiver Operating Characteristic Curve (AUC-ROC):
· Dùng trong trường hợp các mô hình phân loại nhị phân, AUC-ROC đo lường khả năng
của mô hình phân loại giữa các lớp positive và negative.
Sau đó test với thư viện open-cv thì cũng không khá hơn là bao, độ chính xác vẫn thấp, box
không đóng được những phần cần thiết
Tiếp tục kết hợp cả 2 model lại (pytesseract và open-cv) thì cho ra độ chính xác chỉ 50-60%.
Sau khi phát hiện EasyOCR thì cho ra kết quả khá khả quan. Độ chính xác khá ổn định, box
cũng đã đóng được những phần cần thiết
Sau đó sử dụng thử model EasyOCR thì Kết hợp cả EasyOCR với Pytesseract để đóng khung
và xuất chữ, kết quả cũng vượt hơn so với EasyOCR
Và hiện tại đã sử dụng EasyOCR và vietOCR trong việc nhận dạng các ô chữ thì thấy rằng,
model không cần training, nhưng accu mang lại cao hơn so với những model trước.
Và nó có thể điền thông tin vào file CSV, để thuận tiện cho việc trích xuất thông tin cần thiết
về sản phẩm, nhập kho,...
2. Cách hoạt động của model
a. Sơ đồ cấu trúc
b. Quy trình hoạt động của model
Bước 1: Nhập các thư viện cần thiết
Bước 2: tiền xử lý ảnh, nơi mà ảnh được chuẩn bị để tăng cường độ chính xác của việc nhận
dạng văn bản. Chuyển đổi từ mặc định sang xám, điều giúp giảm bớt sự phức tạp của ảnh và
nổi bật hóa văn bản so với nền. Và việc nhận dạng văn bản thường hoạt động tốt hơn trên ảnh
xám.
Bước 3: Đọc, hiển thị ảnh và đưa ảnh vào hàm chỉnh ảnh.
Bước 4: Sử dụng EasyOCR để xác định và trích xuất văn bản từ ảnh đã qua tiền xử lý,
Bước 5: Sử dụng matplotlib để vẽ các hộp giới hạn quanh văn bản đã được nhận dạng và gắn
nhãn với đoạn văn bản tương ứng.
Bước 6: Xử lý văn bản được nhận dạng từ các vùng cụ thể trong hình ảnh và lưu trữ chúng
dưới dạng danh sách hoặc trong tệp.
Bước 7: Nhận dạng văn bản trên mỗi cột, văn bản được xác định và trích xuất từ các khu vực
cụ thể của ảnh
Bước 8: Lưu trữ kết quả vào một tệp CSV.
Tại sao không training? Các model đã làm lỗi ở phần nào?
Thông qua sự tìm hiểu thì tụi em muốn xây dựng mô hình bằng cách training trên
trang web theos.ai. Trang web cung cấp tool để dán nhãn cho tập dữ liệu và chọn
mô hình và training dựa trên bộ dữ liệu đã dán nhãn-> Link (API) để employ UI/UX
Tuy nhiên kết quả training tệ vì thiếu dữ liệu, label 50 tấm ảnh thủ công, accuracy là
1,2%
Best weights là bộ trọng số tốt nhất để mô hình deep learning đạt được accuracy
cao nhất.
· import easyocr: Thư viện này cung cấp chức năng nhận dạng văn bản từ hình
ảnh. EasyOCR hỗ trợ nhiều ngôn ngữ khác nhau và có thể được sử dụng để
nhận dạng ký tự trên hình ảnh một cách nhanh chóng.
· from PIL import Image: PIL (Python Imaging Library), cụ thể là lớp Image, cho
phép mở, xử lý, và lưu nhiều định dạng hình ảnh khác nhau. Trong quá trình
OCR, nó thường được sử dụng để xử lý các hình ảnh cắt từ kết quả OCR.
· import cv2: Thư viện OpenCV (Open Source Computer Vision Library) là một
thư viện mạnh mẽ cho xử lý ảnh và học máy. Trong OCR, OpenCV thường được
sử dụng để thực hiện các bước tiền xử lý hình ảnh như chuyển đổi sang ảnh
xám, làm mịn, loại bỏ nhiễu, v.v.
· import numpy as np: Numpy là thư viện cơ bản cho tính toán khoa học trong
Python. Trong quá trình này, Numpy có thể được sử dụng để thao tác với các
mảng số, chẳng hạn như thay đổi kích thước của hình ảnh hoặc áp dụng các
phép toán trên pixel.
· from vietocr.tool.predictor import Predictor: Đây là một phần của thư viện
VietOCR, được thiết kế để nhận dạng văn bản tiếng Việt. Predictor là lớp chính
sử dụng để nhận dạng văn bản từ hình ảnh.
· from vietocr.tool.config import Cfg: Cfg cho phép tải và tùy chỉnh cấu hình của
VietOCR. Điều này bao gồm việc thiết lập mô hình mạng nơ-ron, thiết bị tính toán
(CPU hoặc GPU), và các thông số khác liên quan đến quá trình nhận dạng văn
bản.
Bước 2 trong quy trình OCR là tiền xử lý ảnh, nơi mà ảnh được chuẩn bị để tăng
cường độ chính xác của việc nhận dạng văn bản. Dưới đây là chi tiết của code và
mô tả từng dòng:
· return gray: Kết quả của hàm tiền xử lý là ảnh xám, được trả về để sử dụng
cho các bước tiếp theo của quy trình OCR.
Bước 3 trong quy trình OCR liên quan đến việc cấu hình các công cụ OCR - cụ thể
là EasyOCR và VietOCR - để chuẩn bị cho việc nhận dạng văn bản. Đây là chi tiết
của code cho bước này và giải thích từng phần:
· reader = easyocr.Reader(['vi']): Tạo một instance của lớp Reader từ thư viện
EasyOCR, với 'vi' chỉ ra rằng ngôn ngữ được sử dụng cho nhận dạng là tiếng
Việt. Điều này quan trọng cho việc nhận dạng chính xác các ký tự tiếng Việt, có
thể bao gồm cả các dấu điệu đặc trưng.
· config['device'] = 'cuda:0': Chỉ định rằng VietOCR nên sử dụng GPU cho việc
xử lý, với 'cuda:0' chỉ định GPU đầu tiên trong hệ thống (nếu có nhiều hơn một
GPU). Sử dụng GPU sẽ tăng tốc độ xử lý đáng kể, đặc biệt quan trọng đối với
các tác vụ nhận dạng văn bản nặng về tính toán.
· detector = Predictor(config): Khởi tạo một đối tượng Predictor từ VietOCR với
cấu hình đã được đặt. Predictor là thành phần chính sẽ được sử dụng để thực
hiện nhận dạng văn bản trong các bước tiếp theo.
Bước 4 trong quy trình OCR là phát hiện văn bản, nơi EasyOCR được sử dụng để
xác định và trích xuất văn bản từ ảnh đã qua tiền xử lý. Dưới đây là phân tích chi tiết
của đoạn code cho bước này (Các tham số tự điều chỉnh)
· slope_ths=1.7: Tham số này xác định ngưỡng độ nghiêng cho văn bản. Nó
cho phép EasyOCR xử lý các dòng văn bản có độ nghiêng nhất định, tăng khả
năng nhận dạng đối với văn bản không được căn chỉnh hoàn hảo.
· rotation_info=[90, 180, 270]: Thông tin về các góc xoay mà EasyOCR nên
xem xét khi tìm kiếm văn bản. Điều này giúp nhận dạng văn bản ngay cả khi nó
được quay ở các hướng khác nhau.
· add_margin=0.52: Đặt một lề bổ sung xung quanh vùng văn bản phát hiện.
Điều này giúp đảm bảo rằng toàn bộ văn bản được bao quanh và không bị cắt
khi nhận dạng.
· decoder="beamsearch": Chọn phương pháp giải mã cho quá trình nhận dạng
văn bản. "Beamsearch" là một phương pháp nâng cao giúp tăng cường độ chính
xác bằng cách xem xét nhiều khả năng giải mã khác nhau.
· Kết quả của hàm readtext là một danh sách các tuple, mỗi tuple chứa thông
tin về một vùng văn bản phát hiện được trong ảnh, bao gồm tọa độ của hộp giới
hạn, văn bản đã được giải mã, và độ tin cậy của kết quả giải mã đó.
Bước này rất quan trọng trong quy trình OCR, vì nó trực tiếp ảnh hưởng đến số
lượng và chất lượng văn bản được trích xuất từ ảnh. Các tham số được cài đặt
ở bước này cần được tinh chỉnh cẩn thận để phù hợp với đặc điểm của văn bản
và ảnh cần xử lý.
· slope_ths=1.7: Đây là ngưỡng cho độ nghiêng của văn bản. Một giá trị 1.7
cho slope_ths có nghĩa là EasyOCR sẽ cố gắng nhận dạng văn bản có độ
nghiêng tới 1.7 độ. Điều này hữu ích trong việc nhận dạng văn bản nghiêng một
cách nhẹ nhàng, điều khá phổ biến trong các hình ảnh nghiêng hoặc ảnh chụp từ
góc độ.
· rotation_info=[90, 180, 270]: Thông số này xác định các góc mà EasyOCR sẽ
xem xét khi phát hiện văn bản. Cụ thể, nó sẽ xem xét văn bản được quay ở 90,
180, và 270 độ. Điều này giúp phát hiện văn bản trong các hình ảnh bị xoay một
cách không chuẩn.
· add_margin=0.52: Khi EasyOCR phát hiện một vùng chứa văn bản, nó
thường cố gắng cắt sát vào ranh giới của văn bản. Thêm một lề 0.52 có nghĩa là
sẽ có thêm 52% kích thước của vùng văn bản dưới dạng lề xung quanh văn bản
được phát hiện. Điều này giúp đảm bảo rằng toàn bộ văn bản được bao gồm
trong vùng được cắt, và không có phần văn bản nào bị cắt bỏ.
· width_ths=1.8, height_ths=1: Đây là các ngưỡng cho kích thước tối thiểu của
vùng văn bản (tính bằng tỷ lệ so với kích thước ảnh). width_ths=1.8 có nghĩa là
EasyOCR sẽ tìm kiếm các vùng có chiều rộng tối thiểu bằng 1.8 lần chiều rộng
trung bình của vùng văn bản trong ảnh. Tương tự, height_ths=1 xác định chiều
cao tối thiểu của vùng văn bản cần tìm.
Bước 5 trong quy trình OCR là việc hiển thị kết quả OCR. Đây là phần nơi chúng ta
sử dụng matplotlib để vẽ các hộp giới hạn quanh văn bản đã được nhận dạng và
gắn nhãn với đoạn văn bản tương ứng. Dưới đây là chi tiết của code cho bước này
và giải thích từng phần:
· fig, ax = plt.subplots(figsize=(12, 12)): Tạo một đối tượng hình ảnh và trục với
matplotlib, đặt kích thước của hình ảnh là 12x12 inch. Đây là nền tảng để vẽ hình
ảnh và các hộp giới hạn.
· for (bbox, text, prob) in result:: Vòng lặp này xử lý từng kết quả được trả về từ
EasyOCR. bbox là tọa độ của hộp giới hạn quanh văn bản, text là nội dung văn
bản được nhận dạng, và prob là độ tin cậy của kết quả nhận dạng.
· ax.text(top_left[0], top_left[1] - 10, text, ...): Gắn nhãn mỗi hộp giới hạn với
văn bản tương ứng được nhận dạng bởi EasyOCR. Nhãn được đặt phía trên
hộp giới hạn và được định dạng với cỡ chữ 12, in đậm, màu đỏ.
· plt.show(): Hiển thị biểu đồ cuối cùng với hình ảnh và các hộp giới hạn đã
được vẽ
Bước 6 trong quy trình OCR liên quan đến việc xử lý và lưu trữ kết quả OCR. Ở
bước này, chúng ta sẽ xử lý văn bản được nhận dạng từ các vùng cụ thể trong hình
ảnh và lưu trữ chúng dưới dạng danh sách hoặc trong tệp. Dưới đây là chi tiết của
code cho bước này và giải thích từng phần:
· list_thuc_nhap = [], list_san_pham = []: Khởi tạo hai danh sách rỗng,
list_thuc_nhap và list_san_pham, để lưu trữ văn bản từ hai cột khác nhau trong
tài liệu. Tùy thuộc vào bố cục của tài liệu, bạn có thể cần xử lý nhiều cột với nội
dung khác nhau.
· for bound in result:: Vòng lặp này xử lý từng kết quả OCR. Mỗi bound là một
tuple chứa thông tin về hộp giới hạn, văn bản được nhận dạng và độ tin cậy.
· bbox = bound[0]: Lấy tọa độ hộp giới hạn từ kết quả OCR.
· list_thuc_nhap.append(text): Thêm văn bản được nhận dạng vào danh sách
list_thuc_nhap. Tương tự, có thể thực hiện cho cột 'Sản phẩm' và lưu vào danh
sách list_san_pham.
Bước này rất quan trọng trong việc tổ chức và lưu trữ dữ liệu được trích xuất, giúp
dễ dàng sử dụng cho các mục đích sau này như phân tích dữ liệu, nhập liệu vào cơ
sở dữ liệu, hoặc tạo báo cáo. Việc tách riêng và xử lý dữ liệu theo từng cột hoặc
phần cụ thể của tài liệu cung cấp một cách có cấu trúc để quản lý thông tin được
trích xuất.
Bước 7: Nhận dạng văn bản trên mỗi cột (Các tham số tự điều chỉnh)
Đoạn code bạn đề cập đến thiết lập các giới hạn cho việc cắt ảnh dựa trên kích
thước của ảnh. Đây là một phần của quy trình OCR, nơi mà văn bản được xác định
và trích xuất từ các khu vực cụ thể của ảnh. Dưới đây là giải thích chi tiết cho từng
dòng code:
· height, width, _ = image.shape: Dòng này lấy kích thước của ảnh. shape là
một thuộc tính của ảnh (numpy array) mà trả về một tuple chứa chiều cao
(height), chiều rộng (width), và số kênh màu (_). Trong trường hợp này, chỉ chiều
cao và chiều rộng được sử dụng.
· Các điều kiện if và elif sau đó kiểm tra chiều rộng của ảnh và thiết lập các giới
hạn x_min và x_max cho các cột 'Thực nhập' và 'Sản phẩm'. Mỗi điều kiện kiểm
tra một phạm vi chiều rộng cụ thể và thiết lập các giới hạn tương ứng:
· thuc_nhap_x_min và thuc_nhap_x_max: Các biến này xác định ranh giới theo
trục x (chiều ngang) cho cột 'Thực nhập' trong ảnh. Điều này cho biết nơi bắt đầu
và kết thúc của cột 'Thực nhập' theo trục ngang của ảnh.
· san_pham_x_min và san_pham_x_max: Tương tự, các biến này xác định
ranh giới theo trục x cho cột 'Sản phẩm'.
· Ví dụ, nếu chiều rộng của ảnh nằm trong khoảng từ 750 đến 800 pixel, cột
'Thực nhập' sẽ được xác định từ pixel thứ 450 đến 550 theo trục x, trong khi cột
'Sản phẩm' từ pixel thứ 50 đến 240. Các điều kiện khác áp dụng logic tương tự
cho các kích thước ảnh khác nhau.
Đoạn code này thực hiện việc trích xuất và xử lý văn bản từ hai cột cụ thể trong hình
ảnh, đó là 'Thực nhập' và 'Sản phẩm'. Cụ thể, code này tách và lưu văn bản từ từng
cột vào hai danh sách riêng biệt. Dưới đây là giải thích chi tiết cho từng phần code:
· Cùng một quy trình được áp dụng cho cột 'Sản phẩm', nhưng với những giới
hạn tọa độ khác (san_pham_x_min và san_pham_x_max) để xác định vùng cần
cắt và trích xuất văn bản.
· Kết quả là, bạn có hai danh sách list_thuc_nhap và list_san_pham, mỗi danh
sách chứa các dòng văn bản đã được nhận dạng từ cột tương ứng trong hình
ảnh. Điều này cho phép xử lý và phân tích dữ liệu một cách có cấu trúc theo
từng cột.
Bước 8: trong quy trình OCR, theo code bạn đã cung cấp, là việc lưu trữ kết quả vào
một tệp CSV. Dưới đây là phân tích chi tiết của đoạn code này:
· import csv: Đầu tiên, code này nhập thư viện csv, thư viện chuẩn trong
Python dùng để làm việc với tệp CSV.
· with open(...) as csvfile: Tạo hoặc mở một tệp CSV mới (output.csv) để ghi dữ
liệu. Cấu trúc with open đảm bảo rằng tệp sẽ được đóng sau khi hoàn tất các
thao tác.
· csvwriter = csv.writer(csvfile): Khởi tạo một đối tượng writer CSV, sử dụng để
ghi dữ liệu vào tệp CSV.
· csvwriter.writerow(['Thực nhập', 'Sản phẩm']): Ghi hàng tiêu đề vào tệp CSV.
Hàng tiêu đề bao gồm tên của các cột, trong trường hợp này là 'Thực nhập' và
'Sản phẩm'.
· from itertools import zip_longest: Import hàm zip_longest từ thư viện itertools.
Hàm này dùng để kết hợp các mục từ nhiều danh sách có độ dài không đồng
đều.
Bước này quan trọng vì nó chuyển đổi dữ liệu được xử lý từ OCR thành một định
dạng có cấu trúc và dễ dàng sử dụng hơn, như CSV, làm cho việc phân tích dữ liệu
và tích hợp với các hệ thống khác trở nên đơn giản hơn.
Lý do: không training thật nên những ảnh để resize về thì bị tình trạng là Easy OCR
không nhận diện được.
-> Nhóm đã làm tay: Tìm các range pixel tổng thể ảnh có, chỉ xét đến độ rộng trải dài
từ 600-1000
Để tránh thất thoát dữ liệu nên phải chia thành các range cách nhau 50 pixels.
EasyOCR
Cấu Trúc Mô Hình Deep Learning (CRNN và CTC):
· CRNN (Convolutional Recurrent Neural Network): Mô hình này kết hợp giữa
CNN (Convolutional Neural Networks) và RNN (Recurrent Neural Networks).
· CNN: Phần CNN của mô hình được sử dụng để phát hiện và trích xuất đặc
trưng từ ảnh. Các lớp CNN nhận diện các mẫu hình học và kết cấu trong ảnh,
chẳng hạn như đường nét và hình dạng của chữ cái.
· RNN: Sau đó, các lớp RNN xử lý thông tin theo chuỗi, giúp mô hình hiểu
được mối liên kết giữa các ký tự liên tiếp, cung cấp khả năng nhận diện từ và
cụm từ.
Đa Ngôn Ngữ và Tính Năng: EasyOCR hỗ trợ đa ngôn ngữ, bao gồm tiếng Việt,
giúp nó trở thành công cụ linh hoạt và mạnh mẽ.
VietOCR
Tối Ưu Hóa Cho Tiếng Việt:
· VietOCR được tối ưu hóa cho văn bản tiếng Việt, có thể bao gồm các mô
hình Deep Learning cụ thể được huấn luyện trên dữ liệu văn bản tiếng Việt.
· Các mô hình này có thể được thiết kế để xử lý đặc điểm phức tạp của tiếng
Việt, như dấu thanh và các ký tự đặc biệt.
· VietOCR cho phép tùy chỉnh mô hình và cấu hình, giúp nó thích ứng tốt với
các yêu cầu cụ thể của tác vụ OCR.
· Điều này bao gồm cả việc sử dụng mô hình có sẵn hoặc tùy chỉnh mô hình
theo yêu cầu, cung cấp khả năng tinh chỉnh cao.
Các mô hình này được huấn luyện trên dữ liệu lớn, gồm nhiều mẫu văn bản khác
nhau, để học cách nhận diện và giải mã ký tự, từ và cụm từ.
Trong quy trình OCR, các mô hình này được sử dụng để phân tích ảnh và trích xuất
thông tin dưới dạng văn bản có thể sử dụng.
Sử dụng EasyOCR
Khởi Tạo EasyOCR:
reader = easyocr.Reader(['vi'])
· easyocr.Reader(['vi']): Tạo một đối tượng OCR để phát hiện văn bản. Tham
số ['vi'] chỉ định rằng ngôn ngữ được sử dụng để nhận dạng là tiếng Việt.
· EasyOCR ở đây sử dụng mô hình Deep Learning dựa trên CRNN và CTC, đã
được huấn luyện sẵn trên dữ liệu lớn, để nhận diện ký tự và từ.
result = reader.readtext(preprocessed_image)
· Kết quả trả về là danh sách các phần tử, mỗi phần tử chứa thông tin về vùng
văn bản (hộp giới hạn), văn bản được nhận dạng, và độ tin cậy.
Sử dụng VietOCR
Cấu Hình và Khởi Tạo VietOCR:
Trong code bạn cung cấp, VietOCR được cấu hình và khởi tạo trước khi xử lý các
phần cụ thể của ảnh. Mô hình này tập trung vào nhận dạng văn bản tiếng Việt.
s = detector.predict(cropped_image)
· VietOCR ở đây sử dụng mô hình Deep Learning, được tối ưu hóa cho tiếng
Việt, để xử lý và nhận dạng văn bản trong ảnh cắt ra.