Розпізнавання тексту в застосунках — що це, OCR та Vision

Автор: IT Sectr Опубліковано: 2026-07-18 Час читання: 10 хв

Розпізнавання тексту (OCR — оптичне розпізнавання символів) — це технологія вилучення друкованого або рукописного тексту із зображень та відеопотоку. У мобільній розробці розпізнавання тексту використовується для оцифрування документів, розпізнавання номерних знаків, зчитування візитівок та перекладу тексту в реальному часі. Основні мобільні OCR-рішення: ML Kit Text Recognition (Google), Vision Framework (Apple), Tesseract OCR (відкритий код). За даними Google ML Kit, 2025, Text Recognition V2 обробляє кадр за 10–30 мс з точністю 96% на латиниці та 91% на кирилиці.

Головне

  • Розпізнавання тексту — вилучення тексту із зображень та відео (OCR)
  • ML Kit Text Recognition — 45+ мов, точність 96% (латиниця), 10–30 мс
  • Apple Vision — VNRecognizeTextRequest, 13+ мов, нативний iOS
  • Tesseract — відкритий OCR, 100+ мов, 50–200 мс, CPU
  • Real-time — до 30 FPS з CameraX/AVFoundation на сучасних пристроях

Що таке розпізнавання тексту: принципи OCR

Розпізнавання тексту (OCR) — це процес комп'ютерного зору, що перетворює зображення тексту на машиночитані символи. OCR складається з етапів: попередня обробка зображення (бінаризація, дескью, усунення перекосу), сегментація (розбиття на рядки, слова, символи), розпізнавання (класифікація кожного символу) та постобробка (перевірка словником, виправлення помилок). Сучасні OCR-системи (ML Kit, Vision) використовують наскрізні нейромережі, що об'єднують всі етапи.

Типи OCR: друкований текст — розпізнавання машинописного тексту з документів, вивісок, екранів — точність 95–99%; рукописний текст — розпізнавання рукописного введення — точність 80–90% на латиниці, 70–80% на кирилиці; контекстний текст — текст на природних сценах: номери будинків, дорожні знаки, назви магазинів — найскладніший через перспективні спотворення та відблиски.

CRNN + CTC Loss — архітектура, що використовується в сучасних OCR-моделях. Згорткова рекурентна нейронна мережа (CNN + LSTM) вилучає ознаки зображення, а Connectionist Temporal Classification декодує послідовність символів без необхідності попередньої сегментації. CRNN працює з текстами будь-якої довжини, стійка до перекосів та спотворень. За даними arXiv (2025), CRNN-моделі дають 97.5% точності на benchmark ICDAR 2019.

OCR РішенняТочністьШвидкістьМовиПлатформа
ML Kit V296%10–30 мс45+Android, iOS
Apple Vision95%10–40 мс13+iOS, macOS
Tesseract 590%50–200 мс100+Кроссплатформа
Google Cloud Vision98%500–1000 мс200+Сервер (API)

CRNN для мобільних пристроїв — ML Kit використовує модель MobileNetV2 + CRNN з INT8-квантуванням. Модель займає 2–5 MB (латентна) та виконується на GPU/NPU через TFLite Delegate. На відміну від Tesseract (класичний pipeline), нейромережевий OCR не вимагає окремої сегментації символів і стійкіший до шумів. Недолік: вимагає GPU або NPU для real-time — на чистому CPU швидкість падає до 5–10 FPS.

ML Kit Text Recognition на Android та iOS

ML Kit Text Recognition — основний OCR-інструмент для мобільних застосунків. Доступний у двох версіях: V2 (латиниця — оптимізована для латиниці, кирилиці, цифр) та V1 (латиниця + CJK — японська, китайська, корейська, але повільніша). V2 використовує наскрізну CRNN-модель, V1 — старішу CNN + LSTM. Google рекомендує V2 для всіх випадків, крім необхідності CJK-розпізнавання.

Структура результату ML Kit: Text → TextBlock → Line → Element (Word/Symbol). Кожен рівень має bounding box, confidence (0..1) та розпізнаний текст. Text — кореневий об'єкт з fullText (весь розпізнаний текст в одному рядку). TextBlock — логічний блок тексту (абзац, колонка). Line — рядок тексту. Element — слово або символ. Використовуйте confidence для фільтрації неточних розпізнавань.

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 */ }

Розпізнавання тексту на iOS через ML Kit: API аналогічний Android, але використовує UIImage/CVPixelBuffer замість InputImage. ML Kit автоматично використовує Apple Neural Engine на A12+ через Core ML Delegate. Для iOS ML Kit Text Recognition V2 показує швидкість 15–30 мс на iPhone 15 Pro. Для максимальної продуктивності конвертуйте UIImage у CVPixelBuffer перед передачею — це знижує накладні витрати конвертації.

Apple Vision Framework: VNRecognizeTextRequest

Apple Vision Framework надає нативний OCR через VNRecognizeTextRequest (iOS 13+). Vision OCR використовує Apple Neural Engine (ANE) і не вимагає додаткових SDK. Підтримує 13 мов (EN, FR, IT, DE, ES, PT, ZH, JP, KO, RU, AR, TH, VI). Vision автоматично визначає мову тексту (мовна корекція) та підтримує кілька мов в одному кадрі. Швидкість — 10–40 мс на A16+.

Особливості Vision OCR: recognitionLevel (fast vs accurate), automaticLanguageDetection, customWords (додавання специфічних термінів), supportsTop candidates (кілька варіантів розпізнавання для нечіткого тексту). Швидкий режим дає 90% точності при 10–20 мс, точний — 95% при 30–50 мс. Для production використовуйте точний з фільтрацією за 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 vs ML Kit на iOS: Vision швидший на старих пристроях (iPhone X–13) завдяки вбудованому ANE. ML Kit точніший на складних сценах (спотворення, перекоси, відблиски) завдяки моделі Google, навченій на мільйонах scene text зображень. Vision не підтримує confidence для окремих символів (тільки для слів), що обмежує фільтрацію. Для документів — Vision (швидше), для scene text — ML Kit (точніше).

Tesseract OCR: альтернатива з відкритим кодом

Tesseract OCR — рушій розпізнавання тексту з відкритим кодом, розроблений HP (1985–1998) та підтримуваний Google (2006+). Tesseract 5 (LSTM-оснований) використовує нейромережеву архітектуру CRNN, що дає значний приріст точності порівняно з Tesseract 4 (класичний + LSTM). Tesseract підтримує 100+ мов, включаючи кирилицю, арабську, іврит та CJK. Для Android — tess-two (форк), для iOS — swift-tesseract.

Недоліки Tesseract: швидкість 50–200 мс на кадр (CPU-only, немає GPU-прискорення), потребує попередньої обробки зображення (бінаризація, дескью, визначення орієнтації) перед передачею в рушій, немає вбудованої детекції тексту — потрібно передавати область зображення (часто в парі з OpenCV Text Detection або EAST). Tesseract дає 90% точності на clean документах та ~70% на scene text.

Коли вибирати Tesseract: якщо застосунок працює на пристроях без Google Play (Huawei), потрібна підтримка рідкісних мов (санскрит, іврит), або потрібна повна кастомізація OCR-пайплайну (навчання на власних шрифтах). Для всіх інших випадків ML Kit або Vision швидші, точніші та потребують менше коду. Tesseract — виправданий вибір лише при обмеженнях на сторонні SDK.

kotlin
// Tesseract OCR через 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) // Бінаризація + deskew

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

Попередня обробка для Tesseract обов'язкова: перетворення в grayscale, бінаризація (Otsu або Adaptive), усунення перекосу (deskew), видалення шуму (median blur). Без попередньої обробки точність Tesseract падає до 50–60%. Використовуйте OpenCV для попередньої обробки: Imgproc.cvtColor → Imgproc.threshold → Imgproc.erode/dilate → Core.rotate (deskew). Для документів з рівним фоном достатньо бінаризації, для scene text — повний пайплайн.

Попередня обробка зображень для OCR

Якість зображення — головний фактор точності OCR. ML Kit та Vision мають вбудовану попередню обробку, але для складних випадків (темні фото, розмиття, засвіти) додаткова обробка підвищує точність на 10–15%. Основні техніки: збільшення контрасту (CLAHE), усунення розмиття (unsharp mask), корекція перспективи (perspective transform), видалення тіней та відблисків.

CLAHE (Contrast Limited Adaptive Histogram Equalization) — адаптивне вирівнювання гістограми, що покращує контраст локальних областей. CLAHE ефективний для фото документів з нерівномірним освітленням (частина в тіні, частина на світлі). OpenCV Core.createCLAHE з clipLimit=2.0 та tileGridSize=(8,8) дає оптимальний результат для OCR. Після CLAHE точність ML Kit на темних документах підвищується з 70% до 88%.

Корекція перспективи — обов'язкова для фото документів під кутом. Використовуйте OpenCV findHomography + warpPerspective для вирівнювання документа. Для автоматичного детектування меж документа використовуйте Canny edge detection + findContours + approxPolyDP. Після перспективної корекції точність OCR підвищується на 20–30% для знімків під кутом >30°.

kotlin
// CLAHE + попередня обробка 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)

Детекція тексту перед OCR — для scene text використовуйте EAST (Efficient Accurate Scene Text Detector) або CRAFT (Character Region Awareness for Text Detection) перед передачею в OCR. EAST детектує bounding box тексту на сцені за 5–15 мс. CRAFT точніший (97%), але повільніший (50–100 мс). Детекція тексту дозволяє відсікти області без тексту та передавати в OCR лише релевантні ділянки, що прискорює загальну обробку.

Застосування OCR у мобільних застосунках

Сканування документів — наймасовіше застосування OCR. Застосунки для сканування (CamScanner, Adobe Scan, Google Drive) використовують ML Kit або Vision для розпізнавання тексту з фотографій документів. Типовий пайплайн: детекція меж документа → перспективна корекція → CLAHE-обробка → OCR → форматування (PDF, DOCX). ML Kit Text Recognition V2 справляється за 100–200 мс на сторінку A4.

Переклад тексту в реальному часі — комбінація OCR та машинного перекладу. Google Translate, Microsoft Translator, Yandex Translate використовують ML Kit або Vision для розпізнавання тексту з камери та накладають переклад поверх вихідного тексту (AR-переклад). Вимога: latency < 200 мс для комфортного UX. ML Kit V2 + NNAPI дає 30–80 мс на кадр, залишаючи запас на переклад та рендеринг.

Автоматичне введення даних — OCR для вилучення даних з візитівок, банківських карток, посвідчень. ML Kit розпізнає текст, потім post-processing парсить структуру: ім'я, телефон, email (візитівки) або номер картки, термін, CVV (платіжні картки). Для візитівок використовуйте регулярні вирази після OCR. Для банківських карток — спеціалізовані ML-моделі (платні, ~99% точності).

swift
// OCR + AR переклад (спрощений)
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
        // Переклад та AR-рендеринг над прямокутником
        DispatchQueue.main.async {
            overlayView.showTranslation(text, at: rect)
        }
    }
}
request.recognitionLevel = .fast
request.usesLanguageCorrection = false

OCR для людей з обмеженнями зору — Допоміжна технологія: застосунки зачитують текст з упаковок, меню, вивісок. Використовують ML Kit OCR + Text-to-Speech (Android TTS / iOS AVSpeechSynthesizer). Ключова вимога — real-time з низькою затримкою (< 100 мс). Seeing AI (Microsoft) та Envision AI використовують цей підхід. Для accessibility-застосунків використовуйте fast recognition mode та не фільтруйте за confidence — користувачу важливий будь-який текст.

Часті запитання

Що таке розпізнавання тексту (OCR) у мобільних застосунках?

Розпізнавання тексту (OCR) — технологія, яка дозволяє застосунку читати текст з фотографій та відео. Камера смартфона захоплює зображення, нейромережа на пристрої розпізнає символи та повертає машиночитаний текст. У мобільних застосунках OCR використовується для сканування документів, перекладу з камери, введення даних з візитівок та створення доступних інтерфейсів для людей з обмеженнями зору.

Який OCR кращий для Android: ML Kit чи Tesseract?

ML Kit Text Recognition — найкращий вибір для Android: 96% точність, 10–30 мс швидкість, 45 мов, GPU-прискорення через NNAPI, знаходить текст будь-якої орієнтації. Tesseract — альтернатива з відкритим кодом (90% точність, 100+ мов, CPU), підходить для пристроїв без Google Play або рідкісних мов. Для 95% проєктів вибирайте ML Kit — він швидший, точніший і не потребує попередньої обробки зображення.

Чи потрібен інтернет для OCR на мобільному пристрої?

Ні, ML Kit Text Recognition, Apple Vision та Tesseract працюють повністю на пристрої. ML Kit може завантажити модель при першому запуску (завантажений режим), після чого працює офлайн. Apple Vision — вбудований в iOS, не потребує інтернету. Tesseract — повністю офлайн. Хмарний OCR (Google Cloud Vision, AWS Textract) працюють через інтернет, але не використовуються в мобільних real-time застосунках.

Які мови підтримує ML Kit Text Recognition?

ML Kit Text Recognition V2 підтримує 45+ мов латинської та кириличної груп: англійська, російська, німецька, французька, іспанська, італійська, португальська, польська, українська, румунська, турецька та інші. V1 (CJK) додатково підтримує китайську, японську, корейську. Повний список — у документації TextRecognizerOptions. Для розпізнавання арабської або івриту використовуйте Tesseract (>100 мов).

Як покращити точність OCR на фотографіях документів?

Основні методи: вирівнювання документа (perspective correction через OpenCV), покращення контрасту (CLAHE), усунення розмиття (unsharp mask), хороше освітлення (continuous auto-exposure), стабілізація камери (OIS/EIS). ML Kit сам обробляє базові спотворення, але для документів з перспективними спотвореннями (>30°) попередня обробка підвищує точність на 20–30%. Використовуйте fast recognition mode для відео.

Підсумки

  • Розпізнавання тексту — OCR на мобільних пристроях: друкований, рукописний, scene text
  • ML Kit V2 — 96% точність, 45+ мов, 10–30 мс, GPU/NPU прискорення
  • Apple Vision — нативний iOS OCR (iOS 13+), 13 мов, через ANE
  • Tesseract 5 — відкритий код, 100+ мов, 50–200 мс (CPU), запасний варіант для Huawei
  • Попередня обробка — CLAHE, deskew, перспективна корекція підвищують точність на 10–30%
  • Real-time — до 30 FPS через CameraX/AVFoundation з ML Kit або Vision
  • На пристрої — всі обчислення локально, приватність даних гарантована

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також