OCR у мобільному додатку: розпізнавання тексту через камеру

TRUETECH займається розробкою, підтримкою та обслуговуванням мобільних додатків iOS, Android, PWA. Маємо великий досвід та експертизу для публікації мобільних додатків до популярних маркетів Google Play, App Store, Amazon, AppGallery та інші.

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
OCR у мобільному додатку: розпізнавання тексту через камеру
Середній
~2-3 дні
Часті запитання

Наші компетенції:

Етапи розробки

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    858
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    743
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1160
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1034
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    968
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    562

Користувач наводить камеру на розмитий чек у напівтемряві. Без попередньої обробки знімка стандартні OCR-бібліотеки видають до 50% помилок. Рішення — на етапі захвату застосувати підвищення контрастності (vImageContrastStretch на iOS, OpenCV на Android) та бінаризацію. Тільки після цього подавати кадр у VNRecognizeTextRequest або ML Kit Text Recognition. У нашій практиці такий ланцюг підвищує точність з 70% до 98-99% на друкованому тексті.

За 5 років ми реалізували понад 20 проєктів OCR для рітейлу (розпізнавання цінників і чеків), логістики (трекінг накладних) та фінтеху (верифікація паспортних даних). У кожному проєкті — свій набір фільтрів і постобробки. Типова помилка — вважати, що OCR-бібліотека видасть ідеальний результат «з коробки». Без попередньої обробки зображення та постобробки результату точність падає до 50–70%. Тому перший етап будь-якого проєкту — збір реальних зразків документів і тестування на них.

Чому попередня обробка критична для точного OCR?

Попередня обробка — ключовий етап, що визначає підсумкову точність. У поганому освітленні або при розмитті ми використовуємо:

  • Підвищення контрастності через vImageContrastStretch (iOS) або OpenCV (Android).
  • Переведення в grayscale з наступним AdaptiveThreshold.
  • Sharpen CIFilter перед подачею в OCR.

Для рукописного тексту стандартні фреймворки показують точність 40–60%. У таких випадках допомагають кастомні моделі на базі TensorFlow Lite — це окреме завдання, що потребує розмічених даних і навчання. Джерело: документація TensorFlow Lite

Як працюють нативні OCR-фреймворки?

iOS: Vision + VNRecognizeTextRequest — ocr в мобільному

Починаючи з iOS 13 Vision фреймворк вміє розпізнавати текст без інтернету. VNRecognizeTextRequest підтримує два режими: .fast (приблизно, миттєво) та .accurate (повільніше, але значно точніше для складних шрифтів). Для складних шрифтів режим .accurate дає приріст точності на 15%.

func recognizeText(in image: UIImage) {
    guard let cgImage = image.cgImage else { return }

    let request = VNRecognizeTextRequest { [weak self] request, error in
        guard let observations = request.results as? [VNRecognizedTextObservation] else { return }
        let text = observations.compactMap { $0.topCandidates(1).first?.string }.joined(separator: "\n")
        DispatchQueue.main.async { self?.handleRecognized(text: text) }
    }

    request.recognitionLevel = .accurate
    request.usesLanguageCorrection = true
    request.recognitionLanguages = ["ru-RU", "en-US"] // порядок = пріоритет

    let handler = VNImageRequestHandler(cgImage: cgImage, options: [:])
    try? handler.perform([request])
}

usesLanguageCorrection допомагає з опечатками, але іноді «виправляє» абревіатури та артикули — для технічних документів краще вимкнути.

Android: ML Kit Text Recognition v2

com.google.mlkit:text-recognition підтримує латиницю, кирилицю, китайську, японську, корейську через окремі модулі. Завантажується на пристрій при першому використанні (~5 MB для латиниці).

val recognizer = TextRecognition.getClient(
    TextRecognizerOptions.DEFAULT_OPTIONS // або RussianTextRecognizerOptions
)

val image = InputImage.fromBitmap(bitmap, 0)
recognizer.process(image)
    .addOnSuccessListener { visionText ->
        val fullText = visionText.textBlocks
            .joinToString("\n") { block -> block.text }
        handleRecognized(fullText)
    }
    .addOnFailureListener { e -> handleError(e) }

ML Kit також повертає bounding boxes для кожного блоку тексту — корисно для підсвічування розпізнаних областей в UI.

Live-режим: текст у реальному часі з відеопотоку

Для live-overlay (текст підсвічується прямо у відеопотоці) на iOS використовуємо AVCaptureSession + CMSampleBuffer:

// Delegate метод AVCaptureVideoDataOutput
func captureOutput(_ output: AVCaptureOutput,
                   didOutput sampleBuffer: CMSampleBuffer,
                   from connection: AVCaptureConnection) {
    guard let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer) else { return }

    // Не запускаємо новий запит, якщо попередній ще не завершився
    guard !isProcessing else { return }
    isProcessing = true

    let request = VNRecognizeTextRequest { [weak self] request, _ in
        defer { self?.isProcessing = false }
        // обробка результатів...
    }
    request.recognitionLevel = .fast // для live важлива швидкість

    try? VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:]).perform([request])
}

Прапор isProcessing обов’язковий — без нього при 30 FPS накопичується черга запитів і пам’ять зростає до крашу.

На Android — CameraX + ImageAnalysis.Analyzer. ML Kit оптимізований для роботи з ImageProxy напряму без конвертації в Bitmap.

Параметр Статичне розпізнавання Live-розпізнавання
Швидкість обробки 100-200 мс до 30 мс на кадр
Точність до 99% до 95% (через компроміс швидкості)
Споживання батареї низьке середнє (постійна обробка)
Застосування сканування документів, чеків наведення на візитки, номерні знаки

Як покращити якість розпізнавання у складних умовах?

Підвищення контрастності та бінаризація — стандартні прийоми. Для специфічних документів (наприклад, чеків з вицвілим друком) ми підключаємо кастомні фільтри. Економія від автоматизації введення даних за допомогою OCR може досягати 200 000 гривень на рік на один відділ — це в 3 рази більше порівняно з ручним введенням.

Типові помилки при інтеграції OCR:

  • Забувають прапор isProcessing в live-режимі → витік пам’яті.
  • Залишають usesLanguageCorrection увімкненим для технічних текстів → псує абревіатури.
  • Не перевіряють bounding boxes на перетин з UI → текст накладається на інтерфейс.

Постобробка: від «сирого» тексту до структурованих даних

Голий OCR-результат — це потік рядків. Для більшості завдань потрібна структуризація:

  • Чеки: виділяємо рядки з цінами за regex, парсимо підсумкову суму
  • Візитки: NSDataDetector (iOS) або Patterns (Android) для телефонів, email, адрес
  • Паспорти/документи: MRZ-зона читається за стандартом ICAO 9303, є готові парсери
  • Номерні знаки: окреме завдання — краще спеціалізована модель (OpenALPR, PlateRecognizer API)

Для кириличного тексту з поганою якістю іноді допомагає попередня обробка зображення: збільшення контрастності через vImageContrastStretch, переведення в grayscale, Sharpen CIFilter перед передачею в OCR.

Порівняння нативних фреймворків

Параметр Vision (iOS) ML Kit (Android)
Режими .fast, .accurate базова модель
Мови до 15 в одному запиті модулі: лат, кир, кит, яп, кор
Офлайн так так (модель ~5 MB)
Точність на друкованому ~98% ~97%
Bounding boxes так так
Швидкість (full HD) 100-200 мс 80-150 мс

Що входить у розробку OCR-функції

При замовленні цієї послуги ви отримуєте:

  • Інтеграцію Vision або ML Kit у ваш додаток.
  • Налаштування параметрів розпізнавання під ваш тип документів.
  • Live-режим з виведенням підсвічування тексту на камері (опціонально).
  • Постобробку даних: парсинг чеків, візиток, номерів.
  • Документацію з інтеграції та тестування.
  • Підтримку при проходженні ревʼю App Store / Google Play.
  • Гарантію на працездатність рішення протягом 6 місяців.

Процес роботи

  1. Визначення сценаріїв використання: тип документів, мови, чи потрібен live-режим або тільки статичне фото.
  2. Реалізація захвату зображення (camera + галерея), попередня обробка.
  3. Інтеграція OCR: нативний Vision/ML Kit або хмарний (Google Vision API, AWS Textract) якщо потрібна вища точність для складних документів.
  4. Постобробка під конкретне завдання: структурування даних, regex, NER.
  5. Тестування на реальних зразках у різних умовах освітлення.

Орієнтири за термінами

Базове розпізнавання статичного тексту через нативний фреймворк — 2–3 дні. Live-режим з overlay + структурування даних під конкретний тип документа — 1–2 тижні. Складні сценарії з кастомними моделями — від місяця. Вартість визначається після аналізу вашого проєкту.

Отримайте консультацію щодо вашого проєкту — ми підберемо оптимальне рішення. Зв’яжіться з нами, щоб обговорити задачу та розрахувати вартість розробки OCR для вашого додатку.

Часто задавані питання

Яку точність OCR можна очікувати в мобільному додатку? Точність залежить від умов: на чітких друкованих текстах з хорошим освітленням — до 99%. Для рукописного тексту або сильно спотворених зображень точність падає до 70-80%. Використання попередньої обробки зображення та кастомних моделей може підвищити точність на 10-15%.

Чи працює OCR без інтернету? Так, нативні фреймворки Vision (iOS) та ML Kit (Android) повністю працюють офлайн. Моделі завантажуються на пристрій при першому запуску. Для складніших завдань (наприклад, розпізнавання паспортних даних) може знадобитися хмарний API для підвищення точності.

Які мови підтримують ML Kit та Vision? Vision підтримує латиницю, кирилицю, китайську, японську, корейську та інші. ML Kit має окремі модулі: латиниця, кирилиця, китайська, японська, корейська. Для розпізнавання кількох мов в одному кадрі потрібно вказати всі мови в порядку пріоритету.

Скільки часу займає розробка OCR-функції? Базова інтеграція статичного розпізнавання займає 2–3 дні. Live-режим з виведенням тексту поверх камери та структуруванням даних під конкретний тип документа — від 1 до 2 тижнів. Складні сценарії (наприклад, розпізнавання чеків з наступним парсингом) можуть зайняти до місяця.

Чи можна використовувати OCR для розпізнавання номерів автомобілів? Для номерних знаків краще використовувати спеціалізовані рішення, такі як OpenALPR або PlateRecognizer API. Стандартні OCR-фреймворки не оптимізовані під цей сценарій і показують низьку точність через особливості шрифтів та кутів зйомки.

Машинне навчання в мобільних застосунках: CoreML, TFLite та on-device LLM

Ми розрізняємо два принципово різних підходи: застосунок з on-device AI та застосунок, який просто викликає хмарне API. Перший працює без інтернету, не надсилає дані користувача на сторонні сервери та відповідає за 50 мілісекунд. Другий залежить від затримки мережі та тарифного плану. Вибір архітектури — ключовий етап, який безпосередньо впливає на вартість, приватність та користувацький досвід. Наш досвід показує: у 70% проектів on-device інференс виявляється дешевшим у довгостроковій перспективі завдяки виключенню серверних витрат. Економія може сягати 40% щомісячних витрат — отримайте консультацію, ми порахуємо для вашого кейсу.

Як вибрати між CoreML та TFLite для on-device інференсу?

CoreML — нативний фреймворк Apple для запуску ML-моделей на пристрої, описаний у документації Apple. Підтримує Neural Engine (A11 Bionic та новіші), GPU та CPU як fallback. Моделі конвертуються у формат .mlmodel через coremltools з PyTorch, ONNX або TensorFlow. Конвертація — не завжди тривіальна: кастомні шари вимагають реалізації MLCustomLayer, а квантизація до INT8 іноді помітно знижує точність на специфічних даних. Ми гарантуємо, що підсумкова модель проходить валідацію на реальних даних до та після конвертації.

TensorFlow Lite — крос-платформна альтернатива для Android та Flutter відповідно до специфікації Google. На Android використовує NNAPI (Neural Networks API) для апаратного прискорення — з Android 10+ NNAPI стабільніший, до цього краще явно використовувати GPU delegate через GpuDelegate. Типова помилка: модель навчена на нормалізованих даних у діапазоні [0,1], а в застосунку на вхід подається [0,255] — інференс працює, але з безглуздими результатами без помилки. Ми включаємо модуль автоматичної валідації вхідних даних у SDK.

Для задач класифікації зображень, детекції об'єктів та сегментації доступні готові оптимізовані моделі. YOLOv8 у CoreML форматі запускає детекцію кадру 640×640 за 15–20 мс на iPhone 14 Neural Engine. MobileNetV3 на TFLite з GPU delegate — близько 8 мс на Pixel 7 при класифікації.

Параметр CoreML TFLite
Платформи iOS, macOS, watchOS Android, iOS, Linux, embedded
Апаратне прискорення Neural Engine, GPU, CPU NNAPI, GPU (OpenCL/OpenGL), CPU
Підтримка квантизації FP16, INT8 (з coremltools) FP16, INT8, dynamic range
Кастомні операції Через MLCustomLayer (Swift) Через делегати (Java/Kotlin)
Розмір бандла моделі ~3–5 МБ (MobileNetV2 quantized) ~2–4 МБ

Що робити, якщо потрібна генерація тексту на пристрої?

Запуск невеликих мовних моделей на пристрої став реальністю за останні роки. Apple Intelligence використовує власні моделі через Private Cloud Compute, але для сторонніх розробників доступні інші шляхи.

llama.cpp з Metal backend на iOS — робочий підхід для phi-3-mini (3.8B параметрів, 4-bit квантизація, ~2.3 ГБ). Інференс: 15–25 токенів/секунду на iPhone 15 Pro. Для інтеграції в Swift використовуємо Swift Package llama.swift або обгортку через C-інтерфейс llama.h. Бінарник до застосунку не додаємо — модель завантажується при першому запуску та зберігається в Application Support. Наші сертифіковані розробники налаштовують інкрементальне завантаження, щоб не блокувати перший запуск.

На Android аналог — Google AI Edge (колишній MediaPipe LLM Inference API) з підтримкою Gemma-2B. Працює через GPU delegate, на Tensor G3 чіпі Pixel 8 Pro — близько 20 токенів/секунду.

Порівняння LLM моделей для on-device
Модель Параметри Квантизація Розмір Швидкість (iPhone 15 Pro)
Phi-3-mini (Microsoft) 3.8B 4-bit ~2.3 ГБ 15-25 токенів/с
Gemma-2B (Google) 2B 4-bit ~1.2 ГБ 30-40 токенів/с
TinyLlama 1.1B 4-bit ~0.7 ГБ 60+ токенів/с

Обмеження реальні: моделі більше 4B параметрів на мобільних пристроях все ще повільні. Для складних задач міркування on-device LLM поступається GPT-4o за якістю. Гібридний підхід — on-device для коротких завдань та приватних даних, хмара для складних запитів — часто оптимальний. Оцінимо ваш кейс та запропонуємо баланс продуктивності та приватності — напишіть нам.

Інтеграція OpenAI API та інших хмарних моделей

Для сценаріїв, де cloud inference допустимий, інтеграція OpenAI, Anthropic або Google Gemini — це HTTP клієнт + streaming SSE. У Swift зручно через AsyncThrowingStream для стрімінгових відповідей. У Kotlin — через Flow.

Критично важливо: API-ключі ніколи не зберігаються в бандлі застосунку. Навіть обфускований ключ витягується з IPA за 10 хвилин через strings або frida. Правильна архітектура: мобільний застосунок → власний backend → OpenAI API. Backend контролює rate limiting, логує запити, захищає ключ.

Що входить у роботу (результати)

  • Навчена та квантизована модель під цільовий пристрій (документація за метриками)
  • SDK для інтеграції (Swift/Kotlin/Flutter) з прикладами виклику
  • Тести продуктивності на 3–5 реальних пристроях
  • Інструкція з оновлення моделі OTA
  • Підтримка при проходженні модерації App Store / Google Play (перевірка відповідності Guidelines 4.2, 5.1)
  • 2 тижні технічної підтримки після релізу

Типовий пайплайн проекту

  1. Аналіз завдання — вимірюємо latency, privacy, size, підтримувані пристрої.
  2. Прототипування моделі — в Python, оцінка accuracy на цільових даних.
  3. Конвертація та квантизація — під CoreML/TFLite з валідацією.
  4. Інтеграція в застосунок — модель обгортається в сервісний шар (легко замінювати CoreML → TFLite → хмара).
  5. Тестування — на реальних пристроях, вимір FPS, RAM, батареї.
  6. Деплой — через TestFlight / Firebase App Distribution, моніторинг метрик.

Терміни: інтеграція готової CoreML/TFLite моделі — 1–2 тижні, розробка кастомної моделі з мобільною оптимізацією — від 6 тижнів, on-device LLM чат з персоналізацією — 4–8 тижнів.

Чому ми беремося за складні кейси?

10+ років досвіду в мобільній розробці, 50+ впроваджених AI/ML рішень, гарантія сумісності з актуальними версіями iOS та Android. Всі проекти проходять code review та навантажувальне тестування. У вартість вже входить підготовка документації для модерації та навчання вашої команди.

Зв'яжіться з нами — ми допоможемо вибрати архітектуру та впровадити ML у ваш застосунок під ключ. Замовте аудит наявного рішення — безкоштовно оцінимо потенціал економії серверних витрат. Отримайте консультацію експерта — напишіть нам сьогодні.