Infinite PhotorealisticWorlds using Procedural Generation
公众号:EDPJ
目录
0. 摘要
1. 简介
2. 相关工作
3. 方法
4. 实验
参考
S. 总结
S.1 主要思想
S.2 方法
S.3 场景生成
0. 摘要
我们介绍 Infinigen,一个自然世界逼真 3D 场景的程序生成器。 Infinigen 完全是程序化的:从形状到纹理的每一个资产(asset)都是通过随机数学规则从头开始生成的,不使用外部源并允许无限变化和组合。 Infinigen 提供广泛的自然界物体和场景覆盖,包括植物、动物、地形以及火、云、雨和雪等自然现象。 Infinigen 可用于为广泛的计算机视觉任务生成无限多样的训练数据,包括目标检测、语义分割、光流和 3D 重建。 我们期望 Infinigen 成为计算机视觉研究及其他领域的有用资源。 请访问 infinigen.org 查看视频、代码和预生成的数据。
1. 简介
数据,尤其是大规模标记数据,一直是计算机视觉进步的关键驱动力。 与此同时,数据也是一个重大挑战,因为许多重要的视觉任务仍然缺乏高质量的数据。 对于 3D 视觉尤其如此,因为很难为真实图像获取准确的 3D 真实标签。
来自计算机图形的合成数据是应对这一数据挑战的有前途的解决方案。 可以使用高质量标签无限量地生成合成数据。 合成数据已被用于广泛的任务中,在 3D 视觉领域取得了显着的成功,其中基于合成数据进行 zero-shot 训练的模型可以在真实图像上表现良好。
尽管前景广阔,但计算机视觉中合成数据的使用仍然比真实图像少得多。 我们假设一个关键原因是 3D 资产的多样性有限:为了使合成数据发挥最大作用,它需要捕获现实世界的多样性和复杂性,但现有的自由合成数据集大多局限于相当狭窄的一组物体和形状,通常是驾驶场景或室内环境中的人造物体。
在这项工作中,我们寻求大幅扩大合成数据的覆盖范围,特别是来自自然世界的物体和场景。 我们介绍 Infinigen,一个自然世界逼真 3D 场景的程序生成器。 与现有的合成数据源相比,Infinigen 的独特之处在于它结合了以下特性:
- 程序性(Procedural):Infinigen 不是 3D 资产或合成图像的有限集合; 相反,它是一个可以创建无限多种不同形状、纹理、材质和场景组合的生成器。 每个资产,从形状到纹理,都是完全程序化的,通过允许无限变化和组合的随机数学规则从头开始生成。 这使其与依赖外部资产的数据集或数据集生成器区分开来。
- 多样性:Infinigen 广泛覆盖自然世界中的物体和场景,包括植物、动物、地形以及火、云、雨和雪等自然现象。
- 逼真性:Infinigen 创建高度逼真的 3D 场景。 它不仅通过程序生成粗糙结构,而且还生成几何和纹理的精细细节,从而实现了高度真实感。
- 真实几何:与视频游戏资源不同,视频游戏资源经常使用纹理贴图来伪造几何细节(例如,表面看起来崎岖不平,但实际上是平坦的),Infinigen 中的所有几何细节都是真实的。 这确保了 3D 重建任务的准确几何真实值。
- 免费且开源:Infinigen 构建于免费开源图形工具 Blender 之上。 Infinigen 的代码是在 GPL 许可证下免费发布的,与 Blender 相同。 任何人都可以自由使用 Infinigen 获得无限的资源和渲染。
Infinigen 关注自然世界有两个原因。
- 首先,许多应用都需要对自然物体的准确感知,包括地质调查、无人机导航、生态监测、救援机器人、农业自动化,但现有的合成数据集对自然世界的覆盖范围有限。
- 其次,我们假设仅自然世界就足以预训练强大的 “基础模型”——人类视觉系统完全是在自然世界中进化的; 接触人造物体可能是不必要的。
Infinigen 在很多方面都很有用。
- 它可以作为各种计算机视觉任务的无限训练数据生成器,包括对象检测、语义分割、姿势估计、3D 重建、视图合成和视频生成。
- 由于用户可以访问每个 3D 场景背后的所有程序规则和参数,因此可以轻松定制 Infinigen 以生成各种特定于任务的真实值。
- Infinigen 还可以用作 3D 资产生成器,可用于构建用于训练物理机器人和虚拟实体代理的模拟环境。
- 同样的 3D 资产也可用于 3D 打印、游戏开发、虚拟现实、电影制作和一般内容创建。
我们在 Blender 之上构建了 Infinigen,Blender 是一个图形系统,为程序生成提供了许多有用的基元(primitives)。 利用这些基元,我们设计并实现了一个程序规则库,以涵盖广泛的自然物体和场景。 此外,我们还开发了有助于创建程序规则并使所有 Blender 用户(包括非程序员)能够做出贡献的实用程序; 这些实用程序包括一个转译器,可以自动将 Blender 节点图(Blender 艺术家经常使用的程序规则的直观视觉 representation)转换为 Python 代码。 我们还开发实用程序来渲染(render)合成图像并提取常见的真实标签,包括深度、遮挡边界(occlusion boundaries)、表面法线(surface normals)、光流(optical flow)、对象类别、边界框(bounding boxes)和实例分割。 构建 Infinigen 涉及大量的软件工程:Infinigen 代码库的最新主要分支由 40,485 行代码组成。
在本文中,我们详细描述了我们的程序系统。 我们还进行实验来验证生成的合成数据的质量; 我们的实验表明,来自 Infinigen 的数据确实有用,特别是对于缩小自然物体覆盖范围的差距而言。 最后,我们提供了计算成本的分析,包括生成流程的详细分析。
我们期望 Infinigen 成为计算机视觉研究及其他领域的有用资源。 在未来的工作中,我们打算使 Infinigen 成为一个活跃的项目,通过与整个社区的开源合作,该项目将扩展到涵盖视觉世界中的几乎所有内容。
2. 相关工作
计算机图形学的合成数据已在计算机视觉中用于广泛的任务。 我们建议读者参考 [65] 进行全面的调查。 下面我们根据应用领域、生成方法和可访问性对现有工作进行分类。表 1 提供了详细的比较。
应用领域。综合数据集或数据集生成器已被开发以涵盖各种领域。
- 建筑环境(built environment)已被最大量的现有工作覆盖,特别是室内场景和城市场景。建筑环境合成数据的一个重要来源是嵌入式人工智能的模拟平台,例如,AI2-THOR、Habitat、BEHAVIOR、SAPIEN、RLBench、CARLA。
- 一些数据集,例如 TartanAir 和 Sintel,包含建筑环境和自然环境的混合。
- 还存在一些数据集,例如,FlyingThings、FallingThings [86] 和 Kubric [24],它们不渲染真实的场景,而是在简单的背景上散布(主要是人造的)对象。
- 合成人类是另一个重要的应用领域,它生成了高质量的合成数据来理解面部、姿势和活动。
- 一些数据集专注于对象,而不是整个场景,以服务于以对象为中心的任务,例如非刚性重建、视图合成和 6D 姿势。
我们专注于自然物体和自然场景,这在现有工作中覆盖范围有限。 尽管自然物体确实出现在许多现有数据集中(例如城市驾驶),但它们大多位于外围且多样性有限。
生成方法。 大多数合成数据集都是通过使用 3D 资源的静态库构建的,这些资源要么是外部来源的,要么是内部制作的。静态库的缺点是合成数据更容易过度拟合。
- 程序生成涉及到一些现有的数据集或生成器,但范围有限。程序生成仅适用于对象排列或对象子集,例如,只有建筑物和没有汽车的道路。
- 相比之下,Infinigen 完全是程序化的,从形状到纹理,从宏观结构到微观细节,不依赖任何外部资源。
可访问性。 如果合成数据集或生成器具有最大程度的可访问性,那么它是最有用的,即它提供对资产和代码的免费访问,并且具有最小的使用限制。 然而,现有的作品很少能最大限度地被访问。 通常会提供渲染图像,但底层 3D 资源不可用、不是免费的或具有重大的使用限制。 此外,程序生成的代码(如果有的话)通常不可用。
Infinigen 具有最大程度的可访问性。 其代码可在 GPL 许可证下使用。 任何人都可以自由使用Infinigen 来生成无限的资产。
3. 方法
程序生成。 程序生成是指通过通用规则和模拟器创建数据。 艺术家可以通过眼睛手动创建一棵树的结构,而程序系统通过编码它们的结构和一般性的生长来创建无限的树。 开发程序规则(Developing procedural rules)是使用紧凑数学语言进行世界建模的一种形式。
Blender 基础。 我们主要使用 Blender 开发程序规则,Blender 是一种开源 3D 建模软件,提供各种基元(primitives)和实用程序。 Blender 将场景表示为姿势对象的层次结构。 用户通过变换对象、添加基元和编辑网格来修改此 representation。 Blender 提供最常见 3D 文件格式的导入/导出。 最后,Blender 中的所有操作都可以使用其 Python API 或通过检查其开源代码来自动化。
对于更复杂的操作,Blender 提供了直观的节点图界面。 艺术家不是直接编辑着色器(shader)代码来定义材质,而是编辑着色器节点以将基元组合成照片般逼真的材质。 同样,几何节点定义为一个网格,该网格使用表示泊松盘采样(Poisson disk sampling)、网格布尔、挤压等操作的节点。最终的几何节点树是广义参数化 CAD 模型,它为其输入参数的每个组合生成唯一的 3D 对象。 这些工具直观且被 3D 艺术家广泛采用。
尽管我们大量使用 Blender,但并非所有程序建模都是使用节点图完成的; 我们的程序生成的很大一部分是在 Blender 之外完成的,并且仅与 Blender 松散地交互。
节点转译器(Node Transpiler)。 作为 Infinigen 的一部分,我们开发了一套新工具来加速我们的程序建模。一个值得注意的例子是我们的 Node Transpiler,它自动将节点图转换为 Python 代码的过程,如图 3 所示。生成的代码更加通用,并且允许我们随机化图结构而不仅仅是输入参数。 该工具使节点图更具表现力,并允许与直接用 Python 或 C++ 开发的其他程序规则轻松集成。 它还允许非程序员通过制作节点图向 Infinigen 贡献 Python 代码。 详细信息请参见附录 E。
生成器子系统。 Infinigen 被组织为生成器,这些生成器是概率程序,每个生成器专门用于生成资产的一个子类(例如,山脉或鱼)。 每个都有一组高级参数(例如,山的总高度),反映用户可控制的外部自由度。 默认情况下,我们根据调整为反映自然世界的分布对这些参数进行随机采样,无需用户输入。 但是,用户还可以使用我们的 Python API 覆盖任何参数,以实现对数据生成的细粒度控制。
每个概率程序都涉及许多额外的内部低级自由度(例如,山上每个点的高度)。 对内部和外部自由度进行随机化会导致资产的分布,我们可以从中进行无限生成的采样。表 2 总结了 Infinigen 中人类可解释的自由度数量,但需要注意的是,这些数字可能被高估,因为并非所有参数都是完全独立的。 请注意,很难量化内部自由度,因此外部自由度作为我们系统总自由度的下限。
材质生成器。 我们提供 50 个程序材质生成器(图 5)。 每个都由一个随机着色器(指定颜色和反射率)和一个局部几何生成器(生成相应的精细几何细节)组成。
产生精确的真实几何的能力是我们系统的一个关键特征。 这妨碍了许多常见图形技术的使用,例如凹凸贴图(Bump Mapping)和 Phong 插值。 两者都操纵面法线来给出详细几何纹理的错觉,但这样做的方式无法表示为网格。 同样,艺术家经常依靠图像纹理或 Alpha 通道 masking 来给出高分辨率网格不存在的错觉。 所有此类捷径均被排除在我们的系统之外。 有关这种区别的说明性示例请参见图 4。
地形生成器。 我们使用来自分形噪声(fractal noise)和模拟器的 SDF 元素生成地形(图 6)。 我们使用行进立方体(marching cubes)将它们评估为网格。 我们通过重复挤压(extrusion)生成巨石,并使用 Blender 的内置插件生成小石头。 我们使用 FLIP 模拟动态流体(图 7),使用 Nishita 天空模型模拟太阳/天空光,并使用 Blender 的粒子系统模拟天气。
植物和水下物体生成器。
- 我们通过随机游走(random walks)和空间殖民(space colonization)来模拟树木生长,从而形成一个覆盖各种树木、灌木甚至一些仙人掌的系统(图 9)。
- 我们使用差分生长(Differential Growth)、拉普拉斯生长(Laplacian Growth)和反应扩散(Reaction-Diffusion)为各种珊瑚提供生成器(图 10)。
- 我们使用几何节点图生成叶子(图 8)、花朵 、海藻、海带、软体动物和水母。
表面分散生成器(Surface Scatter Generators)。 一些自然环境的特点是密集覆盖较小的物体。 为此,我们提供了几个分散生成器,它们将一个或多个现有资产组合在一个密集层中(图 11)。 在森林地面示例中,我们通过从我们的树木系统中程序化地破碎整棵树来生成倒下的树木。
由于篇幅限制,上述所有具体实现细节都可以在附录G中找到。
生物生成器。 每个生物的基因组被表示为树状数据结构(图 12a)。 这反映了真实生物的拓扑结构,其四肢不形成闭环。 节点包含零件(part)参数,边指定零件附件。 我们提供了 5 类真实生物基因组的生成器,如图 12 所示。我们还可以随机组合生物部分,或插入相似的基因组。 详细信息请参见附录 G.6。
每个零件生成器要么是转译的节点图,要么是非均匀有理基样条 (non-uniform rational basis spline,NURBS)。 NURBS 参数空间是高维的,因此我们在受放样(lofting)启发的分解下随机化 NURBS 参数,该分解由与中心曲线的偏差组成。 为了调整随机分布,我们对 30 个示例头部和身体进行了建模,并确保我们的分布支持它们。
动态分辨率缩放。 在相机位置固定的情况下,我们以精确的细节级别评估程序资产,以便渲染时每个面的大小 < 1 像素。 该过程如图 14 所示。对于大多数资产,这需要评估给定像素大小的参数曲线,或使用 Blender 的内置细分或重新网格划分。 对于地形,我们在球坐标中的 SDF 点上执行移动立方体。 对于密集分散的资产(包括图 11 中的所有资产),我们使用实例化 - 也就是说,我们生成每种类型的固定数量的资产,并在场景中通过随机变换重用它们。 即使这种努力尚未优化,完整场景平均仍具有 1600 万个多边形。
图像渲染和真实值提取。 我们使用 Blender 基于物理的路径跟踪渲染器 Cycles 来渲染图像。 我们提供代码来提取常见任务的基本事实,如图 2 所示。
Cycles 单独追踪光的光子,以准确模拟漫反射和镜面反射、透明折射和体积效果。 我们使用每像素 10, 000 个随机样本以 1920 × 1080 分辨率进行渲染,这是 blender 艺术家的标准,并确保最终图像中几乎没有采样噪声。
先前的数据集依赖于 Blender 的内置渲染通道来获得密集的 ground truth。 然而,这些渲染通道是渲染流程的副产品,并不用于训练神经网络。 具体来说,由于半透明表面、体积效应、运动模糊、焦点模糊或采样噪声,它们通常是不正确的。 有关这些问题的示例,请参阅附录 C.2。
相反,我们提供 OpenGL 代码来直接从网格中提取表面法线、深度和遮挡边界,而无需依赖混合器。 除了准确性之外,该解决方案还有许多优点。 用户可以排除与其任务无关的对象(例如水、云或任何其他对象),无论它们是否被渲染。 Blender 显然也不支持许多注释,例如遮挡边界。 最后,我们的实现是模块化的,我们预计用户将通过对我们的代码库的简单扩展来生成上面未涵盖的特定于任务的基本事实。
运行时间。 我们在 2 个 Intel(R) Xeon(R) Silver 4114 @ 2.20GHz CPU 和 1 个 NVidia-GPU 上进行了 1000 次独立试验,对 Infinigen 进行了基准测试。 生成一对 1080p 图像的挂墙(wall)时间为 3.5 小时。 统计数据如图 15 所示。
4. 实验
为了评估 Infinigen,我们生成了 30K 图像对以及用于校正立体匹配的地面实况。 我们从头开始在这些图像上训练 RAFTStereo,并比较 Middlebury 验证(表 3)和测试集(图 16)的结果。 有关野外自然照片的定性结果,请参阅附录。
参考
Raistrick A, Lipson L, Ma Z, et al. Infinite Photorealistic Worlds using Procedural Generation[C]//Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition. 2023: 12630-12641.
[65] Sergey I Nikolenko. Synthetic data for deep learning, volume 174. Springer, 2021.
S. 总结
S.1 主要思想
作者提出 Infinigen,一个自然世界逼真 3D 场景的程序化生成器:它是一个可以创建无限多种不同形状、纹理、材质和场景组合的生成器,从形状到纹理的每一个资产(asset)都是通过随机数学规则从头开始生成的,不使用外部源并允许无限变化和组合。
S.2 方法
程序化生成(Procedural Generation):通过通用规则和模拟器创建数据。 艺术家可以通过眼睛手动创建一棵树的结构,而程序化系统通过编码它们的结构和一般性的生长来创建无限的树。
Infinigen 是基于 Blender 构建的。
Blender:一个图形系统,为程序生成提供了许多有用的基元。利用这些基元,作者设计并实现了一个程序规则库,以涵盖广泛的自然物体和场景。
Blender 将场景表示为姿势对象的层次结构。 用户通过变换对象、添加基元和编辑网格来修改此 representation。
对于更复杂的操作,Blender 提供了直观的节点图界面。 艺术家不是直接编辑着色器(shader)代码来定义材质,而是编辑着色器节点以将基元组合成照片般逼真的材质。
节点转译器(Node Transpiler):作者还开发了有助于创建程序规则并使所有 Blender 用户(包括非程序员)能够做出贡献的实用程序; 这些实用程序包括一个转译器,可以自动将 Blender 节点图(Blender 艺术家经常使用的程序规则的直观视觉 representation)转换为 Python 代码。生成的代码更加通用,并且允许我们随机化图结构而不仅仅是输入参数。 该工具使节点图更具表现力,并允许与直接用 Python 或 C++ 开发的其他程序规则轻松集成。
S.3 场景生成
场景生成过程如上图所示。总共分为四步:
- 合成场景布局:主要是场景的背景
- 生成所有必要的资源,同时显示显示每个网格面的颜色
- 使用程序化材质进行替换
- 通过渲染获得真实照片图像