前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >经典论文 | Nerf: 将场景表示为用于视图合成的神经辐射场

经典论文 | Nerf: 将场景表示为用于视图合成的神经辐射场

作者头像
用户1324186
发布2022-11-07 15:28:59
2.9K0
发布2022-11-07 15:28:59
举报
文章被收录于专栏:媒矿工厂媒矿工厂

作者:Ben Mildenhall,Pratul P. Srinivasan,Matthew Tancik 等 来源:ECCV 2020 项目链接: https://www.matthewtancik.com/nerf 论文链接: https://arxiv.org/abs/2003.08934 内容整理: 王睿妍 本文提出用一个 MLP 神经网络去隐式地学习一个静态的 3D 场景,从而实现以任意的相机位置和朝向作为输入,通过训练渲染出新的场景视角。通俗来说,就是用某个场景的多张 2D 图片隐式重建三维场景,产生让人十分震撼的效果。

目录

  • 引言
  • 算法介绍
    • 三维重建( NeRF函数 )
    • 渲染( 体绘制方法 )
    • 优化神经辐射场
  • 实验结果及对比
    • Loss函数
    • 实验结果

引言

计算机视觉中一个研究方向是在 MLP 的权重中编码对象和场景,使得该 MLP 直接从 3D 空间位置映射到形状的隐式表示。然而,之前的方法无法使用离散的方式(如三角形网格或体素网格)以相同的保真度再现具有复杂几何形状的真实场景,迄今为止也仅限于表示具有低几何复杂性的简单形状,从而导致渲染过度平滑。NeRF提出将一个静态场景表示为5D输入,即:空间中某个位置的3D坐标以及观察方向,通过MLP神经网络得到该位置的颜色以及体密度,使用体绘制技术可以得到输入相机位姿条件下的视角图片,然后和 ground truth 做损失即可完成可微优化,从而渲染出连续的真实场景。

视角合成方法通常使用一个中间3D场景表征作为中介来生成高质量的虚拟视角,如何对这个中间3D场景进行表征,分为了“显示表示“和”隐式表示“,然后再对这个中间3D场景进行渲染,生成照片级的视角。“显示表示”3D场景包括Mesh,Point Cloud,Voxel,Volume等,它能够对场景进行显式建模,但是因为其是离散表示的,导致了不够精细化会造成重叠等伪影,极大地限制了高分辨率场景的应用;“隐式表示”3D场景通常用一个函数来描述场景几何,在表达大分辨率场景的时候它的参数量相对于“显示表示”是较少的,并且隐式表示函数是种连续化的表达,对于场景的表达会更为精细[1]。

算法介绍

整体来看,NeRF的Pipeline可以主要分为三维重建( 即:NeRF函数部分 )和渲染(即利用体绘制技术),然后将体绘制的结果与ground truth 做 L2 损失函数进行优化。

三维重建( NeRF函数 )

三维重建部分的工作即可用上图中蓝框区域内表示。

三维重建部分本质上是一个 2D 到 3D 的建模过程,利用空间中某一3D点的位置坐标

x=(x,y,z)

及观察方向 d =(θ,φ)作为一个5D坐标输入

(x,y,z,\theta,\varphi)

,通过MLP神经网络(不含卷积层的全连接神经网络)建模训练得到该点对应的颜色

c=(r,g,b)

及体密度

\sigma

( volume density ) ,这里的体密度可以理解为透明度,从而形成了 3D 场景的隐式表示 。

因此神经网络可以表示为:

在神经网络的训练过程中,需将位置坐标 x 和先将位置坐标 x(60维)首先输入到 8 个全连接的ReLU层中,每层有256 个通道,输出体密度 σ 和一个 256 维的中间特征向量,该中间特征向量和 观测方向 d (24维)再级联一起输入到的附加的具有 128 个通道的全连接 ReLU 层中预测最终的颜色。其中使用 ReLU 激活函数是为保证输出的体密度非负。

下图为 NeRF 中使用的神经网络构架,其中网络的输入向量用绿色表示,中间隐藏层用蓝色表示,输出向量用红色表示;“+” 符号表示向量串联;黑色实线箭头表示隐藏层使用 ReLU 激活,橙色实线箭头表示隐藏层不使用激活函数,黑色虚线箭头表示隐藏层使用 sigmoid 激活函数。

从上述过程中可以看出:体密度只和空间位置有关,而颜色则与空间位置以及观察的视角都有关系。

渲染( 体绘制方法 )

所谓体绘制就是显示离散三维采样数据集的二维投影技术。在经过神经网络训练后得到对应位置的RGB和体密度,但是当用实际中用一个相机去对这个场景拍摄时,所得到的2D 图像上的一个像素实际上对应了一条从相机出发的光线上的所有连续空间点的颜色积分,这就需要用到体素渲染算法得到这条射线上所有点的最终渲染颜色。

经典体素渲染算法:光线采样+积分

  • 体素密度σ(x)可以被近似理解为该位置点的不透明度。
  • 表示射线:一条射线的原点标记为o,射线方向(即相机视角)标记为d ,则可将射线表示为r(t)=o+td,t的近端和远端边界分别为
t_n

t_f

  • 这条射线的颜色用积分的方式表示为:

T(t)表示的是射线从

t_n

t_f

这一段的累计透明度,即该射线从

t_n

t_f

都没有因击中任何粒子而被停下的概率,具体写作:

其作用是在前面有遮挡物体存在的情况下将后面物体对积分结果的影响减小。当空间中某点前无遮挡时,该点越不透明,对颜色积分结果影响越大;当空间中某点前有遮挡时,由于T(t)的存在而对像素影响减小。

但实际上我们不可能用NeRF去估计连续的3D点的信息,因此需要数值近似的方法。

数值近似方法

1. 确定性求积(Deterministic Quadrature)

一般在需要求积的区域均匀采样N个点进行近似计算。

缺点:限制了神经辐射场的分辨率。

2. 作者提出分层抽样(Stratified Sampling)的方法

首先将射线需要积分的区域 [tn , tf] 均匀分为 N 份,再在每个小区域进行均匀随机采样:

基于这些采样点,可以将上面的积分简化为求和的形式:

优点:保证了辐射场对场景表达的连续性。

优化神经辐射场

位置编码

使用位置信息编码的方式将输入先映射到高频,以提高分辨率,更好地拟合高频变化的数据。

将ϜΘ重写成由两组函数组成:ϜΘ = Ϝ′Θ ∘ γ,其中Ϝ′Θ仍为常规MLP网络,需要通过训练学习得到,而γ用于将输入映射到高维空间中,论文中使用的是R→R^2L的正余弦周期函数的形式:

在实验中对位置和视角信息使用不同的参数L, γ(x)设置 L=10,观察上式发现一个L值对应 sin 和 cos 两个维度,一个矢量 x 其实是在 x, y, z三个方向上都进行计算,因此位置编码后的位置信息γ(x) 共有1023 = 60 个维度;同理对于γ(d)设置 L=4可知有24个维度,与神经网络构架图中矢量维度一致。将 PE 后的 (x,y,z) 和 (θ,ϕ) 作为输入就可以生成更加清晰的图片。

多层级体素采样

NeRF的渲染策略是对相机出发的每条射线都进行N个采样点的求和计算,但渲染效率较低,因为大量对渲染没有贡献的空的或者被遮挡的区域仍在采样计算,因此作者提出一种“coarse to fine”的多层级体素采样方法,同时优化coarse和fine两个网络。其具体做法如下:

  1. 使用分层采样的方法先采集较为稀疏的
N_c

个点,在这些采样点上计算coarse网络的渲染结果,改写前述的离散求和函数:

\omega_i

进行归一化:

  1. 归一化后的
\omega_i

可以看作是沿着射线方向的概率密度函数,如下左图[2]所示。基于这个概率密度函数,使用逆变换采样方法,在

\omega_i

较大的地方多采样,在

\omega_i

少的地方少采样,再采样出

N_f

个点,如右图所示。

  1. 然后在
N_c+N_f

的采样点集合上,计算 fine 网络的渲染结果。

实验结果及对比

Loss函数

训练损失直接定义在渲染结果上的 L2损失(同时优化coarse和fine网络):

实验结果

上表为不同方法在三种数据集应用处理下的PSNR、SSIM和LPIPS指标对比,可以发现NeRF实现了更好的多视图一致性,产生更少的伪影。

从上图中可以看出NeRF与其它baseline对比,渲染结果明显优于其他方法。

上表为作者进行消融实验的结果对比,验证了Positional encoding、view dependence 和 Hierarchical volume sampling 对实验指标的影响。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 媒矿工厂 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
  • 算法介绍
    • 三维重建( NeRF函数 )
      • 渲染( 体绘制方法 )
        • 优化神经辐射场
        • 实验结果及对比
          • Loss函数
            • 实验结果
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档