Home

Awesome

DiffusioNeRF: Regularizing Neural Radiance Fields with Denoising Diffusion Models

Jamie Wynn and Daniyar Turmukhambetov – CVPR 2023

Paper | Supplementary material

<p align="center"> <a href="https://youtu.be/zyRbeBbM-mw"> <img src="assets/video_thumbnail.png" alt="2 minute video" width="500"> </a> </p>

Update 1:

It was brought to our attention that we incorrectly used Alex-net to compute LPIPS (and subsequently Average) metrics for our networks in Table 1 of the CVPR-version of the paper. We have now updated the table by using VGG network scores and updated the paper on arxiv.

Quickstart

This section will walk you through setting up DiffusioNeRF and using it to fit a NeRF to a scene from LLFF.

Hardware requirements

You will need a relatively powerful graphics card to run DiffusioNeRF, in part due to the use of the tiny-cuda-nn framework. All of our experiments were performed on an A100.

Conda environment

Create the DiffusioNeRF Conda environment using:

conda env create -f environment.yml

Downloading the pretrained diffusion model

To download the RGBD patch diffusion model which we trained for our experiments, run (from the root of this repo):

mkdir models && wget https://storage.googleapis.com/niantic-lon-static/research/diffusionerf/rgbd-patch-diffusion.pt -O models/rgbd-patch-diffusion.pt

Prepare the LLFF dataset

First acquire the LLFF dataset by downloading and extracting nerf_llff_data.zip from the official link provided by the NeRF repository. Extract it to ./data/nerf_llff_data relative to the root of this repo.

After downloading it, you must preprocess it into the required format by running the included scripts/preprocess_llff.sh from inside the root directory of the extracted LLFF dataset. This will generate a transforms.json for each scene.

Run on the LLFF dataset

You can now fit a NeRF to an LLFF scene using our regularizers by running from the root of the repo:

bash scripts/run_diffusionerf_example.sh

The arguments passed in this script correspond to the configuration reported as ours in the paper.

Image-by-image metrics will be written to the output folder (which with the above script will be ./runs/example/3_poses/room/) under metrics.json. You should obtain an average test PSNR of about 21.6 with this script.

To change the script to run a full LLFF evaluation, just delete the --only_run_on room argument to run on all scenes, and change --num_train 3 to --num_train 3 6 9 to run each scene with 3, 6 and 9 training views.

To run without our learned diffusion model regularizer, just drop the --patch_regulariser_path argument; to run without the Mipnerf-360 loss, drop the --spread_loss_strength 1.e-5.

Run on other scenes

nerf/evaluate.py, which is used in the above steps, is just a wrapper around main.py; if you want to run on other data, you should use main.py. The data should be in the NeRF 'blender' format, i.e. it should contain a transforms.json file.

Citation

If you find our work useful or interesting, please consider citing our paper:

@inproceedings{wynn-2023-diffusionerf,
 title   = {{DiffusioNeRF: Regularizing Neural Radiance Fields with Denoising Diffusion Models}},
 author  = {Jamie Wynn and
            Daniyar Turmukhambetov
           },
 booktitle = {CVPR},
 year = {2023}
}

Acknowledgements

This code is built on torch-ngp. It also uses functions from denoising-diffusion-pytorch.

License

Copyright © Niantic, Inc. 2023. Patent Pending. All rights reserved. Please see the license file for terms.