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ế:
- 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%)
- 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
- 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
- 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
- License: Tesseract là Apache 2.0. PaddleOCR cũng Apache 2.0. EasyOCR thì... phức tạp hơn với model weights
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ặclang_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.
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ụ →