Bài này bạn sẽ dựng môi trường tối thiểu và chạy OCR thật trên một trang hóa đơn, thu về text sạch để dùng cho bước trích xuất. Chúng ta ưu tiên công cụ dễ dùng, chạy được cả trên máy cá nhân.
Chọn công cụ OCR: 3 lựa chọn thực tế
- OCR API đám mây có sẵn layout (ví dụ Google Document AI, Azure Document Intelligence) — chính xác cao, hiểu bảng và vị trí trường, nhưng tốn phí và gửi dữ liệu ra ngoài.
- Mô hình đa phương thức (vision LLM) — đưa thẳng ảnh cho model "đọc", vừa OCR vừa trích luôn. Linh hoạt nhất cho tài liệu tự do như hợp đồng.
- OCR mã nguồn mở (Tesseract, PaddleOCR) — miễn phí, chạy nội bộ, dữ liệu không rời máy. Cần tiền xử lý ảnh để đạt độ chính xác tốt.
Cài đặt tối thiểu (Python + Tesseract)
# Cài Tesseract kèm gói tiếng Việt
# macOS:
brew install tesseract tesseract-lang
# Ubuntu:
sudo apt install tesseract-ocr tesseract-ocr-vie poppler-utils
# Thư viện Python
pip install pytesseract pdf2image pillow opencv-python
poppler-utils/pdf2image để tách PDF thành ảnh từng trang; opencv để tiền xử lý.
OCR đầu tiên: từ PDF ra text
import pytesseract
from pdf2image import convert_from_path
pages = convert_from_path("hoadon.pdf", dpi=300) # 300 DPI là ngưỡng tối thiểu
text = ""
for page in pages:
text += pytesseract.image_to_string(page, lang="vie")
print(text)
Ghi nhớ con số 300 DPI: dưới ngưỡng này chữ vỡ, OCR nhầm liên tục. File scan gốc nên đặt 300 DPI ngay từ máy scan.
Tiền xử lý ảnh — nơi quyết định 80% chất lượng
OCR trên ảnh thô thường tệ. Bốn bước xử lý đơn giản cải thiện rõ rệt:
import cv2
import numpy as np
def preprocess(img):
gray = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2GRAY) # 1. Xám hóa
# 2. Nhị phân hóa thích ứng (xử lý ảnh sáng không đều)
binary = cv2.adaptiveThreshold(
gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 31, 15)
# 3. Khử nhiễu
denoised = cv2.medianBlur(binary, 3)
return denoised
Bước thứ 4 quan trọng nhất với ảnh chụp điện thoại: làm thẳng ảnh nghiêng (deskew). Ảnh chụp lệch 5 độ đủ làm OCR đọc sai cả dòng.
Khung tư duy: OCR rác vào = rác ra
Đừng đổ lỗi cho model khi kết quả sai. Truy ngược theo thứ tự:
- Ảnh có đủ 300 DPI không?
- Ảnh có thẳng, đủ sáng, không bóng không?
- Đã đúng ngôn ngữ (
lang=vie) chưa? - Có tiền xử lý (xám hóa, nhị phân, khử nghiêng) chưa?
Các bước thiết lập chuẩn
- Cài Tesseract kèm gói
vie(hoặc đăng ký một OCR API). - Chuẩn hóa đầu vào: mọi PDF/ảnh về 300 DPI, ảnh xám.
- Viết hàm
preprocess()dùng chung cho mọi file. - Chạy thử trên 5 file (2 đẹp, 3 xấu) và đọc mắt kết quả text.
- Ghi lại tỉ lệ dòng đọc đúng để có baseline so sánh về sau.
Checklist môi trường
- [ ] OCR chạy được, ra tiếng Việt có dấu
- [ ] Đầu vào chuẩn hóa 300 DPI
- [ ] Hàm tiền xử lý dùng chung
- [ ] Có baseline chất lượng trên 5 file mẫu
- [ ] Quyết định rõ: chạy nội bộ hay API đám mây (vì lý do bảo mật dữ liệu)
Sai lầm thường gặp
- Quên gói ngôn ngữ tiếng Việt — kết quả mất dấu hoàn toàn, không dùng được.
- OCR trên ảnh màu độ phân giải thấp — luôn xám hóa và nâng DPI trước.
- Bỏ qua deskew với ảnh điện thoại — nguyên nhân số 1 gây sai hàng loạt.
- Gửi hợp đồng bí mật lên API công khai — vi phạm bảo mật; chọn giải pháp nội bộ cho dữ liệu nhạy cảm.
Học xong bài này rồi?
Tạo tài khoản miễn phí để lưu lại — lần sau vào là biết ngay đang dở ở đâu,
và học hết khóa thì có chứng chỉ.
Lưu tiến độ của tôi