DeepSORT : Guide Complet — Suivi Multi-Objets avec Deep Learning

DeepSORT : Guide Complet — Suivi Multi-Objets avec Deep Learning

DeepSORT : Guide complet — Suivi Multi-Objets avec Deep Learning

Résumé — DeepSORT (Simple Online and Realtime Tracking with Deep Associations) est l’un des algorithmes de suivi multi-objets les plus utilisés en vision par ordinateur. Il combine les prédictions de mouvement du filtre de Kalman avec des descripteurs d’apparence issus d’un réseau de neurones pour associer les détections image par image. Conçu pour le temps réel, il gère les occlusions temporaires, les croisements et les apparitions/disparitions d’objets avec une efficacité remarquable.


Principe mathématique

1. Filtre de Kalman — Prédiction du mouvement

Le filtre de Kalman modélise l’état d’un track comme un vecteur de 8 dimensions :

$$
x = (u, v, s, r, \dot{u}, \dot{v}, \dot{s}, 0)
$$

Où $(u, v)$ est le centre de la boîte englobante, $s$ la surface, $r$ le ratio d’aspect (largeur/hauteur), et $(\dot{u}, \dot{v}, \dot{s})$ les vitesses linéaires correspondantes.

Étape de prédiction (Predict) :
– Prédiction de l’état : x_pred = F · x_prev où F est la matrice de transition (modèle à vitesse constante)
– Prédiction de la covariance : P_pred = F · P_prev · F^T + Q avec Q le bruit de processus

Étape de mise à jour (Update) :
– Gain de Kalman : K = P_pred · H^T · (H · P_pred · H^T + R)^-1
– Correction de l’état : x_k = x_pred + K · (z_k – H · x_pred)
– Correction de la covariance : P_k = (I – K · H) · P_pred

Le filtre Kalman maintient une estimation probabiliste de la position future de chaque objet suivi, avec une incertitude qui croît pendant les occlusions et se réduit à chaque mise à jour réussie.

2. Distance de Mahalanobis

Pour mesurer la compatibilité entre une prédiction de track et une détection, on utilise la distance de Mahalanobis qui tient compte de l’incertitude directionnelle :

$$
d^{(1)}(i, j) = (d_j – y_i)^T \cdot S_i^{-1} \cdot (d_j – y_i)
$$

Où d_j est la détection j, y_i est la position prédite du track i, et S_i est la covariance de l’innovation. Un seuil de 9.481 (percentile 95% du chi-squared avec 4 degrés de liberté) élimine les associations statistiquement improbables.

3. Appearance Descriptor (CNN features)

Un réseau de neurones profond (Wide Residual Network avec ~1.2M de paramètres) est entraîné sur un grand dataset de réidentification de personnes (Market-1501) pour extraire un vecteur de 128 dimensions représentant l’apparence visuelle de chaque détection. Le coût d’apparence est la similarité cosinus minimale entre la détection courante et les 100 derniers descripteurs du track :

$$
d^{(2)}(i, j) = \min { r_k^T \cdot \tilde{d}_j \mid r_k \in R_i }
$$

4. Distance combinée

$$
c_{i,j} = \lambda \cdot d^{(1)}(i,j) + (1 – \lambda) \cdot d^{(2)}(i,j)
$$

Quand la distance de Mahalanobis dépasse le seuil, l’association est rejetée quel que soit le score d’apparence. Sinon, le mouvement et l’apparence sont combinés. Dans la pratique, on utilise le matching cascade qui priorise les tracks récemment observés.

5. Hungarian Algorithm (assignation optimale)

L’algorithme hongrois (Kuhn-Munkres) résout le problème d’assignation optimale : minimiser le coût total en associant chaque track à au plus une détection. C’est un problème classique d’optimisation combinatoire résolu en temps polynomial $O(n^3)$.

6. Cycle de vie d’un track

  • Tentatif : nouvelle détection non encore confirmée (n_init frames)
  • Confirmé : track actif maintenu par associations successives
  • Supprimé : track non associé pendant max_age frames

Intuition

Imaginez un arbitre de football qui doit suivre chaque joueur sur le terrain pendant tout le match.

  • Détection (YOLO) : à chaque image, l’arbitre voit 22 positions de joueurs
  • Filtre de Kalman : l’arbitre anticipe où chaque joueur sera à la prochaine image selon sa vitesse et direction
  • Apparence (CNN) : l’arbitre reconnaît chaque joueur par son maillot, sa morphologie, sa coupe de cheveux
  • Matching : l’arbitre associe chaque joueur détecté au joueur suivi qui correspond le mieux en position ET en apparence

Quand deux joueurs se croisent : le Kalman seul pourrait les confondre (positions similaires au croisement), l’apparence seule pourrait les confondre (maillots similaires). Mais la combinaison des deux signaux permet de les distinguer avec précision.

Quand un joueur sort du champ temporairement (occlusion) : le Kalman continue de prédire sa trajectoire. Quand il réapparaît, l’apparence permet de le réidentifier instantanément, même plusieurs secondes après.


Implémentation Python

1. Détection + Tracking avec YOLO et DeepSORT

import cv2
import numpy as np
from ultralytics import YOLO
from deep_sort_realtime.deepsort_tracker import DeepSort

# Charger le détecteur et le tracker DeepSORT
detector = YOLO("yolov8n.pt")
tracker = DeepSort(
    max_age=30,
    n_init=3,
    max_cosine_distance=0.2,
    nn_budget=100,
)

cap = cv2.VideoCapture("traffic.mp4")
colors = {}
frame_count = 0
allowed_classes = {0, 2, 3, 5, 7}  # personne, voiture, moto, bus, camion

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    results = detector(frame, conf=0.4)
    detections = []

    for result in results:
        for box in result.boxes:
            cls_id = int(box.cls[0])
            if cls_id not in allowed_classes:
                continue

            x1, y1, x2, y2 = box.xyxy[0].tolist()
            conf = float(box.conf[0])
            label = detector.model.names[cls_id]
            detections.append(([x1, y1, x2 - x1, y2 - y1], conf, label))

    tracks = tracker.update_tracks(detections, frame=frame)

    for track in tracks:
        if not track.is_confirmed():
            continue

        track_id = track.track_id
        left, top, right, bottom = map(int, track.to_ltrb())
        color = colors.setdefault(
            track_id, tuple(np.random.randint(0, 255, 3).tolist())
        )

        cv2.rectangle(frame, (left, top), (right, bottom), color, 2)
        cv2.putText(
            frame,
            f"ID {track_id}",
            (left, top - 10),
            cv2.FONT_HERSHEY_SIMPLEX,
            0.5,
            color,
            2,
        )

    cv2.imshow("DeepSORT Tracking", frame)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

    frame_count += 1

cap.release()
cv2.destroyAllWindows()

2. Extrait de trajectoires et comptage

from collections import defaultdict
import numpy as np

trajectories = defaultdict(list)

# ... à placer juste après `tracks = tracker.update_tracks(...)`
for track in tracks:
    if not track.is_confirmed():
        continue

    left, top, right, bottom = track.to_ltrb()
    cx = (left + right) / 2.0
    cy = (top + bottom) / 2.0
    trajectories[track.track_id].append((frame_count, cx, cy))

# Exemple d'analyse après traitement de la vidéo
for track_id, points in trajectories.items():
    if len(points) < 10:
        continue

    crossings = 0
    for i in range(1, len(points)):
        if points[i - 1][2] < 300 <= points[i][2]:
            crossings += 1

    segment_distances = [
        np.hypot(points[i][1] - points[i - 1][1], points[i][2] - points[i - 1][2])
        for i in range(1, len(points))
    ]
    avg_speed = np.mean(segment_distances) if segment_distances else 0.0

    print(
        f"Track {track_id}: {len(points)} frames, "
        f"{crossings} croisements, vitesse moyenne {avg_speed:.1f} px/frame"
    )

Hyperparamètres

Hyperparamètre Valeur typique Description
max_age 30-100 Frames avant suppression d’un track perdu (plus = tolère occlusions longues)
n_init 3-5 Frames confirmées avant qu’un track soit considéré comme fiable
iou_threshold 0.2-0.5 Seuil IoU minimum pour le matching géométrique
max_dist 0.2 Seuil maximal de distance cosinus pour l’apparence
nn_budget 100 Taille maximale de la galerie d’apparence par track

Avantages de DeepSORT

  1. Temps réel : Avec YOLOv8-nano comme détecteur, DeepSORT atteint 30+ FPS sur un GPU modeste
  2. Robustesse aux occlusions : Le filtre de Kalman prédit pendant les occlusions, l’apparence permet la réidentification
  3. Simple à intégrer : Quelques lignes pour ajouter le tracking à n’importe quel détecteur
  4. Stabilité des ID : Contrairement au tracking basé uniquement sur IoU, DeepSORT maintient les ID à travers les croisements

Limites de DeepSORT

  1. Dépendance au détecteur : Si le détecteur rate un objet pendant plusieurs frames, le Kalman finit par le perdre
  2. Sensible aux changements d’apparence brutaux : Un véhicule qui change d’angle de vue peut perdre l’association
  3. Pas de tracking 3D : Fonctionne uniquement en 2D dans l’espace image
  4. Mémoire : La galerie d’apparence (100 descripteurs × 128 dimensions par track) consomme beaucoup avec des centaines de tracks simultanés

4 cas d’usage concrets

1. Comptage de véhicules sur autoroute

Des caméras de surveillance équipées de YOLO + DeepSORT comptent les véhicules dans chaque voie, mesurent leur vitesse moyenne et détectent les embouteillages en temps réel. Le tracking permet d’éviter les double-comptages quand un véhicule passe par le champ de plusieurs caméras.

2. Analyse de comportements sportifs

Dans un match de basket, DeepSORT suit chaque joueur et le ballon. Les trajectoires extraites permettent d’analyser les schémas tactiques, mesurer les distances parcourues par chaque joueur, et identifier les zones du terrain les plus fréquentées.

3. Surveillance de sécurité dans les aéroports

Un système de vidéoprotection suit les bagages et les personnes pour détecter les bagages abandonnés (objet détecté sans track associé pendant plus de X minutes) et les mouvements suspects dans les zones restreintes.

4. Analyse de foule et gestion de flux

Dans les gares, le comptage de piétons par direction permet d’estimer les temps d’attente, détecter les mouvements de panique (vitesse anormale), et optimiser la signalétique en temps réel pour répartir les flux de voyageurs.


Conclusion

DeepSORT est la référence en tracking multi-objets pour sa simplicité et sa performance en temps réel. En combinant prédiction de mouvement (Kalman), apparence visuelle (CNN) et assignation optimale (Hungarian algorithm), il offre une solution robuste et élégante au problème du suivi d’objets dans les vidéos. Bien que des approches plus récentes comme ByteTrack (sans apprentissage d’apparence) et les trackers basés sur les Transformers émergent, DeepSORT reste un excellent choix pour la plupart des applications pratiques en 2026.


Voir aussi


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.