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







