Kalman Filter (KF)
Un filtre de Kalman estime un état évolutif, comme la position et la vitesse d’un objet, en combinant les prédictions d’un modèle avec des mesures bruitées. Découvre les mathématiques et le code.
Un filtre de Kalman (KF) est un algorithme récursif qui estime l’état caché d’un système en évolution, par exemple la position et la vitesse d’un objet, à partir d’un flux de mesures bruitées. À chaque pas de temps, il prédit l’état suivant à partir d’un modèle du mouvement du système, puis corrige cette prédiction à l’aide de la nouvelle mesure, en pondérant chacune selon son degré d’incertitude. Rudolf E. Kálmán a publié cette méthode en 1960 ; pour les systèmes linéaires avec un bruit gaussien, elle fournit l’estimation de l’erreur quadratique moyenne minimale. Elle est utilisée dans les récepteurs GPS, la navigation aérienne et spatiale, la localisation robotique et presque tous les suiveurs multi-objets en vision par ordinateur, où elle lisse les détections instables et prédit où chaque objet apparaîtra ensuite.
Fonctionnement du filtre de Kalman#
Le filtre conserve deux quantités : une estimation d’état x, par exemple la position et la vitesse, et une matrice de covariance P qui décrit l’incertitude associée à cette estimation. Chaque cycle comporte deux étapes :
- Prédiction : Un modèle de mouvement
Fprojette l’état vers l’avant,x = F x, et l’incertitude augmente en raison du bruit de processusQ, qui représente les mouvements que le modèle ne prend pas en compte :P = F P Fᵀ + Q. - Mise à jour : Une nouvelle mesure
zarrive ; elle est liée à l’état par le modèle de mesureH. Le filtre calcule le résiduz − H xet le gain de KalmanK = P Hᵀ (H P Hᵀ + R)⁻¹, oùRcorrespond au bruit de mesure. L’état corrigé estx + K (z − H x)et l’incertitude diminue jusqu’à(I − K H) P.
Le gain de Kalman définit l’équilibre entre le modèle et le capteur. Lorsque les mesures sont précises par rapport à la prédiction, le gain approche de 1 et l’estimation suit la mesure ; lorsqu’elles sont bruitées, le gain approche de 0 et l’estimation suit la prédiction. Comme l’état peut inclure des quantités qui ne sont jamais mesurées directement, le filtre les estime aussi : un suiveur qui n’observe que les positions estime tout de même la vitesse. Lorsqu’une mesure manque, le filtre ignore la mise à jour et poursuit son estimation à partir de la prédiction :
Filtres de Kalman pour le suivi d’objets#
En suivi d’objets, chaque trajectoire possède son propre filtre de Kalman. L’état contient le centre et la taille de la boîte englobante, ainsi que leurs vitesses ; un modèle à vitesse constante prédit où se trouvera la boîte dans l’image suivante. Ces prédictions sont associées aux nouvelles détections par l’intersection sur union (IoU), et chaque détection associée devient la mesure qui met à jour sa trajectoire. Lorsqu’un objet est masqué pendant quelques images, la trajectoire continue de suivre le chemin prédit. La détection qui réapparaît se trouve alors assez près de sa prédiction pour conserver l’ancien identifiant.
Tous les suiveurs du mode suivi d’Ultralytics YOLO fonctionnent ainsi : le KalmanFilterXYAH de ByteTrack suit un état à 8 dimensions comprenant le centre de la boîte, le rapport hauteur-largeur, la hauteur et leurs vitesses ; BoT-SORT et TrackTrack utilisent une variante fondée sur la largeur et la hauteur, et tous deux ajustent leur bruit à la taille de la boîte afin que les grands objets proches tolèrent des sauts de pixels plus importants. Les mêmes étapes de prédiction et de mise à jour se résument à quelques lignes de NumPy pour une coordonnée du centre d’une boîte :
import numpy as np
F = np.array([[1.0, 1.0], [0.0, 1.0]]) # constant-velocity model, state = [position, velocity]
H = np.array([[1.0, 0.0]]) # the detector measures position only
Q = 0.001 * np.eye(2) # process noise: how far real motion may stray from the model
R = np.array([[25.0]]) # measurement noise: detections jitter by about 5 px
rng = np.random.default_rng(0)
truth = 100 + 3.0 * np.arange(60) # box center moving 3 px per frame
z = truth + rng.normal(0, 5.0, truth.size) # noisy detections
x, P = np.array([z[0], 0.0]), np.diag([25.0, 100.0]) # start from the first detection
estimates = [x[0]]
for measurement in z[1:]:
x, P = F @ x, F @ P @ F.T + Q # predict
K = P @ H.T @ np.linalg.inv(H @ P @ H.T + R) # Kalman gain
x = x + K @ (measurement - H @ x) # update with the weighted residual
P = (np.eye(2) - K @ H) @ P
estimates.append(x[0])
print(f"Detection error: {np.sqrt(np.mean((z - truth) ** 2)):.2f} px")
print(f"Kalman error: {np.sqrt(np.mean((np.array(estimates) - truth) ** 2)):.2f} px")
print(f"Estimated velocity: {x[1]:.2f} px/frame")Le programme affiche une erreur quadratique moyenne de 4.50 px pour les détections brutes et de 2.48 px pour les estimations filtrées, ainsi qu’une vitesse estimée de 2.98 px par image, proche de la valeur réelle de 3 px, même si la vitesse n’a jamais été mesurée.
Filtres apparentés#
Le filtre de Kalman standard suppose que les modèles de mouvement et de mesure sont linéaires et que le bruit est gaussien. Ses variantes assouplissent ces hypothèses :
- Filtre de Kalman étendu (EKF) : Linéarise les modèles non linéaires autour de l’estimation actuelle au moyen de jacobiennes à chaque étape. C’est le choix standard pour le GPS et la navigation inertielle.
- Filtre de Kalman non parfumé (UKF) : Fait passer un petit ensemble de points d’échantillonnage soigneusement choisis à travers le modèle non linéaire. Cette méthode est généralement plus précise que la linéarisation et ne nécessite pas de dérivées.
- Filtre particulaire : Représente la distribution de l’état avec de nombreux échantillons aléatoires pondérés. Il peut ainsi gérer des distributions non gaussiennes et multimodales, comme l’incertitude d’un robot qui ne sait pas dans lequel de deux couloirs il se trouve, au prix d’un coût de calcul bien plus élevé.
- Modèle de Markov caché (HMM) : Utilise la même récursion de prédiction et de mise à jour pour des états discrets ; le filtre de Kalman en est l’équivalent pour les états continus à distribution linéaire gaussienne.
Applications au-delà du suivi#
- Robotique et fusion de capteurs : Les robots combinent l’odométrie des roues, les IMU, le lidar et les caméras en une seule estimation de pose ; les méthodes fondées sur l’EKF constituent une approche classique de la localisation et de la cartographie simultanées.
- Réalité augmentée : Les casques filtrent les mesures de pose de la tête afin de stabiliser les objets virtuels avec une faible latence.
- Économie et traitement du signal : Les analystes utilisent le lissage de Kalman pour estimer les tendances non observées à partir de séries temporelles bruitées.
- Navigation : Les avions, les navires, les drones et les téléphones combinent le GPS aux capteurs inertiels pour maintenir une position stable entre les corrections satellitaires. La navigation a aussi été la première grande application du filtre : au début des années 1960, Stanley F. Schmidt, de la NASA Ames, l’a adapté à l’estimation de trajectoires non linéaires pour l’ordinateur de navigation d’Apollo.










