Mip-NeRF 360 (无界抗混叠神经辐射场)论文阅读(更新中)

Mip-NeRF 360: 无界抗混叠神经辐射场

摘要

尽管神经辐射场(NeRF)已经在物体和小的有界空间区域上展示了令人印象深刻的视图合成结果,但是它们在“无界”场景中挣扎,在这些场景中,摄像机可以指向任何方向,内容可以存在于任何距离。在这种情况下,现有的NeRF类模型通常会产生模糊或低分辨率的渲染效果(由于附近和远处物体的细节和尺度不平衡) ,训练缓慢,并且可能由于从一小组图像重建大场景的任务的固有模糊性而展示伪影。我们提出了 mip-NeRF (一种处理采样和混叠的 NeRF 变体)的扩展,它使用了非线性场景参量化、在线蒸馏和一种新的基于失真的正则化器来克服无界场景带来的挑战。我们的模型,我们称之为“ mip-NeRF 360”,因为我们目标场景中的相机围绕一个点旋转360度,相比 mip-NeRF来说减少了57% 的均方误差,能够为高度复杂、无界限的真实世界场景生成真实的合成视图和详细的深度图。

神经辐射场(NeRF)通过在基于坐标的多层感知器(MLP)的权重范围内对场景的体积密度和颜色进行编码,合成高度逼真的场景渲染图。这种方法使得在实景视图合成方面取得了重大进展。然而,NeRF 使用沿射线的无限小的3D 点来模拟 MLP 的输入,这在呈现不同分辨率的视图时会导致混淆。Mip-NeRF 修正了这个问题,将 NERF 扩展到圆锥体上的体积平截面。虽然这提高了质量,但是在处理无界场景时,NeRF 和 mip-NeRF 都会遇到困难,因为无界场景中摄像机可能面向任何方向,场景内容可能存在于任何距离。在这项工作中,我们提出了一个 mip-NeRF 的扩展,我们称之为“ mip-NeRF 360”,它能够生成这些无界场景的真实渲染,如图1所示。

在这里插入图片描述

图1。(a)虽然 mip-NERF 能够产生准确的物体渲染,但对于无界的场景,它经常产生模糊的背景和低细节的前景。(b)我们的模型产生这些无界场景的详细的现实渲染,证明了两个模型中的渲染(上)和深度地图(下)。有关其他结果,请参阅补充视频。

将类 NERF 模型应用于大型无界场景提出了三个关键问题:
1.参量化
无界360度场景可以占据任意大的欧氏空间区域,但 mip-NeRF 要求场景坐标位于有界区域内。
2.效率
大而详细的场景需要更大的网络容量,但是在训练期间沿着每条射线密集查询一个大的 MLP 是昂贵的。
3.含糊不清
无界场景的内容可能位于任何距离,只能通过少量光线观察到,这加剧了从二维图像重建三维内容的固有模糊性。
Parameterization.(参数化)
由于透视投影,放置在远离相机的物体将占据图像平面的一小部分,但是如果放置在附近,将占据图像的更多部分并且可以看到细节。因此,一个理想的3D场景参量化应该把更多的容量分配给附近的内容,而把更少的容量分配给远处的内容。在 NeRF 之外,传统的视图合成方法通过在投影全景空间中参数化场景来解决这个问题,或者将场景内容嵌入到一些代理几何中,这些代理几何已经使用多视图立体恢复。
NERF 成功的一个方面是它将特定的场景类型与其适当的3D 参数化结合起来。最初的 NERF 论文集中在360度捕捉物体的遮蔽背景和前面的场景,其中所有的图像朝向大致相同的方向。对于被遮蔽的物体,NeRF 直接参数化了三维欧几里得空间中的场景,但是对于正面场景,NeRF 使用了投影空间中定义的坐标(归一化设备坐标,或称为“ NDC”)。通过将一个无限深的摄像机平台缠绕成一个有界的立方体,其中沿 z 轴的距离对应于视差(反距离) ,NDC 以一种与透视投影几何一致的方式有效地重新分配了 NeRF MLP 的容量。
然而,**如果场景不限于任何方向,而不仅仅限于一个方向,则需要不同的参量化(require a different parame-
terization)。NERF + + 和 DONERF探索了这个想法,NERF + +使用了一个额外的网络来模拟远处的物体,DONERF 提出了一个空间扭曲程序来缩小距离原点的距离。**这两种方法的行为有点类似于 NDC,但是在每个方向,而不只是沿着 z 轴。在这项工作中,我们将这个想法扩展到 mip-NeRF,并提出了一种将任何平滑参量化应用于体积(而不是点)的方法,同时也提出了我们自己的无界场景参量化。
Efficiency
处理无边界场景的一个基本挑战是这种场景通常是大而详细的。虽然类 NERF 模型可以使用少得惊人的权值准确地再现物体或场景区域,但当面对日益复杂的场景内容时,NeRF MLP 的容量已经饱和。此外,较大的场景需要沿着每条射线采集更多的样本,以准确定位表面。例如,当从物体到建筑物缩放 NeRF 时,MartinBrualla 等人将 MLP 隐藏单元的数量增加了一倍,并将 MLP 评估的数量增加了8倍。这种模型容量的增加是昂贵的————一个 NERF 已经需要好几个小时的训练,而且在大多数情况下,将这个时间乘以额外的40倍是非常缓慢的。
由于 NeRF 和 mip-NeRF 使用的从粗到细的重采样策略加剧了这种训练成本: MLP 使用“粗”和“细”射线间隔进行多次评估,并使用两次通过的图像重建损失进行监督。这种方法是浪费的,因为“粗糙”的场景渲染并不有助于最终的图像。与其训练一个单一的多规模监督的 NERF MLP,我们将训练两个 MLP: 一个““proposal MLP”和一个“ NeRF MLP”。“proposal MLP 预测体积密度(但不预测颜色) ,这些密度被用来重新采样新间隔提供给 NeRF MLP ,然后呈现图像。重要的是,the proposal MLP 产生的权重并不使用输入图像进行监督,而是使用由 NeRF MLP 产生的直方图(柱状图)权重进行监督。这使我们能够使用一个较大的 NERF MLP,评估次数相对较少,同时一个a small proposal MLP,评估次数更多。因此,整个模型的总容量明显大于 mip-NeRF (约15 ×) ,从而大大提高了渲染质量,但我们的训练时间只是适度地增加(约2 ×)。
我们可以将这种方法视为一种“online distillation”“在线蒸馏”: 虽然“蒸馏”通常是指训练一个小型网络来匹配已经训练好的大型网络的输出 ,但是在这里,我们通过同时训练两个网络将 NERF MLP 预测的输出结构提取到proposal MLP “online”中。NeRV为完全不同的任务执行类似的online distillation在线精馏: 为了建模可见性和间接照明,训练 MLP 近似渲染积分。我们的在线蒸馏方法在灵感上类似于 DONeRF 中使用的“采样预言网络”(sampling oracle networks),尽管这种方法使用地面真实深度进行监督。TermiNeRF 中使用了一个相关的想法,尽管这种方法只是加速了推理,实际上减慢了训练的速度(一个 NeRF 被训练为收敛,一个额外的模型随后被训练)。在 NeRF 中详细地探索了一个learned “proposer” network,但是只实现了25% 的加速,而我们的方法将训练加速了300% 。
一些作品试图将一个训练有素的 NERF 提取/蒸馏或“烘烤”到一个格式,即可以迅速呈现,但这些技术并没有加速训练。通过诸如八叉树或包围体层次结构等层次数据结构加速光线追踪的想法在渲染文献中得到了很好的探索,尽管这些方法假设场景的几何形状的先验知识,因此不会自然地推广到场景的几何形状是未知的,必须恢复的逆渲染上下文。事实上,尽管建立了一个八叉树加速结构,同时优化了 NERF 类模型,神经稀疏体素场方法并没有显着减少训练时间。

  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
对于流水车间调度问题的求解,可以使用python-mip库来实现。python-mip是一个基于MIP(Mixed Integer Programming,混合整数规划)的数学优化库,它可以用来解决各种优化问题。 在流水车间调度问题,我们需要考虑各个工序的顺序和时间,以及机器的可用性等因素,以最小化总的完成时间或最大化生产效率为目标。 以下是一个简单的示例代码,使用python-mip库来求解流水车间调度问题: ```python from mip import Model, xsum, minimize, ConstrsGenerator # 定义工序数量、机器数量和工序时间 num_jobs = 3 num_machines = 2 job_times = [[2, 3], [4, 2], [3, 1]] # 创建模型 m = Model() # 创建变量 x = [[m.add_var(var_type='B') for _ in range(num_machines)] for _ in range(num_jobs)] # 创建约束条件 for j in range(num_jobs): m.add_constr(xsum(x[j][k] for k in range(num_machines)) == 1) # 每个工序只能在一个机器上执行 for k in range(num_machines): m.add_constr(xsum(x[j][k] * job_times[j][k] for j in range(num_jobs)) <= 8) # 每个机器的总执行时间不能超过8 # 定义目标函数 m.objective = minimize(xsum(x[j][k] * job_times[j][k] for j in range(num_jobs) for k in range(num_machines))) # 求解模型 m.optimize() # 输出结果 print('Optimal schedule:') for j in range(num_jobs): for k in range(num_machines): if x[j][k].x >= 0.99: print(f'Job {j+1} on machine {k+1}') ``` 在上述代码,我们首先定义了工序数量、机器数量和每个工序在每台机器上的执行时间。然后创建模型,并创建变量和约束条件。最后定义目标函数为最小化总的执行时间,并求解模型。 这是一个简单的示例,实际的流水车间调度问题可能更加复杂,需要根据具体情况进行调整和扩展。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值