Этот репозиторий содержит:
Новости : Чистая и улучшенная версия, посвященная статической реконструкции NERF реалистичных сцен, была разделена на nerf_template, так как этот репозиторий было трудно поддерживать.
Интерактивное обучение/рендеринг мгновенного NGP на LEGO:
Также первая интерактивная реализация деформируемого инерфа:
ngp_pl: pytorch+cuda, обученный с помощью пирога.
JNERF: NERF Clarkmark на основе Jittor.
Hashnerf-Pytorch: чистая реализация Pytorch.
Dreamfields-Torch: Pytorch+CUDA Реализация генерации объектов с нулевым выстрелом с полями мечты на основе этого репозитория.
git clone --recursive https://github.com/ashawkey/torch-ngp.git
cd torch-ngppip install -r requirements.txt
# (optional) install the tcnn backbone
pip install git+https://github.com/NVlabs/tiny-cuda-nn/ # subdirectory=bindings/torchconda env create -f environment.yml
conda activate torch-ngp По умолчанию мы используем load для создания расширения во время выполнения. Однако иногда это может быть неудобно. Поэтому мы также предоставляем setup.py для создания каждого расширения:
# install all extension modules
bash scripts/install_ext.sh
# if you want to install manually, here is an example:
cd raymarching
python setup.py build_ext --inplace # build ext only, do not install (only can be used in the parent directory)
pip install . # install to python path (you still need the raymarching/ folder, since this only install the built extension.) В настоящее время --ff поддерживает только графические процессоры с архитектурой CUDA >= 70 . Для графических процессоров с более низкой архитектурой --tcnn все еще можно использовать, но скорость будет медленнее по сравнению с более поздними графическими процессорами.
Мы используем тот же формат данных, что и мгновенный NGP, например, Armadillo и Fox. Пожалуйста, скачайте и поместите их под ./data .
Мы также поддерживаем набор данных по себе и преобразовываем другие форматы (например, LLFF, Tanks & Gears, MIP-Snerf 360) в формат NERF, с подробной информацией в следующем блоке кода.
nerf_synthetic
Танки и храмы: [сценарий конверсии]
LLFF: [Сценарий конверсии]
Mip-nerf 360: [сценарий конверсии]
(динамический) d-nerf
(Динамический) Hyper-Snerf: [Сценарий конверсии]
Первый раз, когда забег займет некоторое время, чтобы скомпилировать расширения CUDA.
# ## Instant-ngp NeRF
# train with different backbones (with slower pytorch ray marching)
# for the colmap dataset, the default dataset setting `--bound 2 --scale 0.33` is used.
python main_nerf.py data/fox --workspace trial_nerf # fp32 mode
python main_nerf.py data/fox --workspace trial_nerf --fp16 # fp16 mode (pytorch amp)
python main_nerf.py data/fox --workspace trial_nerf --fp16 --ff # fp16 mode + FFMLP (this repo's implementation)
python main_nerf.py data/fox --workspace trial_nerf --fp16 --tcnn # fp16 mode + official tinycudann's encoder & MLP
# use CUDA to accelerate ray marching (much more faster!)
python main_nerf.py data/fox --workspace trial_nerf --fp16 --cuda_ray # fp16 mode + cuda raymarching
# preload data into GPU, accelerate training but use more GPU memory.
python main_nerf.py data/fox --workspace trial_nerf --fp16 --preload
# one for all: -O means --fp16 --cuda_ray --preload, which usually gives the best results balanced on speed & performance.
python main_nerf.py data/fox --workspace trial_nerf -O
# test mode
python main_nerf.py data/fox --workspace trial_nerf -O --test
# construct an error_map for each image, and sample rays based on the training error (slow down training but get better performance with the same number of training steps)
python main_nerf.py data/fox --workspace trial_nerf -O --error_map
# use a background model (e.g., a sphere with radius = 32), can supress noises for real-world 360 dataset
python main_nerf.py data/firekeeper --workspace trial_nerf -O --bg_radius 32
# start a GUI for NeRF training & visualization
# always use with `--fp16 --cuda_ray` for an acceptable framerate!
python main_nerf.py data/fox --workspace trial_nerf -O --gui
# test mode for GUI
python main_nerf.py data/fox --workspace trial_nerf -O --gui --test
# for the blender dataset, you should add `--bound 1.0 --scale 0.8 --dt_gamma 0`
# --bound means the scene is assumed to be inside box[-bound, bound]
# --scale adjusts the camera locaction to make sure it falls inside the above bounding box.
# --dt_gamma controls the adaptive ray marching speed, set to 0 turns it off.
python main_nerf.py data/nerf_synthetic/lego --workspace trial_nerf -O --bound 1.0 --scale 0.8 --dt_gamma 0
python main_nerf.py data/nerf_synthetic/lego --workspace trial_nerf -O --bound 1.0 --scale 0.8 --dt_gamma 0 --gui
# for the LLFF dataset, you should first convert it to nerf-compatible format:
python scripts/llff2nerf.py data/nerf_llff_data/fern # by default it use full-resolution images, and write `transforms.json` to the folder
python scripts/llff2nerf.py data/nerf_llff_data/fern --images images_4 --downscale 4 # if you prefer to use the low-resolution images
# then you can train as a colmap dataset (you'll need to tune the scale & bound if necessary):
python main_nerf.py data/nerf_llff_data/fern --workspace trial_nerf -O
python main_nerf.py data/nerf_llff_data/fern --workspace trial_nerf -O --gui
# for the Tanks&Temples dataset, you should first convert it to nerf-compatible format:
python scripts/tanks2nerf.py data/TanksAndTemple/Family # write `trainsforms_{split}.json` for [train, val, test]
# then you can train as a blender dataset (you'll need to tune the scale & bound if necessary)
python main_nerf.py data/TanksAndTemple/Family --workspace trial_nerf_family -O --bound 1.0 --scale 0.33 --dt_gamma 0
python main_nerf.py data/TanksAndTemple/Family --workspace trial_nerf_family -O --bound 1.0 --scale 0.33 --dt_gamma 0 --gui
# for custom dataset, you should:
# 1. take a video / many photos from different views
# 2. put the video under a path like ./data/custom/video.mp4 or the images under ./data/custom/images/*.jpg.
# 3. call the preprocess code: (should install ffmpeg and colmap first! refer to the file for more options)
python scripts/colmap2nerf.py --video ./data/custom/video.mp4 --run_colmap # if use video
python scripts/colmap2nerf.py --images ./data/custom/images/ --run_colmap # if use images
python scripts/colmap2nerf.py --video ./data/custom/video.mp4 --run_colmap --dynamic # if the scene is dynamic (for D-NeRF settings), add the time for each frame.
# 4. it should create the transform.json, and you can train with: (you'll need to try with different scale & bound & dt_gamma to make the object correctly located in the bounding box and render fluently.)
python main_nerf.py data/custom --workspace trial_nerf_custom -O --gui --scale 2.0 --bound 1.0 --dt_gamma 0.02
# ## Instant-ngp SDF
python main_sdf.py data/armadillo.obj --workspace trial_sdf
python main_sdf.py data/armadillo.obj --workspace trial_sdf --fp16
python main_sdf.py data/armadillo.obj --workspace trial_sdf --fp16 --ff
python main_sdf.py data/armadillo.obj --workspace trial_sdf --fp16 --tcnn
python main_sdf.py data/armadillo.obj --workspace trial_sdf --fp16 --test
# ## TensoRF
# almost the same as Instant-ngp NeRF, just replace the main script.
python main_tensoRF.py data/fox --workspace trial_tensoRF -O
python main_tensoRF.py data/nerf_synthetic/lego --workspace trial_tensoRF -O --bound 1.0 --scale 0.8 --dt_gamma 0
# ## CCNeRF
# training on single objects, turn on --error_map for better quality.
python main_CCNeRF.py data/nerf_synthetic/chair --workspace trial_cc_chair -O --bound 1.0 --scale 0.67 --dt_gamma 0 --error_map
python main_CCNeRF.py data/nerf_synthetic/ficus --workspace trial_cc_ficus -O --bound 1.0 --scale 0.67 --dt_gamma 0 --error_map
python main_CCNeRF.py data/nerf_synthetic/hotdog --workspace trial_cc_hotdog -O --bound 1.0 --scale 0.67 --dt_gamma 0 --error_map
# compose, use a larger bound and more samples per ray for better quality.
python main_CCNeRF.py data/nerf_synthetic/hotdog --workspace trial_cc_hotdog -O --bound 2.0 --scale 0.67 --dt_gamma 0 --max_steps 2048 --test --compose
# compose + gui, only about 1 FPS without dynamic resolution... just for quick verification of composition results.
python main_CCNeRF.py data/nerf_synthetic/hotdog --workspace trial_cc_hotdog -O --bound 2.0 --scale 0.67 --dt_gamma 0 --test --compose --gui
# ## D-NeRF
# almost the same as Instant-ngp NeRF, just replace the main script.
# use deformation to model dynamic scene
python main_dnerf.py data/dnerf/jumpingjacks --workspace trial_dnerf_jumpingjacks -O --bound 1.0 --scale 0.8 --dt_gamma 0
python main_dnerf.py data/dnerf/jumpingjacks --workspace trial_dnerf_jumpingjacks -O --bound 1.0 --scale 0.8 --dt_gamma 0 --gui
# use temporal basis to model dynamic scene
python main_dnerf.py data/dnerf/jumpingjacks --workspace trial_dnerf_basis_jumpingjacks -O --bound 1.0 --scale 0.8 --dt_gamma 0 --basis
python main_dnerf.py data/dnerf/jumpingjacks --workspace trial_dnerf_basis_jumpingjacks -O --bound 1.0 --scale 0.8 --dt_gamma 0 --basis --gui
# for the hypernerf dataset, first convert it into nerf-compatible format:
python scripts/hyper2nerf.py data/split-cookie --downscale 2 # will generate transforms*.json
python main_dnerf.py data/split-cookie/ --workspace trial_dnerf_cookies -O --bound 1 --scale 0.3 --dt_gamma 0 Проверьте каталог scripts для получения дополнительных примеров.
Протестировано с настройками по умолчанию в наборе данных LEGO. Здесь скорость относится к iterations per second на V100.
| Модель | Расколоть | PSNR | Скорость поезда | Скорость испытания |
|---|---|---|---|---|
| instant-ngp (бумага) | Trainval? | 36.39 | - | - |
instant -ngp ( -O ) | Поезд (30 тысяч шагов) | 34.15 | 97 | 7,8 |
instant -ngp ( -O --error_map ) | Поезд (30 тысяч шагов) | 34,88 | 50 | 7,8 |
instant -ngp ( -O ) | Trainval (40 тысяч шагов) | 35,22 | 97 | 7,8 |
instant -ngp ( -O --error_map ) | Trainval (40 тысяч шагов) | 36.00 | 50 | 7,8 |
| Tensorf (бумага) | Поезд (30 тысяч шагов) | 36.46 | - | - |
Tensorf ( -O ) | Поезд (30 тысяч шагов) | 35,05 | 51 | 2.8 |
Tensorf ( -O --error_map ) | Поезд (30 тысяч шагов) | 35,84 | 14 | 2.8 |
В : Как выбрать основу сети?
A : Флаг -O , который использует нативную смешанную точность Pytorch, подходит для большинства случаев. Я не нахожу очень значительное улучшение для --tcnn и --ff , и им требуется дополнительное здание. Кроме того, некоторые новые функции могут быть доступны только для режима -O умолчанию.
Q : CUDA Out из памяти для моего набора данных.
A : Вы можете попытаться выключить --preload , которая загружает все изображения в GPU для ускорения (если использовать -O , измените его на --fp16 --cuda_ray ). Другое решение состоит в том, чтобы вручную установить downscale в NeRFDataset для снижения разрешения изображения.
Q : Как настраивать bound и scale ?
A : Вы можете начать с большой bound (например, 16) или небольшого scale (например, 0,3), чтобы убедиться, что объект попадает в ограничивающую коробку. Режим графического интерфейса может использоваться для интерактивного сокращения bound , чтобы найти подходящее значение. Нарушение этой линии визуализирует позы камеры, и в этом выпуске можно найти несколько хороших примеров.
Q : Шумные новые представления для реалистичных наборов данных.
A : Вы можете попробовать установить bg_radius в большом значении, например, 32. Он обучает дополнительную карту среды для моделирования фона на реалистичных фотографиях. Большая bound также поможет. Пример для bg_radius в наборе данных FireKeeper: 
[0, 1] и центрирована в (0.5, 0.5, 0.5) , эта репо предполагает, что сцена ограничена в коробке [-bound, bound] и центрирована в (0, 0, 0) . Следовательно, функциональность aabb_scale заменяется bound здесь.trunc_exp в качестве активации плотности вместо softplus . Обрезка альфа-маски заменяется пробоотборником сетки плотности от Instant-NGP, который разделяет ту же логику для ускорения.Если вы найдете эту работу полезной, цитата будет оценена через:
@misc{torch-ngp,
Author = {Jiaxiang Tang},
Year = {2022},
Note = {https://github.com/ashawkey/torch-ngp},
Title = {Torch-ngp: a PyTorch implementation of instant-ngp}
}
@article{tang2022compressible,
title = {Compressible-composable NeRF via Rank-residual Decomposition},
author = {Tang, Jiaxiang and Chen, Xiaokang and Wang, Jingbo and Zeng, Gang},
journal = {arXiv preprint arXiv:2205.14870},
year = {2022}
}
Кредиты Томасу Мюллеру за удивительные крошечные куда-нн и мгновенный-Нг:
@misc{tiny-cuda-nn,
Author = {Thomas M"uller},
Year = {2021},
Note = {https://github.com/nvlabs/tiny-cuda-nn},
Title = {Tiny {CUDA} Neural Network Framework}
}
@article{mueller2022instant,
title = {Instant Neural Graphics Primitives with a Multiresolution Hash Encoding},
author = {Thomas M"uller and Alex Evans and Christoph Schied and Alexander Keller},
journal = {arXiv:2201.05989},
year = {2022},
month = jan
}
Структура NERF адаптирована из NERF_PL:
@misc{queianchen_nerf,
author = {Quei-An, Chen},
title = {Nerf_pl: a pytorch-lightning implementation of NeRF},
url = {https://github.com/kwea123/nerf_pl/},
year = {2020},
}
Официальная реализация тензора:
@article{TensoRF,
title={TensoRF: Tensorial Radiance Fields},
author={Chen, Anpei and Xu, Zexiang and Geiger, Andreas and Yu, Jingyi and Su, Hao},
journal={arXiv preprint arXiv:2203.09517},
year={2022}
}
GUI Nerf разработан с Dearpygui.