instant-ngp-Windows:基于 tiny-cuda-nn 框架的神经网络图形基元实现项目

Instant neural graphics primitives: lightning fast NeRF and more

分支1Tags0
当前项目代码仓暂无内容

即时神经图形原语

这是一个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,带来令人惊叹的效果!

定制相机路径渲染

  1. 可能需要安装额外的依赖项。运行pip install tqdm scipy pillow opencv-python和在conda虚拟环境中使用conda install -c conda-forge ffmpeg。如果未安装pyexr,也请参考安装部分中提到的pyexr安装步骤。

  2. 像上述一样训练任意图像集。

  3. 当你的训练达到满意阶段时,在GUI上保存一个快照(无需修改路径和名称,在其中一个选项卡中即可完成)。

  4. 寻找名为“相机路径”的另一个GUI界面,它可能会跟你玩捉迷藏,但确实存在,找到这个窗口。

  5. 这个GUI设计得非常直观,如果你熟悉任何3D引擎,会发现其操作十分类似。添加相机路径会给你带来新的摄像机视角。

  6. 添加完所有相机点后,保存相机路径设置(同样不需要编辑路径和名称)。

  7. 使用以下命令渲染路径:

    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
    

    视频将会被保存在根目录下。可能需要调整fpsn_seconds来控制播放速度。因信息有限未能精确指导,但这已是目前最佳方案。请注意,这只是临时解决方案,作者承诺将来会发布官方指南,敬请期待!

    我的修改至此结束。

交互式训练与渲染

交互式训练与渲染示意图

此代码库附带一个交互式测试平台,包含许多超出学术论文介绍的功能:

  • 额外的训练特性,如外参和内参优化。
  • “行进的立方体”算法用于从NeRF到网格以及从SDF到网格的转换。
  • 基于样条曲线的相机路径编辑器以创建视频。
  • 每个神经元输入和输出激活的调试可视化。
  • 许多针对特定任务的设置选项。
  • 亦可观看我们的工具一分钟演示视频

NeRF狐狸示例

仓库提供了一个测试场景,使用的是随意拍摄的手机视频中的少量帧:

instant-ngp$ ./build/testbed --scene data/nerf/fox

NeRF狐狸

或者,下载任何兼容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

SDF犰狳

爱因斯坦画像

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 TremblayAndrew 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 查看许可副本。


项目介绍

Instant neural graphics primitives: lightning fast NeRF and more

定制我的领域