video-matting — détourer une vidéo en local
Gratuit et privé : tout tourne en local (ONNX Runtime, pas de PyTorch requis, accélération CoreML sur Apple Silicon).
Le principe qui décide de tout
Un détourage « se voit » quand le masque est binaire (bord franc) ou instable (contour qui frémit d'une image à l'autre). RobustVideoMatting règle les deux : alpha continu (vraies demi-transparences dans les cheveux) et état récurrent propagé d'une image à l'autre — mesuré plusieurs fois plus stable que les segmentations image-par-image des frameworks systèmes.
Méthode
Poids publics : rvm_resnet50_fp32.onnx (~100 Mo) ou rvm_mobilenetv3_fp32.onnx (~14 Mo), dépôt officiel PeterL1n/RobustVideoMatting.
- Prendre
resnet50: meilleur détail capillaire, moins d'artefacts (et souvent plus rapide via CoreML, meilleure couverture d'opérateurs). downsample_ratio: viser ~512 px sur le petit côté réduit (0,5 pour une source verticale ~576×1024 ; 0,25 pour de la 4K).- Composer
fgr+pha(les deux sorties du modèle), passource × alpha: le premier plan rendu est décontaminé du spill du décor. - Les 4 états récurrents s'initialisent à zéro et se repassent tels quels d'une frame à l'autre.
⚠️ RVM ne segmente QUE les personnes
Ni le bureau, ni le micro, ni les objets tenus. Deux compléments, légitimes tant que la caméra est fixe :
- Meuble/bureau : bande pleine en bas de cadre avec un dégradé vertical (~50 px) pour que la jonction ne se lise pas.
- Objets tenus : seuillage de luminance dans une bande centrale (sur toute la largeur, le seuillage ramasse le décor).
Piège de lecture : sur le masque seul, une manche ressemble à un meuble. Toujours contrôler en compositant sur un fond uni, jamais sur le masque brut.
Contrôle qualité — systématique
Extraire l'alpha (alphaextract) et suivre sa moyenne par frame (signalstats) : chercher les décrochages (masque quasi vide → clignotement), les sauts brusques, le jitter. Normaliser selon la profondeur de pixel (12 bits = échelle 0-4095). Si un frémissement se voit : lissage temporel tmix sur 3 images.
Export
- ProRes 4444 avec
-alpha_bits 8(≈ 1 Go/min en 1080×1920).-alpha_bits 16décuple le débit pour rien. - ⚠️ Certains encodeurs matériels perdent silencieusement l'alpha (sortie en
yuv420pmalgré la demande) : vérifier lepix_fmtdu fichier de sortie. - Garder la résolution native : tout upscale est de l'invention de détail — le faire une seule fois, au plus tard dans la chaîne.
⚠️ La leçon la plus chère : régénérer plutôt que rattraper une source molle
Quand la source est en basse définition et que le montage la recadre fortement (zooms ×2-3), le calque détouré restera mou face à des plans générés en HD — et aucun rattrapage (matte pleine résolution, débruitage, upscale IA) ne comblera l'écart de définition. Vérifier la définition effective de la source avant de bâtir une architecture sur son détourage. Le détourage garde son sens entre sources de définition équivalente ; sinon, régénérer le plan entier (→ video-generation) est la voie qui tient.
Autre échec documenté : un compositing sujet/fond sans light wrap « se voit » toujours. L'incrustation et la lumière (halo, vignette, grain commun) se règlent au montage (→ video-editing) : dans une composition HyperFrames, où le calque détouré se pose comme une vidéo à canal alpha au-dessus du fond et où vignette et grain vont sur un calque commun (skills hyperframes:hyperframes-core et hyperframes:hyperframes-media), ou par des filtres ffmpeg dans le plan de montage (voie B). Jamais une simple superposition du calque sur le fond. Pour une composition HyperFrames, le calque se livre en WebM VP9 avec alpha, le format que Chrome lit en transparence ; le ProRes 4444 sert aux échanges et à ffmpeg.
Ce que cette skill ne fait pas
- ❌ Incruster le fond et régler la lumière (→
video-editing: glow, vignette, grain commun, étalonnage) - ❌ Générer le fond (→
image-generation) - ❌ Le chroma key sur fond vert : un fond uni se découpe au montage, par le filtre ffmpeg
chromakeydans le plan de montage devideo-editing(voie B), sans modèle de détourage. La documentation d'HyperFrames ne propose pas de keyer : sa commanderemove-background(skillhyperframes:hyperframes-media) détoure une personne, comme cette skill


