Представьте: ваше мобильное приложение ведёт подсчёт посетителей в магазине, но каждый раз, когда человек выходит за край кадра и возвращается, система считает его новым. Это классическая ошибка наивной детекции без трекинга — потеря идентичности объекта. Возьмём реальный кейс: автоматизация подсчёта посетителей в торговом центре с помощью камер на входе. Без трекинга система ошибочно считала одного и того же человека несколько раз, если он ненадолго выходил из поля зрения. После внедрения 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 недель |
Свяжитесь с нами для получения консультации и точной оценки сроков. Мы гарантируем результат и предоставляем поддержку после сдачи проекта.







