VECTIQ
← Tất cả bài viết
Câu chuyện triển khai · Generative AI & Data

OCR Tiếng Việt: Bài Học Thực Tế

Dấu thanh, bản scan lộn xộn và bảng tài chính khiến OCR tiếng Việt khó hơn vẻ ngoài. Đây là những gì thực sự cải thiện độ chính xác trong sản xuất, rút ra từ dự án OCR tiếng Việt mã nguồn mở của chúng tôi.

bởi Vectiq Engineering · 2026-06-30 · 7 phút đọc
OCR Tiếng Việt: Bài Học Thực Tế

Các engine OCR sẵn có thường được huấn luyện chủ yếu trên tiếng Anh và các ngôn ngữ hệ chữ Latinh. Khi áp dụng chúng vào một tờ hóa đơn tiếng Việt được scan, chúng sẽ vui vẻ loại bỏ hết dấu thanh - biến 'phân bón' thành 'phan bon' - điều này khiến dữ liệu trở nên vô dụng đối với một pipeline tài chính. Việc xử lý tiếng Việt chính xác đòi hỏi những quyết định có chủ đích ở từng giai đoạn.

Nhận diện Bố cục (Layout) trước khi nhận diện Text

Sai lầm mà hầu hết các đội ngũ thường mắc phải là chạy OCR trên toàn bộ trang giấy cùng một lúc. Các tài liệu luôn có cấu trúc - tiêu đề, đoạn văn, bảng biểu - và một bảng biểu nếu bị đọc tràn như văn bản thông thường sẽ không thể khôi phục lại được cấu trúc ban đầu. Chúng tôi chạy mô hình nhận diện bố cục YOLOv7 trước để tìm các khu vực đó, sau đó mới OCR từng khu vực với chiến lược phù hợp. Bảng biểu sẽ được tái tạo theo từng ô (cell-aware); đoạn văn sẽ được nhận diện theo từng dòng.

# 1. Phát hiện các vùng bố cục
regions = layout_model(page_image)  # YOLOv7 -> [title, paragraph, table, ...]

# 2. Định tuyến từng vùng tới reader phù hợp
results = []
for r in sorted(regions, key=lambda r: (r.y, r.x)):
    crop = page_image[r.y1:r.y2, r.x1:r.x2]
    if r.kind == "table":
        results.append(reconstruct_table(crop))
    else:
        results.append(viet_ocr.recognize(crop))  # VietOCR / TrOCR

Tiền xử lý (Preprocessing) là chìa khóa

Tài liệu thực tế thường được chụp ở góc nghiêng, thiếu sáng, trên giấy nhàu nát. Việc căn chỉnh lại ảnh (deskewing) và lấy ngưỡng thích ứng (adaptive thresholding) trước khi nhận diện luôn mang lại bước nhảy vọt lớn nhất về độ chính xác - thậm chí lớn hơn cả việc thay đổi model nhận diện. Các dấu thanh trong tiếng Việt nằm ở vài pixel rất nhỏ phía trên mỗi ký tự, vì vậy bất kỳ thao tác nào làm sắc nét các pixel đó đều mang lại lợi ích trực tiếp.

  • Deskew và dewarp (khử độ cong) trước khi làm bất cứ việc gì
  • Lấy ngưỡng thích ứng (Adaptive thresholding) cho ánh sáng không đồng đều
  • Upscale (tăng tỷ lệ) các đoạn text nhỏ để giữ lại dấu thanh
  • Giữ một bản sao có màu - một số con dấu và text được mã hóa bằng màu sắc

Xác thực bằng ngôn ngữ học, không chỉ qua điểm ảnh (pixels)

Chỉ dựa vào độ tin cậy (confidence) của model nhận diện là một sự lừa dối. Một mô hình có thể rất tự tin về một từ sai nhưng có vẻ hợp lý. Vì tiếng Việt có cấu trúc âm tiết rất chặt chẽ, một bước kiểm tra ngôn ngữ hạng nhẹ sẽ bắt các kết quả đầu ra không phải là âm tiết tiếng Việt hợp lệ và gắn cờ (flag) để xem xét lại - hoặc để LLM đề xuất phương án sửa lỗi dựa trên ngữ cảnh xung quanh.

Đối với tài liệu tài chính, sai một con số là một thảm họa. Chúng tôi thà gắn cờ 5% các trường dữ liệu cho con người kiểm tra lại còn hơn là âm thầm xuất ra một sai sót mà mô hình "tự tin" cho là đúng.

Những gì chúng tôi sẽ khuyên chính mình trong quá khứ

  • Đầu tư vào phân tích bố cục (layout analysis) từ sớm - nó nhân lên giá trị của mọi bước phía sau.
  • Đo lường trên CHÍNH TÀI LIỆU CỦA BẠN, không phải trên các benchmark công khai; sự thay đổi miền dữ liệu (domain shift) rất tàn khốc.
  • Luôn giữ lại điểm confidence và quy trình xem xét có con người tham gia (human-in-the-loop).
  • Chỉ kết hợp OCR với LLM sau khi các nền tảng cơ bản đã vững chắc - đó là bước đánh bóng (polish), không phải là giải pháp cứu cánh.

Các dự án Vietnamese OCR và Document Layout Analysis của chúng tôi hiện đang mã nguồn mở, và trang giải pháp Document AI có một bản demo tương tác của pipeline layout-then-OCR được mô tả tại đây.

OCRVietnamese NLPDocument AIYOLOv7VietOCR