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. За реален 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 | Латентност | Параметри | Размер |
|---|---|---|---|---|
| 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 изискват избор на котви за набора от данни. За мобилно разработване anchor-free архитектурите (YOLOv8, FCOS) са предпочитани — не зависят от размера на обектите и са по-прости за персонализиране.
ML Kit Object Detection and Tracking — библиотека на Google за откриване и проследяване на обекти на устройството. Поддържа две модификации: single-image detector (за снимки) и streaming detector (за видео). Режимът streaming автоматично проследява обекти между кадри с помощта на оптичен поток, намалявайки латентността между кадри до 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 се препоръчва за реален 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, латентност 8–20 ms) и Core ML (4.5 MB, латентност 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 в TFLite
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
model.export(format="tflite", int8=True, imgsz=320)
# Инференс с TFLite на Android
val interpreter = Interpreter(loadFile("yolov8n_int8.tflite"))
val output = Array(1) { Array(8400) { FloatArray(6) } }
interpreter.run(inputBuffer, output)
YOLO срещу ML Kit на мобилни устройства: ML Kit Object Detection е по-прост за интеграция (10 реда код), не изисква ML експертиза, но е ограничен до стандартни класове (fashion, food, home, places). YOLOv8-Nano изисква персонализиран експорт, но дава пълен контрол: всякакви класове, размер на входа, архитектура. За бързо прототипиране — ML Kit. За продукция с нестандартни обекти — 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) за всяка клетка на картата на характеристиките. Плюс: максимална скорост за времето си. Минус: ниска точност на малки обекти (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 без увеличаване на латентността. За мобилно разработване 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 режим и 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 (тренировка) + експорт в TFLite/Core ML.
TFLite Task Vision ObjectDetector — унифициран API от Google за стартиране на Object Detection модели на Android и iOS. Task API автоматично обработва предварителната обработка на изображението (мащабиране, нормализация, конвертиране на цветово пространство) и последващата обработка (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 операции (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 автоматично избира наличния хардуерен акселератор, но делегатът може да бъде принудително зададен чрез DetectorOptions.
Броене на хора и обекти — retail аналитика: откриване на посетители в магазина, броене на опашки, определяне на запълнеността на рафтовете със стоки. Броячът на Object Detection в кадъра позволява оценка на трафика и конверсията. ML Kit Object Detector дава до 30 FPS — достатъчно за броене в реално време. За пресичане на линии (zone crossing) — комбинация от Object Detection + ByteTrack проследяване. Точност на броене: 92–95% при добра осветеност.
Откриване на дефекти в производството — Object Detection определя дефекти на конвейера: драскотини, отчупвания, пукнатини, неправилен монтаж. Персонализираният модел YOLOv8-Nano (INT8) работи на Android таблет, свързан с USB камера. Латентност: 20–40 ms на кадър (25–50 FPS). За сложни дефекти (микропукнатини) — увеличете разделителната способност на входа до 640x640 (латентност 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. Изискване за реален time: > 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 (пропускането на патология е по-опасно от фалшива аларма), използване на праг на доверие < 0.4. Обработката на устройството гарантира поверителността на медицинските данни.
Често задавани въпроси
Object Detection връща bounding box за всеки обект — правоъгълна рамка, обхващаща обекта. Image Segmentation (семантична или instance) връща точния контур на обекта — пикселна маска. Сегментацията е по-точна, но по-бавна (50–300 ms срещу 10–30 ms за откриване). За задачи, където формата на обекта е важна (медицина, AR), използвайте сегментация. За задачи, където положението и наличието са важни (броене, модериране), използвайте откриване. MobileViT — архитектура, решаваща и двете задачи.
YOLOv8-Nano е обучен на COCO (80 класа). ML Kit Object Detection — 40+ класа (fashion, food, home, places). Персонализиран модел може да открива до 100 класа на мобилно устройство без загуба на производителност. Над 100 класа — латентността се увеличава и mAP намалява. За приложения с 1000+ класа използвайте йерархична класификация: първо груба категория (10 класа), после точна (100 подкласа). EfficientNet + YOLO — йерархичен подход за 1000+ класа с латентност < 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 заявки. Реален 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, но латентност ×2. Използвайте FP16 или INT8 квантуване след обучение (post-training) — +0–1% загуба на mAP, 4x компресия. За iOS използвайте ANE (Neural Engine) чрез Core ML Delegate — ускорение 3–5x спрямо CPU.
Резюме
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също