Object Detection — це задача комп'ютерного зору, яка одночасно визначає клас об'єкта (кішка, машина, людина) та його положення на зображенні у вигляді прямокутної рамки (bounding box). На відміну від Image Labeling, Object Detection знаходить кілька об'єктів різних класів на одному кадрі та вказує їхні координати. У мобільній розробці Object Detection застосовується в системах відеоспостереження, AR-додатках, автономних дронах, медичній візуалізації та retail-аналітиці. За даними Google ML Kit, 2025, on-device Object Detection досягає 30 FPS на флагманських пристроях з точністю 87% mAP.
Головне
Object Detection вирішує дві задачі одночасно: що на зображенні (класифікація) та де (регресія координат). Модель ділить зображення на сітку, для кожної комірки передбачає bounding box (x, y, ширина, висота) та ймовірності класів. Non-Maximum Suppression (NMS) видаляє дублюючі рамки для одного об'єкта, залишаючи найбільш впевнене передбачення. Сучасні архітектури поділяються на two-stage (Faster R-CNN — спочатку region proposals, потім класифікація) та one-stage (YOLO, SSD — все одразу).
Метрики оцінки: mAP (mean Average Precision) — основна метрика якості Object Detection. mAP@0.5 — точність при IoU порозі 0.5, mAP@0.5:0.95 — середня по порогах від 0.5 до 0.95. FPS — кількість кадрів на секунду (швидкість інференсу). Для мобільних додатків баланс mAP/FPS критичний: YOLOv8-Nano дає 42% mAP@0.5:0.95 при 50+ FPS, SSD MobileNet — 22% mAP при 60+ FPS. Для real-time > 20 FPS, для інтерактивного використання 5–15 FPS.
IoU (Intersection over Union) — метрика перекриття передбаченого та ground truth bounding box. IoU = площа перетину / площа об'єднання. Поріг IoU для NMS зазвичай 0.5–0.7. Для трекінгу об'єктів між кадрами (re-identification) використовуйте Deep SORT або ByteTrack з IoU-матчингом. Для підрахунку об'єктів на відео — BoT-SORT забезпечує 85% MOTA (Multiple Object Tracking Accuracy).
| Архітектура | mAP@0.5:0.95 | Latency | Параметри | Розмір |
|---|---|---|---|---|
| YOLOv8-Nano | 42% | 10–30 ms | 2.6M | 5.9 MB |
| YOLOv8-Small | 50% | 25–60 ms | 11.2M | 22 MB |
| SSD MobileNetV2 | 22% | 15–40 ms | 5.2M | 21 MB |
| EfficientDet-Lite0 | 35% | 20–50 ms | 3.9M | 15 MB |
Anchor Boxes — попередньо визначені форми bounding box, які модель коригує. YOLOv8 використовує без'якірну детекцію (anchor-free), що спрощує навчання та прискорює інференс. SSD та старі YOLO вимагають підбору anchors під датасет. Для мобільної розробки anchor-free архітектури (YOLOv8, FCOS) є кращими — вони не залежать від розміру об'єктів і простіші в кастомізації.
ML Kit Object Detection and Tracking — бібліотека Google для виявлення та трекінгу об'єктів на пристрої. Підтримує дві модифікації: single-image detector (для фото) та streaming detector (для відео). Streaming mode автоматично трекіть об'єкти між кадрами за допомогою оптичного потоку, що знижує latency до 5–10 ms між кадрами після первинної детекції. Категорії: fashion, food, home, places — по 10–20 класів кожна.
API ML Kit: ObjectDetector (опції: detectorMode, enableClassification, enableMultipleObjects) → InputImage → DetectedObject (trackingId, boundingBox, classificationCategory, classificationConfidence). TrackingId дозволяє відстежувати один і той самий об'єкт між кадрами. MultipleObjects = true — детектує до 5 об'єктів на кадр. Classification — включає розпізнавання категорії об'єкта (за замовчуванням false для швидкості). Streaming mode рекомендовано для real-time: 20–30 FPS на Pixel 6.
val options = ObjectDetectorOptions.Builder()
.setDetectorMode(ObjectDetectorOptions.STREAM_MODE)
.enableClassification()
.enableMultipleObjects()
.build()
val detector = ObjectDetection.getClient(options)
detector.process(inputImage)
.addOnSuccessListener { objects ->
objects.forEach { obj ->
val box = obj.boundingBox
val trackingId = obj.trackingId
val category = obj.classificationCategory()
drawBoundingBox(box, trackingId, category)
}
}
Object Tracking: після детекції об'єкта на першому кадрі ML Kit відстежує його по відеопотоку без повторної детекції (на основі optical flow + feature tracking). Це знижує навантаження на CPU/GPU: перша детекція 30–60 ms, наступні трекінг-кадри 2–5 ms. Якщо об'єкт виходить із кадру або повертається > 30°, трекер скидається і потрібна повторна детекція. TrackingId зберігається, поки об'єкт знаходиться в кадрі. Для підрахунку унікальних об'єктів використовуйте trackingId як ідентифікатор.
YOLOv8-Nano — найменша версія YOLOv8 (Ultralytics) для edge-пристроїв. 2.6M параметрів, 5.9 MB (FP16), 42% mAP@0.5:0.95 на COCO. YOLOv8 використовує anchor-free детекцію + C2f backbone + TaskAlignedAssigner для матчингу передбачень. Для мобільної розробки доступний експорт в TFLite (INT8 — 2.0 MB, latency 8–20 ms) та Core ML (4.5 MB, latency 5–15 ms на iPhone 15 Pro). YOLOv8-Nano — найкращий вибір для on-device real-time Object Detection.
Експорт YOLOv8 в TFLite: Ultralytics надає CLI: yolo export model=yolov8n.pt format=tflite int8. На виході — TFLite INT8-модель, оптимізована під GPU Delegate через NNAPI. Для кастомного датасету (свої класи, не COCO) — навчання через Ultralytics HUB на 50–500 зображеннях на клас. RT-DETR (Real-Time Detection Transformer) — альтернатива на архітектурі Transformer, 48% mAP при 60 FPS на NVIDIA Jetson, але для мобільних пристроїв поки поступається YOLOv8-Nano за швидкістю.
# YOLOv8 export to TFLite
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
model.export(format="tflite", int8=True, imgsz=320)
# Inference with TFLite on Android
val interpreter = Interpreter(loadFile("yolov8n_int8.tflite"))
val output = Array(1) { Array(8400) { FloatArray(6) } }
interpreter.run(inputBuffer, output)
YOLO vs ML Kit на мобільних пристроях: ML Kit Object Detection простіше в інтеграції (10 рядків коду), не вимагає ML-експертизи, але обмежений стандартними класами (fashion, food, home, places). YOLOv8-Nano вимагає кастомного експорту, але дає повний контроль: будь-які класи, розмір входу, архітектура. Для швидкого прототипування — ML Kit. Для production з нестандартними об'єктами — YOLOv8-Nano. Для iOS: YOLOv8-Core ML через модель експорт з Ultralytics + VNCoreMLRequest.
SSD (Single Shot Multibox Detector) — класична one-stage архітектура для мобільних пристроїв. SSD MobileNetV2 — стандарт де-факто в 2020–2023: 22% mAP@0.5:0.95 на COCO, 15–40 ms на Pixel 6. SSD використовує feature pyramid (різні шари MobileNet для детекції об'єктів різного розміру) та default boxes (anchor boxes) для кожної комірки feature map. Плюс: максимальна швидкість для свого часу. Мінус: низька точність на дрібних об'єктах (10–30 px).
EfficientDet-Lite — сімейство від Google (2020+), оптимізоване для TFLite. EfficientDet-Lite0: 3.9M параметрів, 35% mAP, 20–50 ms. EfficientDet-Lite2: 8.1M, 42% mAP, 40–80 ms. EfficientDet використовує BiFPN (Bidirectional Feature Pyramid Network) для multi-scale feature fusion — це дає приріст 2–4% mAP без збільшення latency. Для мобільної розробки Google рекомендує EfficientDet-Lite як основний детектор для TFLite Task Vision.
MediaPipe Object Detector — готова реалізація на основі EfficientDet-Lite у складі MediaPipe Tasks Vision. Надає уніфікований API для Android, iOS, Python, Web. MediaPipe Object Detector підтримує класи COCO (80 класів), кастомні моделі, streaming mode та CPU/GPU делегати. Для швидкої інтеграції Object Detection у кроссплатформенний проект MediaPipe — оптимальний вибір: один код для всіх платформ.
// MediaPipe Object Detection
val options = ObjectDetectorOptions.Builder()
.setBaseOptions(BaseOptions.builder()
.setDelegate(BaseOptions.Delegate.GPU)
.build())
.setMaxResults(5)
.setScoreThreshold(0.5f)
.build()
val detector = ObjectDetector.createFromOptions(context, options)
val image = MPImage.fromBitmap(bitmap)
val result = detector.detect(image)
result.detections.forEach { detection ->
val box = detection.boundingBox
val category = detection.categories.first()
}
Вибір архітектури для мобільного додатку: для > 30 FPS на середніх пристроях — YOLOv8-Nano (INT8) або SSD MobileNetV2. Для точності > 40% mAP — YOLOv8-Small (11.2M) або EfficientDet-Lite2 (8.1M). Для кроссплатформенності — MediaPipe Object Detector. Для простоти — ML Kit. Для iOS-first — Core ML + YOLOv8 .mlpackage. Для Android-first — TFLite Task Vision (ObjectDetector API). Навчання: Roboflow (датасет) + Ultralytics YOLOv8 (training) + експорт в TFLite/Core ML.
TFLite Task Vision ObjectDetector — уніфікований API від Google для запуску моделей Object Detection на Android та iOS. Task API автоматично обробляє передобробку зображення (масштабування, нормалізація, color space conversion) та постобробку (NMS, thresholding). Розробнику потрібно передати модель .tflite та отримати список Detections з bounding box + category + score. Task API підтримує COCO-сумісні моделі (80 класів).
Конвертація кастомної моделі в Task API: TFLite модель повинна мати вхід [1, height, width, 3] (float32/uint8) та вихід: detection_boxes[1,N,4], detection_classes[1,N], detection_scores[1,N], num_detections[1]. Експорт з TensorFlow Object Detection API з post-processing ops включеними (SSD Postprocess). Для YOLOv8 — експорт TFLite з NMS через ops-compat. Task API на iOS використовує Core ML Delegate для прискорення на ANE.
// TFLite Task Vision Object Detector
val options = ObjectDetectorOptions.Builder()
.setScoreThreshold(0.5f)
.setMaxResults(10)
.setDelegate(Delegate.GPU)
.build()
val detector = ObjectDetector.createFromFileAndOptions(
context, "custom_model.tflite", options
)
val image = TensorImage.fromBitmap(bitmap)
val results = detector.detect(image)
results.forEach { detection ->
onObjectDetected(
detection.boundingBox,
detection.categories.first().label,
detection.categories.first().score
)
}
Продуктивність Task API: GPU Delegate на Android дає прискорення 3–5x порівняно з CPU (XNNPACK). NNAPI Delegate — ще 1.5–2x на пристроях з NPU (Pixel 8, Snapdragon 8 Gen 3, Dimensity 9300). Hexagon, DSP — до 10x на DSP-акселераторах. Для iOS Core ML Delegate — 4–6x проти CPU. Task API автоматично вибирає доступний апаратний прискорювач, але можна примусово вказати delegate через DetectorOptions.
Підрахунок людей та об'єктів — retail-аналітика: детекція відвідувачів у магазині, підрахунок черг, визначення заповненості полиць товаром. Object Detection лічильник людей у кадрі дозволяє оцінити прохідність та конверсію. ML Kit Object Detector дає до 30 FPS — достатньо для real-time підрахунку. Для перетину ліній (zone crossing) — комбінація Object Detection + ByteTrack трекінг. Точність підрахунку: 92–95% при хорошому освітленні.
Детекція дефектів на виробництві — Object Detection визначає брак на конвеєрі: подряпини, сколи, тріщини, неправильне складання. Кастомна модель YOLOv8-Nano (INT8) працює на Android-планшеті, підключеному до USB-камери. Latency: 20–40 ms на кадр (25–50 FPS). Для складних дефектів (мікротріщини) — збільшуйте роздільну здатність входу до 640x640 (latency 40–80 ms). Навчання: Roboflow — датасет з 200–1000 зображень дефектів + Ultralytics YOLOv8.
AR-розмітка об'єктів у реальному часі — ARCore (Android) та ARKit (iOS) використовують Object Detection для розпізнавання плоских поверхонь, вертикальних площин та 3D-об'єктів. ML Kit Object Detection + ARCore Scene Semantics дає сегментацію об'єктів: стіна, підлога, стеля, меблі. Для кастомної AR-розмітки (наприклад, розпізнавання конкретної моделі дивана та накладення AR-інформації) — YOLOv8-Nano + SceneKit/SceneForm. Real-time requirement: > 20 FPS.
// ARKit + Object Detection
let request = VNCoreMLRequest(model: objectDetector) { req, _ in
guard let results = req.results as? [VNDetectedObjectObservation] else { return }
for result in results where result.confidence > 0.6 {
let rect = result.boundingBox
let worldPos = arView.hitTest(rect.center)
arView.addAnchor(ARAnchor(name: label, transform: worldPos))
}
}
Медична візуалізація — Object Detection для аналізу рентгенівських знімків, МРТ, КТ. Детекція пухлин, переломів, патологій на мобільному пристрої лікаря. YOLOv8-Nano на Android-планшеті детектує вузли в легенях за 15–30 ms з чутливістю 89% та специфічністю 93% (дані NIH ChestX-ray14). Вимоги: INT8-квантування (приватність даних), high recall (пропуск патології небезпечніший за хибне спрацювання), використання порогу confidence < 0.4. On-device обробка гарантує приватність медичних даних.
Часті запитання
Object Detection повертає bounding box для кожного об'єкта — прямокутну рамку, що охоплює об'єкт. Image Segmentation (семантична або instance) повертає точний контур об'єкта — попіксельну маску. Segmentation точніша, але повільніша (50–300 ms vs 10–30 ms для detection). Для завдань, де важлива форма об'єкта (медицина, AR), використовуйте segmentation. Для завдань, де важливе положення та наявність (підрахунок, модерація), використовуйте detection. MobileViT — архітектура, що вирішує обидві задачі.
YOLOv8-Nano навчена на COCO (80 класів). ML Kit Object Detection — 40+ класів (fashion, food, home, places). Кастомна модель може визначати до 100 класів на мобільному пристрої без втрати продуктивності. Понад 100 класів — зростає latency та падає mAP. Для додатків з 1000+ класів використовуйте ієрархічну класифікацію: спочатку груба категорія (10 класів), потім точна (100 підкласів). EfficientNet + YOLO — ієрархічний підхід для 1000+ класів з latency < 50 ms.
Так, ML Kit Object Detection включає вбудований трекінг: після детекції на першому кадрі об'єкт відстежується по відеопотоку без повторної детекції. Для більш складного трекінгу (перетин об'єктів, вихід з кадру) використовуйте ByteTrack або BoT-SORT. ByteTrack працює на основі IoU (intersection over union) між bounding box сусідніх кадрів — 85% MOTA на MOT17. BoT-SORT додатково використовує re-identification (ReID) для відновлення втрачених об'єктів — 90% MOTA.
Експортуйте YOLOv8 в Core ML: yolo export model=yolov8n.pt format=coreml int8. Отриманий .mlpackage інтегрується через VNCoreMLRequest (Vision Framework). Альтернатива: YOLOv8 → TFLite → Core ML Delegate (iOS TFLite API). Ultralytics YOLOv8 Core ML експорт підтримує iOS 16+, ANE прискорення, FP16 та INT8 квантування. Для streaming використовуйте AVFoundation + Vision з повторюваними VNImageRequestHandler перфоманс-запитами. Real-time: 20–30 FPS на iPhone 14 Pro.
Збільште різноманітність датасету (ракурси, освітлення, фон) — 500+ зображень на клас. Використовуйте data augmentation: mosaic, mixup, random perspective (Ultralytics YOLOv8 augmentation — 2–5% приросту mAP). Збільште розмір входу до 640x640 (замість 320x320) — +4–8% mAP, але latency ×2. Використовуйте FP16 або INT8 квантування після навчання (post-training) — +0–1% mAP loss, 4x стиснення. Для iOS використовуйте ANE (Neural Engine) через Core ML Delegate — прискорення 3–5x проти CPU.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.