渲染概述
可微渲染是计算机视觉领域一个相对较新且令人兴奋的研究方向,它通过允许将 2D 图像像素关联回场景的 3D 属性,从而弥合了 2D 和 3D 之间的差距。
例如,通过从神经网络预测的 3D 形状渲染图像,可以计算出与参考图像的 2D 损失。反转渲染步骤意味着我们可以将像素的 2D 损失关联回形状的 3D 属性,例如网格顶点的位置,从而能够在没有任何显式 3D 监督的情况下学习 3D 形状。
我们广泛研究了现有的可微渲染代码库,发现
- 渲染管道很复杂,包含 7 个以上需要互操作且可微的独立组件
- 流行的现有方法 [1, 2] 基于相同的核心实现,该实现将许多关键组件捆绑到大型 CUDA 内核中,需要大量的专业知识才能理解,并且扩展范围有限
- 现有方法要么不支持批处理,要么假设批处理中的网格具有相同数量的顶点和面
- 现有项目仅提供 CUDA 实现,因此在没有 GPU 的情况下无法使用
为了尝试不同的方法,我们希望有一个模块化且易于使用和扩展的实现,并支持异构批处理。借鉴现有工作的灵感 [1, 2],我们创建了一个新的、模块化的、可微的渲染器,并使用 PyTorch、C++ 和 CUDA 提供并行实现,以及全面的文档和测试,旨在帮助进一步推动该领域的研究。
我们的实现将渲染的光栅化和着色步骤解耦。核心光栅化步骤(基于[2])返回多个中间变量,并在 CUDA 中具有优化的实现。管道其余部分完全在 PyTorch 中实现,并旨在进行自定义和扩展。通过这种方法,PyTorch3D 可微渲染器可以作为库导入。
开始使用
要了解有关实现的更多信息并开始使用渲染器,请参阅渲染器入门,其中还包含架构概述和坐标转换约定。
技术报告
有关渲染器设计、关键功能和基准的深入解释,请参阅 arXiv 上的 PyTorch3D 技术报告:使用 PyTorch3D 加速 3D 深度学习,有关 pulsar 后端的更多信息,请参见此处:使用基于球体的表示进行神经渲染的快速可微光线投射。
注意:CUDA 内存使用情况
技术报告中的主要比较对象是 SoftRasterizer [2]。SoftRasterizer 前向 CUDA 内核仅输出一个 (N, H, W, 4)
FloatTensor,而 PyTorch3D 光栅化器前向 CUDA 内核输出 4 个张量
pix_to_face
,LongTensor(N, H, W, K)
zbuf
,FloatTensor(N, H, W, K)
dist
,FloatTensor(N, H, W, K)
bary_coords
,FloatTensor(N, H, W, K, 3)
其中 N = 批次大小,H/W 是图像高度/宽度,K 是每个像素的面数。PyTorch3D 反向传播返回 zbuf
、dist
和 bary_coords
的梯度。
从光栅化返回中间变量会产生相关的内存成本。我们可以如下计算前向和反向传播的内存使用量的理论下限
# Assume 4 bytes per float, and 8 bytes for long
memory_forward_pass = ((N * H * W * K) * 2 + (N * H * W * K * 3)) * 4 + (N * H * W * K) * 8
memory_backward_pass = ((N * H * W * K) * 2 + (N * H * W * K * 3)) * 4
total_memory = memory_forward_pass + memory_backward_pass
= (N * H * W * K) * (5 * 4 * 2 + 8)
= (N * H * W * K) * 48
每个光栅化输出的像素的每个面需要 48 字节。为了保持内存使用量在范围内,我们可以更改批次大小(N)、图像大小(H/W)和每个像素的面数(K)。例如,对于固定的批次大小,如果使用更大的图像大小,请尝试减少每个像素的面数。
参考文献
[1] Kato 等人,“神经 3D 网格渲染器”,CVPR 2018
[2] Liu 等人,“Soft Rasterizer:用于基于图像的 3D 推理的可微渲染器”,ICCV 2019
[3] Loper 等人,“OpenDR:近似可微渲染器”,ECCV 2014
[4] De La Gorce 等人,“基于模型的单目视频 3D 手部姿态估计”,PAMI 2011
[5] Li 等人,“通过边缘采样进行可微蒙特卡罗光线追踪”,SIGGRAPH Asia 2018
[6] Yifan 等人,“用于基于点的几何处理的可微表面散射”,SIGGRAPH Asia 2019
[7] Loubet 等人,“重新参数化不连续被积函数以进行可微渲染”,SIGGRAPH Asia 2019
[8] Chen 等人,“使用基于插值的可微渲染器学习预测 3D 对象”,NeurIPS 2019