【论文精读】Deblur-NeRF

今天读的是一篇CVPR2022的文章,这项工作由港科大、腾讯和港大共同完成。他们对模糊图片作为输入进行NeRF重建进行了研究。
项目地址:点此前往

Abstract

NeRF近年来在三维场景重建和新视角合成任务上表现出众。但是,野外环境中采集图像会因为移动或者失焦而模糊,这影响到了重建的质量。为了解决这个问题,作者提出了Deblur-NeRF,它在模糊的输入下也能重建出清晰的NeRF。作者通过模拟模糊过程来重建模糊视图,从而使 NeRF 对模糊输入具有鲁棒性。模拟的核心是一个Deformable Sparse Kernel(DSK),通过在每个空间位置对规范稀疏核进行变形来对空间变化的模糊核进行建模。每个kernel point的ray origin被联合优化,这是被物理上的模糊过程所启发到的。这个模块被编码为MLP来适应不同的模糊类型。

1. Introduction

先是简要介绍了一下NeRF。提到如果用长曝光来拍摄光线少的场景,图片对于相机的抖动会更加敏感,就容易造成模糊。此外,在使用大光圈拍摄景深变化较大的场景时,散焦模糊也是不可避免的。前人没人做过针对模糊图像进行NeRF的工作,所以我们把baseline设定为“先在图像层面去模糊,然后在训练NeRF”。虽然对单张图片去模糊有效果,但是无法聚合邻域帧的信息,也无法保证多视角的一致性。还有一种方法是对视频进行去模糊,把多个帧考虑进来,这依赖于optical flows和feature correlation volumes。然而,它没有用上场景里的3D几何信息,导致视图之间的对应关系不准确,尤其是当它们具有较大的baseline时。而Deblur-NeRF,是利用了这些信息的。
我们通过对一个干净的图片进行卷积操作来建立一个“模糊”的过程,使用了一个和blind convolution method类似的blur kernel。提出来一个新的可变形稀疏核模块,用于建模这个blur kernel。这个模块是怎么被想到的呢?基于这么几个观察。首先,使用稠密的卷积核对像NeRF这种场景表达是不可行的,因为这会导致计算量剧烈的增加和渲染过程中更大的显存开销,因此DSK使用稀疏的光线来近似这个dense kernel。其次,我们展示了实际的模糊过程是在组合来自不同来源的光线,这促使我们对光线来源进行联合优化。最后,为了建立一个空间变化的模糊核,我们在每个 2D 空间位置变形一个规范的稀疏核。这个变形被编码进MLP以泛化到各种类型的模糊。在训练过程中,联合优化DSK和NeRF,只用模糊输入做监督。在推断阶段,把DSK移走就能合成干净的新视角。作者主要在两种模糊上做实验:相机移动和失焦。贡献主要就是:可使用模糊图片重建的框架、可用于模拟不同模糊过程的可变形稀疏核、通过考虑每个kernel point射线原点的平移将 2D 内核扩展到 3D 空间。

2. Related Work

介绍了一下相关工作,NeRF、单张图片去模糊、多张图片去模糊。

3. Preliminary

复读了一下NeRF的工作,无非就是输入输出的表达、高频编码和渲染最终颜色的公式。

4. Method

任务是训练一个能处理模糊输入的NeRF。pipeline如下:
在这里插入图片描述
核心思想是:显示建模这个模糊过程,优化参数和NeRF,让合成的“模糊视图”和真正的模糊的视图匹配。为了在训练过程中渲染一个模糊的像素,先使用DSK生成几个ray,然后使用NeRF渲染这些ray,把这些混合到一起得到一个混杂的颜色。在推理阶段,我们可以在没有 DSK 的情况下直接渲染 NeRF,以获得清晰的新视图。

4.1 Deformable Sparse Kernel

类似于大多数图像去模糊算法,我们通过将清晰图像与模糊核 h 进行卷积来模拟模糊过程:
在这里插入图片描述
其中 c p c_{p} cp是位置 p p p处的锐利像素的颜色,这也自然是我们希望NeRF能得到的结果, b p b_{p} bp是对应的模糊颜色,而 ∗ * 是卷积。blur kernel的support是以p为中心点的大小为K×K的窗口,为了计算 b p b_{p} bp,我们 c p c_{p} cp h h h在窗口内的element-wise 乘法之和。这可以在map-based的图像表示中有效地计算。然而,把 c p c_{p} cp建模为NeRF会有一个问题,那就是渲染会变得需要很大的计算量和显存开销。对每个像素,会有 K × K K×K K×K个光线需要被渲染进去。因此,我们希望能使用小数量的稀疏点就能接近这个dense blur kernel:
在这里插入图片描述
N ( p ) N(p) N(p)是稀疏地分布在 p p p周围的 N N N个位置,它们组成了我们sparse kernel的support, w q w_{q} wq是每个位置对应的权重。我们把 N N N设为固定的数字,作为超参。 q q q是连续的值,我们可以优化 N ( p ) N(p) N(p) w q w_{q} wq和NeRF,这样就能回归到最好的稀疏核。
Blur kernel是spatially-varying的,所以我们像对待NeRF一样,也用MLP来对其进行建模。具体来说,对每个输入视角,我们设定一个“canonical kernel locations” N ′ ( p ) = { q i ′ } i = 0 N − 1 N^{'}(p)={\{q^{'}_{i}}\}_{i=0}^{N-1} N(p)={ qi}i=0N1,用一个MLP来变形位置,同时还预测权重:
在这里插入图片描述
在这个式子里, G G G是MLP, l l l是一个学习的view embedding。这个view embedding是必要的,因为模糊的pattern常常在不同视角下是不一样的。为每个视图优化不同的view embedding使得 DSK 模块可以为每个视图拟合不同的blur kernel。在我们的实验当中,我们设置view embedding为一个长度32的向量。我们计算最终稀疏核位置 N ( p ) N(p) N(p) q = q ′ + Δ q q=q'+\Delta q q=q+Δq。我们需要前向传播 N N N次MLP G G G来得到所有变形的位置。一种可能提高性能的选项是,通过用 γ ( p ) γ(p) γ(p) 替换等式 (6) 中的输入 p p p 来将位置编码引入 G Φ G_{Φ} GΦ。然而,我们发现这个操作无法提高质量。一个可能的原因是spatially-varying的kernel沿空间位置逐渐变化,但没有高频变化。

4.2 Convolution with Irradiance

这种模糊卷积模型应该应用于scene irradiance而不是image intensity。一个在物理上更正确的模型应该是 b p = f ( c p ′ ∗ h ) b_{p} = f(c ^{'}_{p} ∗ h) bp=f(cph),其中 c ′ c' c是scene irradiance场景辐照度, f ( ) f() f()是将场景辐照度映射到图像强度的camera response function (CRF)。一个非线性的CRF会增加blur kernel的复杂度并让DSK的学习变得困难(如果等式4中的线性模型被使用),尤其是高对比度的区域。为了补偿非线性的CRF,我们假设sharp NeRF在一个线性空间中预测颜色,并在最终的输出里采用简单的gamma correction function:
在这里插入图片描述
其中,
在这里插入图片描述
是gamma纠正函数。我们也可以用更复杂的CRF来建模现实世界的相机,比如预标定的CRF或者把CRF也放到训练的优化里去。不过我们发现这个简单的模式已经够用了,足以补偿成像过程中的非线性,并提高质量。

4.3 Optimizing the Ray Origin

Blurry result是邻近像素的组合,它们是一些相邻光线以同一个相机中心作为源头的渲染结果。然而事实上模糊过程常常也有不同源头的光线进入进行混杂。考虑两个模糊过程。
在这里插入图片描述
当相机移动造成模糊,相机中心在一次拍摄中就有移动,导致了光线源头的变化;当失焦造成模糊,光线被散射到不同的方向,这相当于来自不同源头的光线的混合。当场景大部分是平面时,射线原点的平移可以很好地近似为像素位置的 2D 平移。然而,由于parallax effect和occlusion,当存在深度不连续时,情况并非如此。由于我们可以访问 3D 场景表示,我们可以开发一个考虑光线来源变化的kernel。 因此,我们共同优化了每个稀疏内核位置的光线原点的平移。具体来说,我们对每一个内核的位置的源头平移进行预测,像等式6一样:
在这里插入图片描述
然后生成rays:
在这里插入图片描述
这些优化的光线被渲染和组合来得到最后的模糊像素。
训练过程被总结为如下步骤。首先用等式8预测 { ∆ o q , ∆ q , w q } q ∈ N ( p ) \{∆o_{q}, ∆q, w_{q}\}_{q∈N(p)} { oq,q,wq}qN(p),然后我们通过变形canonical sampling location和像等式9中一样优化光源来生成多个光线 { r q } q ∈ N ( p ) \{r_{q}\}_{q∈N(p)} { rq}qN(p)。我们通过等式3渲染这些光线以得到 c q ′ c'_{q} cq并混合他们以得到模糊像素 b p b_{p} bp(使用等式7)。这个合成模糊像素被对应的真值所监督:
在这里插入图片描述
其中 R R R是每个batch当中像素的集合。注意,我们的这个pipeline只用在了训练中,在测试的时候,我们可以使用sharp NeRF和gamma correction直接渲染得到清晰的结果。

4.4 Aligning the NeRF

如实验所示,如果我们自由优化所有可学习的组件,即 NeRF 和可变形稀疏核,重建的 NeRF 可能会出现一些非刚性失真。这是预料之中的,因为NeRF表达的场景和学习到的kernel有可能一起变形而没有影响到重建的模糊结果。然而,这并不是我们希望发生的。为了约束NeRF与这些观察能够保持一致,我们首先初始化可变形稀疏核,这样所有优化的光线 r q r_{q} rq和输入光线 r p r_{p} rp接近。这是通过将 ϵ = 0.1 ϵ = 0.1 ϵ=0.1 的小增益乘以输出元组的每个元素来实现的 ( ∆ o q , ∆ q , w q ) (∆o_{q}, ∆q, w_{q}) (oq,q,wq)。因此,光线源头 o q o_{q} oq和kernel points q分别被初始化得和相机中心、像素位置接近。并且,所有kernel points在训练开始时将具有大致相同的权重。我们额外添加了alignment loss,强制优化的rays r q r_{q} rq中的一个光线要和输入光线 r p r_{p} rp相似:
在这里插入图片描述
其中 q 0 q_{0} q0 N ( q ) N(q) N(q)中一个固定的元素。通过使用 L a l i g n L_{align} Lalign,我们监督 q 0 q_{0} q0来当作kernel的中心。我们在所有实验当中都设置 λ o = 10 λ_{o}=10 λo=10
最终loss函数是:
在这里插入图片描述
其中 λ a = 0.1 λ_{a}=0.1 λa=0.1

5. Experiments

5.1 Implementation Details

训练

使用 1024 条射线的batch大小,每个样本在coarse volume中的 64 个坐标和fine volume中的 64 个附加坐标。设置稀疏位置的个数N=5,默认参数的优化器Adam,初始学习率0.0005,然后成倍降低到0.00008。每个场景在V100上训练200k次。MLP F和原省NeRF一样,MLP G则使用4个全连接的隐藏层,每层有64通道,激活函数为ReLU。此外还直接把第一层和最后一层连了起来。

数据集

主要针对两种模糊类型。对每个类型自己用blender合成了5个场景。我们手动放置多个视角的相机来模拟真实的数据捕获。 为了渲染具有相机运动模糊的图像,我们随机扰动相机位姿,然后在每个视图的原始位姿和扰动位姿之间线性插入位姿。 我们从插值姿势渲染图像,并将它们混合到线性 RGB 空间中以生成最终的模糊图像。 对于失焦模糊,我们使用内置的功能来渲染景深图像。 我们固定光圈并在最近和最远深度之间随机选择一个焦平面。

我们还采集了 20 个真实世界场景,每种模糊类型有 10 个场景,用于定性研究。 使用的相机是带有手动曝光模式的佳能 EOS RP。我们通过在曝光期间手动摇动相机来捕捉相机运动模糊图像,而参考图像是依赖三脚架拍摄的。为了捕捉失焦图像,我们选择了大的光圈。 我们使用 COLMAP 计算现实世界场景中模糊图像和参考图像的相机姿势。尽管由于模糊,从 COLMAP 估计的姿势可能不准确,但我们发现我们的方法对于不准确的姿势是鲁棒的。原因之一是优化射线源可以补偿配准上的错误。

5.2 Ablation Study

做了一些消融实验,验证一些组件的有效性。gamma correction, ray origin optimization, 和alignment loss。除此之外,还对稀疏位置的个数 N N N这个超参数进行了实验,我们发现 N N N越大效果越好,但是 N = 5 N=5 N=5之后效果提升并不如之前的增大 N N N那么明显。

5.3 Comparisons

做了一些对照实验。由于没有现有的方法试图从模糊输入中重建 NeRF 以进行新的视图合成,因此我们仔细选择了几个可能的baseline进行比较。 最直接的一种方法是使用模糊输入直接训练 NeRF。此外,我们还比较了image-space基线,首先使用现有的基于图像或视频的去模糊技术恢复输入,然后用去掉模糊了的图像来训练 NeRF。

6. Discussion and Conclusion

6.1 为什么框架能生效

仅用模糊图像盲目地同时恢复清晰的 NeRF 和模糊内核是一个ill-posed问题,因为 NeRF 还可以重建一个模糊场景,场景模糊的话那图片当然模糊了,这样NeRF就觉得自己能解释得通,但这样显然是与事实是不符合的。那么我们的框架如何确保我们得到一个清晰的 NeRF 呢?如 NeRF++ 中所示,NeRF 编码先验信息以实现视图一致的重建。当模糊输入是视图不一致时,我们的框架使用 DSK 模块来补偿不一致,导致一致锐利场景和不一致模糊模式的分解。值得注意的是,如果模糊输入等同于对一个模糊的 3D 场景的清晰的观察,我们将其定义为视图一致。现实世界中的模糊通常是不一致的。由于相机移动的随机性或焦距的可变性,每个镜头都有不同的模糊模式。这可以通过以下事实进一步验证:当原生 NeRF 重建真实场景数据集时,视点发生变化时,结果会严重闪烁。我们的框架解决了这个问题,这在现实世界的数据中很常见。

6.2 Limitations

当模糊是视图一致时,我们的方法可能会失败,例如,相机在所有视图中巧合地在大致相同的方向上晃动,或者相机具有固定的焦点(即,聚焦在单个目标上)。 可以通过引入图像先验来解决一致的模糊问题,我们将其视为未来的工作。 当遇到严重模糊的输入图像时,我们的方法也可能会失败,因为 COLMAP 可能无法重建相机位姿。 但在实验中,我们发现这只是在非常非常模糊的情况下才会出现的问题。

6.3 Conclusion

在本文中,我们提出了一个简单但有效的框架,用于在模糊的输入下训练清晰的 NeRF。 在合成场景和真实世界场景上的实验验证了我们框架的有效性,并证明了与原生的 NeRF 和先去模糊再用NeRF的方法相比质量有显著提高。 我们希望这项工作将进一步激发对基于 NeRF 的去模糊应用方法的研究。

猜你喜欢

转载自blog.csdn.net/YuhsiHu/article/details/125012075
今日推荐