OCR engine so sánh: Tesseract vs EasyOCR vs PaddleOCR — tiếng Việt

So sánh 3 engine OCR cho tiếng Việt: kiến trúc, ưu nhược, tốc độ, độ chính xác trên văn bản Việt.

Khi build tính năng OCR PDF cho AloPDF, mình phải chọn 1 trong 3 engine phổ biến: Tesseract, EasyOCR, PaddleOCR. Cả 3 đều support tiếng Việt, cả 3 đều open source. Nhưng kết quả cho tiếng Việt thì khác nhau rõ rệt — đặc biệt với dấu (ă, â, ơ, ư, đ) và font viết tay.

Mình test cả 3 với bộ dataset tiếng Việt thật (hóa đơn, giấy tờ scan, ảnh chụp tài liệu). Bài này chia sẻ kết quả và lý do AloPDF chọn Tesseract.

3 engine — kiến trúc khác nhau

Engine Nguồn gốc Kiến trúc Hỗ trợ ngôn ngữ
Tesseract 5 Google (HP ban đầu) LSTM neural network (từ v4), trước đó là traditional pattern matching 100+ ngôn ngữ, có Vietnamese trained model
EasyOCR JaidedAI (Thái Lan) CRNN (CNN + RNN + CTC decoder) 80+ ngôn ngữ, có Vietnamese
PaddleOCR Baidu (Trung Quốc) PP-OCR (lightweight CNN + attention-based recognition) 80+ ngôn ngữ, Vietnamese support

Kiến trúc chi tiết hơn

Tesseract 5 — LSTM-based

Tesseract trải qua 2 thời kỳ: trước v4 dùng traditional approach (character segmentation + template matching), từ v4 trở đi chuyển sang LSTM neural network. Version 5 cải thiện thêm về tốc độ.

Pipeline: Image → Preprocessing (binarize, deskew) → Layout analysis (detect text regions) → Line segmentation → LSTM recognition → Output

Điểm mạnh kiến trúc: mature, ổn định, ít bug. Điểm yếu: preprocessing bước đầu là rule-based, nếu ảnh quá xấu (nghiêng, mờ) thì LSTM phía sau dù tốt cũng không cứu được.

EasyOCR — CRNN end-to-end

EasyOCR dùng kiến trúc CRNN (Convolutional Recurrent Neural Network):

  • CNN backbone (ResNet/VGG): extract visual features từ ảnh text
  • RNN (BiLSTM): học sequential context giữa các ký tự
  • CTC decoder: convert RNN output thành text

Text detection dùng CRAFT (Character Region Awareness For Text). Tách riêng detection và recognition — detect vùng text trước, crop ra, rồi recognize từng vùng.

PaddleOCR — PP-OCR lightweight

Baidu thiết kế PP-OCR tối ưu cho mobile/edge device:

  • Text detection: DB (Differentiable Binarization) — nhẹ, nhanh
  • Direction classifier: Xác định text ngang/dọc/nghiêng
  • Text recognition: SVTR (Scene Text Recognition) với attention mechanism

Model size nhỏ nhất trong 3: PP-OCRv4 mobile chỉ ~10MB total. So với EasyOCR ~700MB, Tesseract ~50MB (trained data).

Test với tiếng Việt — setup

Mình chuẩn bị 50 mẫu test chia 5 nhóm:

  • Hóa đơn scan: 10 file — text in rõ, có bảng số liệu
  • CMND/CCCD chụp: 10 file — text nhỏ, background phức tạp
  • Tài liệu A4 scan: 10 file — Times New Roman 12pt, scan 200-300 DPI
  • Ảnh chụp biển hiệu: 10 file — font đa dạng, góc chụp nghiêng
  • Viết tay: 10 file — ghi chú, đơn viết tay

Metric: Character Error Rate (CER) — tỷ lệ ký tự sai so với ground truth. Thấp hơn = tốt hơn.

Kết quả

Nhóm test Tesseract 5 (CER) EasyOCR (CER) PaddleOCR (CER)
Hóa đơn scan 2.1% 3.8% 2.9%
CMND/CCCD chụp 5.7% 4.2% 3.5%
Tài liệu A4 scan 1.3% 2.1% 1.8%
Biển hiệu chụp 8.9% 5.4% 4.7%
Viết tay 24.5% 18.3% 15.8%
Metric Tesseract 5 EasyOCR PaddleOCR
CER trung bình (50 mẫu) 8.5% 6.8% 5.7%
Tốc độ (trang A4, CPU) 1.2 giây 4.8 giây 2.1 giây
Tốc độ (trang A4, GPU) 1.0 giây 1.5 giây 0.8 giây
RAM sử dụng ~200 MB ~1.5 GB ~400 MB
Model size ~50 MB ~700 MB ~150 MB

Phân tích lỗi tiếng Việt cụ thể

Lỗi phổ biến nhất: dấu

Cả 3 engine đều struggle với dấu tiếng Việt, nhưng mỗi cái sai khác nhau:

  • Tesseract: Hay nhầm ơ→o, ư→u khi ảnh mờ. Dấu nặng (.) đôi khi bị miss
  • EasyOCR: Nhầm ă→a nhiều hơn. Dấu ngã (~) và dấu hỏi (?) đôi khi hoán đổi
  • PaddleOCR: Ít lỗi dấu nhất, nhưng đôi khi hallucinate thêm dấu không có

Ví dụ thực tế: chữ "Nguyễn" — Tesseract đọc đúng 9/10 lần, EasyOCR 8/10, PaddleOCR 9/10. Nhưng chữ "kỹ thuật" — Tesseract hay ra "ky thuât", EasyOCR ra "kỹ thuật" đúng, PaddleOCR cũng đúng.

Lỗi layout bảng

Hóa đơn có bảng — Tesseract detect bảng tốt nhất (layout analysis mature). EasyOCR và PaddleOCR đôi khi đọc text xuyên cột (đọc hàng thay vì đọc theo cột). Đây là lý do Tesseract thắng ở nhóm hóa đơn dù CER tổng không tốt nhất.

Tại sao AloPDF chọn Tesseract?

Nhìn bảng kết quả, PaddleOCR tốt hơn về accuracy tổng thể. Vậy sao mình chọn Tesseract? Lý do thực tế:

  1. Use case chính của AloPDF là tài liệu scan/PDF — không phải ảnh chụp biển hiệu hay viết tay. Với tài liệu A4 scan, Tesseract thắng rõ (1.3% vs 1.8%)
  2. Tốc độ trên CPU: Server AloPDF không có GPU. Trên CPU, Tesseract nhanh gấp 4 lần EasyOCR và gần 2x PaddleOCR
  3. RAM: Server chạy nhiều request cùng lúc. Tesseract 200MB/instance vs EasyOCR 1.5GB — khác biệt lớn khi scale
  4. Mature & stable: Tesseract chạy production hàng chục năm, ít bug bất ngờ. PaddleOCR version mới đôi khi breaking change
  5. License: Tesseract là Apache 2.0. PaddleOCR cũng Apache 2.0. EasyOCR thì... phức tạp hơn với model weights
Trade-off: Mình chấp nhận Tesseract yếu hơn ở ảnh chụp/viết tay (ít ai OCR mấy cái đó trên web tool) để đổi lấy tốc độ, RAM thấp, và stability cho use case chính là tài liệu scan.

Khi nào nên dùng engine khác?

Tình huống Engine phù hợp Lý do
Tài liệu scan rõ nét, bảng biểu nhiều Tesseract Layout analysis tốt, nhanh, nhẹ
Ảnh chụp tự nhiên (biển, menu, sản phẩm) PaddleOCR Text detection trong scene phức tạp tốt nhất
Nhiều ngôn ngữ mix (VN + EN + CN) PaddleOCR Multi-language support tốt nhất
Cần setup nhanh, ít code Python EasyOCR API đơn giản nhất: reader.readtext(image) xong
Edge device / mobile PaddleOCR (mobile) Model 10MB, chạy được trên điện thoại
Viết tay tiếng Việt PaddleOCR (hoặc custom model) Kiến trúc attention xử lý viết tay tốt hơn LSTM

Tips cải thiện accuracy cho tiếng Việt

Bất kể dùng engine nào, mấy trick này giúp tăng accuracy đáng kể:

  • Preprocessing: Binarize (Otsu/Sauvola), deskew (xoay thẳng), remove noise. Tesseract đặc biệt nhạy cảm với bước này
  • DPI: Resize ảnh về 300 DPI trước khi OCR. Dưới 200 DPI accuracy giảm rõ rệt
  • Language flag: Luôn specify --lang vie (Tesseract) hoặc lang_list=['vi'] (EasyOCR). Không để engine auto-detect
  • PSM mode (Tesseract): Chọn đúng mode — PSM 6 cho block text, PSM 4 cho cột, PSM 7 cho 1 dòng
  • Post-processing: Dùng spell checker tiếng Việt để fix lỗi dấu phổ biến (ư→u, ơ→o)

Tương lai — hướng đi tiếp theo

Cả 3 engine đều đang phát triển nhanh. PaddleOCR v4 vừa ra đã cải thiện đáng kể cho CJK và Southeast Asian languages. Tesseract 5 thêm nhiều preprocessing tự động. EasyOCR đang tích hợp thêm model nhẹ hơn.

Mình cũng đang evaluate thêm option thứ 4: fine-tune model riêng cho tiếng Việt trên PaddleOCR framework. Với dataset ~10,000 mẫu hóa đơn VN, accuracy có thể tăng thêm 1-2% nữa. Nhưng đó là bài toán khác — cần GPU train và pipeline phức tạp hơn.

Kết luận cho người dùng: Nếu bạn cần OCR file PDF scan tiếng Việt — dùng AloPDF là nhanh nhất. Engine Tesseract phía sau đã được mình tune preprocessing riêng cho tiếng Việt, accuracy với tài liệu scan đạt ~98-99% cho text in rõ nét.

Tóm lại

Không có engine "tốt nhất" cho mọi trường hợp. Tesseract thắng ở tài liệu scan + tốc độ + nhẹ. PaddleOCR thắng ở ảnh chụp + viết tay + accuracy tổng. EasyOCR thắng ở dễ dùng. Chọn dựa trên use case cụ thể, không phải benchmark chung chung.

Dùng ngay: OCR PDF — Chuyển PDF scan thành văn bản có thể tìm kiếm

Nhận dạng văn bản OCR trong PDF scan online miễn phí. Hỗ trợ tiếng Việt có dấu. Chuyển ảnh scan thành text copy được, tìm kiếm được. Sử dụng Tesseract — chính xác và nhanh.

Mở công cụ →

Bài viết liên quan

Bảo mật PDF thực sự an toàn? AES-128 vs 256, owner vs user password AES-128 vs AES-256, owner password vs user password. Tại sao "gỡ mật khẩu" hoạt động và giới hạn bả… PDF/A lưu trữ dài hạn: 1b vs 2b vs 3b — yêu cầu lưu trữ Việt Nam PDF/A-1b vs 2b vs 3b: khác biệt, use case, và yêu cầu lưu trữ theo Luật Lưu trữ 2024 Việt Nam. Lossy vs Lossless nén PDF: JPEG vs FLATE — khi nào mất dữ liệu là OK JPEG (DCT) vs FLATE (zlib) trong PDF. Khi nào nén mất dữ liệu chấp nhận được, khi nào phải giữ nguy… Font embedding trong PDF: tại sao lỗi font và cách fix triệt để Embedded vs subset vs system font. Tại sao PDF bị lỗi font tiếng Việt và cách đảm bảo font hiển thị…