video_to_ply est un pipeline permettant de générer un fichier 3D .ply de splats gaussiens à partir d’une ou plusieurs vidéos ou d’un dossier d’images
Le projet s’appuie sur :
et sur un post-traitement final pour produire un .ply exploitable dans des outils 3D.
Le résultat produit n’est pas un simple nuage de points : c’est un .ply enrichi contenant les paramètres des gaussiennes appris par le modèle :
- position
- échelle
- rotation
- opacité
- attributs de couleur
- autres attributs nécessaires au rendu
Ce fichier peut ensuite être ouvert dans un viewer compatible Gaussian Splats, comme SuperSplat.
Le pipeline automatise les étapes suivantes :
- préparation des images à partir d’une vidéo ou d’un dossier d’entrée
- reconstruction photogrammétrique des poses caméra
- entraînement d’un modèle
splatfactoavec Nerfstudio - export d’un
.plyde splats gaussiens - nettoyage final du
.plyà partir de la reconstruction sparse COLMAP
Chaîne globale :
VIDEO / IMAGES
↓
préparation des images
↓
préprocess photogrammétrique
(COLMAP / HLOC via Nerfstudio)
↓
transforms.json + sparse COLMAP
↓
entraînement Gaussian Splat
↓
export `.ply`
↓
nettoyage et export du `.ply` final
Le livrable final recherché est :
<root>/exports/<basename>.ply
Le pipeline est conçu pour tourner sur un environnement Linux avec :
bash- GPU NVIDIA
- CUDA
- conda / mamba
Le cas d’usage principal repose sur un entraînement Gaussian Splat sur GPU avec splatfacto.
L’environnement prêt à l’emploi utilisé pour ce projet est fourni ici :
environment/ign.slurm/conda_env.yml
Il contient notamment la stack nécessaire pour :
- PyTorch
- Nerfstudio
- COLMAP / pycolmap
- ffmpeg
- HLOC
Exemple :
mamba env create -f environment/ign.slurm/conda_env.yml
mamba activate gsplatLe projet a été pensé et testé principalement pour :
- un contexte serveur / Slurm
- un notebook Google Colab
Le script principal supporte deux modes.
Entrée :
- une ou plusieurs vidéos via
--video
Le pipeline :
- copie les vidéos dans l’espace de travail
- extrait les frames
- traite ensuite les images produites
Options utiles :
--fps--num-frames- variables d’environnement optionnelles :
VIDEO_STARTVIDEO_END
Entrée :
- un dossier d’images via
--images
Le pipeline :
- prépare les images
- lance directement le préprocess photogrammétrique
Sous le dossier --root, le pipeline génère plusieurs fichiers intermédiaires, mais le livrable final recherché est :
<root>/exports/<basename>.ply
Ce fichier est un PLY enrichi pour représenter des Gaussian Splats.
Les sorties intermédiaires importantes sont notamment :
ori/transforms.jsonori/colmap/...- les checkpoints d’entraînement Nerfstudio
- un
.plyexporté avant nettoyage - un
.plyfinal nettoyé dansexports/
Les frames sont extraites via ffmpeg grâce à :
scripts/extract_frames.sh
Les images sont stockées dans :
<root>/ori/images/
Les images sont préparées / copiées via :
scripts/prepare_images.sh
Objectif :
- obtenir un dossier d’images homogène et éventuellement sous-échantillonné pour la suite du pipeline
Le pipeline lance un préprocess via Nerfstudio pour produire :
- les poses caméra
transforms.json- la reconstruction sparse COLMAP
Script utilisé :
scripts/preprocess_nerfstudio.sh
-
colmap
pipeline photogrammétrique classique basé directement sur COLMAP.
C’est l’option la plus simple et la plus standard pour reconstruire les poses caméra et la géométrie sparse. -
hloc
pipeline basé sur Hierarchical Localization (HLOC).
Il utilise des descripteurs et appariements plus modernes que COLMAP seul, ce qui peut être plus robuste sur des scènes difficiles, répétitives ou avec de grands changements de point de vue. -
hloc-lightblue
variante dehlocavec un réglage spécifique au projet.
C’est un profil plus spécialisé, pensé pour certains jeux de données ou contraintes internes, tout en restant dans la logique HLOC.
Sortie typique :
<root>/ori/
├── images/
├── transforms.json
└── colmap/
Cette étape reconstruit la géométrie de prise de vue et prépare les données pour l’entraînement.
Avant l’entraînement, le pipeline estime automatiquement des plans proches / lointains à partir du sparse COLMAP.
Script utilisé :
scripts/estimate_planes.py
Les valeurs estimées sont injectées dans l’entraînement via le collider.
Cette étape améliore la cohérence du rendu et du training sur certaines scènes.
Le pipeline entraîne ensuite un modèle splatfacto de la librairie Nerfstudio sur les données de ori/.
Script utilisé :
scripts/train.sh
Sorties :
- configuration de run
- checkpoints
- logs d’entraînement
Après entraînement, le pipeline exporte le résultat vers un fichier .ply grâce au script :
scripts/export_splat_to_ply.sh
Il s’agit d’un .ply enrichi décrivant des Gaussian Splats, et non d’un simple nuage de points.
Le .ply exporté est post-traité à partir de la reconstruction sparse COLMAP.
Script utilisé :
scripts/cleaning/clean-ply.py
Entrées :
- le
.plyexporté points3D.bindataparser_transforms.json
Sortie :
- un
.plyfinal dans :
<root>/exports/<basename>.ply
Le script :
- charge les points 3D COLMAP
- applique le même transform que Nerfstudio pour les remettre dans le bon repère
- filtre les points COLMAP aberrants
- estime une distance de voisinage caractéristique
- conserve uniquement les gaussiennes :
- proches des points COLMAP
- ou incluses dans la boîte englobante de la scène reconstruite
L’objectif est de supprimer les gaussiennes isolées, parasites ou trop éloignées de la géométrie réellement reconstruite par COLMAP, afin d’obtenir un .ply final plus propre.
--video <file ...>: une ou plusieurs vidéos--images <dir>: dossier d’images--root <dir>: dossier de sortie principal--name <name>: nom de base des sorties
--fps <int ...>--num-frames <int ...>
--preprocess-profile <name>:colmap | hloc | hloc-lightblue--gsplat-profile <name>:fast | balanced | quality | quality_plus | best
--automask--skip-conda--no-proxy--skip-frame-extraction--skip-preprocess--skip-training--skip-export
Le pipeline est conçu pour être relancé sans tout recalculer.
Il peut :
- sauter l’extraction si les images existent déjà
- sauter le préprocess si
transforms.jsonest déjà présent - sauter l’entraînement ou l’export via les flags
--skip-*
Cela facilite :
- les reprises après erreur
- le debug
- les exécutions par étapes
Structure principale :
video_to_ply/
├── config/
├── doc/
├── environment/
├── install/
├── io/
├── profiles/
│ ├── gsplat/
│ └── preprocess/
├── scripts/
│ ├── cleaning/
│ ├── masking/
│ ├── rendering/
│ ├── analysis/
│ ├── extract_frames.sh
│ ├── prepare_images.sh
│ ├── preprocess_nerfstudio.sh
│ ├── train.sh
│ ├── export_nerf_to_ply.sh
│ ├── export_splat_to_ply.sh
│ └── estimate_planes.py
├── run.sh
└── README.md
config/: configuration globaleprofiles/: presets de préprocess et d’entraînementscripts/: briques métier du pipelineenvironment/: environnements d’exécution (Slurm, Colab, Kaggle, macOS)doc/: documentation et notesio/: outils de transfert / import-export
./run.sh \
--video input.mov \
--numframes 150 \
--root runs/test \
--preprocess-profile colmap \
--gsplat-profile quality./run.sh \
--images ./imgs \
--root runs/test \
--preprocess-profile hloc \
--gsplat-profile quality./run.sh \
--images ./imgs \
--root runs/test \
--skip-preprocess \
--gsplat-profile quality| Arbuste sous différents angles | ||
|---|---|---|
![]() Vue 1 |
![]() Vue 2 |
![]() Vue 3 |
| Statue sous différents angles | ||
|---|---|---|
![]() Vue 1 |
![]() Vue 2 |
![]() Vue 3 |
| Rue de Paris (Panos GoPro 8k) | ||
|---|---|---|
![]() Vue 1 |
![]() Vue 2 |
![]() Vue 3 |








