PyTorch3D

PyTorch3D

  • 文档
  • 教程
  • API
  • GitHub

›渲染器

简介

  • 为什么选择 PyTorch3D

数据

  • 文件 I/O
  • 从文件加载
  • 数据加载器
  • 批处理

操作

  • Cubify
  • IoU3D

可视化

  • Plotly 可视化

渲染器

  • 概述
  • 入门
  • 相机

渲染概述

可微渲染是计算机视觉领域一个相对较新且令人兴奋的研究方向,它通过允许将 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

← Plotly 可视化开始使用 →
  • 开始使用
  • 技术报告
    • 参考文献
pytorch3d
Facebook Open Source
版权所有 © 2024 Meta Platforms, Inc
法律:隐私条款