Implémentation officielle de « Splatter Image : Reconstruction 3D ultra-rapide à vue unique » (CVPR 2024)
[16 avril 2024] Plusieurs grosses mises à jour du projet depuis la première version :
Découvrez la démo en ligne. Exécuter la démo localement sera souvent encore plus rapide et vous pourrez voir les boucles rendues avec Gaussian Splatting (par opposition à l'objet .ply extrait qui peut montrer des artefacts). Pour exécuter la démo localement, suivez simplement les instructions d'installation ci-dessous, puis appelez :
python gradio_app.py
conda create --name splatter-image
conda activate splatter-image
Installez Pytorch en suivant les instructions officielles. La combinaison Pytorch / Python / Pytorch3D dont le fonctionnement a été vérifié est :
Installez d'autres exigences :
pip install -r requirements.txt
Installez le moteur de rendu Gaussian Splatting, c'est-à-dire la bibliothèque permettant de restituer un nuage de points gaussien sur une image. Pour ce faire, extrayez le référentiel Gaussian Splatting et, avec votre environnement conda activé, exécutez pip install submodules/diff-gaussian-rasterization
. Vous devrez répondre aux exigences matérielles et logicielles. Nous avons réalisé toutes nos expérimentations sur un GPU NVIDIA A6000 et mesures de vitesse sur un GPU NVIDIA V100.
Si vous souhaitez vous entraîner sur les données CO3D, vous devrez installer Pytorch3D 0.7.2. Voir les instructions ici. Il est recommandé d'installer avec pip à partir d'un binaire pré-construit. Trouvez un binaire compatible ici et installez-le avec pip
. Par exemple, avec Python 3.8, Pytorch 1.13.0, CUDA 11.6, exécutez pip install --no-index --no-cache-dir pytorch3d -f https://anaconda.org/pytorch3d/pytorch3d/0.7.2/download/linux-64/pytorch3d-0.7.2-py38_cu116_pyt1130.tar.bz2
.
Pour la formation/évaluation sur les classes ShapeNet-SRN (voitures, chaises), veuillez télécharger le srn_*.zip (* = voitures ou chaises) à partir du dossier de données PixelNeRF. Décompressez le fichier de données et remplacez SHAPENET_DATASET_ROOT
dans datasets/srn.py
par le dossier parent du dossier décompressé. Par exemple, si la structure de vos dossiers est : /home/user/SRN/srn_cars/cars_train
, dans datasets/srn.py
définissez SHAPENET_DATASET_ROOT="/home/user/SRN"
. Aucun prétraitement supplémentaire n’est nécessaire.
Pour la formation/évaluation sur CO3D, téléchargez les classes de bouche d'incendie et d'ours en peluche à partir de la version CO3D. Pour ce faire, exécutez les commandes suivantes :
git clone https://github.com/facebookresearch/co3d.git
cd co3d
mkdir DOWNLOAD_FOLDER
python ./co3d/download_dataset.py --download_folder DOWNLOAD_FOLDER --download_categories hydrant,teddybear
Ensuite, définissez CO3D_RAW_ROOT
sur votre DOWNLOAD_FOLDER
dans data_preprocessing/preoprocess_co3d.py
. Définissez CO3D_OUT_ROOT
là où vous souhaitez stocker les données prétraitées. Courir
python -m data_preprocessing.preprocess_co3d
et définissez CO3D_DATASET_ROOT:=CO3D_OUT_ROOT
.
Pour ShapeNet multi-catégories, nous utilisons l'ensemble de données ShapeNet 64x64 par NMR hébergé par les auteurs DVR qui peut être téléchargé ici. Décompressez le dossier et définissez NMR_DATASET_ROOT
sur le répertoire contenant les dossiers de sous-catégorie après la décompression. En d'autres termes, le répertoire NMR_DATASET_ROOT
doit contenir les dossiers 02691156
, 02828884
, 02933112
etc.
Pour la formation sur Objaverse, nous avons utilisé des rendus de Zero-1-to-3 qui peuvent être téléchargés avec la commande suivante :
wget https://tri-ml-public.s3.amazonaws.com/datasets/views_release.tar.gz
Avertissement : notez que les rendus sont générés avec Objaverse. Les rendus dans leur ensemble sont publiés sous la licence ODC-By 1.0. Les licences pour les rendus d'objets individuels sont publiées sous la même licence Creative Commons que dans Objaverse.
De plus, veuillez télécharger lvis-annotations-filtered.json
à partir du référentiel de modèles. Ce json qui contient la liste des identifiants des objets du sous-ensemble LVIS. Ces actifs sont de meilleure qualité.
Définissez OBJAVERSE_ROOT
dans datasets/objaverse.py
sur le répertoire du dossier décompressé avec les rendus, et définissez OBJAVERSE_LVIS_ANNOTATION_PATH
dans le même fichier sur le répertoire du fichier .json
téléchargé.
Notez que l'ensemble de données Objaverse est destiné uniquement à la formation et à la validation. Il n'a pas de sous-ensemble de test.
Pour évaluer le modèle formé sur Objaverse, nous utilisons l'ensemble de données Google Scanned Objects pour garantir qu'il n'y a pas de chevauchement avec l'ensemble de formation. Téléchargez les rendus fournis par Free3D. Décompressez le dossier téléchargé et définissez GSO_ROOT
dans datasets/gso.py
dans le répertoire du dossier décompressé.
Notez que l'ensemble de données Google Scanned Objects n'est pas destiné à la formation. Il permet de tester le modèle formé sur Objaverse.
Des modèles pré-entraînés pour tous les ensembles de données sont désormais disponibles via Huggingface Models. Si vous souhaitez simplement exécuter une évaluation qualitative/quantitative, vous n'avez pas besoin de les télécharger manuellement, elles seront utilisées automatiquement si vous exécutez le script d'évaluation (voir ci-dessous).
Vous pouvez également les télécharger manuellement si vous le souhaitez, en cliquant manuellement sur le bouton de téléchargement sur la page des fichiers de modèles Huggingface. Téléchargez le fichier de configuration avec celui-ci et consultez eval.py
pour savoir comment le modèle est chargé.
Une fois que vous avez téléchargé l'ensemble de données pertinent, l'évaluation peut être exécutée avec
python eval.py $dataset_name
$dataset_name
est le nom de l'ensemble de données. Nous soutenons :
gso
(objets scannés Google),objaverse
(Objaverse-LVIS),nmr
(ShapeNet multi-catégories),hydrants
(bouche CO3D),teddybears
en peluche (ours en peluche CO3D),cars
(voitures ShapeNet),chairs
(chaises ShapeNet). Le code téléchargera automatiquement le modèle pertinent pour l'ensemble de données demandé.Vous pouvez également entraîner vos propres modèles et les évaluer avec
python eval.py $dataset_name --experiment_path $experiment_path
$experiment_path
doit contenir un fichier model_latest.pth
et un dossier .hydra
contenant config.yaml
.
Pour évaluer le fractionnement de validation, appelez avec l'option --split val
.
Pour enregistrer les rendus des objets avec la caméra se déplaçant en boucle, appelez avec l'option --split vis
. Avec cette option, les scores quantitatifs ne sont pas renvoyés puisque les images de vérité terrain ne sont pas disponibles dans tous les ensembles de données.
Vous pouvez définir le nombre d'objets pour enregistrer les rendus avec l'option --save_vis
. Vous pouvez définir où enregistrer les rendus avec l'option --out_folder
.
Les modèles à vue unique sont formés en deux étapes, d'abord sans LPIPS (la majeure partie de la formation), suivie d'un réglage fin avec LPIPS.
python train_network.py +dataset=$dataset_name
opt.pretrained_ckpt
(définie par défaut sur null). python train_network.py +dataset=$dataset_name +experiment=$lpips_experiment_name
$lpips_experiment_name
à utiliser dépend de l'ensemble de données. Si $dataset_name se trouve dans [cars,hydrants,teddybears], utilisez lpips_100k.yaml. Si $dataset_name est une chaise, utilisez lpips_200k.yaml. Si $dataset_name est nmr, utilisez lpips_nmr.yaml. Si $dataset_name est objaverse, utilisez lpips_objaverse.yaml. Pensez à placer le répertoire du modèle de la première étape dans le fichier .yaml approprié avant de lancer la deuxième étape.Pour entraîner une exécution de modèle à deux vues :
python train_network.py +dataset=cars cam_embd=pose_pos data.input_images=2 opt.imgs_per_obj=5
La boucle de formation est implémentée dans train_network.py
et le code d'évaluation est dans eval.py
. Les ensembles de données sont implémentés dans datasets/srn.py
et datasets/co3d.py
. Le modèle est implémenté dans scene/gaussian_predictor.py
. L'appel au moteur de rendu se trouve dans gaussian_renderer/__init__.py
.
Le rastériseur gaussien suppose l'ordre des lignes majeures des matrices de transformation de corps rigides, c'est-à-dire que les vecteurs de position sont des vecteurs de lignes. Cela nécessite également des caméras dans la convention COLMAP / OpenCV, c'est-à-dire que x pointe vers la droite, y vers le bas et z loin de la caméra (vers l'avant).
@inproceedings{szymanowicz24splatter,
title={Splatter Image: Ultra-Fast Single-View 3D Reconstruction},
author={Stanislaw Szymanowicz and Christian Rupprecht and Andrea Vedaldi},
year={2024},
booktitle={The IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
}
S. Szymanowicz est soutenu par une bourse de partenariats de formation doctorale (DTP) EP/R513295/1 de l'EPSRC et par la bourse Oxford-Ashton. A. Vedaldi est soutenu par ERC-CoG UNION 101001212. Nous remercions Eldar Insafutdinov pour son aide avec les exigences d'installation.