Optical Flow (Flux Optique)
L’optical flow (flux optique) est une technique de vision par ordinateur qui estime le mouvement apparent de chaque pixel entre deux images consécutives d’une séquence vidéo, produisant un champ de vecteurs 2D décrivant la direction et l’amplitude du déplacement.
Vous regardez une vidéo au ralenti fluide alors qu’elle a été filmée à 30 FPS. Un logiciel stabilise une vidéo tremblante de smartphone. Un système de conduite autonome détecte qu’un piéton se déplace vers la route. Un algorithme de compression vidéo exploite la redondance entre frames. Un modèle de reconnaissance d’actions identifie qu’une personne court plutôt que marche. Toutes ces applications reposent sur l’estimation du flux optique, une brique fondamentale de l’analyse de mouvement vidéo.
Le domaine est dominé par les architectures itératives héritées de RAFT (2020), avec des variantes transformers (FlowFormer, FlowFormer++) et des modèles efficaces (SEA-RAFT) qui continuent de repousser les limites de précision. Les travaux récents (FlowSeek ICCV 2025, DPFlow CVPR 2025) montrent que l’intégration de foundation models de profondeur et l’extension à la haute résolution (jusqu’à 8K) sont les nouvelles frontières.
- Catégorie
- Vision par ordinateur / Analyse de mouvement
- Entrée
- Deux images (frames) consécutives
- Sortie
- Champ de vecteurs 2D (u, v) pour chaque pixel
- Approches classiques
- Lucas-Kanade (local, sparse), Horn-Schunck (global, dense)
- Modèles deep learning
- RAFT, FlowFormer, SEA-RAFT, FlowFormer++, DPFlow
- Benchmarks
- Sintel, KITTI 2015, Spring
- Métriques
- EPE (End-Point Error), F1-all (KITTI)
Comment fonctionne l’optical flow
Principe fondamental
L’optical flow capture le mouvement apparent dans une séquence vidéo. Pour chaque pixel (x, y) de l’image au temps t, le modèle estime un vecteur de déplacement (u, v) indiquant où ce pixel se trouve dans l’image au temps t+1. L’ensemble de ces vecteurs forme un champ de mouvement dense qui décrit comment les objets et la caméra se déplacent entre deux frames.
Le champ de flux optique est généralement visualisé en utilisant un codage couleur (color wheel) : la teinte encode la direction du mouvement (par convention HSV, rouge = droite, bleu = gauche, vert = bas), et la saturation encode l’amplitude. Un pixel immobile apparaît gris ou noir.
Hypothèses fondamentales
Trois hypothèses sous-tendent la plupart des algorithmes de flux optique :
Constance de luminosité (brightness constancy). L’intensité d’un pixel ne change pas entre deux frames : le même point de surface conserve la même apparence. Cette hypothèse est violée par les changements d’éclairage, les reflets spéculaires et les ombres mobiles.
Petit mouvement (small motion). Le déplacement entre frames est suffisamment petit pour permettre une linéarisation de la fonction d’intensité. Les mouvements rapides violent cette hypothèse, d’où l’utilisation de pyramides multi-échelles (coarse-to-fine).
Cohérence spatiale. Les pixels voisins tendent à avoir des déplacements similaires, car ils appartiennent généralement au même objet. Cette hypothèse est violée aux frontières des objets en mouvement.
Flux sparse vs dense
Sparse. Le flux est estimé uniquement sur un sous-ensemble de pixels « intéressants » (coins, features). Lucas-Kanade (1981) est la méthode sparse classique : elle suppose que tous les pixels d’une petite fenêtre partagent le même vecteur de mouvement. C’est rapide mais insuffisant pour les applications nécessitant un champ de mouvement complet. OpenCV implémente Lucas-Kanade via cv2.calcOpticalFlowPyrLK().
Dense. Le flux est estimé pour chaque pixel de l’image. Horn-Schunck (1981) est la méthode dense classique : elle minimise une énergie combinant fidélité aux données et régularisation de lissage sur l’ensemble de l’image. Farneback est une autre méthode dense populaire, implémentée dans OpenCV via cv2.calcOpticalFlowFarneback(). Les modèles de deep learning modernes (RAFT, FlowFormer) produisent tous un flux dense.
Évolution des approches deep learning
L’estimation du flux optique par deep learning a suivi une trajectoire distincte, marquée par des ruptures architecturales majeures.
FlowNet et PWC-Net : les pionniers
FlowNet (Dosovitskiy et al., ICCV 2015) a été le premier CNN à estimer le flux optique de bout en bout. Deux variantes : FlowNetS (simple, concatène les deux images en entrée) et FlowNetC (corrélation, calcule un volume de corrélation entre les features des deux images). FlowNet 2.0 (2017) a empilé plusieurs de ces réseaux pour améliorer la précision.
PWC-Net (Sun et al., CVPR 2018) a introduit une architecture pyramide-warping-coût (Pyramid, Warping, Cost volume) plus légère et performante. Le flux est estimé de manière coarse-to-fine en construisant un volume de coût local à chaque niveau de la pyramide.
RAFT : la rupture
RAFT (Teed & Deng, ECCV 2020) a profondément transformé le domaine avec trois innovations clés. Premièrement, un volume de corrélation 4D all-pairs qui calcule la similarité entre chaque paire de pixels des deux images. Deuxièmement, un raffinement itératif par une unité récurrente (GRU) qui effectue des lookups dans le volume de corrélation pour mettre à jour progressivement le champ de flux. Troisièmement, une généralisation cross-dataset remarquable.
Les résultats étaient spectaculaires à sa sortie : sur KITTI, RAFT a atteint un F1-all de 5,10%, une réduction de 16% par rapport au meilleur résultat publié (6,10%). Sur Sintel (final pass), il a obtenu un EPE de 2,855 pixels, réduisant l’erreur de 30% par rapport à l’état de l’art précédent. RAFT est devenu le framework dominant, et la quasi-totalité des modèles récents sont des variantes ou des extensions de son architecture.
FlowFormer et architectures transformer
FlowFormer (Huang et al., ECCV 2022) a introduit une architecture entièrement basée sur les transformers pour l’estimation de flux optique. Son innovation : un encodeur de volume de coût qui transforme le volume 4D en tokens latents compacts via une tokenisation en deux étapes, puis alterne l’attention entre tokens du même pixel source et tokens de pixels différents. Le décodeur récurrent utilise des requêtes de coût positionnelles dynamiques pour le raffinement itératif.
FlowFormer++ (Shi et al., CVPR 2023) a étendu FlowFormer avec un pré-entraînement par autoencoding masqué du volume de coût, améliorant la généralisation. D’autres architectures transformer notables incluent CRAFT (cross-attentional flow transformer) et GMFlowNet.
SEA-RAFT et modèles récents
SEA-RAFT (2024) est une version plus simple, efficace et précise de RAFT. Ses innovations : une loss mixture-of-Laplace (meilleure modélisation de l’incertitude), une régression directe du flux initial (convergence plus rapide), et un pré-entraînement sur le mouvement rigide (TartanAir). SEA-RAFT est le baseline dominant pour la recherche récente.
FlowSeek (ICCV 2025) intègre des priors de profondeur issus de foundation models (Depth Anything V2) dans l’estimation de flux optique. Les features et les cartes de profondeur estimées sont injectées dans le réseau de contexte et la base de correspondance, améliorant les performances sur des scènes complexes avec un seul GPU RTX 3090.
DPFlow (CVPR 2025) s’attaque à la haute résolution avec un framework dual-pyramide adaptatif, capable de généraliser jusqu’à des entrées 8K tout en étant entraîné uniquement sur des échantillons basse résolution.
Comparaison des modèles
| Modèle | Architecture | Sintel (final) EPE | KITTI F1-all | Innovation clé |
|---|---|---|---|---|
| FlowNet 2.0 (2017) | CNN empilé | ~3,96 | ~11,48% | Premier CNN compétitif |
| PWC-Net (2018) | Pyramide-Warping-Coût | ~3,45 | ~9,60% | Volume de coût local pyramidal |
| RAFT (2020) | Corrélation 4D + GRU itératif | ~2,86 | ~5,10% | All-pairs correlation, raffinement itératif |
| GMA (2021) | RAFT + attention globale | ~2,47 | ~5,15% | Agrégation de mouvement global pour les occlusions |
| FlowFormer (2022) | Transformer | ~1,16* | ~4,68% | Encodage latent du volume de coût |
| FlowFormer++ (2023) | Transformer + pré-entraînement | ~1,07* | ~4,52% | Masked cost volume autoencoding |
| SEA-RAFT (2024) | RAFT amélioré | Compétitif | Compétitif | Mixture-of-Laplace loss, rigid pre-training |
| DPFlow (CVPR 2025) | Dual-pyramide adaptative | N/A | N/A | Généralisation 8K |
*Scores sur Sintel training set clean pass (1,00 EPE pour FlowFormer sans entraînement sur Sintel). Les scores sur les benchmarks de test sont généralement plus élevés.
Utilisation en pratique
Optical Flow classique avec OpenCV
import cv2
import numpy as np
# Lire deux frames consécutives
cap = cv2.VideoCapture("video.mp4")
ret, frame1 = cap.read()
ret, frame2 = cap.read()
# Convertir en niveaux de gris
gray1 = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)
# === SPARSE : Lucas-Kanade ===
# Détecter des points d'intérêt
pts = cv2.goodFeaturesToTrack(gray1, maxCorners=200, qualityLevel=0.01, minDistance=10)
# Suivre les points
new_pts, status, err = cv2.calcOpticalFlowPyrLK(gray1, gray2, pts, None)
# Filtrer les bons points
good_old = pts[status == 1]
good_new = new_pts[status == 1]
# === DENSE : Farneback ===
flow = cv2.calcOpticalFlowFarneback(
gray1, gray2, None,
pyr_scale=0.5, levels=3, winsize=15,
iterations=3, poly_n=5, poly_sigma=1.2, flags=0
)
# flow.shape = (H, W, 2) : (u, v) pour chaque pixel
# Visualisation (color wheel)
magnitude, angle = cv2.cartToPolar(flow[..., 0], flow[..., 1])
hsv = np.zeros_like(frame1)
hsv[..., 0] = angle * 180 / np.pi / 2 # Teinte = direction
hsv[..., 1] = 255 # Saturation max
hsv[..., 2] = cv2.normalize(magnitude, None, 0, 255, cv2.NORM_MINMAX) # Valeur = amplitude
rgb_flow = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)
cv2.imwrite("flow_vis.png", rgb_flow)
RAFT (deep learning)
# pip install torch torchvision
import torch
from torchvision.models.optical_flow import raft_large, Raft_Large_Weights
from torchvision.io import read_video
import torchvision.transforms.functional as F
# Charger le modèle pré-entraîné
weights = Raft_Large_Weights.DEFAULT
transforms = weights.transforms()
model = raft_large(weights=weights).eval().cuda()
# Charger deux frames
frames, _, _ = read_video("video.mp4", pts_unit="sec", output_format="TCHW")
img1 = frames[0].unsqueeze(0).cuda().float()
img2 = frames[1].unsqueeze(0).cuda().float()
# Appliquer les transformations
img1, img2 = transforms(img1, img2)
# Estimer le flux optique
with torch.no_grad():
flow_predictions = model(img1, img2)
flow = flow_predictions[-1] # Dernière itération
# flow.shape = (1, 2, H, W) : canaux (u, v)
print(f"Flow shape: {flow.shape}")
print(f"Déplacement moyen: u={flow[0,0].mean():.2f}, v={flow[0,1].mean():.2f}")
Benchmarks et métriques
Métriques principales
EPE (End-Point Error). Erreur euclidienne moyenne entre le flux prédit et la vérité terrain, en pixels. C’est la métrique standard sur Sintel. Un EPE de 2,86 signifie qu’en moyenne, chaque pixel prédit est à 2,86 pixels de sa position réelle.
F1-all (KITTI). Pourcentage de pixels où l’erreur de flux dépasse 3 pixels ET 5% de la magnitude du flux vrai. Plus bas est mieux. C’est la métrique standard sur KITTI car elle pénalise les erreurs proportionnellement à la vitesse réelle du mouvement.
AEE (Average End-Point Error). Synonyme d’EPE dans certaines publications.
Datasets de référence
| Dataset | Type | Caractéristiques | Usage |
|---|---|---|---|
| MPI Sintel | Synthétique (film d’animation) | Clean + Final pass (brouillard, motion blur), scènes complexes | Benchmark principal, évaluation fine |
| KITTI 2015 | Réel (conduite) | 200 paires d’entraînement + 200 test, LiDAR ground truth | Benchmark conduite autonome |
| Spring | Synthétique HD | Scènes 3D photoréalistes, haute résolution | Benchmark moderne, plus diversifié |
| FlyingChairs | Synthétique | Chaises sur fond aléatoire, simple | Pré-entraînement |
| FlyingThings3D | Synthétique | Objets 3D en mouvement, plus complexe | Entraînement principal |
| TartanAir | Synthétique (simulation) | Environnements variés, données de profondeur + pose | Pré-entraînement, mouvement rigide |
| HD1K | Réel (conduite) | Haute résolution, route | Évaluation conduite |
Le pipeline d’entraînement standard suit une progression : pré-entraînement sur FlyingChairs, entraînement sur FlyingThings3D, puis fine-tuning sur les données cibles (Sintel ou KITTI). La généralisation cross-dataset (s’entraîner sur un dataset et évaluer sur un autre) reste un critère important.
Applications
Interpolation de frames (slow motion). L’optical flow permet de générer des frames intermédiaires pour créer un effet de ralenti fluide à partir d’une vidéo filmée en framerate standard. Des méthodes comme Super SloMo, RIFE et AMT (All-Pairs Multi-Field Transforms) utilisent le flux estimé pour warper les frames existantes et synthétiser les frames manquantes. C’est ce qui permet à votre smartphone de produire des vidéos slow-motion à partir de 30 FPS.
Stabilisation vidéo. En estimant le mouvement global de la scène (mouvement de caméra) et en le soustrayant, le flux optique permet de stabiliser des vidéos tremblantes. Les algorithmes séparent le mouvement de caméra (global) du mouvement des objets (local) pour ne compenser que les tremblements tout en conservant les mouvements intentionnels de la caméra.
Compression vidéo. Les codecs vidéo modernes (H.264, H.265/HEVC, AV1) exploitent le flux optique (sous forme de vecteurs de mouvement) pour la compensation de mouvement : au lieu de stocker chaque frame entière, le codec stocke un vecteur de mouvement par bloc et ne code que la différence résiduelle. Les approches de compression vidéo apprises de bout en bout (DVC, DCVC) utilisent des réseaux d’estimation de flux pour améliorer la prédiction inter-frames.
Reconnaissance d’actions. Le flux optique capture l’information de mouvement qui est complémentaire à l’information d’apparence. Les architectures « two-stream » (Simonyan & Zisserman, 2014) traitent un flux RGB (apparence) et un flux optical flow (mouvement) séparément avant de fusionner les prédictions. Bien que les architectures vidéo modernes (Video Swin Transformer, TimeSformer) apprennent implicitement le mouvement, le flux optique reste utilisé comme feature d’entrée ou supervision auxiliaire pour la compréhension vidéo.
Suivi d’objets et segmentation vidéo. Le flux optique guide la propagation temporelle des masques de segmentation entre frames. Il aide à distinguer les objets en mouvement du fond statique (segmentation de mouvement) et à maintenir l’identité des objets au fil du temps dans les pipelines de tracking.
Conduite autonome et SLAM. Le flux optique est utilisé pour l’odométrie visuelle (estimation du mouvement de la caméra/véhicule), la détection d’obstacles en mouvement, et comme entrée pour les systèmes de depth estimation monoculaire (SfM). RAFT est fréquemment intégré dans les pipelines de reconstruction 3D et de SLAM visuel.
Génération et édition vidéo. Les modèles de génération vidéo par IA utilisent le flux optique pour assurer la cohérence temporelle entre frames générées. Le flux sert aussi de signal de contrôle pour l’édition vidéo (transférer le mouvement d’une vidéo à une autre, re-timing).
Défis techniques
Grands déplacements. Les mouvements rapides violent l’hypothèse de petit mouvement. Les approches pyramidales (coarse-to-fine) et les volumes de corrélation multi-échelle (RAFT) atténuent ce problème, mais les mouvements très rapides de petits objets restent difficiles. HMAFlow (2025) introduit un alignement hiérarchique de champs de mouvement et un module de Correlation Self-Attention spécialement conçus pour les petits objets rapides.
Occlusions. Quand un objet en cache un autre, les pixels occultés n’ont pas de correspondance dans la frame suivante. GMA (Global Motion Aggregation) a introduit un mécanisme d’attention pour propager l’information de mouvement dans les régions occultées, et les modèles récents continuent d’améliorer ce point.
Surfaces homogènes. Les zones sans texture (murs blancs, ciel uniforme) ne fournissent pas d’indices visuels pour estimer le mouvement. Le flux y est fondamentalement ambigu. La régularisation spatiale (lisser le flux dans les zones sans texture en s’appuyant sur les voisins texturés) est la solution standard.
Motifs répétitifs. Les textures répétitives (grilles, briques, clôtures) créent des correspondances ambiguës car plusieurs pixels se « ressemblent ». Les mécanismes d’attention globale (FlowFormer, CRAFT) aident à résoudre cette ambiguïté en considérant le contexte à longue portée.
Haute résolution. La plupart des modèles sont entraînés sur des résolutions modestes (448×1024 ou moins). L’extension à la haute résolution (4K, 8K) pose des problèmes de mémoire GPU et de généralisation. DPFlow (CVPR 2025) a proposé la première solution adaptative capable de traiter des entrées jusqu’à 8K sans ré-entraînement.
Temps réel et déploiement. Les modèles SOTA (FlowFormer++) nécessitent plusieurs secondes sur GPU pour des images haute résolution. Les applications temps réel (stabilisation live, conduite autonome) requièrent des modèles légers ou des méthodes classiques (Lucas-Kanade, Farneback). L’optimisation par quantization, export ONNX et pruning est indispensable pour le déploiement.
Tendances récentes
Intégration de foundation models. FlowSeek (ICCV 2025) a montré que les priors de profondeur issus de foundation models (Depth Anything V2) améliorent significativement l’estimation de flux optique, surtout sur les scènes avec des mouvements structurels. Cette convergence entre estimation de profondeur et flux optique est une direction prometteuse.
Unification flux/stéréo/profondeur. Plusieurs travaux récents unifient l’estimation de flux optique, la disparité stéréo et la profondeur monoculaire dans un seul framework, car ces tâches partagent des mécanismes de correspondance similaires. UniMatch et GMStereo explorent cette direction.
Modèles de diffusion pour le flux. Les modèles de diffusion ont montré des résultats surprenants pour l’estimation de flux optique sans architecture spécialement conçue pour la tâche, suggérant que les priors génératifs pourraient compléter les approches discriminatives.
Haute résolution adaptative. DPFlow (CVPR 2025) a démontré qu’une architecture dual-pyramide adaptative peut généraliser de la basse résolution (entraînement) à la 8K (inférence) sans perte de qualité, répondant à l’augmentation constante de la résolution des vidéos.
Questions fréquentes sur l’optical flow
Quelle est la différence entre optical flow et object tracking ?
L’optical flow estime le mouvement de chaque pixel entre deux frames, sans notion d' »objet ». C’est un champ de mouvement dense, pixel par pixel. L’object tracking suit des objets identifiés au fil du temps, maintenant leur identité entre frames (cet objet dans la frame 1 est le même dans la frame 50). Le tracking peut utiliser l’optical flow comme feature de mouvement, mais il inclut aussi la détection, l’association d’identité, et la gestion des entrées/sorties de scène. En pratique, les trackers modernes (ByteTrack, BoTSORT) combinent la détection par YOLO avec le mouvement estimé.
Faut-il utiliser l’optical flow ou un modèle vidéo de bout en bout ?
Cela dépend de la tâche. Pour la reconnaissance d’actions, les modèles vidéo de bout en bout (Video Swin Transformer, TimeSformer, VideoMAE) ont largement rattrapé les architectures two-stream qui utilisaient le flux optique explicitement. Le flux optique reste indispensable pour les applications où le champ de mouvement dense est la sortie désirée (interpolation de frames, stabilisation, compression vidéo, segmentation de mouvement). Pour la compréhension vidéo, le flux optique est de plus en plus utilisé comme supervision auxiliaire plutôt que comme feature d’entrée.
RAFT ou FlowFormer : lequel est meilleur ?
FlowFormer et FlowFormer++ obtiennent de meilleurs scores sur les benchmarks (EPE plus bas sur Sintel, F1 plus bas sur KITTI), grâce aux mécanismes d’attention globale des transformers. Cependant, RAFT reste très compétitif et est beaucoup plus simple à implémenter et à adapter. Pour la production, RAFT (via torchvision) est le choix le plus pratique : il est bien maintenu, facile à intégrer, et performant. Pour la recherche et les cas nécessitant la plus haute précision, FlowFormer++ ou SEA-RAFT. Pour le mobile et l’embarqué, les variantes compactes de RAFT restent préférables.
Peut-on estimer l’optical flow en temps réel ?
Les méthodes classiques (Lucas-Kanade, Farneback) sont rapides (100+ FPS) mais moins précises. RAFT en version optimisée (nombre d’itérations réduit, résolution limitée) peut atteindre 15 à 30 FPS sur GPU. Les modèles légers comme LiteFlowNet et PWC-Net sont plus rapides (40+ FPS) avec un compromis sur la précision. Pour le mobile, des architectures optimisées existent mais la qualité reste en deçà des modèles SOTA. Les approches hybrides (estimation rapide + raffinement local sur les zones d’intérêt) sont une piste prometteuse pour le temps réel.
Comment le flux optique est-il utilisé dans la compression vidéo ?
Les codecs vidéo (H.264, H.265, AV1, VVC) utilisent la compensation de mouvement : chaque frame est prédite à partir de frames de référence en appliquant des vecteurs de mouvement par bloc. Le résidu (différence entre la prédiction et la frame réelle) est ensuite encodé. Le flux optique, sous forme de vecteurs de mouvement, est donc au cœur de la compression vidéo. Les approches de compression vidéo apprises de bout en bout (DVC, DCVC) remplacent les vecteurs de mouvement par blocs par un flux optique dense estimé par un réseau neuronal, obtenant de meilleurs ratios de compression pour une qualité équivalente.