Разработка системы трекинга объектов на видео (Object Tracking)
Трекинг — задача следования за конкретным объектом через последовательность кадров с сохранением идентичности. Если детекция отвечает на вопрос «что и где на кадре», то трекинг добавляет «это тот же объект, что и в предыдущих кадрах». Применения: подсчёт людей пересекающих линию, анализ траекторий в магазине, управление в системах автономного вождения, спортивная аналитика.
Алгоритмы трекинга
SORT (Simple Online and Realtime Tracking) — базовый алгоритм: Калман-фильтр для предсказания положения + IoU matching для ассоциации. Быстрый, но теряет объект при перекрытиях.
DeepSORT — SORT + ReID (Re-Identification): deep appearance features для ассоциации по внешнему виду, не только по пространственному положению. Лучше справляется с перекрытиями.
ByteTrack — текущий state-of-the-art для общих задач. Использует все детекции (включая низкоуверенные) для ассоциации:
from ultralytics import YOLO
model = YOLO('yolov8l.pt')
# Трекинг встроен в Ultralytics
results = model.track(
source='video.mp4',
tracker='bytetrack.yaml',
persist=True, # сохранять трек-IDs между кадрами
conf=0.3,
iou=0.5
)
for result in results:
boxes = result.boxes
for box in boxes:
track_id = box.id.item() # уникальный ID объекта
x1, y1, x2, y2 = box.xyxy[0]
BoT-SORT — ByteTrack + camera motion compensation + ReID. Лучшие результаты на MOT17 benchmark: HOTA 77.8.
StrongSORT — ещё более агрессивная ReID интеграция, лучше для задач с длительными перекрытиями.
ReID модели
ReID-модель извлекает embedding внешнего вида объекта. При потере трека система ищет его по similarity в embeddings:
import torchreid
# Загрузка ReID модели
model = torchreid.models.build_model(
name='osnet_x1_0',
num_classes=751, # Market-1501
pretrained=True
)
def extract_appearance_features(crop: np.ndarray) -> np.ndarray:
tensor = preprocess_crop(crop)
with torch.no_grad():
features = model(tensor)
return features.cpu().numpy()
Метрика ReID: mAP и Rank-1 на Market-1501 / DukeMTMC. OSNet-x1.0: Rank-1 94.8%, mAP 84.9% на Market-1501.
Анализ траекторий
После трекинга строим аналитику по траекториям:
class TrajectoryAnalyzer:
def __init__(self):
self.tracks = {} # track_id -> list of (frame, x, y)
def update(self, track_id, frame_num, cx, cy):
if track_id not in self.tracks:
self.tracks[track_id] = []
self.tracks[track_id].append((frame_num, cx, cy))
def count_line_crossings(self, line: tuple, direction='both') -> int:
"""Подсчёт пересечений виртуальной линии"""
count = 0
for track in self.tracks.values():
if self._crosses_line(track, line, direction):
count += 1
return count
Метрики качества трекинга
- HOTA (Higher Order Tracking Accuracy) — основная метрика, балансирует Detection и Association accuracy
- MOTA (Multiple Object Tracking Accuracy) — учитывает FP, FN, ID switches
- IDF1 — ID F1 score: насколько хорошо сохраняются ID через время
- ID Switches — количество смен ID у одного объекта
| Алгоритм | HOTA MOT17 | MOTA | ID Switches |
|---|---|---|---|
| SORT | 55.1 | 63.3 | 4852 |
| DeepSORT | 61.2 | 71.4 | 1821 |
| ByteTrack | 77.3 | 80.3 | 2196 |
| BoT-SORT | 77.8 | 80.5 | 1871 |
| Масштаб системы | Срок |
|---|---|
| Трекинг 1 класса, 1–4 камеры | 2–3 недели |
| Мультикласс, анализ траекторий | 4–6 недель |
| Долгосрочный ReID трекинг (re-enter) | 6–10 недель |







