简体中文 | English
本文档提供 XRNeRF 相关用法的基本教程。对于安装说明,请参阅 安装指南。
更多细节可查看 benchmark.md.
支持的场景类神经渲染方法如下:
(click to collapse)
- NeRF (ECCV'2020)
- Mip-NeRF (ICCV'2021)
- KiloNeRF (ICCV'2021)
- Instant NGP (SIGGRAPH'2022)
- BungeeNeRF (ECCV'2022)
支持的人体类神经渲染方法如下:
(click to collapse)
- NeuralBody (CVPR'2021)
- AniNeRF (ICCV'2021)
- GNR
如果期望在XRNeRF中看到新的NeRF方法,可以张贴在愿望清单,我们会根据社区投票意见来安排下一步的计划。
我们推荐把数据集放在项目目录/data
下面,否则可能需要修改config中的内容
xrnerf
├── xrnerf
├── docs
├── configs
├── test
├── extensions
├── data
│ ├── nerf_llff_data
│ ├── nerf_synthetic
│ ├── multiscale
│ ├── multiscale_google
│ ├── ...
请参阅 数据集准备 获取数据集准备的相关信息。
安装方法详见教程, 我们还提供了docker镜像文件作为另一种环境安装方式。
在XRNeRF中,模型被分为4个部分
- embedder: 输入点的位置和视角,输出embedded特征数据,embedder可能是纯函数型的,或者带有可学习参数的
- mlp: 使用embedder的输出作为输入,输出原始的点数据(采样点的rgb值和密度值)送给render, 一般由多层感知机组成
- render: 获取mlp的输出数据,沿着射线上的点进行积分等操作,输出图像上一个像素点的rgb值
- network: 将以上三个部分组织起来,同时也是与mmcv的runner进行交互的部分,控制了训练时的loss计算和验证时的指标计算
对于上述所有模型而言,输入都是一个字典类型的data
。模型使用字典data
中的内容来创建新的键值对,并加入data
。以origin nerf为例,最开始的data
应该包含pts
(尺寸为 n_rays, n_pts, 3) and viewdirs
(尺寸为 n_rays, n_pts, 3).
如果要自定义一个network,需要继承BaseNerfNetwork
,其中定义了两个抽象方法
train_step()
: training 模式下的推理和计算loss的函数.val_step()
: testing 模式下的推理函数.
NerfNetwork 是一个很好的例子
具体而言,如果想要实现一个具有新feature的nerf方法,有以下几步需要做
-
创建一个新文件如
xrnerf/models/networks/my_networks.py
.from ..builder import NETWORKS from .nerf import NerfNetwork @NETWORKS.register_module() class MyNerfNetwork(NerfNetwork): def __init__(self, cfg, mlp=None, mlp_fine=None, render=None): super().__init__(cfg, mlp, mlp_fine, render) def forward(self, data): .... def train_step(self, data, optimizer, **kwargs): .... def val_step(self, data, optimizer=None, **kwargs): ....
-
修改
xrnerf/models/networks/__init__.py
文件from .my_networks import MyNerfNetwork
-
修改配置文件config file 原来
model = dict( type='NerfNetwork', ....
现在
model = dict( type='MyNerfNetwork', ....
同样的,要实现embedder/mlp/render的新功能,步骤与上述类似
- 要定义一个新的embedder, 需要继承
nn.Module
或者BaseEmbedder
, 并定义forward
方法. BaseEmbedder 是个很好的例子 - 要定义一个新的mlp, 需要继承
nn.Module
或者BaseMLP
, 并定义forward
方法. NerfMLP 可供参考 - 要定义一个新的render, 需要继承
nn.Module
或者BaseRender
, 并定义forward
方法. NerfRender 可供参考
XRnerf 使用 mmcv.runner.IterBasedRunner
来控制训练, 并用 mmcv.runner.EpochBasedRunner
来测试.
训练时, 配置文件的 max_iters
表示最多训练多少次.
测试时, max_iters
被强制改为1, 表示进行一次完整的epoch.
python run_nerf.py --config configs/nerf/nerf_blender_base01.py --dataname lego
参数为:
--config
: 配置文件位置--dataname
: 使用数据集下的哪个数据来训练
python run_nerf.py --config configs/nerf/nerf_blender_base01.py --dataname lego --test_only --load_from iter_200000.pth
参数为:
--config
: 配置文件位置--dataname
: 使用数据集下的哪个数据--test_only
: 切换为测试模式--load_from
: 重载覆盖掉原来配置文件里的load_from
, 在某些情况下为了方便而使用
目前, XRNeRF 提供以下几种更详细的教程
除此以外,文档还包括以下内容
@misc{xrnerf,
title={OpenXRLab Neural Radiance Field Toolbox and Benchmark},
author={XRNeRF Contributors},
howpublished = {\url{https://github.com/openxrlab/xrnerf}},
year={2022}
}
我们非常欢迎用户对于 XRNeRF 做出的任何贡献,可以参考 贡献指南 文件了解更多细节
XRNeRF 是一款由不同学校和公司共同贡献的开源项目。我们感谢所有为项目提供算法复现和新功能支持的贡献者,以及提供宝贵反馈的用户。 我们希望该工具箱和基准测试可以为社区提供灵活的代码工具,供用户复现现有算法并开发自己的新模型,从而不断为开源社区提供贡献。
- XRPrimer: OpenXRLab foundational library for XR-related algorithms.
- XRSLAM: OpenXRLab Visual-inertial SLAM Toolbox and Benchmark.
- XRSfM: OpenXRLab Structure-from-Motion Toolbox and Benchmark.
- XRLocalization: OpenXRLab Visual Localization Toolbox and Server.
- XRMoCap: OpenXRLab Multi-view Motion Capture Toolbox and Benchmark.
- XRMoGen: OpenXRLab Human Motion Generation Toolbox and Benchmark.
- XRNeRF: OpenXRLab Neural Radiance Field (NeRF) Toolbox and Benchmark.