Уявіть: ваш мобільний додаток веде підрахунок відвідувачів у магазині, але кожного разу, коли людина виходить за край кадру і повертається, система вважає її новою. Це класична помилка наївної детекції без трекінгу — втрата ідентичності об'єкта. Візьмемо реальний кейс: автоматизація підрахунку відвідувачів у торговому центрі за допомогою камер на вході. Без трекінгу система помилково рахувала одну й ту саму людину кілька разів, якщо вона ненадовго виходила з поля зору. Після впровадження 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 тижнів |
Зв'яжіться з нами для отримання консультації та точної оцінки термінів. Ми гарантуємо результат і надаємо підтримку після здачі проекту.







