You are on page 1of 17

1.

Trả lời về Data (Data ảnh gốc)


- 100 tấm
- Độ phân giải cỡ 700x500
- Định dạng png
- Các ký tự đặc biệt như là chữ ký
Yếu tố Đầu Vào (Input):
1.1 Ảnh đầu vào (Image): file 100 hóa đơn của Hồng Á
1.2. Ngôn ngữ của Văn bản (Language): ngôn ngữ là vie
1.3. Cấu hình Mô hình (Model Configuration):

Yếu tố Đầu Ra (Output):


1.4. Văn bản nhận dạng (Recognized Text):
1.5. Tọa độ của Văn bản (Text Coordinates):
1.6. Độ chính xác của Nhận dạng (Confidence Score):
2. Lý thuyết EasyOcr - VietOcr
2.1 EasyOcr
· Là một dự án dựa trên OCR Python
· Mã nguồn mở
· Nhận dạng ký tự quang học, với hơn 80 ngôn ngữ, bao gồm tiếng Trung, Nhật, Hàn,
Thái… EasyOCR có thể được cài đặt chỉ bằng một lệnh pip và nhập vào dự án bằng lệnh
import.
2.1. Cài đặt EasyOCR:
pip install easyocr
2.2. Nhập thư viện và khởi tạo đối tượng Reader:
Sau khi cài đặt, bạn sẽ nhập thư viện vào mã của mình và khởi tạo một đối tượng Reader
với các ngôn ngữ bạn muốn hỗ trợ.
import easyocr reader = easyocr.Reader(['en', 'vi'])
2.3. Nhận dạng văn bản từ hình ảnh:
Sử dụng phương thức readtext để nhận dạng văn bản từ một hình ảnh:
result = reader.readtext('path/to/image.jpg')
2.4. Xử lý kết quả:
Kết quả sẽ là một danh sách các tuples, mỗi tuple chứa thông tin về văn bản nhận dạng
được, ví dụ như văn bản và tọa độ.
for detection in result: print(detection[1]) # In ra văn bản nhận dạng được
2.5. Tùy chỉnh cấu hình (tuỳ chọn):
Bạn có thể tùy chỉnh cấu hình của EasyOCR bằng cách chuyển thêm đối số khi khởi tạo đối
tượng Reader. Các tùy chọn có thể bao gồm ngôn ngữ, mô hình sử dụng, và các tham số
nhận dạng khác.
2.6. Xử lý lỗi và xử lý ngoại lệ (tuỳ chọn):
Đối với các ảnh đặc biệt hoặc điều kiện khó khăn, có thể cần xử lý các trường hợp ngoại lệ
hoặc xử lý lỗi.

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

3.4 Sơ đồ tổng quan Kiến trúc

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

5. Các độ đo khác tùy thuộc vào nhiệm vụ:


· Tùy thuộc vào bản chất của nhiệm vụ cụ thể, có thể có các độ đo khác như Mean
Squared Error (MSE) cho vấn đề hồi quy, Intersection over Union (IoU) cho vấn đề phân
đoạn, và nhiều độ đo khác nữa.

6. Điểm mới của nhóm về dự án phần Tech (Thống kê?)


Lợi ích lớn nhất khi áp dụng mô hình là gì?
· Độ chính xác cải thiện: Bằng cách kết hợp các mô hình từ các thư viện khác nhau, bạn
có thể tận dụng các ưu điểm và điểm mạnh của mỗi mô hình để cải thiện độ chính xác của
hệ thống nhận dạng văn bản.
· Hỗ trợ nhiều ngôn ngữ: Nếu EasyOCR và VietOCR hỗ trợ những ngôn ngữ khác nhau,
hơn 80 ngôn ngữ,kết hợp chúng có thể mở rộng khả năng nhận dạng văn bản đa ngôn ngữ
trong ứng dụng của bạn.
· Tính linh hoạt: Sự kết hợp giữa các mô hình có thể mang lại tính linh hoạt cao, giúp
ứng dụng của bạn thích ứng với nhiều loại hình ảnh và điều kiện ánh sáng khác nhau.
· Tối ưu hóa hiệu suất: Bạn có thể tinh chỉnh và tối ưu hóa việc sử dụng mô hình để đáp
ứng yêu cầu cụ thể của ứng dụng và cải thiện hiệu suất toàn diện.
1. Quá trình phát triển sản phẩm
Ban đầu sử dụng pytesseract và data train model để cho model có thể nhận dạng được chữ,
đóng box sau đó trích xuất chữ ra nhưng độ chính xác rất thấp 30-45%, và không ổn định,
box không bọc được những phần cần thiết.

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.

Độ chính xác khá ấn tượng

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.

Sử dụng Model Easy OCR và VietOCR thay thế chữa cháy.

Quy trình code


Bước 1 của quy trình OCR sử dụng EasyOCR và VietOCR bao gồm việc nhập các
thư viện cần thiết. Dưới đây là phân tích chi tiết của từng dòng code trong bước này:

· 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.

· import matplotlib.pyplot as plt: matplotlib là một thư viện đồ họa, được sử


dụng ở đây để hiển thị hình ảnh và kết quả của quá trình OCR. Đặc biệt, plt giúp
vẽ hình ảnh và các hình chữ nhật quanh văn bản được nhận dạ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:

· def preprocess_image(img):: Định nghĩa một hàm preprocess_image, với img


là tham số đầu vào, đại diện cho ảnh gốc cần được tiền xử lý.

· gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY): Sử dụng hàm cvtColor


từ thư viện OpenCV để chuyển đổi ảnh từ không gian màu BGR (màu mặc định
khi ảnh được đọc bởi OpenCV) sang ảnh xám. Điều này thường được làm vì
nhận dạng văn bản thường hoạt động tốt hơn trên ảnh xám, 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.

· 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 = Cfg.load_config_from_name('vgg_transformer'): Nạp cấu hình cho


VietOCR dựa trên tên mô hình đã định trước. 'vgg_transformer' có thể là một mô
hình được huấn luyện sẵn có sẵn trong VietOCR, được tối ưu cho việc nhận
dạng văn bản tiếng Việt.

· config['cnn']['pretrained'] = False: Đặt cấu hình này thành False có nghĩa là


VietOCR sẽ không sử dụng các trọng số từ một mô hình đã được huấn luyện
trước, điều này cho phép tùy chỉnh mô hình hoặc bắt đầu huấn luyện từ đầu.

· 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)

· result = reader.readtext(preprocessed_image, ...): Hàm readtext của đối


tượng reader (EasyOCR) được gọi để thực hiện nhận dạng văn bản.
preprocessed_image là ảnh đầu vào đã được tiền xử lý ở bước 2.

· 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.

· width_ths=1.8, height_ths=1: Các ngưỡng về kích thước chiều rộng và chiều


cao để xác định vùng văn bản. Những tham số này giúp xác định kích thước tối
thiểu của vùng văn bản mà EasyOCR sẽ xem xét.

· 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.

· decoder="beamsearch": Phương thức giải mã được sử dụng trong quá trình


nhận dạng văn bản. "Beamsearch" là một kỹ thuật tìm kiếm nâng cao, giúp cải
thiện độ chính xác của việc nhận dạng bằng cách xem xét nhiều khả năng giải
mã khác nhau và chọn ra kết quả tối ưu.

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.

· ax.imshow(preprocessed_image): Hiển thị ảnh sau khi tiền xử lý trên trục đã


được tạo. Điều này giúp người dùng xem trực quan ảnh mà họ đang làm việc
với.

· 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.add_patch(plt.Rectangle(top_left, ...)): Vẽ một hình chữ nhật xung quanh


mỗi vùng văn bản được nhận dạng. Hình chữ nhật được vẽ bằng cách sử dụng
tọa độ của hộp giới hạn, với màu đỏ, không lấp đầy, và đường viền có độ rộng 2
pixels.

· 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.

· if thuc_nhap_x_min <= bbox[0][0] <= thuc_nhap_x_max:: Kiểm tra xem hộp


giới hạn có nằm trong phạm vi cột 'Thực nhập' không. thuc_nhap_x_min và
thuc_nhap_x_max là các giới hạn xác định trước cho cột này.

· cropped_image = Image.fromarray(image[y_min:y_max, x_min:x_max]): Cắt


phần ảnh tương ứng với hộp giới hạn từ ảnh gốc để lấy chính xác vùng chứa
văn bản.

· text = detector.predict(cropped_image): Sử dụng VietOCR để nhận dạng văn


bản trong vùng ảnh đã cắt. detector là đối tượng Predictor của VietOCR được
cấu hình ở bước 3.

· 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'.

· Các giá trị cụ thể cho thuc_nhap_x_min, thuc_nhap_x_max,


san_pham_x_min, và san_pham_x_max được chọn dựa trên bố cục và kích
thước của ảnh đầu vào. Việc này cho phép quy trình OCR tập trung vào các khu
vực cụ thể của ảnh nơi chứa thông tin quan trọng, tăng cường độ chính xác và
hiệu quả của quá trình trích xuất văn bản.

· 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.

· Trong mỗi vòng lặp, hàm detector.predict(cropped_image) của VietOCR được


sử dụng để nhận dạng văn bản trong ảnh đã được cắt. Kết quả nhận được là
một chuỗi văn bản, sau đó được chia thành các dòng riêng lẻ. Mỗi dòng được
kiểm tra xem có phải là dòng trống hay không trước khi được thêm vào danh
sách tương ứng.

· 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.

· for thuc_nhap_line, san_pham_line in zip_longest(...): Vòng lặp này duyệt qua


cả hai danh sách list_thuc_nhap và list_san_pham, ghép từng dòng từ cả hai
danh sách thành cặp. Trong trường hợp một danh sách dài hơn danh sách kia,
fillvalue='' sẽ điền vào các chỗ trống.

· csvwriter.writerow([thuc_nhap_line, san_pham_line]): Mỗi cặp dòng (một từ


'Thực nhập' và một từ 'Sản phẩm') được ghi vào tệp CSV.

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.

Một số điểm lưu ý:

Máy không có card đồ họa nên em chạy bằng CPU

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.

Nêu lý do cơ bản tại sao sử dụng Easy OCR và Viet OCR

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ừ.

· CTC (Connectionist Temporal Classification): CTC giúp mô hình gán nhãn


cho dữ liệu chuỗi mà không cần thông tin về vị trí chính xác của từng ký tự. Nó
quan trọng trong việc xác định biên giữa các ký tự trong văn bản.

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

Linh Hoạt và Tùy Chỉnh:

· 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.

AI và Deep Learning Trong OCR


AI và Deep Learning đóng vai trò trung tâm trong việc phát triển các mô hình nhận
dạng văn bản.

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ừ.

Phát Hiện Văn Bản trong Ảnh:

result = reader.readtext(preprocessed_image)

· reader.readtext(preprocessed_image): Gọi phương thức readtext trên ảnh đã


qua tiền xử lý để phát hiện văn bản. Ở đây, AI được sử dụng để xác định vị trí và
nội dung của văn bản trong ảnh.

· 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.

Nhận Dạng Văn Bản trong Phần Cắt của Ảnh:

s = detector.predict(cropped_image)

· detector.predict(cropped_image): Dùng VietOCR để nhận dạng văn bản từ


một phần cắt ra của ảnh. cropped_image là ảnh sau khi đã được cắt để tập trung
vào một khu vực cụ thể (ví dụ: một cột trong bảng).

· 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.

You might also like