【论文精读】Point-NeRF:Point-based Neural Radiance Fields

CVPR2022 oral的一篇文章,文章还行,代码比较乱,超参非常多且没有注释,代码也有bug
原文链接:https://arxiv.org/abs/2201.08845
代码链接:https://github.com/Xharlie/pointnerf
在这里插入图片描述

Abstract

NeRF对每个场景从头开始重建太过耗费时间,基于学习的multi-view stereo(MVS)可以快速地重建一些场景。该文章把二者结合,使用MVS方法得到3D点云,用以构建辐射场。

1. Introduction & Related work

将真实场景建模并渲染出新的角度下的图片是一个计算机视觉与图形学中的关键问题。NeRF系列的论文在这一方面获得了很好的效果,使用全局的MLP通过ray marching构建radiance fields,但这个过程非常消耗时间,因为针对每个场景拟合本身就很耗时,并且还对很多大片的空旷区域进行了不必要的采样。作者应该是由此想到了使用其他方法获得初始的点云来指导NeRF。Point-NeRF 表现形式包括了一个每个点都有neural feature的点云,每个点编码了3D几何信息和点周围的环境。与以往的NeRF不同,文章将这些神经点视为 3D 中的局部神经基函数,以模拟连续的体积辐射场,从而使用可微分的ray marching实现高质量渲染。初始点云的获得使用了learning-based的MVS。

PixelNeRF和IBRNet在每个ray point添加了多视图2D图像特征用以回归体素特征,而本文利用了(leverage:杠杆作用)场景表面的3D点特征来构建辐射场,这避免了考虑空旷地区的点,从而达到更快的速度和更好的渲染效果。MVSNeRF也可以较快获得结果,但是需要3个small baseline的图片作为输入来重建局部的辐射场,本文方法却可以融合大量数目和视角的图像来更快得到。
在这里插入图片描述

2. Point-NeRF Representation

2.1 Volume rendering and radiance fields

一个pixel的radiance可以通过投射一条穿过像素的光线来计算,沿着这条光线采M个点,使用体素密度得到的累积radiance是:
在这里插入图片描述
其中, τ \tau τ表示volume transmittance, σ j \sigma_{j} σj r j r_{j} rj是在 x j x_{j} xj处的点j的volume density和radiance, Δ t \Delta_{t} Δt是相邻着色样本之间的距离。一个辐射场表示了任意点的volume density σ \sigma σ和与视角有关的radiance r r r,NeRF提出用MLP来回归这样的辐射场,而文章提出用点云作为替代来计算体素属性。

2.2 Point-based radiance field

一个点云 P = { ( p i , f i , y i ) ∣ i = 1 , . . . , N } P=\{(p_{i},f_{i},y_{i})| i =1, ..., N\} P={ (pi,fi,yi)i=1,...,N},其中每个点 i i i位于 p i p_{i} pi并与含有局部场景信息的神经特征向量 f i f_{i} fi关联, y i y_{i} yi是一个在 [ 0 , 1 ] [0,1] [0,1]之间的置信值,描述了这个点接近真实场景表面的程度。
给定任意一个3D位置 x x x,查询半径 R R R之内的 K K K个邻近的neural points。基于点的神经辐射场可以被抽象为一个神经模块,它在任何位置 x x x从其相邻位置回归volume density sigma和与视图相关的radiance r r r,表示为:
在这里插入图片描述
文章使用了形如PointNet的网络,用多个sub MLP来做这个回归任务。

2.3 Per-point processing

使用MLP F来处理每个相邻的神经点来为着色位置 x x x预测一个新的特征向量:
在这里插入图片描述
原始的特征 f i f_{i} fi编码了 p i p_{i} pi周围的局部3D场景信息,这个MLP表示了一个局部3D函数,它输出了 x x x处特定的神经场景描述 f i , x f_{i,x} fi,x ,由其局部帧中的神经点建模。相对位置 x − p x-p xp的使用使得网络对于点的平移不变,从而拥有更好的泛化性能。

2.4 View-dependent radiance regression

使用标准的inverse distance weighting(反距离加权)来聚合特征 f i , x f_{i,x} fi,x 以得到描述 x x x位置场景信息的单个特征 f x f_{x} fx
在这里插入图片描述
然后一个多层感知机R从这个特征和一个给定的视图方向d回归视图相关的radiance:
在这里插入图片描述
反距离权重 w i w_{i} wi被广泛运用于稀疏数据的插值。文章使用它来聚合神经特征,使得更近的神经点为着色计算贡献更多。此外,使用了每个点的置信度 y i y_{i} yi,这在最后的重建中被sparsity loss优化,这使得网络能够拒绝不必要的点。

Tips: 什么是反距离加权?
假设:彼此距离较近的事物要比彼此距离较远的事物更相似。当为任何未测量的位置预测值时,反距离权重法会采用预测位置周围的测量值与距离预测位置较远的测量值相比,距离预测位置最近的测量值对预测值的影响更大。反距离权重法假定每个测量点都有一种局部影响,而这种影响会随着距离的增大而减小。由于这种方法为距离预测位置最近的点分配的权重较大,而权重却作为距离的函数而减小,因此称之为反距离权重法。

2.5 Density regression

为了计算位置 x x x处的volume density σ \sigma σ,先使用多层感知机T来回归 σ i \sigma_{i} σi然后使用反距离权重:
在这里插入图片描述
如此一来,每个神经点直接对volume density(体素密度)作出贡献,置信度也显式地与贡献关联,这一点在后续的除点操作中很有用。
在这里插入图片描述

3. Point-NeRF Reconstruction

在这里插入图片描述

扫描二维码关注公众号,回复: 14611832 查看本文章

3.1 Generating initial point-based radiance fields

给定一组图像 I 1 , . . . , I Q I_{1}, ..., I_{Q} I1,...,IQ,和一个点云,Point-NeRF可以通过优化神经特征和多层感知机重建。现在先想办法快速得到一个初始点云,然后在基于点的辐射场上fine-tune就能快很多了。这一块先介绍了learning-based MVS的流程,Point-NeRF其实可以对接各种获得稠密点云的方法,而不仅仅是MVSNet。
获得点云之后,因为深度置信度描述了点在表面上的可信度,所以为了得到每个点 p i p_{i} pi的置信度 y i y_{i} yi,对MVSNet中的深度置信体进行tri-linearly sample:
在这里插入图片描述
G p , y G_{p,y} Gp,y是基于MVSNet的网络, I q n I_{q_{n}} Iqn ϕ q n \phi_{q_{n}} ϕqn是MVS重建过程中使用的图片的邻域帧,在大部分案例中采用2个就够了。
使用2D CNN G f G_{f} Gf来从每个图片 I q I_{q} Iq中提取特征图,这些特征图与 G p , y G_{p,y} Gp,y出来的点(深度)预测对齐并被直接用来预测每个点的特征 f i f_{i} fi
在这里插入图片描述
G f G_{f} Gf采用了带有3个下采样层的VGG网络。

3.2 Optimizing point-based radiance fields

前面的步骤,我们得到了一个可靠的初始point-based radiance field,再通过可微分的ray marching,我们可以进一步优化神经点云(点特征 f i f_{i} fi和点置信度 y i y_{i} yi)和MLP来提升辐射场。初始的点云往往有空洞或离群点,这会影响到渲染质量。在对场景的优化中,为了解决这个问题,文章发现直接优化现存点的位置会让训练不稳定并且并不能填补大空洞,于是,文章使用了point pruning和growing来逐步提升几何模型和渲染质量。

Point pruning

Point置信度 y i y_{i} yi描述了神经点是否离表面很近,文章使用这些置信度来修剪不必要的离群点。注意到点置信度与每个点在volume density regression中的贡献直接相关,因此,低置信度反映了一个点局部区域的低体素密度,很有可能这里就是空的。因此,每 10000 10000 10000次迭代就删去 y i < 0.1 y_{i}<0.1 yi<0.1的点。文章在这里也引入了一个loss,在点置信度上引入的loss函数如下:
在这里插入图片描述
优化这个loss能强制yi尽量趋近于0或者尽量趋近于1。

Point growing

文章利用在光线行进中采样的每条光线着色位置 x j x_{j} xj来识别新的候选点。具体来说,确定沿光线不透明度最高的着色位置 x j g x_{j_{g}} xjg
在这里插入图片描述
计算 ϵ j g \epsilon_{j_{g}} ϵjg作为 x j g x_{j_{g}} xjg到最近的神经点的距离。
如果 α j g > T o p a c i t y \alpha_{j_{g}}>T_{opacity} αjg>Topacity ϵ j g > T d i s t \epsilon_{j_{g}}>T_{dist} ϵjg>Tdist,则生成一个新点 x j g x_{j_{g}} xjg。这表明这个位置距离表面很近但离其他神经点比较远,通过重复这个步骤,神经场能够被扩大以覆盖初始点云中缺失的区域。这种方法对于较为稀疏的点云尤为有效。

4. Implementation details

Network details

G f G_{f} Gf里的三个层级多尺度特征提取时,向量是 56 ( 8 + 16 + 32 ) 56(8+16+32) 568+16+32通道。最终的每个点的神经特征是 59 59 59通道的向量。

Training and optimization details

整个pipeline在DTU数据集上训练。先预训练MVSNet深度生成网络,然后训练整个渲染的网络,使用 L 2 L2 L2 rendering loss。文章声称前向传播只需要 0.2 s 0.2s 0.2s就由 3 3 3个视图能生成点云。
在对每个场景优化的阶段,loss函数如下:
在这里插入图片描述

5. Experiments

在DTU、NeRF Synthetic、Tanks&Temples和ScanNet数据集上实验,并与其他方法进行了对比,效果很好。
此外,还做了一些额外的实验,将COLMAP重建得到的稀疏点云交给网络,迭代 150 k 150k 150k次后变得很稠密,验证了点云剪枝和生长的有效性。
在这里插入图片描述

6. Conclusion

文章将MVS与NeRF结合,更快地得到了初始点云,并引入了点云的修剪与生长算法,加速了重建与渲染速度,提升了质量。

猜你喜欢

转载自blog.csdn.net/YuhsiHu/article/details/123939121