Nhận dạng văn bản trong ứng dụng — nó là gì, OCR và Vision

Tác giả: IT Sectr Đã đăng: 2026-07-18 Thời gian đọc: 10 phút

Nhận dạng Văn bản (OCR — Nhận dạng Ký tự Quang học) là công nghệ trích xuất văn bản in hoặc viết tay từ hình ảnh và luồng video. Trong phát triển di động, Nhận dạng Văn bản được sử dụng để số hóa tài liệu, nhận dạng biển số xe, đọc danh thiếp và dịch văn bản theo thời gian thực. Các giải pháp OCR di động chính là: ML Kit Text Recognition (Google), Vision Framework (Apple), Tesseract OCR (mã nguồn mở). Theo Google ML Kit, 2025, Text Recognition V2 xử lý một khung hình trong 10–30 ms với độ chính xác 96% trên chữ Latinh và 91% trên chữ Kirin.

Những điểm chính

  • Nhận dạng Văn bản — trích xuất văn bản từ hình ảnh và video (OCR)
  • ML Kit Text Recognition — 45+ ngôn ngữ, độ chính xác 96% (Latinh), 10–30 ms
  • Apple Vision — VNRecognizeTextRequest, 13+ ngôn ngữ, iOS gốc
  • Tesseract — OCR mã nguồn mở, 100+ ngôn ngữ, 50–200 ms, CPU
  • Thời gian thực — lên tới 30 FPS với CameraX/AVFoundation trên thiết bị hiện đại

Nhận dạng Văn bản là gì: nguyên lý OCR

Nhận dạng Văn bản (OCR) là một quy trình thị giác máy tính chuyển đổi hình ảnh văn bản thành các ký tự có thể đọc được bằng máy. OCR bao gồm các giai đoạn: tiền xử lý hình ảnh (nhị phân hóa, deskew, chỉnh độ nghiêng), phân đoạn (chia thành dòng, từ, ký tự), nhận dạng (phân loại từng ký tự) và hậu xử lý (kiểm tra từ điển, sửa lỗi). Các hệ thống OCR hiện đại (ML Kit, Vision) sử dụng mạng nơ-ron đầu-cuối kết hợp tất cả các giai đoạn.

Các loại OCR: văn bản in — nhận dạng văn bản đánh máy từ tài liệu, biển hiệu, màn hình — độ chính xác 95–99%; chữ viết tay — nhận dạng đầu vào viết tay — độ chính xác 80–90% trên Latinh, 70–80% trên Kirin; văn bản cảnh — văn bản trong cảnh tự nhiên: số nhà, biển báo đường, tên cửa hàng — khó nhất do biến dạng phối cảnh và chói sáng.

CRNN + CTC Loss — kiến trúc được sử dụng trong các mô hình OCR hiện đại. Mạng nơ-ron tích chập hồi tiếp (CNN + LSTM) trích xuất đặc trưng hình ảnh, trong khi Phân loại Thời gian Kết nối giải mã chuỗi ký tự mà không cần phân đoạn trước. CRNN hoạt động với văn bản có độ dài bất kỳ và chịu được độ nghiêng và biến dạng. Theo arXiv (2025), các mô hình CRNN đạt độ chính xác 97.5% trên chuẩn ICDAR 2019.

Giải pháp OCRĐộ chính xácTốc độNgôn ngữNền tảng
ML Kit V296%10–30 ms45+Android, iOS
Apple Vision95%10–40 ms13+iOS, macOS
Tesseract 590%50–200 ms100+Đa nền tảng
Google Cloud Vision98%500–1000 ms200+Máy chủ (API)

CRNN cho thiết bị di động — ML Kit sử dụng mô hình MobileNetV2 + CRNN với lượng tử hóa INT8. Mô hình chiếm 2–5 MB (tiềm ẩn) và chạy trên GPU/NPU thông qua TFLite Delegate. Không giống như Tesseract (đường ống cổ điển), OCR mạng nơ-ron không yêu cầu phân đoạn ký tự riêng biệt và chịu nhiễu tốt hơn. Nhược điểm: yêu cầu GPU hoặc NPU cho thời gian thực — trên CPU thuần, tốc độ giảm xuống 5–10 FPS.

ML Kit Text Recognition trên Android và iOS

ML Kit Text Recognition là công cụ OCR chính cho ứng dụng di động. Nó có sẵn ở hai phiên bản: V2 (dựa trên Latinh — tối ưu cho Latinh, Kirin, chữ số) và V1 (Latinh + CJK — tiếng Nhật, Trung, Hàn, nhưng chậm hơn). V2 sử dụng mô hình CRNN đầu-cuối, V1 sử dụng CNN + LSTM cũ hơn. Google khuyến nghị V2 cho mọi trường hợp ngoại trừ khi cần nhận dạng CJK.

Cấu trúc kết quả ML Kit: Text → TextBlock → Line → Element (Word/Symbol). Mỗi cấp có hộp giới hạn, độ tin cậy (0..1) và văn bản được nhận dạng. Text là đối tượng gốc với fullText (toàn bộ văn bản được nhận dạng trong một dòng). TextBlock là khối văn bản logic (đoạn văn, cột). Line là một dòng văn bản. Element là một từ hoặc ký hiệu. Sử dụng confidence để lọc các nhận dạng không chính xác.

kotlin
// ML Kit Text Recognition V2
val recognizer = TextRecognition.getClient(
    TextRecognizerOptions.DEFAULT_OPTIONS
)

recognizer.process(inputImage)
    .addOnSuccessListener { text ->
        val fullText = text.text
        text.textBlocks.forEach { block ->
            val blockText = block.text
            val blockRect = block.boundingBox
            block.lines.forEach { line ->
                line.elements.forEach { element ->
                    val word = element.text
                    val confidence = element.confidence
                }
            }
        }
    }
    .addOnFailureListener { error -> /* error */ }

Nhận dạng Văn bản trên iOS qua ML Kit: API tương tự Android nhưng sử dụng UIImage/CVPixelBuffer thay vì InputImage. ML Kit tự động sử dụng Apple Neural Engine trên A12+ thông qua Core ML Delegate. Đối với iOS, ML Kit Text Recognition V2 đạt tốc độ 15–30 ms trên iPhone 15 Pro. Để có hiệu suất tối đa, hãy chuyển đổi UIImage thành CVPixelBuffer trước khi truyền — điều này giảm chi phí chuyển đổi.

Apple Vision Framework: VNRecognizeTextRequest

Apple Vision Framework cung cấp OCR gốc thông qua VNRecognizeTextRequest (iOS 13+). Vision OCR sử dụng Apple Neural Engine (ANE) và không yêu cầu SDK bổ sung. Hỗ trợ 13 ngôn ngữ (EN, FR, IT, DE, ES, PT, ZH, JP, KO, RU, AR, TH, VI). Vision tự động phát hiện ngôn ngữ của văn bản (hiệu chỉnh ngôn ngữ) và hỗ trợ nhiều ngôn ngữ trong một khung hình. Tốc độ — 10–40 ms trên A16+.

Tính năng Vision OCR: recognitionLevel (nhanh vs chính xác), automaticLanguageDetection, customWords (thêm thuật ngữ cụ thể), supportsTop candidates (nhiều phương án nhận dạng cho văn bản mờ). Chế độ nhanh cho độ chính xác 90% ở 10–20 ms, chế độ chính xác 95% ở 30–50 ms. Cho sản xuất, sử dụng chế độ chính xác với lọc theo confidence >= 0.5.

swift
import Vision

let request = VNRecognizeTextRequest { request, error in
    guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
    for observation in observations {
        let topCandidate = observation.topCandidates(1).first
        let text = topCandidate?.string ?? ""
        let confidence = topCandidate?.confidence ?? 0
        let boundingBox = observation.boundingBox
    }
}
request.recognitionLevel = .accurate
request.usesLanguageCorrection = true

let handler = VNImageRequestHandler(cgImage: cgImage, orientation: .up)
try handler.perform([request])

Vision so với ML Kit trên iOS: Vision nhanh hơn trên thiết bị cũ (iPhone X–13) nhờ ANE tích hợp. ML Kit chính xác hơn trên cảnh phức tạp (biến dạng, nghiêng, chói) nhờ mô hình của Google được huấn luyện trên hàng triệu hình ảnh scene text. Vision không hỗ trợ confidence cho từng ký tự riêng lẻ (chỉ cho từ), hạn chế khả năng lọc. Cho tài liệu — Vision (nhanh hơn), cho scene text — ML Kit (chính xác hơn).

Tesseract OCR: giải pháp thay thế mã nguồn mở

Tesseract OCR là công cụ nhận dạng văn bản mã nguồn mở do HP (1985–1998) phát triển và Google (2006+) duy trì. Tesseract 5 (dựa trên LSTM) sử dụng kiến trúc mạng nơ-ron CRNN, mang lại sự cải thiện đáng kể về độ chính xác so với Tesseract 4 (cổ điển + LSTM). Tesseract hỗ trợ 100+ ngôn ngữ, bao gồm Kirin, Ả Rập, Do Thái và CJK. Cho Android — tess-two (fork), cho iOS — swift-tesseract.

Nhược điểm của Tesseract: tốc độ 50–200 ms mỗi khung hình (chỉ CPU, không tăng tốc GPU), yêu cầu tiền xử lý hình ảnh (nhị phân hóa, deskew, phát hiện hướng) trước khi truyền vào công cụ, không có tính năng phát hiện văn bản tích hợp — cần truyền vùng hình ảnh (thường cùng với OpenCV Text Detection hoặc EAST). Tesseract đạt độ chính xác 90% trên tài liệu sạch và ~70% trên scene text.

Khi nào chọn Tesseract: nếu ứng dụng chạy trên thiết bị không có Google Play (Huawei), cần hỗ trợ ngôn ngữ hiếm (tiếng Phạn, Do Thái), hoặc yêu cầu tùy chỉnh đầy đủ đường ống OCR (huấn luyện trên phông chữ tùy chỉnh). Cho mọi trường hợp khác, ML Kit hoặc Vision nhanh hơn, chính xác hơn và yêu cầu ít mã hơn. Tesseract chỉ hợp lý khi có hạn chế về SDK bên thứ ba.

kotlin
// Tesseract OCR via tess-two
val tess = TessBaseAPI()
tess.init(dataPath, "rus+eng")
tess.pageSegMode = TessBaseAPI.PageSegMode.PSM_AUTO

val bitmap = BitmapFactory.decodeResource(resources, R.drawable.text)
val gray = Bitmap.createBitmap(bitmap.width, bitmap.height, Bitmap.Config.ARGB_8888)
OpenCV.process(bitmap, gray) // Nhị phân hóa + deskew

tess.setImage(gray)
val result = tess.utF8Text
tess.recycle()

Tiền xử lý cho Tesseract là bắt buộc: chuyển đổi sang thang độ xám, nhị phân hóa (Otsu hoặc Adaptive), deskew, loại bỏ nhiễu (median blur). Nếu không tiền xử lý, độ chính xác của Tesseract giảm xuống 50–60%. Sử dụng OpenCV để tiền xử lý: Imgproc.cvtColor → Imgproc.threshold → Imgproc.erode/dilate → Core.rotate (deskew). Đối với tài liệu có nền đồng nhất, nhị phân hóa là đủ; đối với scene text, cần đường ống đầy đủ.

Tiền xử lý hình ảnh cho OCR

Chất lượng hình ảnh là yếu tố chính cho độ chính xác OCR. ML Kit và Vision có tiền xử lý tích hợp, nhưng đối với các trường hợp khó (ảnh tối, mờ, quá sáng), xử lý bổ sung cải thiện độ chính xác 10–15%. Kỹ thuật chính: tăng cường độ tương phản (CLAHE), làm sắc nét (unsharp mask), hiệu chỉnh phối cảnh (perspective transform), loại bỏ bóng và chói.

CLAHE (Cân bằng biểu đồ tần suất thích ứng giới hạn độ tương phản) — cân bằng biểu đồ tần suất thích ứng cải thiện độ tương phản trong các vùng cục bộ. CLAHE hiệu quả cho ảnh tài liệu có ánh sáng không đồng đều (một phần trong bóng, một phần sáng). OpenCV Core.createCLAHE với clipLimit=2.0 và tileGridSize=(8,8) cho kết quả tối ưu cho OCR. Sau CLAHE, độ chính xác của ML Kit trên tài liệu tối cải thiện từ 70% lên 88%.

Hiệu chỉnh phối cảnh — bắt buộc đối với ảnh tài liệu chụp ở góc nghiêng. Sử dụng OpenCV findHomography + warpPerspective để căn chỉnh tài liệu. Để phát hiện tự động ranh giới tài liệu, sử dụng Canny edge detection + findContours + approxPolyDP. Sau hiệu chỉnh phối cảnh, độ chính xác OCR cải thiện 20–30% cho ảnh chụp ở góc >30°.

kotlin
// CLAHE + tiền xử lý OpenCV
val mat = Mat()
Utils.bitmapToMat(bitmap, mat)
Imgproc.cvtColor(mat, mat, Imgproc.COLOR_RGB2GRAY)

val clahe = Imgproc.createCLAHE(2.0, Size(8.0, 8.0))
clahe.apply(mat, mat)

Imgproc.GaussianBlur(mat, mat, Size(3.0, 3.0), 0.0)
Imgproc.threshold(mat, mat, 0.0, 255.0, Imgproc.THRESH_BINARY or Imgproc.THRESH_OTSU)

val processedBitmap = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888)
Utils.matToBitmap(mat, processedBitmap)

Phát hiện văn bản trước OCR — đối với scene text, sử dụng EAST (Bộ phát hiện văn bản cảnh hiệu quả và chính xác) hoặc CRAFT (Nhận biết vùng ký tự để phát hiện văn bản) trước khi truyền vào OCR. EAST phát hiện hộp giới hạn văn bản trong cảnh trong 5–15 ms. CRAFT chính xác hơn (97%) nhưng chậm hơn (50–100 ms). Phát hiện văn bản cho phép lọc các khu vực không có văn bản và chỉ truyền các vùng liên quan đến OCR, tăng tốc xử lý tổng thể.

Ứng dụng OCR trong ứng dụng di động

Quét tài liệu — ứng dụng phổ biến nhất của OCR. Các ứng dụng quét (CamScanner, Adobe Scan, Google Drive) sử dụng ML Kit hoặc Vision để nhận dạng văn bản từ ảnh tài liệu. Đường ống điển hình: phát hiện ranh giới tài liệu → hiệu chỉnh phối cảnh → xử lý CLAHE → OCR → định dạng (PDF, DOCX). ML Kit Text Recognition V2 xử lý trong 100–200 ms mỗi trang A4.

Dịch văn bản thời gian thực — kết hợp OCR và dịch máy. Google Dịch, Microsoft Translator, Yandex Dịch sử dụng ML Kit hoặc Vision để nhận dạng văn bản từ camera và phủ bản dịch lên văn bản gốc (dịch AR). Yêu cầu: độ trễ < 200 ms để có UX thoải mái. ML Kit V2 + NNAPI cung cấp 30–80 ms mỗi khung hình, để lại khoảng trống cho dịch thuật và kết xuất.

Nhập dữ liệu tự động — OCR để trích xuất dữ liệu từ danh thiếp, thẻ ngân hàng, giấy tờ tùy thân. ML Kit nhận dạng văn bản, sau đó hậu xử lý phân tích cấu trúc: tên, điện thoại, email (danh thiếp) hoặc số thẻ, ngày hết hạn, CVV (thẻ thanh toán). Đối với danh thiếp, sử dụng biểu thức chính quy sau OCR. Đối với thẻ ngân hàng — mô hình ML chuyên dụng (trả phí, ~99% độ chính xác).

swift
// OCR + dịch AR (đơn giản hóa)
let request = VNRecognizeTextRequest { req, _ in
    guard let results = req.results as? [VNRecognizedTextObservation] else { return }
    for observation in results {
        let text = observation.topCandidates(1).first?.string ?? ""
        let rect = observation.boundingBox
        // Dịch thuật và kết xuất AR trên hình chữ nhật
        DispatchQueue.main.async {
            overlayView.showTranslation(text, at: rect)
        }
    }
}
request.recognitionLevel = .fast
request.usesLanguageCorrection = false

OCR cho người khiếm thị — Công nghệ hỗ trợ: ứng dụng đọc to văn bản từ bao bì, thực đơn, biển hiệu. Chúng sử dụng ML Kit OCR + Text-to-Speech (Android TTS / iOS AVSpeechSynthesizer). Yêu cầu chính — thời gian thực với độ trễ thấp (< 100 ms). Seeing AI (Microsoft) và Envision AI sử dụng cách tiếp cận này. Đối với ứng dụng trợ năng, sử dụng chế độ nhận dạng nhanh và không lọc theo confidence — bất kỳ văn bản nào cũng có giá trị với người dùng.

Câu hỏi thường gặp

Nhận dạng Văn bản (OCR) trong ứng dụng di động là gì?

Nhận dạng Văn bản (OCR) là công nghệ cho phép ứng dụng đọc văn bản từ ảnh và video. Camera điện thoại thông minh chụp ảnh, mạng nơ-ron trên thiết bị nhận dạng các ký tự và trả về văn bản có thể đọc được bằng máy. Trong ứng dụng di động, OCR được sử dụng để quét tài liệu, dịch bằng camera, nhập dữ liệu từ danh thiếp và tạo giao diện trợ năng cho người khiếm thị.

OCR nào tốt hơn cho Android: ML Kit hay Tesseract?

ML Kit Text Recognition là lựa chọn tốt nhất cho Android: độ chính xác 96%, tốc độ 10–30 ms, 45 ngôn ngữ, tăng tốc GPU qua NNAPI, tìm văn bản ở mọi hướng. Tesseract là giải pháp thay thế mã nguồn mở (độ chính xác 90%, 100+ ngôn ngữ, CPU), phù hợp cho thiết bị không có Google Play hoặc ngôn ngữ hiếm. Cho 95% dự án, hãy chọn ML Kit — nó nhanh hơn, chính xác hơn và không yêu cầu tiền xử lý hình ảnh.

Có cần internet cho OCR trên thiết bị di động không?

Không, ML Kit Text Recognition, Apple Vision và Tesseract hoạt động hoàn toàn trên thiết bị. ML Kit có thể tải mô hình khi khởi chạy lần đầu (chế độ đã tải), sau đó hoạt động ngoại tuyến. Apple Vision được tích hợp trong iOS và không cần internet. Tesseract hoàn toàn ngoại tuyến. OCR đám mây (Google Cloud Vision, AWS Textract) hoạt động qua internet nhưng không được sử dụng trong ứng dụng thời gian thực trên di động.

ML Kit Text Recognition hỗ trợ những ngôn ngữ nào?

ML Kit Text Recognition V2 hỗ trợ 45+ ngôn ngữ từ nhóm Latinh và Kirin: tiếng Anh, Nga, Đức, Pháp, Tây Ban Nha, Ý, Bồ Đào Nha, Ba Lan, Ukraina, Rumani, Thổ Nhĩ Kỳ và các ngôn ngữ khác. V1 (CJK) hỗ trợ thêm tiếng Trung, Nhật, Hàn. Danh sách đầy đủ — trong tài liệu TextRecognizerOptions. Để nhận dạng tiếng Ả Rập hoặc Do Thái, sử dụng Tesseract (>100 ngôn ngữ).

Làm thế nào để cải thiện độ chính xác OCR trên ảnh tài liệu?

Các phương pháp chính: căn chỉnh tài liệu (hiệu chỉnh phối cảnh qua OpenCV), tăng cường độ tương phản (CLAHE), làm sắc nét (unsharp mask), ánh sáng tốt (tự động phơi sáng liên tục), ổn định camera (OIS/EIS). ML Kit tự xử lý các biến dạng cơ bản, nhưng đối với tài liệu có biến dạng phối cảnh (>30°), tiền xử lý cải thiện độ chính xác 20–30%. Sử dụng chế độ nhận dạng nhanh cho video.

Tổng kết

  • Nhận dạng Văn bản — OCR trên thiết bị di động: văn bản in, viết tay, cảnh
  • ML Kit V2 — độ chính xác 96%, 45+ ngôn ngữ, 10–30 ms, tăng tốc GPU/NPU
  • Apple Vision — OCR gốc iOS (iOS 13+), 13 ngôn ngữ, qua ANE
  • Tesseract 5 — mã nguồn mở, 100+ ngôn ngữ, 50–200 ms (CPU), thay thế cho Huawei
  • Tiền xử lý — CLAHE, deskew, hiệu chỉnh phối cảnh cải thiện độ chính xác 10–30%
  • Thời gian thực — lên tới 30 FPS qua CameraX/AVFoundation với ML Kit hoặc Vision
  • Trên thiết bị — tất cả tính toán cục bộ, quyền riêng tư dữ liệu được đảm bảo

Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay

IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.

Thảo luận dự án

Đọc thêm