Розробка системи трекингу об'єктів на відео
Трекинг — завдання стеження за конкретним об'єктом через послідовність кадрів зі збереженням тотожності. Якщо детекція відповідає на запитання "що і де на кадрі", то трекинг додає "це той же об'єкт, що й у попередніх кадрах". Застосування: підрахунок людей, що перетинають лінію, аналіз траєкторій у магазині, керування в системах автономного водіння, спортивна аналітика.
Алгоритми трекингу
SORT (Simple Online and Realtime Tracking) — базовий алгоритм: Kalman-фільтр для передбачення положення + 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, # зберігати track-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 + компенсація руху камери + 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 тижнів |







