Instant neural graphics primitives: lightning fast NeRF and more
即时神经图形原语
这是一个Windows安装教程的分叉版本,主要代码不会更新。 观看这个YouTube教程,更轻松地了解安装过程,如果有问题,请加入我的discord频道提问。

是否曾想在5秒内训练一只狐狸的NeRF模型?或者从工厂机器人照片中飞越场景?当然想过!
这里实现了四个__神经图形原语__:神经辐射场(NeRF)、signed距离函数(SDFs)、神经图像和神经体积。在每种情况下,我们使用tiny-cuda-nn框架训练并渲染具有多分辨率哈希输入编码的MLP。
多分辨率哈希编码的即时神经图形原语
Thomas Müller, Alex Evans, Christoph Schied, Alexander Keller
arXiv:2201.05989 [cs.CV], 2022年1月
[ 项目页面 ] [ 论文 ] [ 视频 ] [ BibTeX ]
如需商业咨询,请访问我们的网站并填写表格:NVIDIA Research Licensing
要求
- 一个__NVIDIA GPU__;如果可用,Tensor核心会提高性能。所有展示结果来自RTX 3090。
- Python版本:3.9.*
- Visual Studio Community 2019(最新版最佳,约8GB)以下是安装要求

- CUDA v11.6。可以通过任何提示符中的
nvcc --version检查CUDA版本,如果不是CUDA11.6,请参考this link来切换/安装正确的版本。 - 在某些机器上,
pyexr通过pip拒绝安装。这可以通过从此处下载OpenEXR来解决。请参阅后续步骤。 - 此安装教程将使用Anaconda。在这里下载AnacondaPrompt:https://www.anaconda.com/products/individual。
- OptiX 7.3或更高版本,用于更快的网格SDF训练。您需要登录或加入才能获取安装程序。如果未自动发现,请设置系统环境变量
OptiX_INSTALL_DIR为安装目录。应如下所示:
编译
将这些文件复制到C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\extras\visual_studio_integration\MSBuildExtensions
到此处C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations
导航到您想要下载代码的目录。例如:cd F:\Tutorial\ngp\
首先克隆此存储库及其所有子模块,使用以下命令(如果您没有git,请在此处下载https://git-scm.com/download/win并将它添加到路径):
$ git clone --recursive https://github.com/nvlabs/instant-ngp
$ cd instant-ngp
如果您的Python不是3.9(用命令python --version检查),则需要运行以下命令将其升级到3.9.*:
conda install python=3.9
然后打开开发者命令提示符,您可以在搜索栏中找到它。

然后cd到您克隆的仓库,使您处于其根目录/instant-ng/下:
cmake . -B build
cmake --build build --config RelWithDebInfo -j 16
如果以上任一构建失败,请在创建问题之前查看可能的修复列表https://github.com/NVlabs/instant-ngp#troubleshooting-compile-errors。
如果自动GPU架构检测失败(例如,如果您已安装多个GPU),则需要为要使用的GPU设置TCNN_CUDA_ARCHITECTURES环境变量。常见GPU的值如下表所示。如果您的GPU未列出,请参考这个详尽的列表。
| RTX 30X0 | A100 | RTX 20X0 | TITAN V / V100 | GTX 10X0 / TITAN Xp | GTX 9X0 | K80 |
|---|---|---|---|---|---|---|
| 86 | 80 | 75 | 70 | 61 | 52 | 37 |
自定义图像集的交互式训练和渲染
安装[COLMAP](https://github.com/colmap/colmap/releases/tag/3.7),我使用的是3.7版本。
将其添加到您的系统环境变量“环境变量”>“系统变量”>“编辑环境变量”。

打开Anaconda Prompt,如果没有,可以在这里获得https://www.anaconda.com/products/individual 导航到instnat-ngp作为根目录
conda create -n ngp python=3.9
conda activate ngp
pip install -r requirements.txt
如果无法通过pip install pyexr安装pyexr,请下载OpenEXR‑1.3.2‑cp39‑cp39‑win_amd64.whl,将其移动到根目录。然后可以运行:
pip install OpenEXR-1.3.2-cp39-cp39-win_amd64.whl
将自定义图像集放在data/<image_set_name>下
通过以下命令获取transform.json。将您的图片路径插入<image/path>中:
python scripts/colmap2nerf.py --colmap_matcher exhaustive --run_colmap --aabb_scale 16 --images <image/path>
transform.json将在根目录生成,将其拖放到data/<image_set_name>文件夹中。
由于transform.json的创建方式,您需要重新组织文件结构...
例如:
生成transform.json前的文件结构:
📂instant-ngp/ # 这是根目录
├── 📂data/
│ └── 📂toy_truck/
│ ├── 📜toy_truck_001.jpg
│ ├── 📜toy_truck_002.jpg
│ │...
│...
生成transform.json后的文件结构:
📂instant-ngp/ # 这是根目录
├── 📂data/
│ └── 📂toy_truck/
│ ├── 📜transforms.json/
│ └── 📂data/
│ └── 📂toy_truck/
│ ├── 📜toy_truck_001.jpg
│ ├── 📜toy_truck_002.jpg
│ │...
│...
注意:“aabb_scale”中的值可在transform.json中调整以减轻GPU VRAM的负担。该值越低,负载越小。
最后,运行即时-ngp:
<path_to_your_ngp>\instant-ngp\build\testbed.exe --scene data/<image_set_name>
例如:
C:\user\user\download\instant-ngp\build\testbed.exe --scene data/toy_truck
一切准备就绪,应该会启动GUI,带来令人惊叹的效果!
定制相机路径渲染
-
可能需要安装额外的依赖项。运行
pip install tqdm scipy pillow opencv-python和在conda虚拟环境中使用conda install -c conda-forge ffmpeg。如果未安装pyexr,也请参考安装部分中提到的pyexr安装步骤。 -
像上述一样训练任意图像集。
-
当你的训练达到满意阶段时,在GUI上保存一个快照(无需修改路径和名称,在其中一个选项卡中即可完成)。
-
寻找名为“相机路径”的另一个GUI界面,它可能会跟你玩捉迷藏,但确实存在,找到这个窗口。
-
这个GUI设计得非常直观,如果你熟悉任何3D引擎,会发现其操作十分类似。添加相机路径会给你带来新的摄像机视角。
-
添加完所有相机点后,保存相机路径设置(同样不需要编辑路径和名称)。
-
使用以下命令渲染路径:
python scripts/render.py --scene <场景路径> --n_seconds <秒数> --fps <帧率> --render_name <输出文件名> --width <分辨率宽度> --height <分辨率高度>示例:
python scripts/render.py --scene data/toy --n_seconds 5 --fps 60 --render_name test --width 1920 --height 1080视频将会被保存在根目录下。可能需要调整
fps和n_seconds来控制播放速度。因信息有限未能精确指导,但这已是目前最佳方案。请注意,这只是临时解决方案,作者承诺将来会发布官方指南,敬请期待!我的修改至此结束。
交互式训练与渲染

此代码库附带一个交互式测试平台,包含许多超出学术论文介绍的功能:
- 额外的训练特性,如外参和内参优化。
- “行进的立方体”算法用于从NeRF到网格以及从SDF到网格的转换。
- 基于样条曲线的相机路径编辑器以创建视频。
- 每个神经元输入和输出激活的调试可视化。
- 许多针对特定任务的设置选项。
- 亦可观看我们的工具一分钟演示视频。
NeRF狐狸示例
仓库提供了一个测试场景,使用的是随意拍摄的手机视频中的少量帧:
instant-ngp$ ./build/testbed --scene data/nerf/fox

或者,下载任何兼容NeRF的场景(例如,从NeRF作者的驱动器)。
然后可以运行:
instant-ngp$ ./build/testbed --scene data/nerf_synthetic/lego/transforms_train.json
对于如何准备与我们的NeRF实现一起使用的数据集,详情见这份文档。
SDF犰狳
instant-ngp$ ./build/testbed --scene data/sdf/armadillo.obj

爱因斯坦画像
instant-ngp$ ./build/testbed --scene data/image/albert.exr

为了重现超像素结果,可以从比如东京图片链接下载图片,并使用scripts/image2bin.py脚本将其转换为.bin格式。这种自定义格式提高了高分辨率下的兼容性和加载速度。接着可以运行:
instant-ngp$ ./build/testbed --scene data/image/tokyo.bin
体积渲染器
下载来源于迪士尼云数据集的nanovdb体积(CC BY-SA 3.0)。
instant-ngp$ ./build/testbed --mode volume --scene data/volume/wdas_cloud_quarter.nvdb

Python绑定
为了自动化地进行受控实验,所有来自交互式测试台的功能(以及更多!)都通过Python绑定可供轻松调用。
查看./scripts/run.py了解如何在Python内部实施并扩展原本的./build/testbed应用程序,该脚本支持比原命令行参数更多的功能。
享受编程的乐趣!
编译错误排错
在进一步调查之前,请确保所有子模块已更新,并尝试重新编译。
instant-ngp$ git submodule sync --recursive
instant-ngp$ git submodule update --init --recursive
如果__instant-ngp__仍无法编译,请同时更新CUDA和您的编译器到系统能安装的最新版本。重要的是两者都要更新,因为较新的CUDA版本可能与早期编译器不兼容,反之亦然。 如果问题依旧,请参照以下已知问题表格。
| 问题 | 解决方案 |
|---|---|
| CMake错误: 未找到CUDA工具集 / CUDA_ARCHITECTURES为空目标"cmTC_0c70f" | Windows: Visual Studio的CUDA集成可能安装不正确,遵循这些指示修复问题,无需重装CUDA。(#18) |
Linux: 您的CUDA环境变量可能设置不当。使用cmake . -B build -DCMAKE_CUDA_COMPILER=/usr/local/cuda-<your_cuda_version>/bin/nvcc绕过此问题。(#28) |
|
| CMake错误: 未知的CXX编译器特征 | 重新安装Visual Studio并确保从开发者命令提示符运行CMake。(#21) |
| 编译错误: 对“cudaGraphExecUpdate”等的未定义引用 / 标识符"cublasSetWorkspace"未定义 | 更新CUDA安装(可能为11.0)至11.3或更高版本。(#34 #41 #42) |
| 编译错误: 函数调用参数不足 | 使用上述两个git命令更新子模块。(#37 #52) |
| Python错误: 没有名为'pyngp'的模块 | 可能是CMake未检测到您的Python安装,因此没有构建pyngp。检查CMake日志确认这一点。如果pyngp构建在不同目录而非instant-ngp/build,Python将无法识别,需提供完整路径导入。(#43) |
若问题不在上述列表中,欢迎提交问题寻求帮助。
感谢
特别感谢 Jonathan Tremblay 和 Andrew Tao 对早期代码库版本的测试,以及 Arman Toorians 和 Saurabh Jain 提供的工厂机器人数据集。
我们也要感谢 Andrew Webb 发现空间哈希中的一个素数其实不是素数;这个问题现在已经修复了。
这个项目利用了一些出色的开源库,包括:
- tiny-cuda-nn:用于快速的 CUDA 多层感知机网络
- tinyexr:提供 EXR 格式的支持
- tinyobjloader:用于 OBJ 格式的支持
- stb_image:提供 PNG 和 JPEG 支持
- Dear ImGui:一款优秀的即时模式图形用户界面库
- Eigen:C++ 的线性代数模板库
- pybind11:实现无缝的 C++/Python 交互操作
- 还有许多其他的!请查看
dependencies文件夹。
衷心感谢这些杰出项目的作者!
许可和引用
@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
}
版权所有 © 2022,NVIDIA 公司。所有权利保留。
本作品根据 Nvidia 源代码许可证-非商业使用版授权。点击 LICENSE.txt 查看许可副本。