Lightplane
Lightplane实现了一个高度内存效率的可微分辐射场渲染器,以及一个将图像特征投影到通用3D网格的模块,这在我们的论文中有所描述:
Lightplane:用于神经3D场景的高度可扩展组件
Ang Cao、Justin Johnson、Andrea Vedaldi、David Novotny
Lightplane可以差分渲染全高清图像批次,同时仅消耗不到1GB的GPU内存。 渲染/反向传播速度与现有方法相当,但后者在渲染单张QVGA图像(640x480)时就已经超出内存限制。 因此,Lightplane的内存和计算效率允许大幅度扩展最新的神经场景方法。
文档
请访问文档网站以获取详细的项目和API描述。
概述
Lightplane是一对用于渲染神经3D场景的高度可扩展组件。 它由两个组件组成:Lightplane渲染器和Lightplane散射器。
- Lightplane渲染器(3D --> 2D)是一个辐射场渲染器,给定相机视点和场景网格结构(三平面、体素网格等),渲染相应的图像。
- Lightplane散射器(2D --> 3D)是渲染器的对偶:它接收图像特征并将其提升/反投影到3D网格结构。
这两个组件作为一对融合的自动优化Triton GPU内核实现。
主要特点包括:
- 内存效率:与现有方法相比,Lightplane大幅节省内存使用,同时保持竞争力的速度。在渲染256x256图像进行反向传播时,它使用10 MB GPU内存,而PyTorch实现使用10 GB。
- 高度可扩展:Lightplane的内存效率显著提高了3D重建/生成模型的可扩展性。 它允许提升/反投影数百个视图,渲染高分辨率多视图图像,同时使用很少的内存。
- 易于扩展:Lightplane是一种通用的3D网格结构设计。除了体素网格和三平面外,它还可以轻松扩展到其他3D网格(如哈希网格、HexPlane等)。更多支持即将推出。
- 易于使用:Lightplane功能强大、可配置且易于使用。
安装
pip install cogapp
pip install triton
pip install plotly
- 安装LightPlane包:
pip install -e .
-
(可选,用于运行示例代码和Jupyter笔记本)
- 安装PyTorch3D
pip install notebook
pip install imageio opencv-python lpips matplotlib
pip install configargparse tqdm
使用
Lightplane渲染器和散射器被打包成torch.nn.Module
,可以轻松作为插件在神经3D场景管道中使用。
使用Lightplane渲染器:
from lightplane import LightplaneRenderer, LightplaneSplatter, Rays
# 设置GPU设备和渲染模块。
device=torch.device("cuda:0")
renderer = LightplaneRenderer(
num_samples=128,
color_chn=3,
grid_chn=3,
mlp_hidden_chn=32,
mlp_n_layers_opacity=2,
mlp_n_layers_trunk=2,
mlp_n_layers_color=2,
ray_embedding_num_harmonics=3,
).to(device)
# 创建128个随机渲染射线:
num_rays = 128
rays = Rays(
directions=torch.randn(num_rays, 3) * 0.1,
origins=torch.randn(num_rays, 3),
grid_idx=torch.zeros(num_rays, dtype=torch.int32),
near=torch.full(num_rays, 0.1),
far=torch.full(num_rays, 3.0),
)
# 创建一个随机三平面。
batch_size = 1
channels = 16
H = W = D = 64 # 三平面空间大小
feature_grid = [
torch.randn(batch_size, 1, H, W, channels, device=device),
torch.randn(batch_size, D, 1, W, channels, device=device),
torch.randn(batch_size, D, H, 1, channels, device=device),
]
# 渲染三平面。
(
rendered_ray_length,
rendered_alpha,
rendered_features,
) = renderer(rays=rays.to(device), feature_grid=input_grid)
使用Lightplane散射器:
以下代码使用上一个片段中的Rays
将特征散射到体素网格:
# 初始化散射器模块
splatter = LightplaneSplatter(
num_samples=256,
grid_chn=channels,
).to(device)
# 将每条射线的图像特征分配给`rays`的`encoding`字段,以散射到网格中。
rays.encoding = torch.randn(num_rays, channels, device=device)
# 设置我们要散射特征的输出体素网格大小:
grid_size = [(batch_size, D, H, W, channels)]
# 运行散射器。
splatted_grid = splatter(
rays=rays,
grid_size=grid_size,
)
示例
请访问示例以获取更详细的示例Python脚本和Jupyter笔记本。
待办事项
我们计划实现两个主要的新功能:
- 支持哈希网格
- 支持时间网格,如HexPlane
许可
Lightplane根据BSD 3.0许可证发布。
引用
@article{cao2024lightplane,
author = {Ang Cao and Justin Johnson and Andrea Vedaldi and David Novotny},
title = {Lightplane: Highly-Scalable Components for Neural 3D Fields},
journal = {arXiv},
year = {2024},
}