[CVPR2024] PlatoNeRF

527 阅读7分钟

🐧企鹅小弟继续带大家读读cvpr2024的论文喽~

碎碎念:这篇文章可以说很有意思,但是第一遍读的时候真的很头疼zzz 项目地址:platonerf.github.io/

一起来看看demo效果吧

这篇文章是CVPR2024 Oral文章。先一起看看看他们重建后的demo,最左边的为本文方法重建的模型。能很好的重建出物体的细节。 platonerf_demo.gif

作者的心路历程

对于XR用户来说,保持对场景的完整且最新的扫描是繁琐的。因此,需要能够从单视图或少量视图中恢复几何结构的方法。

方法一览:

1831718804023_.pic.jpg PlatoNeRF是使用单个视角通过雷达光的反射信息进行三维重建。回忆往常的NeRF方法,都是围绕图片环绕一周采取数据,然后进行三维重建的。这种固定视角的三维重建方法十分新颖,雷达提供了传感器信息。反射光线同时也会提供场景中被遮挡的信息。收集这些激光图像然后进行重建,就得到了最后的PlatoNeRF。 这个方法相比于其他重建方法的优势是,这个单视角最后生成的并不是相对深度。而是包含了物理信息的绝对深度。让PlatoNeRF有很强的实用意义。也就是更加真实了!在本文里,使用了雷达和双次反射采集数据进行NeRF的重建。

  • 为什么要使用雷达:激光雷达系统通常向场景发射光并测量光返回传感器的飞行时间(ToF)。激光雷达系统利用从场景返回传感器的第一次反弹光,提供精确的绝对深度,如果利用双次反弹飞行时间,即光在返回传感器前在场景中反射两次的时间,可以实现被遮挡物体的重建。
  • 为什么要双次反射:双次反射光的存在或缺失揭示了阴影,从而可以推断被遮挡的几何结构。

双次反射光的存在或缺失揭示了阴影,从而可以推断被遮挡的几何结构,而其ToF则揭示了深度。这两者结合在一起,使用双次反射激光雷达的意义就不言而喻了。说白了双次反射激光雷达有缺点,NeRF有缺点。两个方法结合起来。就可以左脚踩右脚直接登天噜。

NeRF重建图片获取

既然是NeRF,小伙伴们都会想知道。该如何取得NeRF重建所需要的图像呢?这里作者也给了解答。 image.png 还是要用到激光雷达系统,激光雷达系统包括一个位于已知位置XsX_s的 SPAD 传感器和一个位于已知位置 XlX_l的脉冲激光器。激光器依次指向 K 个不同的点 A = {Ii,...,IKI_i,...,I_K}。对于每个照明点 IKI_K,捕获一张图像,最终形成一组 KK 张图像的集合 I=i1,...,iKI = {i_1, ..., i_K}。这样不就有了一组数据了嘛。数据也在作者的图1里画出来了,就长这样: 3251718903952_.pic.jpg

开始渲染

3261718905039_.pic.jpg 现在要开始渲染的一环了,整体渲染流程由三部分组成:初始光线渲染,次光线渲染。重建。为了能得到真实的重建结果,我们对两条光线都进行渲染。把要渲染的整个场景参数化为一个神经辐射场(NeRF)。多层感知器(MLP)函数 fθ:3f_{\theta}: \real^3 \rightarrow \real σ\sigma为每个输入的三维场景点 x=(x,y,z)x = (x, y, z) 预测体积密度 。然后可以直接从 σ(x)σ(x) 中估计场景的三维几何结构。开发一个渲染器,将密度 σ\sigma映射到预测的瞬态图像 i^\hat i来合成瞬态图像。这些合成的瞬态测量数据可以在分析-合成框架中用来训练 NeRF。 为了渲染双跳瞬态,我们必须沿两种类型的射线进行渲染:(1) 主要射线和 (2) 次要射线。主要射线定义为 rp(λ)=op+λdpr_p(\lambda) = o_p+\lambda d_p 次要射线定义为 rs(λ)=os+λdsr_s(\lambda) = o_s + \lambda d_s

渲染第一条光线

1921718960783_.pic.jpgimage.png 又要用到这张图了~对于第一条光线来说,我们的目标是通过确定xpx_p(看右边那张图,二次反射平面上的点)的深度d3d_3。通过深度进一步计算这条反射路径的飞行时间tpeak=dct_{peak} = \frac{d}{c}。当d3d_3已知时,d1d_1d2d_2也可以被计算了。因为llxsx_sxlx_l都已知。我们就可以通过: d2=lxp2d_2 = ||l-x_p||_2 d3=xpxs2d_3 = ||x_p-x_s||_2 首先我们先对第一条光线rpr_p上从近到远采样PP个点,并使用MLP查询这几个点的深度信息。也就是通过这几个点的NeRF获取深度,这也是NeRF的性质。查询到的密度是σ1,...,σP\sigma_1, ..., \sigma_P。做完这些准备工作之后就可以开始计算d3d_3了。在前文铺垫了很多,但最终的目的是要得到d3d_3这个深度。它的深度信息通过: d^3(rp)=i=1NTiaiti\hat d_3(r_p) = \sum^N_{i = 1}T_i a_i t_i 得到,其中: Ti=j=1i1(1aj)T_i = \prod^{i - 1}_{j =1}(1-a_j),ai=1eσiδia_i = 1-e^{-\sigma_i\delta_i} 在这里,δi=titi1\delta_i = t_i - t_{i-1}是沿着光线两个采样点之间的距离,d3d_3的求解方程可以理解成离散化对期望的积分。TiaiT_ia_i是光线到这点停止的概率。TiT_i是透射率。总而言之,我们通过这些流程,先通过神经网络得到计算ToF,并且能得到对应的深度信息。

渲染第二条光线

1931718963802_.pic.jpgimage.png 再来看这个图,渲染第二条光线的目的是确定xpx_p是否在阴影里,也就是对阴影的预测。能从图里很明显的看出紫色的线条是第二条光线。我们直观来想,如果xpx_p处于阴影中,那么次级光线密度会很高。要不然就会很低。 pshadow=j=1N1(1aj)p_{shadow} = \prod_{j=1}^{N-1}(1-a_j) 我们用这个公式来表示xpx_p不处于阴影中的概率,这个公式代表了二条光线的透射率,透射率较低代表xpx_p处于阴影中。而且对于这个光线来说,因为它是两次反射间的光线。拿右图举例子,它是一条处于lKl_Kxpx_p间的光线。可以由此确定远平面和近平面(光从哪里来,到哪里去)。因此渲染第二条光线的目的就是为了确定阴影。

结合两条光线

1941718977115_.pic.jpgimage.png 除了渲染好光线,我们更需要把渲染结果结合起来进行重建工作,具体来说分两种损失对MLP进行训练。

  • 距离loss:距离loss使用欧氏距离的平方来衡量。公式如下:

Lprimary=tpeakt^peak22L_{primary} = ||t_{peak} - \hat t_{peak}||^2_2 在这里,tpeakt_{peak}是瞬态测量的ToF,而t^peak\hat t_{peak}是NeRF预测d3d_3后计算的ToF。这个距离loss我们只会在无阴 影上进行计算,对有阴影的像素。二次反射都不会存在。但是我们仍然可以估计有阴影场景的深度,因为随 时间的推移,阴影也会转化成不是阴影的场景。

  • 阴影loss:

Lsecondary=sp^shadow22L_{secondary} = ||s - \hat p_{shadow}||^2_2 阴影损失确定ss瞬态观测值和渲染值p^shadow\hat p_{shadow}之间的欧式距离平方作为第二个损失。

  • loss确定:

L=Lprimary+βLsecondaryL = L_{primary} + \beta L_{secondary} β 是一个超参数。一旦 MLP 在这个损失函数上训练完毕,可以通过密集采样 3D 场景点并在这些点上查询 MLP 来提取预测的体积密度。结果密度可以用于从任何视点渲染深度图。这个损失函数虽然形式简单,但仅 使用基于物理的测量而无需数据先验,就能重建可见和被遮挡的场景。

来看看渲染结果吧

1951718978960_.pic.jpg 文章提供了预测深度在训练视角和新测试视角上的定性结果,比较了文章的方法、BF Lidar 和 S³–NeRF 与四个场景中的真实数据的对比。每种方法都从展示的一个训练视角进行训练,并重建整个场景。

总结

PlatoNeRF在自动驾驶、扩展现实(XR)等领域有着广泛的应用潜力。例如,在XR游戏中,虚拟物体的物理行为可以更加真实地反映被遮挡的几何结构。此外,该方法适用于室内场景,特别是在需要多表面反射光的情况下。总的来说,PlatoNeRF通过结合NeRF和双跳跃激光雷达技术,实现了单视图下更为准确和物理真实的3D重建,展示了在现实应用中的潜力。