Разработка машинного обучения (ML Kit) в мобильном приложении
ML Kit от Google — это Firebase SDK, который работает на Android и iOS. Готовые API закрывают большинство типичных задач: OCR, детекция лиц, сканирование штрих-кодов, перевод. Но за кажущейся простотой скрываются нюансы, которые выясняются не в документации, а в продакшне.
Частые проблемы при работе с ML Kit
Готовые API (Text Recognition v2, Face Detection, Barcode Scanning) работают корректно, если соблюдать требования к входному изображению. Face Detection с FaceDetectorOptions.PerformanceMode.ACCURATE на Android возвращает результаты за 80–150 ms на Pixel 6, но на бюджетных устройствах с Snapdragon 680 — уже 400+ ms. Если использовать FAST-режим, точность падает при повороте головы больше 30°.
На iOS MLKitFaceDetection через VisionImage(image:) теряет ориентацию изображения, если не выставить image.orientation явно из UIImage.imageOrientation. Краш не происходит — просто лица не детектируются, когда телефон повёрнут горизонтально.
С кастомными TFLite-моделями через CustomImageLabeler важно правильно упаковать metadata. Без TFLiteMetadataHelper модель не знает нормализацию входа — нужно либо добавить metadata через flatbuffers, либо указывать нормализацию вручную через CustomRemoteModel options.
Что мы делаем
Выбор между On-Device и Cloud API — первый вопрос. On-Device работает офлайн, быстрее, без затрат на API-вызовы. Cloud — точнее для сложных случаев (многоязычный OCR, нестандартные шрифты). Для большинства B2C-приложений оптимальна гибридная схема: on-device как основной путь, cloud как fallback при низкой уверенности.
Кейс из практики: приложение для сканирования чеков. ML Kit Text Recognition v2 on-device давал 94% точность на стандартных кассовых чеках, но на термобумаге с выцветшим текстом — 67%. Добавили preprocessing через CIFilter (повышение контраста, binarization) перед передачей в VisionImage — точность выросла до 89% без перехода в Cloud API.
Для Android интеграция идёт через BarcodeScanning.getClient() или TextRecognition.getClient(TextRecognizerOptions.DEFAULT_OPTIONS). Модели скачиваются автоматически через Play Services при первом запуске — это нужно учитывать в UX: первый инференс может занять несколько секунд, пока модель не загружена. Используем ModuleInstallClient для явного preload при onboarding.
Для кастомных моделей — FirebaseModelDownloader с ModelDownloadType.LOCAL_MODEL_UPDATE_IN_BACKGROUND. Модель обновляется в фоне, приложение использует текущую версию до следующего запуска.
Поддерживаемые API ML Kit
| API | Режим | Платформы |
|---|---|---|
| Text Recognition v2 | On-Device | Android, iOS |
| Face Detection | On-Device | Android, iOS |
| Barcode Scanning | On-Device | Android, iOS |
| Image Labeling | On-Device + Cloud | Android, iOS |
| Object Detection & Tracking | On-Device | Android, iOS |
| Translation | On-Device | Android, iOS |
| Custom Model (TFLite) | On-Device | Android, iOS |
Процесс и сроки
Аудит требований → выбор API (готовый vs кастомный) → интеграция SDK → настройка preprocessing → тестирование на целевых устройствах → настройка мониторинга точности в продакшне.
Интеграция одного готового API (например, Barcode Scanning или Face Detection) — 2–4 рабочих дня. Кастомная TFLite-модель с preprocessing и fallback-логикой — 1–2 недели. Стоимость рассчитывается индивидуально.







