英伟达这篇CVPR 2022 Oral火了!2D图像秒变逼真3D物体!虚拟爵士乐队来了!

2023-11-10

点击下方卡片,关注“CVer”公众号

AI/CV重磅干货,第一时间送达

你见过乐器自己演奏么?看看这个:

e95708984cf752ba3dc07332887bc1e7.gif

图1. "活灵活现"的虚拟乐器还是在 NVIDIA 服务器房间里面"尽情"般表演

这正是 NVIDIA Research 在庆祝爵士乐及其发源地新奥尔良的视频中展示的技术。Follow 前沿 AI 的同学应该知道 CVPR 2022 线下会议当前正在美国新奥尔良城市火热举办中,可谓相当应景!

上述演示的 Demo 技术是被称为 "NVIDIA 3D MoMa",此技术可以让游戏开发者、建筑师、设计师等快速将目标物导入图形引擎,并对其进行处理:修改大小、改变材料或不同的照明效果。这项研究大大节省了内容创作者产出成果所需的时间和精力。

下面将深入聊聊 NVIDIA  3D MoMa 背后的 CVPR 2022 (Oral) 顶会论文及算法细节。


论文介绍

296080b03b8dba75e424c706c8ac059d.png

Extracting Triangular 3D Models, Materials, and Lighting From Images

主页:https://nvlabs.github.io/nvdiffrec/

论文(已支持下载):

https://nvlabs.github.io/nvdiffrec/assets/paper.pdf

代码(已开源):

https://github.com/NVlabs/nvdiffrec

一句话总结:本文提出了一种 2D 多视图图像到 3D 重建的新工作,即一种从多视图图像观察中联合优化拓扑、材料和照明的高效可逆渲染(inverse rendering)方法,其能够从多视图图像中提取具有空间变化材料和环境照明的未知拓扑的三角形网格(triangle meshes),并可以在任何传统和现代图形引擎中部署。

bd3aaf5eeda52f84ac77c1a205667cc1.gif

图2. 2D 多视图图像生成 3D 重建

算法背景

多视图 3D 重建

  1. 神经隐式表示(Neural implicit representations):本文优化了显式网格表示的端到端图像损失,通过设计支持形状、材料和照明的内在分解,并利用有效的可微分光栅化。

  2. 显式表面表示(Explicit surface representations):本文将 DMTet(Deep Marching Tetrahedra) 扩展到 2D 监督,使用可微分渲染来联合优化拓扑、材料和照明。

BRDF 和照明估计

  1. 本文提出了一种可微分 split sum 照明模型。

  1. 本方法的输出直接与现有的渲染器和建模工具兼容。

  2. 本文优化了存储在 HDR probe 中的显式表面网格、BRDF 参数和光照,实现了更快的训练速度和更好的分解结果。

下表显示了本文方法与当前先进的 3D 重建方法的比较。

09cb3058ccc3f9639042b2b87112a1e6.png

表 1. 方法分类。NV:神经体素,NS:神经表面

算法细节

本文提出了一种 3D 重建方法,该方法由在未知环境照明条件下照明的物体的多视图图像以及已知的相机姿态和背景分割掩码监督。目标表示由三角形网格、空间变化的材料(存储在 2D 纹理中)和照明(高动态范围环境探测器)组成。本文精心设计优化任务以显式渲染三角形网格,同时稳健地处理任意拓扑。因此,与最近使用神经隐式表面或体素表示的工作不同,本文直接优化目标形状表示。

本文方法的框架如下图所示:

7930344d11bf28a81c9dcfe62bb4f1e2.png

图3. 方法框架

1. 拓扑学习

具体来说,本文将 DMTet(Deep Marching Tetrahedra)修改为在 2D 监督的设置中工作,并共同优化形状、材料和照明。在每个优化步骤中,形状表示——在网格上定义的有符号距离场 (SDF,signed distance field) 的参数,具有相应的每个顶点偏移——使用 MT(marching tetrahedra)层转换为三角形表面网格。SDF 通过 MT 层转换成三角形网格的示意图如下所示:

0b8b01eb9541f56ca3d2e65e2a39ec62.png

图4. MT(marching tetrahedra)提取转换

本文将生成的网格与相关竞争方法生成的网格进行了比较。虽然 NeRF(volumetric rep)和 NeuS(implicit surface rep)提供了高质量的视图插值(view interpolation),但在 MC 步骤中引入的质量损失在三角形计数较低时非常显著。

a8d92cf8795eeaf9834e70f05b607a47.png

图5. 从一组 256 个带 masks 的渲染图像中提取三角形网格

2. 渲染模型

2.1 材料模型

接下来,本文在具有延迟渲染(deferred shading)可微分光栅器(differentiable rasterizer)中渲染提取的表面网格,并与参考图像相比,计算渲染图像上图像空间的损失。并使用了基于物理的渲染(PBR,Physically Based Rendering)

6bef834aa7b6cd5011a0fc098098c027.png

图6. 将 3D 模型表示为三角形网格和一组遵循标准 PBR 模型的空间变化材料

2.2 Texturing

表面网格的自动纹理参数化是计算机图形学中一个活跃的研究领域。本文优化拓扑,这需要不断更新参数化,可能会在训练过程中引入不连续性。

为了在拓扑优化期间稳健地处理纹理,本文利用体素(volumetric)纹理,并使用世界空间位置来索引纹理。这确保了映射随着顶点平移和拓扑变化而平滑变化。

e3d11b80aa8ab63527da46da461c1c37.png

图7. 对体素表示进行采样以创建 2D 纹理会产生纹理接缝(左)。然而,进一步优化(右),可以快速自动去除接缝

这样生成的 2D 纹理与标准 3D 工具和游戏引擎兼容。

3. 基于图像的照明

本文采用基于图像的照明模型,其中场景环境照明由高分辨率 cube map 生成。

本文从实时渲染中汲取灵感,其中 split sum  approximation 是一种流行的、有效的基于全频图像的照明方法。这里引入了  split sum 渲染模型的可微分版本,以通过可微分渲染从图像观察中学习环境照明。本文让 cube map (典型分辨率为 6 × 512 × 512)的纹素作为可训练参数。

为了获得纹素梯度,本文使用 PyTorch 的自动微分来表达光照计算。另外还创建了一个过滤后的低分辨率(6×16×16)cube map 来表示漫反射光照。

注:篇幅有限,关于算法的更多细节,建议阅读原文进行消化。

实验结果

本文在实验中,针对各种应用评估了上述算法。为了强调此方法明确分解为三角形网格和材料,本文使用现成的工具展示了重新照明、编辑和模拟。

本文还比较了最近支持分解的神经方法:NeRD 和 NeRFactor,而且包括视图插值结果,最后,将 split-sum approximation 与基于图像的照明的球面高斯(SG,spherical Gaussians)进行比较。

1. 场景编辑和仿真

本文方法分解场景表示支持高级场景编辑,而以前使用基于密度的神经表示的工作仅支持基本的重新照明和简单形式的场景编辑。

在下图中,本文将使用 Blender Cycles 路径跟踪器渲染的重建模型的重新照明质量与 NeRFactor 的结果(通过评估神经网络渲染)进行了比较。

6e753fe5564992b0213c5d35757c7130.png

图8. 重新照明比较

下表中提供了定量总结,本文还测量了重建的反照率(albedo)纹理的质量。可以注意到,本文方法产生了更详细的结果,并且在所有指标上都优于 NeRFactor

2d1b7e22c68843fba4dfacb39c6e14e1.png

表 2. NeRFactor 合成数据集的重新照明质量。报告的图像指标是所有 4 个测试场景的 8 个验证视图和 8 个照明  probes 的算术平均值

本文方法的表示可以直接部署在可用于三角形网格的大量 3D 内容生成工具中,这极大地促进了场景编辑。图 9 中展示了高级场景编辑示例,其中将来自 NeRFactor 数据集的重建模型添加到 Cornell box 中,并在软体模拟中使用它们。请注意,本文的模型接收场景照明,投射准确的阴影,并稳健地充当虚拟对象的碰撞器

69e41549246e29086c4a04554f033eff.png

图9. 为了突出显式表示的好处,本文将两个重建模型插入到  Cornell box 中。

2. 视图插值

2.1 合成数据集

表 3 显示了 NeRF 真实合成图像数据集的结果,在图 10 中显示了 MATERIALS 场景的视觉示例。本文方法始终与 NeRF 性能相近,在某些场景中质量更好。基于感知的图像指标(SSIM 和 LPIPS)的边距较小。

7e1436847379b815103c3fe82df006e5.png

表 3. NeRF 真实合成数据集中八个场景的平均结果。

32b7cc993925ca96d7ba9d573345d48c.png

图10. 本文在 MATERIALS 场景中的结果,由来自 NeRF 合成数据集的 100 张图像重建。

2.2 真实世界数据集

NeRD 提供了一个小型真实世界照片扫描数据集,具有自动生成的(不准确的)覆盖蒙版和不同的相机位置。

视觉和定量结果如图 11 所示。由于数据集中的不一致,NeRF 和 NeRD 都很难找到带有透明“ floaters ”和孔洞的清晰几何边界。相比之下,本文方法得到了清晰的轮廓和图像质量的显著提升

c5a473cf24713e55f7fd1849903ff3c5.png

图11. 从照片重建(来自 NeRD 的数据集),将本文方法结果与 NeRD 和 NeRF 的结果进行比较。

3. 比较球面高斯和 Split Sum

在图 12 中,本文将可微分 split sum 环境照明近似值与常用的球面高斯 (SG) 模型进行了比较。Split sum 在所有频率上更好地捕获照明,同时具有较低的运行时成本。这里观察到与具有 128 lobes 的 SG 相比,优化时间减少了 5 倍。在推理时,评估分割和近似值非常快,只需要两次纹理查找。

208db7e3b1bc9c44eef3379a4b48d071.png

图12. 使用 128 lobes 与 Split Sum 用球形高斯近似的环境照明

总之,本文展示了与视图合成和材料分解的最新技术相当的结果,同时直接优化了显式表示:具有材料和环境照明的三角形网格。通过设计,本文方法的表示直接与现代 3D 引擎和建模工具兼容,从而支持大量应用并简化了工作流程。本文方法可以用作外观感知转换器,从(神经)体素或 SDF 表示到具有材料的三角形 3D 模型,补充了许多最近的技术。


应用案例:虚拟爵士乐队

上述介绍的就是 NVIDIA 3D MoMa 技术背后的算法。生成的 3D 模型无需转换即可部署在任何支持三角形渲染的设备上,包括手机和 Web 浏览器,并以交互速率进行渲染。据了解,NVIDIA 3D MoMa 在单个 NVIDIA Tensor Core GPU 上一小时内就可以生成三角形网格模型。

虚拟爵士乐队的乐器:从 2D 到 3D

为了展示 NVIDIA 3D MoMa 的应用场景和性能,NVIDIA 研究团队从不同角度收集了五种爵士乐队乐器(小号、长号、萨克斯管、架子鼓和单簧管)的多视图图像,每种乐器分别被拍摄约 100 多张图像。

d99863b782aaca80669ecfe6faee5976.gif

图13. 从不同角度拍摄乐器图像

NVIDIA 3D MoMa 将这些 2D 图像重建为每个乐器的 3D 表示。然后 NVIDIA 团队将这些乐器从其原始场景中取出,并将它们导入 NVIDIA Omniverse 3D 模拟平台进行编辑。

在 NVIDIA Omniverse 中编辑 3D 模型

在任何传统的图形引擎中,创作者都可以轻松改变由 NVIDIA 3D MoMa 生成形状的材料。比如这里用 NVIDIA Omniverse 将小号、萨克斯管等乐器的材料替换成黄金、白银、木材等。

a7e0a3cb1a53eb8d2db8c26a2dc90313.png

图14. 在图形引擎中编辑 3D 模型

a222cdf719ed076150730ad637eace27.gif

图15. 编辑乐器材料

然后,创作者可以将新编辑的对象放入任何虚拟场景中。这里 NVIDIA 团队将这些乐器放入 Cornell box 中。由下图可知,虚拟乐器对光的反应就像在真实的物理世界中一样,闪亮的铜管乐器反射出明亮的光,哑光鼓皮吸收光。

c23d8d7e9f38622032b95ac8b1a312a7.gif

图16. 动态照明和物理世界

这些通过逆向渲染生成的新对象可以用作复杂动画场景的构建块,比如这里以文章开头的虚拟爵士乐队的形式展示。

更多技术细节可以阅读原论文和代码进行学习,更多应用展示可以点击下方视频进行观看。

展望

NVIDIA 这项技术可以帮助创作者快速将 2D 图像变成 3D 物体,而且兼容传统和现代 3D 引擎和建模工具。这将极大地简化建筑师、设计师、游戏开发者和艺术家等创作者的工作流程,提高整体工作效率。

算法代码已开源!快来尝试,也许你可以助力你的研究和应用~

整理不易,请点赞和在看bdc724c68a5a716224858bd4d8e235a7.gif

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

英伟达这篇CVPR 2022 Oral火了!2D图像秒变逼真3D物体!虚拟爵士乐队来了! 的相关文章

  • Pandas apply 与 np.vectorize 从现有列创建新列的性能

    我正在使用 Pandas 数据框 并希望创建一个新列作为现有列的函数 我还没有看到关于之间速度差异的很好的讨论df apply and np vectorize 所以我想我会在这里问 熊猫apply 功能很慢 根据我的测量 在一些实验中如下
  • 为什么我不能使用“exclude”从 python 轮子中排除“tests”目录?

    考虑以下包结构 与以下setup py内容 from setuptools import setup find packages setup name dfl client packages find packages exclude te
  • 子进程改变目录

    我想在子目录 超级目录中执行脚本 我需要首先进入该子目录 超级目录 我无法得到subprocess进入我的子目录 tducin localhost Projekty tests ve python Python 2 7 4 default
  • Python sqlite3游标没有属性commit

    当我运行这段代码时 path Scripts wallpapers single png conn sqlite3 connect Users Heaven Library Application Support Dock desktopp
  • conda 无法从 yml 创建环境

    我尝试运行下面的代码来从 YAML 文件创建虚拟 Python 环境 我在 Ubuntu 服务器上的命令行中运行代码 虚拟环境名为 py36 当我运行下面的代码时 我收到下面的消息 环境也没有被创建 这个问题是因为我有几个必须使用 pip
  • 如何从谷歌云存储桶读取音频文件并在datalab笔记本中使用ipd播放

    我想在数据实验室笔记本中播放我从谷歌云存储桶中读取的声音文件 这个怎么做 import numpy as np import IPython display as ipd import librosa import soundfile as
  • 在Python中创建一个新表

    我正在尝试从数控机床中提取数据 事件每毫秒发生一次 我需要过滤掉一些用管道 分隔的变量分隔符 PuTTy exe 程序生成的日志文件 我尝试阅读熊猫 但列不在同一位置 df pd read table data log sep 日志文件的一
  • 如何对这个 Flask 应用程序进行单元测试?

    我有一个 Flask 应用程序 它使用 Flask Restless 来提供 API 我刚刚写了一些身份验证来检查 如果消费者主机被识别 该请求包含一个哈希值 通过加密 POST 的请求内容和 GET 的 URL 以及秘密 API 密钥来计
  • Django - 电子邮件发送两次

    每当我使用如下所示的电子邮件设置从views py调用下面的方法时 电子邮件的两份副本都会发送给收件人 并且我收到如下所示的错误 def sendEmailBasic request msg EmailMessage Request Cal
  • pip 安装软件包两次

    不幸的是我无法重现它 但我们已经见过几次了 pip 将一个软件包安装两次 如果卸载第一个 第二个就会可见并且也可以被卸载 我的问题 如果一个包安装了两次 如何用 python 检查 背景 我想编写一个测试来检查这一点 devOp Updat
  • 参数验证,Python 中的最佳实践[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 让我们举一个 API 的例子 def get abs directory self path if os path isdir path ret
  • 如何检查列表是否为空?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 例如 如果通过以下内容 a 我如何检查是否a是空的 if not a print Lis
  • 为什么“return self”返回 None ? [复制]

    这个问题在这里已经有答案了 我正在尝试获取链的顶部节点getTopParent 当我打印出来时self name 它确实打印出了父实例的名称 然而 当我回来时self 它返回 None 为什么是这样 class A def init sel
  • Spark中的count和collect函数抛出IllegalArgumentException

    当我使用时抛出此异常时 我尝试在本地 Spark 上加载一个小数据集count 在 PySpark 中 take 似乎有效 我试图搜索这个问题 但没有找到原因 看来RDD的分区有问题 有任何想法吗 先感谢您 sc stop sc Spark
  • 如何在C++中列出Python模块的所有函数名称?

    我有一个 C 程序 我想导入一个 Python 模块并列出该模块中的所有函数名称 我该怎么做 我使用以下代码从模块中获取字典 PyDictObject pDict PyDictObject PyModule GetDict pModule
  • Spyder 如何在同一线程的后台运行 asyncio 事件循环(或者确实如此?)

    我已经研究 asyncio 模块 功能几天了 因为我想将它用于我的应用程序的 IO 绑定部分 并且我认为我现在对它的工作原理有一个合理的理解 或者在至少我认为我已经理解了以下内容 任一时刻 任一线程中只能运行一个异步事件循环 一旦一切都设置
  • SQLAlchemy:避免声明式样式类定义中的重复

    我正在使用 SQLAlchemy 并且我的对象模型中的许多类具有相同的两个属性 id 和 整数和主键 以及名称 字符串 我试图避免在每个类中声明它们 如下所示 class C1 declarative base id Column Inte
  • scipysolve_ivp() 中的访问时间步长

    我有一个常微分方程系统 正在使用 scipy 的solve ivp 函数求解 它运行良好 但我在访问每个步骤中使用的时间步时遇到问题 我知道solve ivp 将当前时间传递给用户定义的函数 但我需要使用的时间步长 而不是当前时间 为了解决
  • Python 枚举子集迭代

    我想迭代以下枚举的子集 class Items enum Enum item1 0 item2 1 item3 2 item4 3 item5 4 item6 5 item7 6 item8 7 说我想 for item in Items
  • 从 pandas 数据框中绘制堆积条形图

    我有数据框 payout df head 10 复制以下 Excel 绘图的最简单 最智能和最快的方法是什么 我尝试过不同的方法 但无法让一切都到位 Thanks 如果您只想要一个堆积条形图 那么一种方法是使用循环来绘制数据框中的每一列 并

随机推荐