NeRF ——使用神经辐射场(Neural Radiance Fields)表示场景来进行视图合成(View Synthesis)

Publish your model insights with interactive plots for performance metrics, predictions, and hyperparameters. Made by Elena Khachatryan using W&B
Elena Khachatryan
本报告是作者Lavanya Shukla所写的 "NeRF – Representing Scenes as Neural Radiance Fields for View Synthesis" 的翻译

前言

代码 | 论文→

Representing Scenes as Neural Radiance Fields for View Synthesis paper一文中,作者提出了一种合成复杂场景视图的方法——使用一组稀疏的输入视图优化底层的连续体积场景函数。该方法达到最先进的结果。

他们的算法使用完全连接的(非卷积)深度神经网络表示场景,其输入是单个连续5D坐标(空间位置(x,y,z)和查看方向(θ,φ)),其输出是在该空间位置的体积密度和基于视图的辐射。

他们通过查询沿照相机光线的5D坐标来合成视图,并使用经典的体积渲染技术将输出的颜色和密度投影到图像中。由于体积渲染自然是可以区分的,因此优化我们的表示(representation)所需的唯一输入就是一组已知相机姿势的图像。他们描述了如何有效地优化神经辐射场,以渲染具有复杂几何形状和外观的场景真实视图,并得到了优于过去神经渲染和视图合成工作的结果。

如果您想进一步了解本文,请观看这​​段2分钟的论文视频—— Screen Shot 2020-04-13 at 12.17.06 AM.png

基准模型

我们已经创建了一个带有超参数扫描功能的colab笔记本,因此您可以在colab中重现此分析。看看您是否可以通过调整超参数来改善结果。

请在colab中尝试一下→

首先,让我们训练一个基准模型,并将模型的预测记录在wandb中。这使我们可以实时观察模型在每次迭代中如何学习基础场景的表示。

从学习的神经表示中为单个场景渲染新视图

让我们尝试更改模型的各种超参数,看看这如何提高性能。 在下面我们可以看到,训练时间越长,我们的模型从单个场景的神经表示构造学习视图的能力就越强。

我们在10,000次这里停止了迭代,但我鼓励您尝试对模型进行更长的训练。 下面的视频是论文的作者在200,000次迭代后的结果——如您所见,结果非常逼真。

After training for 200,000 iterations

学习率(Learning Rates)变化的影响

在本节中,我们将改变学习率,同时保持所有其他超参数相同。 让我们选择一个合理的时期数量来训练我们的模型,比如说1000 epoch。在这里,我们可以比较损失函数,并看到理想的learning_rate在3e-4和7e-4之间。

5e-3太高,而5e-5和5e-6太低。 如果您想提高模型性能,建议您尝试[5e-4和7e-4]之间的更多值。

我们也可以将此模式反映在渲染的视频中。 学习率为5e-3时,我们的模型无法学习基础结构;学习率在7e-4和3e-4之间时,模型慢慢地学习了这些3D表示;此后其性能会慢慢降低,直到在5e-6时,模型无法捕获场景的神经表示为止。 请记住,我们只训练了1000个epoch的模型。 如果我们以较小的学习率对其进行更长的训练,我们可能会开始看到真正的良好表现。

不同嵌入向量维度(Embedding Size)的效果

在下一个实验中,我们将学习率设为5e-4,并像以前一样训练所有模型1000个epoch。这次,我们改变嵌入(embedding)的维度来达到合适的效果。

我们既可以从损失和psnr图中观察到,也可以从场景的学习神经表示渲染的视频观察到,嵌入维度2太小,无法捕获基础场景的复杂性,而10太大了。我鼓励您探索6左右的更多嵌入值,以查看是否可以改善我们模型的性能。

添加更多网络层的效果

接下来——我们添加更多隐藏层(hidden layers),同时将学习率保持在5e-4,将嵌入维度设为6,并训练所有模型1000个epoch。我们有趣地观察到,添加更多的层并不总是等于更好的性能。尽管非常接近,但是隐藏层大小为6的性能优于4和8层。对于本实验,我们可以坚持使用6层,并集中精力调整对损失函数和psnr影响更大的其他参数。

添加更多神经节点的效果

最后,我们保持所有超参数与上面相同(学习率= 5e-4,嵌入维度embedding size = 6,时期epoch= 1000,网络层数layer_size = 6),并调整密集层dense_layers的大小。 我们可以清晰看到损失与密集层的大小成反比。

我的GPU在512层网络中就内存不足了,但是如果您有更大的GPU,我建议您尝试使用大于256的层大小,以查看模型的性能是否继续提高。

运行超参数扫描以找到最佳模型

最后,我们进行超参数扫描以测试这些学习率,嵌入维度和其他超参数的组合,并更彻底地探索超参数空间以找到性能最佳的模型。 使用W&B,您可以通过将要尝试的参数和搜索策略指定为.yaml文件来轻松运行超参数扫描。

了解如何在5分钟内启动超参数扫描→

平行坐标图

运行扫描后,您可以使用平行坐标图(如上所示)可视化扫描结果,该图将您的所有运行和您选择的指标对应,因此您可以轻松找到规律。该图对于调整超参数组合以达到最佳模型性能很有用。

超参数重要性图

超参数重要性图(如右图所示)显示哪些超参数是最佳的预测指标,哪些与指标的理想值高度相关。

关联是超参数与所选指标(在这种情况下为损失)之间的线性关联。因此,epoch与损失之间的高度相关性意味着当epoch具有较高的值时,损失也具有较高的(负)值,反之亦然。

参数的重要性是训练以超参数为输入、指标(损失)为目标输出的随机森林的结果。在这里我们可以看到batch_size,optimizer_sgd在预测损失值时最重要。

您可以使用参数重要性和平行坐标图来调整超参数值进行尝试。

亲自尝试一下

我们已经创建了一个带有超参数扫描功能的colab笔记本,因此您可以在colab中重现此分析。 看看您是否可以通过调整超参数来改善结果。

在colab中尝试一下→