Text Recognition в приложениях — что это, OCR и Vision

Автор: IT Sectr Опубликовано: 2026-07-18 Время чтения: 10 мин

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

Главное

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

Что такое Text Recognition: принципы OCR

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

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

CRNN + CTC Loss — архитектура, используемая в современных OCR-моделях. Convolutional Recurrent Neural Network (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 (latent) и выполняется на 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 (Latin-based — оптимизирована для латиницы, кириллицы, цифр) и V1 (Latin + CJK — японский, китайский, корейский, но медленнее). V2 использует энд-ту-энд CRNN-модель, V1 — более старую CNN + LSTM. Google рекомендует V2 для всех случаев, кроме необходимости CJK-распознавания.

Структура результата ML Kit: Text → TextBlock → Line → Element (Word/Symbol). Каждый уровень имеет bounding box, confidence (0..1) и recognised text. 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 */ }

Text Recognition на 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 перед передачей — это снижает overhead конвертации.

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 автоматически определяет язык текста (language correction) и поддерживает multiple languages в одном кадре. Скорость — 10–40 мс на A16+.

Особенности Vision OCR: recognitionLevel (fast vs accurate), automaticLanguageDetection, customWords (добавление специфичных терминов), supportsTop candidates (несколько вариантов распознавания для нечёткого текста). Fast режим даёт 90% точности при 10–20 мс, accurate — 95% при 30–50 мс. Для production используйте accurate с фильтрацией по 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: open-source альтернатива

Tesseract OCR — open-source движок распознавания текста, разработанный HP (1985–1998) и развиваемый Google (2006+). Tesseract 5 (LSTM-based) использует нейросетевую архитектуру 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 documents и ~70% на scene text.

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

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) // Binarization + 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 preprocessing
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 translation (simplified)
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
        // Translation and AR rendering over rect
        DispatchQueue.main.async {
            overlayView.showTranslation(text, at: rect)
        }
    }
}
request.recognitionLevel = .fast
request.usesLanguageCorrection = false

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

Часто задаваемые вопросы

Что такое Text Recognition (OCR) в мобильных приложениях?

Text Recognition (OCR) — технология, которая позволяет приложению «читать» текст с фотографий и видео. Камера смартфона захватывает изображение, нейросеть на устройстве распознаёт символы и возвращает машиночитаемый текст. В мобильных приложениях OCR используется для сканирования документов, перевода с камеры, ввода данных с визиток и создания доступных интерфейсов для людей с ограничениями зрения.

Какой OCR лучше для Android: ML Kit или Tesseract?

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

Требуется ли интернет для OCR на мобильном устройстве?

Нет, ML Kit Text Recognition, Apple Vision и Tesseract работают полностью on-device. ML Kit может скачать модель при первом запуске (downloaded mode), после чего работает офлайн. Apple Vision — встроен в iOS, не требует интернета. Tesseract — полностью офлайн. Cloud 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 для видео.

Итоги

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

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

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