Skip to content

OCR chữ viết tay

Đọc chữ viết tay tiếng Việt từ ảnh — biểu mẫu, ghi chú, phiếu bài tập, mặt sau CMND/CCCD. Khác với OCR chữ in (xem Chuyển định dạng), chữ viết tay cần một mô hình thị giác đa phương thức (VLM) chứ không phải engine OCR truyền thống.

TL;DR — gợi ý của chúng tôi

pip install "nom-vn[ocr-handwriting]" để có sẵn transformers + torch + torchvision + timm + pillow. Mặc định dùng 5CD-AI/Vintern-1B-v3_5 (MIT, 0.9 B tham số, safetensors). Lần đầu tải khoảng 1.8 GB.

Yêu cầu: GPU 4–6 GB VRAM cho tốc độ chấp nhận được; CPU chạy được nhưng mất 1–2 phút mỗi ảnh.

Số đo nội bộ trên synthetic_ocr_vi (2026-05-03)

Đo thử Vintern trên dòng chữ in tiếng Việt — để biết "Vintern đọc đúng dòng in sạch đến đâu" trước khi nói chuyện chữ viết tay:

Điều kiệnnCER trung bìnhKhớp tuyệt đối
clean (một phông, nền trắng)200,47 %16/20
noisy (cùng nội dung, có nhiễu)200,37 %17/20

Phần lớn "lỗi" còn lại là biến thể chính tả VN hợp lệ (hoàhòa) nhưng CER tính là khác. n=20 còn nhỏ — phải đo trên 200+ ảnh trước khi công bố con số "CER chữ viết tay VN" chính thức.

Tập đánh giá (nrl-ai/vn-synthetic-ocr, CC0) đã đăng trên HuggingFace. JSON kết quả: benchmarks/accuracy/vintern_ocr_clean_baseline.json

Cách dùng

Trong giao diện web

Mở OCR chữ viết tay ở thanh điều hướng bên trái. Kéo thả ảnh (.png, .jpg, .jpeg, .tif, .tiff, .bmp, .webp) hoặc bấm Chọn ảnh. Bấm OCR. Lần đầu chạy mất 30–60 giây để tải mô hình; lần sau ~5–15 giây mỗi ảnh trên GPU, hoặc 1–2 phút trên CPU.

Gọi trực tiếp qua API HTTP

bash
curl -X POST http://localhost:8080/api/jobs/handwriting-ocr \
  -F "file=@phieu_dang_ky.jpg"
# → { "id": "<job-id>", "status": "queued", ... }

Tác vụ chạy nền — theo dõi qua Hàng đợi xử lý hoặc GET /api/jobs/{id}.

Cách hoạt động

nom.ocr.handwriting là wrapper quanh Vintern-1B-v3_5:

  1. Đọc ảnh — Pillow load + chuyển sang RGB. Truyền cả trang, không cắt từng dòng.
  2. Prompt"Đọc và trích xuất toàn bộ chữ viết tay trong ảnh. Giữ nguyên xuống dòng và bố cục."
  3. Generate — temperature 0, max 2048 token đầu ra.
  4. Decode + NFC — chuẩn hoá Unicode tổ hợp dấu trước khi trả về.

Vì sao truyền cả trang, không cắt từng dòng

VLM ảo trên line crop < 60 px chiều ngắn — cạm bẫy đã đo trên qwen2.5vl:7b (CER 33 % với chữ in clean ở line crop, vs 5 % cho Tesseract). Truyền cả trang giữ ngữ cảnh không gian, mô hình tự suy luận đường đọc.

Khi nào chọn cái gì

Đầu vàoKhuyến nghịLý do
Chữ viết tayVintern-1B-v3_5Mô hình chuyên cho chữ tay tiếng Việt
Chữ in sạch (PDF / scan)Tesseract qua nom convertCER 0 % trên dòng in sạch, 100 × nhanh hơn VLM
Biểu mẫu lai (in + viết tay)Vintern trước, Tesseract lại nếu phần in cần độ chính xác caoVintern bao quát; Tesseract chốt phần in
Hồ sơ y tế viết tayVintern + người xác nhậnVintern chưa được tinh chỉnh trên y tế VN; CER ước ~20 %

Vintern không thay thế Tesseract cho mọi trường hợp — nó bổ sung cho phần Tesseract không làm được (chữ viết tay).

Giới hạn đã biết

  • Đã đo trên chữ in tổng hợp (CER 0,47 % sạch / 0,37 % nhiễu, n=20), chưa đo độc lập trên chữ viết tay thật. Các con số dưới đây là ước lượng, chưa có số liệu nội bộ:

    • Ảnh quét chữ in rõ: CER ≈ 5 % (cao hơn tổng hợp do bố cục phức tạp)
    • Chữ viết tay người lớn, nét rõ: CER ≈ 15 % (ước lượng)
    • Chữ viết tay nhanh hoặc nguệch ngoạc: CER ≈ 30 %+ (ước lượng)

    Đo trên chữ viết tay thật là việc đợt sau — sẽ chạy trên brianhuster/VietnameseOCRdataset (~7 nghìn ảnh, Apache-2.0) và cập nhật con số ở đây trong cùng commit với JSON kết quả.

  • Phụ thuộc chất lượng ảnh. Ảnh mờ, tối, hoặc nghiêng > 15° làm giảm chất lượng đáng kể. Crop sạch đầu vào trước.

  • Không xử lý cấu trúc biểu mẫu. Vintern trả về văn bản tuyến tính, không nhận diện ô / cột / nhãn. Với biểu mẫu có cấu trúc, kết hợp một bước trích xuất trường theo luật sau bước OCR.

  • Độ trễ cao. 5–15 giây/ảnh trên GPU 8 GB là điển hình. Cho xử lý hàng loạt nên dùng Hàng đợi thay vì chờ từng yêu cầu HTTP.

  • Tiếng Việt thuần; mô hình đa ngôn ngữ về cơ bản nhưng chưa được đo trên tài liệu lai EN/VN.

Mô hình thay thế

Mô hìnhLicenseKhi nào chọn
5CD-AI/Vintern-1B-v3_5 (mặc định)MITChữ viết tay VN tiêu chuẩn
5CD-AI/Vintern-3BMITCần chất lượng cao hơn, có VRAM 8 GB+
qwen2.5-vl:7b qua OllamaApache 2.0Đa ngôn ngữ, không cần GPU; kém Vintern trên VN

Liên quan