Nerfstudio - Reconstruction 3D par Neural Radiance Fields¶
Nerfstudio est un framework open-source pour créer des modèles 3D photoréalistes à partir de photos.
Vue d'ensemble¶
| Paramètre | Valeur |
|---|---|
| URL | http://192.168.1.82:7007 |
| Port | 7007 |
| GPU | 2× RTX 5090 (64 GB VRAM each) |
| Data | /data/nerfstudio/ |
| Install | /opt/nerfstudio/ |
| User | nerfstudio (system) |
Architecture¶
┌────────────────────────────────────────────┐
│ Photos (50-200) │
│ - JPEG/PNG │
│ - 360° coverage │
└──────────────┬─────────────────────────────┘
│
▼
┌────────────────────────────────────────────┐
│ COLMAP (Structure-from-Motion) │
│ - Calcul poses caméra │
│ - Calibration automatique │
└──────────────┬─────────────────────────────┘
│
▼
┌────────────────────────────────────────────┐
│ Training NeRF (10-30 min RTX 5090) │
│ - nerfacto (balanced) │
│ - instant-ngp (ultra-fast) │
│ - splatfacto (Gaussian Splatting) │
└──────────────┬─────────────────────────────┘
│
▼
┌────────────────────────────────────────────┐
│ Output │
│ - Viewer 3D interactif (port 7007) │
│ - Export mesh (.obj, .ply) │
│ - Vidéos flythrough │
└────────────────────────────────────────────┘
Installation¶
Déployé automatiquement via GitLab CI/CD :
cd /opt/probatiovault-ia-server/ansible
ansible-playbook -i inventory/hosts playbooks/install-nerfstudio.yml
Durée : ~5-8 minutes (téléchargement packages)
Premier démarrage¶
1. Dataset d'exemple (LEGO poster)¶
Un dataset d'exemple est téléchargé automatiquement :
ls /data/nerfstudio/data/nerfstudio/poster/
# images/ (100 photos d'un poster LEGO)
# transforms.json (poses caméra pré-calculées)
2. Lancer un training¶
Output :
🚀 Training NeRF with method: nerfacto
📁 Dataset: /data/nerfstudio/data/nerfstudio/poster
──────────────────────────────────────────────────────────────────
Starting training on poster dataset
Step 0: loss=0.5234, PSNR=18.2 dB
Step 100: loss=0.1234, PSNR=25.7 dB
Step 500: loss=0.0234, PSNR=32.1 dB
Step 1000: loss=0.0089, PSNR=35.4 dB ✅
Training complete! (15min 32s)
Viewer running at: http://192.168.1.82:7007
3. Ouvrir le viewer¶
Naviguer vers http://192.168.1.82:7007
Interface : - Rotation 3D (souris) - Zoom (molette) - Export mesh (bouton) - Changement de caméra - Réglages qualité (samples, résolution)
Workflow complet¶
Étape 1 : Prendre des photos¶
Recommandations : - 50-200 photos (plus = meilleur, mais plus lent) - Couvrir tous les angles (360° si possible) - Éclairage stable (pas de variation entre photos) - Éviter le flou (trépied ou vitesse élevée) - Format : JPEG ou PNG (résolution ≥ 1080p)
Exemples d'objets : - ✅ Objets opaques (sculptures, meubles, produits) - ✅ Environnements (pièces, bâtiments, jardins) - ⚠️ Objets transparents (verre, plastique) → résultats moyens - ❌ Objets très réfléchissants (miroirs, chrome) → difficile
Étape 2 : Uploader les photos¶
# Créer un dossier pour votre scène
mkdir -p /data/nerfstudio/data/my-scene/images
# Copier vos photos
cp /chemin/vers/photos/*.jpg /data/nerfstudio/data/my-scene/images/
# Vérifier
ls /data/nerfstudio/data/my-scene/images/
# IMG_001.jpg, IMG_002.jpg, ...
Étape 3 : Lancer le training¶
Méthode 1 : Nerfacto (balanced, recommandé)
- Qualité : ⭐⭐⭐⭐ (excellent)
- Vitesse : 15-30 min sur RTX 5090
- VRAM : ~8-12 GB
- Cas d'usage : Général (objets, scènes)
Méthode 2 : Instant-NGP (ultra-fast)
- Qualité : ⭐⭐⭐ (bon)
- Vitesse : 5-10 min sur RTX 5090
- VRAM : ~4-6 GB
- Cas d'usage : Prototypage rapide, previews
Méthode 3 : Splatfacto (Gaussian Splatting, best quality)
- Qualité : ⭐⭐⭐⭐⭐ (photoréaliste)
- Vitesse : 10-20 min sur RTX 5090
- VRAM : ~15-20 GB
- Cas d'usage : Production (cinéma, VFX, archivage)
Étape 4 : Visualisation (pendant training)¶
Le viewer démarre automatiquement pendant le training :
URL : http://192.168.1.82:7007
Interface :
┌─────────────────────────────────────────────┐
│ [◀] [▶] [▲] [▼] Camera Controls │
│ │
│ ┌───────────────────────────────────────┐ │
│ │ │ │
│ │ [Rendu 3D interactif] │ │
│ │ - Rotation souris │ │
│ │ - Zoom molette │ │
│ │ - Pan shift+souris │ │
│ │ │ │
│ └───────────────────────────────────────┘ │
│ │
│ Training: ████████████░░ 85% │
│ Step: 850/1000 | FPS: 45 │
│ Loss: 0.0124 | PSNR: 33.2 dB │
│ ETA: 2min 15s │
│ │
│ [Export Mesh] [Export Video] [Save] │
└─────────────────────────────────────────────┘
Étape 5 : Export mesh 3D¶
Quand le training est terminé, exporter le mesh :
cd /opt/nerfstudio
# Trouver le chemin de config
CONFIG=$(ls /data/nerfstudio/outputs/my-scene/nerfacto/*/config.yml | head -1)
# Exporter
./export.sh $CONFIG
Output :
🎨 Exporting mesh from config: /data/nerfstudio/outputs/...
Extracting points: ████████████████ 100%
Generating mesh (Poisson reconstruction)...
Decimating to 50,000 faces...
✅ Mesh exported to: /data/nerfstudio/exports/my-scene.ply
Import in Blender: File → Import → PLY
Formats disponibles : - .ply (point cloud + mesh) - .obj (mesh + textures) - .glb (mesh + textures, web-ready)
Méthodes disponibles¶
| Méthode | Qualité | Vitesse | VRAM | Cas d'usage |
|---|---|---|---|---|
| nerfacto | ⭐⭐⭐⭐ | 15-30 min | 8-12 GB | Général (recommandé) |
| instant-ngp | ⭐⭐⭐ | 5-10 min | 4-6 GB | Prototypage rapide |
| splatfacto | ⭐⭐⭐⭐⭐ | 10-20 min | 15-20 GB | Production (meilleure qualité) |
| mipnerf | ⭐⭐⭐⭐ | 30-60 min | 10-14 GB | Scènes multi-échelles |
| tensorf | ⭐⭐⭐ | 20-40 min | 6-10 GB | Scènes larges |
Recommandation : - Débuter : nerfacto (bon compromis) - Production : splatfacto (meilleure qualité) - Rapide : instant-ngp (tests, previews)
Cas d'usage¶
1. Reconstruction d'objets (e-commerce, musées)¶
Input : 50-80 photos d'un objet (tournante)
Exemple :
# Photos de chaussure (360°)
mkdir -p /data/nerfstudio/data/shoe/images
cp photos/*.jpg /data/nerfstudio/data/shoe/images/
# Training
cd /opt/nerfstudio
./train.sh /data/nerfstudio/data/shoe splatfacto
# Export pour web viewer
CONFIG=$(ls /data/nerfstudio/outputs/shoe/splatfacto/*/config.yml | head -1)
ns-export gaussian-splat --load-config $CONFIG --output-dir /data/nerfstudio/exports/
Résultat : Viewer 3D interactif pour site web (Three.js, Babylon.js)
2. Numérisation patrimoine (sculptures, monuments)¶
Input : 100-200 photos haute résolution
Exemple :
# Photos de sculpture
mkdir -p /data/nerfstudio/data/sculpture/images
cp photos/*.jpg /data/nerfstudio/data/sculpture/images/
# Training haute qualité
cd /opt/nerfstudio
ns-train splatfacto \
--data /data/nerfstudio/data/sculpture \
--output-dir /data/nerfstudio/outputs \
--viewer.start-viewer true \
--viewer.host 0.0.0.0 \
--viewer.port 7007 \
--pipeline.model.num-samples 512 # Plus de samples = meilleure qualité
# Export mesh haute résolution
CONFIG=$(ls /data/nerfstudio/outputs/sculpture/splatfacto/*/config.yml | head -1)
ns-export poisson \
--load-config $CONFIG \
--output-dir /data/nerfstudio/exports \
--target-num-faces 200000 \ # Mesh très détaillé
--num-pixels-per-side 4096 # Texture 4K
Résultat : Mesh 3D haute-fidélité pour conservation digitale
3. Visites virtuelles (immobilier, tourisme)¶
Input : 100-150 photos d'une pièce/bâtiment
Exemple :
# Photos d'appartement
mkdir -p /data/nerfstudio/data/apartment/images
cp photos/*.jpg /data/nerfstudio/data/apartment/images/
# Training
cd /opt/nerfstudio
./train.sh /data/nerfstudio/data/apartment nerfacto
# Export vidéo flythrough (visite virtuelle)
CONFIG=$(ls /data/nerfstudio/outputs/apartment/nerfacto/*/config.yml | head -1)
ns-render camera-path \
--load-config $CONFIG \
--camera-path-filename /data/nerfstudio/data/apartment/camera_path.json \
--output-path /data/nerfstudio/exports/apartment-tour.mp4
Résultat : Vidéo 360° haute qualité pour visite virtuelle
4. VFX / Cinéma (assets 3D)¶
Input : Scan volumétrique d'acteurs, décors, props
Exemple :
# Photos d'acteur (tête, 360°)
mkdir -p /data/nerfstudio/data/actor-head/images
cp photos/*.jpg /data/nerfstudio/data/actor-head/images/
# Training ultra-haute qualité (Gaussian Splatting)
cd /opt/nerfstudio
ns-train splatfacto \
--data /data/nerfstudio/data/actor-head \
--output-dir /data/nerfstudio/outputs \
--viewer.start-viewer true \
--viewer.host 0.0.0.0 \
--viewer.port 7007 \
--pipeline.model.num-points 1000000 # 1M points Gaussiens
# Export pour Blender/Unreal Engine
CONFIG=$(ls /data/nerfstudio/outputs/actor-head/splatfacto/*/config.yml | head -1)
ns-export gaussian-splat --load-config $CONFIG --output-dir /data/nerfstudio/exports/
Résultat : Asset 3D photoréaliste pour intégration VFX
Commandes avancées¶
Training personnalisé (full control)¶
ns-train nerfacto \
--data /data/nerfstudio/data/my-scene \
--output-dir /data/nerfstudio/outputs \
--viewer.start-viewer true \
--viewer.host 0.0.0.0 \
--viewer.port 7007 \
--max-num-iterations 30000 \ # Plus d'itérations = meilleure qualité
--pipeline.datamanager.train-num-rays-per-batch 4096 \ # Plus de rays = plus rapide (si VRAM suffisant)
--pipeline.model.background-color white \ # Fond blanc (défaut: noir)
--logging.steps-per-log 10
Export mesh (paramètres avancés)¶
CONFIG=/data/nerfstudio/outputs/my-scene/nerfacto/*/config.yml
# Méthode 1: Poisson (smooth, pour objets fermés)
ns-export poisson \
--load-config $CONFIG \
--output-dir /data/nerfstudio/exports \
--target-num-faces 100000 \ # Nombre de faces (plus = plus détaillé)
--num-pixels-per-side 2048 \ # Résolution texture
--normal-method open3d # Méthode calcul normales
# Méthode 2: Marching Cubes (précis, pour scènes complexes)
ns-export tsdf \
--load-config $CONFIG \
--output-dir /data/nerfstudio/exports \
--resolution 512 # Grille voxel (plus = plus détaillé, mais plus lent)
Export vidéo (flythrough)¶
CONFIG=/data/nerfstudio/outputs/my-scene/nerfacto/*/config.yml
# Méthode 1: Chemin de caméra prédéfini
ns-render camera-path \
--load-config $CONFIG \
--camera-path-filename /data/nerfstudio/data/my-scene/camera_path.json \
--output-path /data/nerfstudio/exports/flythrough.mp4 \
--rendered-output-names rgb depth \ # Rendu RGB + depth map
--image-format mp4 \
--jpeg-quality 100
# Méthode 2: Interpolation entre poses existantes
ns-render interpolate \
--load-config $CONFIG \
--pose-source train \ # Utiliser poses du training
--output-path /data/nerfstudio/exports/interpolated.mp4 \
--frame-rate 30 \
--seconds 10
Intégration Homer¶
Nerfstudio est référencé dans le dashboard Homer :
- name: "IA & Machine Learning"
items:
- name: "Nerfstudio"
logo: "assets/tools/nerfstudio.png"
subtitle: "Neural Radiance Fields - 3D reconstruction"
url: "http://192.168.1.82:7007"
Accès depuis Homer : http://192.168.1.82:8080
Troubleshooting¶
Training très lent¶
# Vérifier utilisation GPU
nvidia-smi
# Si utilisation faible (~10%) :
# → Augmenter num-rays-per-batch (si VRAM disponible)
ns-train nerfacto \
--data /data/nerfstudio/data/my-scene \
--pipeline.datamanager.train-num-rays-per-batch 8192 # Défaut: 4096
# Si CUDA out of memory :
# → Réduire num-rays-per-batch
ns-train nerfacto \
--data /data/nerfstudio/data/my-scene \
--pipeline.datamanager.train-num-rays-per-batch 2048
COLMAP échoue (poses caméra)¶
Si COLMAP ne parvient pas à calculer les poses :
# Vérifier que photos ont EXIF (metadata caméra)
exiftool /data/nerfstudio/data/my-scene/images/*.jpg | grep "Focal Length"
# Si pas d'EXIF, spécifier manuellement :
ns-process-data images \
--data /data/nerfstudio/data/my-scene/images \
--output-dir /data/nerfstudio/data/my-scene \
--camera-type perspective \
--matching-method exhaustive # Plus lent mais plus robuste
Erreurs communes : - Photos trop floues → COLMAP échoue (reprendre photos nettes) - Éclairage variable → Mauvaises correspondances (éclairage stable requis) - Trop peu de photos (< 30) → Poses instables (minimum 50 photos)
Résultat flou ou bruité¶
# Augmenter nombre d'itérations
ns-train nerfacto \
--data /data/nerfstudio/data/my-scene \
--max-num-iterations 50000 # Défaut: 30000
# Passer à une méthode plus précise
cd /opt/nerfstudio
./train.sh /data/nerfstudio/data/my-scene splatfacto
Viewer ne charge pas¶
# Vérifier que service tourne
sudo systemctl status nerfstudio
# Vérifier logs
sudo journalctl -u nerfstudio -n 50
# Redémarrer viewer
sudo systemctl restart nerfstudio
# Tester manuellement
cd /opt/nerfstudio
python3 -m nerfstudio.scripts.viewer.run_viewer --host 0.0.0.0 --port 7007
Export mesh vide¶
# Vérifier que training est terminé (loss < 0.01)
# Si training incomplet, continuer :
ns-train nerfacto \
--data /data/nerfstudio/data/my-scene \
--load-dir /data/nerfstudio/outputs/my-scene/nerfacto/TIMESTAMP \ # Reprendre training
--max-num-iterations 50000
# Essayer méthode d'export alternative
CONFIG=/data/nerfstudio/outputs/my-scene/nerfacto/*/config.yml
ns-export tsdf --load-config $CONFIG --output-dir /data/nerfstudio/exports
Maintenance¶
Nettoyage outputs anciens¶
# Supprimer outputs > 30 jours
find /data/nerfstudio/outputs -type d -mtime +30 -exec rm -rf {} \;
# Vérifier espace disque
du -sh /data/nerfstudio/*
Mise à jour Nerfstudio¶
# Pull dernière version
sudo pip3 install --upgrade nerfstudio
# Redémarrer service
sudo systemctl restart nerfstudio
# Vérifier version
python3 -c "import nerfstudio; print(nerfstudio.__version__)"
Sauvegarde projets¶
# Sauvegarder un projet complet
sudo tar czf /tmp/nerfstudio-my-scene-$(date +%Y%m%d).tar.gz \
/data/nerfstudio/data/my-scene \
/data/nerfstudio/outputs/my-scene
# Copier sur NAS
cp /tmp/nerfstudio-*.tar.gz /mnt/nas/backups/
Ressources¶
- Documentation officielle : https://docs.nerf.studio
- GitHub : https://github.com/nerfstudio-project/nerfstudio
- Discord : https://discord.gg/RFSHkYuD4v
- Paper : https://arxiv.org/abs/2302.04264
Résumé des ports¶
| Service | Port | Protocole | Accès |
|---|---|---|---|
| Nerfstudio Viewer | 7007 | HTTP | LAN uniquement |
Comparaison avec alternatives¶
| Solution | Qualité | Vitesse | Coût | Facilité |
|---|---|---|---|---|
| Nerfstudio (RTX 5090) | ⭐⭐⭐⭐⭐ | 10-30 min | Gratuit | Moyenne |
| Polycam | ⭐⭐⭐⭐ | 5-10 min | $20/mois | Facile |
| RealityCapture | ⭐⭐⭐⭐ | 30-60 min | $99/mois | Moyenne |
| Meshroom | ⭐⭐⭐ | 60-120 min | Gratuit | Difficile |
| Luma AI | ⭐⭐⭐⭐ | 10-20 min | $29/mois | Très facile |
Avantages Nerfstudio : - ✅ Gratuit et open-source - ✅ Meilleure qualité (Gaussian Splatting) - ✅ Contrôle total (paramètres, exports) - ✅ Données privées (RGPD compliant) - ✅ GPU local (RTX 5090) = très rapide
Avantages cloud : - ✅ Pas de gestion infrastructure - ✅ Interface plus simple - ✅ Mobile app (scan avec smartphone)