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, width, height) и вероятности классов. 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также