Реалізація детекції об'єктів у мобільних додатках
Детекція об'єктів на мобілі — це не просто «знайти та обвести». Це також frame-to-frame трекінг, коректна проекція bounding box на preview шар, обробка перекриваючих детекцій та управління продуктивністю при 30 FPS відеопотоці. Остання часто стає вузьким місцем.
Вибір моделі: YOLO vs SSD vs NanoDet
На мобілі працюють три основні сімейства:
- MobileNet SSD — класика, відмінна підтримка TFLite Task Library та ML Kit. На Pixel 7: 18–25 ms на 320×320. COCO mAP: ~23–27.
- YOLOv8n/YOLOv5n — найкращий баланс точність/швидкість у 2024. Після конвертації в TFLite або Core ML: 22–40 ms залежно від розміру входу. COCO mAP: 37+.
- NanoDet — для дійсно слабких пристроїв, <10 ms на Snapdragon 665.
Для real-time відео на сучасних Android флагманах використовуйте YOLOv8n з GPU делегатом. Для офлайн фото на широкому спектрі пристроїв використовуйте MobileNet SSD v2.
Bounding Box: проекція на камеру
Найпоширеніша візуальна помилка: bounding box не збігається з об'єктом на preview. Причина: модель отримує ресайзене введення (наприклад, 320×320), а camera preview — 1920×1080 з AspectFill або AspectFit. Перерахуйте координати з врахуванням масштабу та відступів.
На iOS з AVCaptureVideoPreviewLayer:
let converted = previewLayer.layerRectConverted(fromMetadataOutputRect: normalizedRect)
VNDetectedObjectObservation повертає boundingBox в нормалізованих координатах (0..1, y знизу). Перед проекцією на UIKit-координати інвертуйте Y-ось: CGRect(x: box.minX, y: 1 - box.maxY, width: box.width, height: box.height).
На Android з CameraX + ImageAnalysis: результати детекції в координатах вхідного зображення, preview в координатах PreviewView. Використовуйте MappingUtils із ML Kit або обраховуйте трансформацію вручну через матрицю.
Трекінг між кадрами
Детектування на кожному кадрі дороговартісне. Правильний підхід: детекція раз на N кадрів (зазвичай кожні 5–10), між кадрами — трекінг через SORT або ByteTrack, або вбудований iOS VNDetectRectanglesRequest з ObjectTrackerObservation.
ML Kit Object Detection & Tracking підтримує трекінг з коробки через .enableMultipleObjects() та .enableClassification(). Кожен об'єкт, що трекується, отримує стабільний trackingID—дозволяючи відображення інформації про об'єкт без мерцання при втраті/появленні в кадрі.
NMS (Non-Maximum Suppression) — важливий параметр. За замовчуванням iouThreshold = 0.5. Якщо об'єкти перекриваються в кадрі (наприклад, упаковані товари на конвеєрі), знизьте до 0.3–0.35. Інакше детектор «склеює» сусідні об'єкти в один.
Реальний кейс
Програма для підрахунку людей в черзі через статичну камеру (планшет на стійці). YOLOv8n, TFLite, GPU делегат на Android 11+. Проблема: щільні черги (>8 людей) детектор пропускав людей у центрі—перекриття >60%. Рішення: знизили nmsThreshold до 0.3, додали minDetectionConfidence = 0.4 (vs 0.5). Хибні пропуски впали з 31% на 9%. Додатково: переучили модель на кадрах з перекриттям через Roboflow датасет.
Часові рамки
Інтеграція детекторної моделі з проекцією preview та NMS тюнінгом: 1–2 тижні. Fine-tune на кастомних класах + інтеграція: 2–3 тижні. Вартість розраховується індивідуально.







