Уявіть: ваш мобільний додаток веде підрахунок відвідувачів у магазині, але кожного разу, коли людина виходить за край кадру і повертається, система вважає її новою. Це класична помилка наївної детекції без трекінгу — втрата ідентичності об'єкта. Візьмемо реальний кейс: автоматизація підрахунку відвідувачів у торговому центрі за допомогою камер на вході. Без трекінгу система помилково рахувала одну й ту саму людину кілька разів, якщо вона ненадовго виходила з поля зору. Після впровадження ByteTrack з Kalman фільтром кількість хибних спрацьовувань знизилася на 90%. Ми вирішуємо це завдання, впроваджуючи AI-трекінг, який пов'язує об'єкти між кадрами та зберігає їхні унікальні ID. Крім зміни ID, виникають проблеми з оклюзіями, коли об'єкт тимчасово прихований, або зі швидким рухом, коли об'єкт зміщується за край кадру. Вже на старті важливо розуміти: трекінг — це не просто детекція на кожному кадрі, а асоціація об'єктів у часі. Згідно з ByteTrack, використання низьковпевнених детекцій знижує втрати ID на 30-40%.
Чому трекінг складніший за детекцію?
Детектор визначає клас і позицію об'єкта на кожному кадрі незалежно. Трекер відповідає на питання: «Це той самий об'єкт, що був на минулому кадрі?». Основні складності:
- Оклюзії: об'єкт тимчасово прихований іншим об'єктом або перешкодою.
- Перетини: два об'єкти міняються місцями — трекер може переплутати ID.
- Швидкий рух: об'єкт зміщується за кадр на відстань більшу, ніж розмір bounding box.
Ми використовуємо два підходи: SOT (один об'єкт) і MOT (множина об'єктів). Вибір залежить від сценарію.
Що таке SOT і MOT?
SOT (Single Object Tracking)
Користувач тапає на об'єкт — додаток слідкує за ним. Застосування: спортивні трансляції, стеження за конкретною людиною в кадрі, AR-ігри. Алгоритми: SiamFC, OSTrack, STARK. На iOS — Vision VNTrackObjectRequest.
MOT (Multi-Object Tracking)
Одночасний трекінг усіх об'єктів потрібного класу. Застосування: підрахунок відвідувачів, контроль трафіку, виробничі конвеєри. Алгоритми: SORT, ByteTrack, StrongSORT, OC-SORT.
Чому ByteTrack надійніший за SORT?
SORT використовує лише детекції з confidence > порогу. ByteTrack — всі детекції, навіть низьковпевнені. Це різко знижує втрати треку:
// Android: ByteTrack асоціація
class ByteTracker(
private val trackThresh: Float = 0.5f,
private val highThresh: Float = 0.6f,
private val matchThresh: Float = 0.8f
) {
private val trackedStracks = mutableListOf<STrack>()
private val lostStracks = mutableListOf<STrack>()
fun update(detections: List<Detection>): List<STrack> {
val highDetections = detections.filter { it.confidence >= highThresh }
val lowDetections = detections.filter { it.confidence in trackThresh..<highThresh }
val (matches1, unmatched_tracks1, unmatched_dets1) =
linearAssignment(trackedStracks, highDetections, matchThresh)
val (matches2, _, _) =
linearAssignment(unmatched_tracks1, lowDetections, 0.5f)
val newTracks = unmatched_dets1.map { STrack(it) }
return (matches1 + matches2).map { it.track } + newTracks
}
}
ByteTrack знижує втрати ID на 30-40% порівняно з SORT при частих окклюзіях. При цьому обчислювальна складність залишається низькою — трекер працює на CPU без помітного нагріву.
Як працює зв'язка детектора і трекера на iOS?
Стандартний pipeline для мобільних:
// iOS: YOLOv8 детекція + SORT трекінг
class MultiObjectTracker {
private let detector: YOLOv8Detector
private let tracker: SORTTracker
// SORT параметри — важливо підібрати під задачу
init(targetClass: String,
maxAge: Int = 10, // кадрів без детекції до видалення треку
minHits: Int = 3, // кадрів детекції для підтвердження треку
iouThreshold: Float = 0.3) {
self.detector = YOLOv8Detector(targetClass: targetClass)
self.tracker = SORTTracker(maxAge: maxAge,
minHits: minHits,
iouThreshold: iouThreshold)
}
func processFrame(_ pixelBuffer: CVPixelBuffer) async -> [TrackedObject] {
let detections = await detector.detect(pixelBuffer)
let tracks = tracker.update(detections: detections.map { det in
Detection(bbox: det.boundingBox, confidence: det.confidence)
})
return tracks.map { track in
TrackedObject(
id: track.trackId,
boundingBox: track.bbox,
isConfirmed: track.hitStreak >= tracker.minHits,
velocity: track.kalmanFilter.velocity
)
}
}
}
maxAge = 10 — трек живе 10 кадрів без детекції (об'єкт за перешкодою). При 30 FPS це 333 мс — достатньо для коротких окклюзій.
Як впровадити ByteTrack за 5 кроків?
- Вибір моделі детекції: YOLOv8-nano (INT8) для мобільних — 2x швидше, mAP падає на 1-2%.
- Налаштування трекера: підберіть trackThresh=0.5, highThresh=0.6, matchThresh=0.8.
- Інтеграція pipeline: детекція на кожному кадрі, трекінг після фільтрації низьковпевнених.
- Рендер треків: через Metal/OpenGL — до 60 FPS на середньому пристрої.
- Оптимізація: знизьте FPS до 15-20, якщо точність не критична — економія 40% енергії.
Типові помилки та як їх уникнути
| Проблема | Причина | Рішення |
|---|---|---|
| Втрата ID при окклюзії | SORT відкидає низьковпевнені детекції | Використовуйте ByteTrack |
| Тремтіння bounding box | Високий поріг детекції, шум моделі | Застосуйте Kalman фільтр або згладжування |
| Низька продуктивність | Важка модель детекції | Виберіть YOLOv8-nano, використовуйте INT8 квантування |
Повний код Pipeline для iOS з ByteTrack
// iOS: ByteTrack pipeline (спрощено)
class ByteTrackPipeline {
private let detector: YOLOv8Detector = .init()
private var tracker: ByteTracker = .init()
func process(pixelBuffer: CVPixelBuffer) async -> [Track] {
let detections = await detector.detect(pixelBuffer)
let tracks = tracker.update(detections: detections)
return tracks
}
}
Як зменшити навантаження на процесор при AI-трекінгу?
Використовуйте квантовані моделі (INT8) для детекції — приріст швидкості до 2x без помітного падіння mAP. Трекери SORT і ByteTrack самі по собі легкі, їх можна запускати на CPU. Рендер bounding box через Metal (iOS) або OpenGL (Android) знімає навантаження з основного потоку. На iOS підключайте Core ML з Neural Engine, на Android — NNAPI. Якщо точність не критична, знижуйте FPS відеопотоку до 15-20: це економить до 40% енергії.
Що входить у нашу роботу з трекінгу
- Аналіз задачі: вибір підходу (SOT/MOT), цільових класів, сценаріїв окклюзій.
- Прототипування: навчання або fine-tune моделі детекції, підбір трекера.
- Розробка модуля: інтеграція детектора та трекера, рендер треків, обробка орієнтації камери.
- Оптимізація: зниження енергоспоживання, робота при 30 FPS на пристроях середнього сегменту.
- Тестування: 50+ сценаріїв (зміна освітлення, швидкі рухи, перетини).
- Супровід: документація, вихідний код, навчання команди.
Ми маємо 5+ років досвіду в мобільній розробці та реалізували трекінг для ритейлу, логістики та спорту. Замовте консультацію інженера — оцінимо ваш проект і запропонуємо рішення.
Орієнтири за термінами
| Задача | Терміни |
|---|---|
| SOT (Vision VNTrackObjectRequest) з тапом | 2–3 дні |
| MOT (YOLOv8 + ByteTrack) на одній платформі | 5–7 днів |
| MOT на iOS та Android з кількома класами | 1–2 тижні |
| Повний цикл з навчанням моделі | від 2 тижнів |
Зв'яжіться з нами для отримання консультації та точної оцінки термінів. Ми гарантуємо результат і надаємо підтримку після здачі проекту.







