NeRF神经辐射场学习笔记(一)——NeRF论文翻译以及原理解读

声明

本人书写本系列博客目的是为了记录我学习三维重建领域相关知识的过程和心得,不涉及任何商业意图,欢迎互相交流,批评指正。

论文概述

本文提供了一种新的思路——神经辐射场(NeRF,Neural Radiance Fields),其能够隐式地用一个MLP全连接神经网络来表示一个静态物体或者场景,参数经过优化后的网络则可以从任意角度生成场景的图片。由于NeRF超强的隐式三维信息表达能力,使得其快速应用于新视点合成、三维重建等领域。
论文的要点一共可以分为三大部分:

  1. 第一部分是对于NeRF场景表示的原理以及流程概述;
  2. 第二部分则是介绍NeRF中用于渲染当前点颜色信息的传统体素渲染方法以及其离散化推导;
  3. 第三部分则是MLP优化过程上的两点技巧,分别是位置信息编码(Positional encoding)——对位置信息进行升维处理以得到网络对图像高频领域的清晰表示、多层级体素采样(Hierarchical volume sampling)——优化采样方式来提高图像的渲染效率;

Neural Radiance Field Scene Representation(NeRF场景表示)

请添加图片描述

  1. 首先将连续的场景隐式地用一个函数表示,该函数的输入是一个5D向量(3D的位置坐标 x = ( x , y , z ) \textbf{x}=(x,y,z) x=(x,y,z)以及2D视角方向 ( θ , ϕ ) ( \theta,\phi) (θ,ϕ)),其中我们将视角方向用一个三维笛卡尔单位向量 d \textbf{d} d来表示;输出为颜色信息 c \textbf{c} c=(r,g,b)和体密度 σ \sigma σ——有关于x点处的体密度, σ ( x ) \sigma(x) σ(x)被定义为一条射线r在经过x处的一个无穷小的粒子时被终止的概率,类似于x点处的不透明度 。在NeRF下,该函数近似用MLP网络不断优化来实现,记作: F Θ : ( x , d ) → ( c , σ ) F_{\Theta}:(\textbf{x},\textbf{d})\to(\textbf{c},\sigma) FΘ:(x,d)(c,σ)
  2. 接下来将从MLP网络中得到的体密度和颜色信息利用体绘制(volume rendering)方法合成到图像中去;
  3. 最后通过最小化体绘制合成图像与真实图像之间的Loss函数来优化MLP网络的参数,得到隐式场景表示;
    请添加图片描述
    有上图所示,同一位置的颜色信息可能会随观察方向的改变而改变,而体密度与位置信息是一致的;则令体密度 σ \sigma σ的预测只与位置信息 x \textbf{x} x相关,即在MLP网络中,首先将 x \textbf{x} x位置信息通过8层全连接层(激活函数为ReLU,每层有256个通道),输出体密度 σ \sigma σ以及一个256维的特征向量;紧接着将该特征向量与观察方向 d \textbf{d} d链接并通过另外一个全连接层(激活函数为ReLU,每层有128个通道),最终输出基于方向的RGB颜色信息;

Volume Rendering with Radiance Fields(基于辐射场的体绘制方法)

方法介绍

体绘制(Volume rendering)是一种用于显示离散三维采样数据集的二维投影技术,为了渲染三维数据集的二维投影,首先需要定义相机相对于几何体的空间位置,还需要定义每个点即体素的不透明性以及颜色;
请添加图片描述
根据NeRF应用的传统体绘制方法描述,若将一个相机射线记为 r ( t ) = o + t d r(t)=\textbf{o}+t\textbf{d} r(t)=o+td,其中 o \textbf{o} o是射线原点,近处远处的界限为 t n t_n tn t f t_f tf,则期望的颜色 C ( r ) C(r) C(r)可以被表示为: C ( r ) = ∫ t n t f T ( t ) σ ( r ( t ) ) c ( r ( t ) , d ) d t , where  T ( t ) = e x p ( − ∫ t n t σ ( r ( s ) ) d s ) C(r)=\int^{t_f}_{t_n}T(t)\sigma(r(t))\textbf{c}(\textbf{r}(t),\textbf{d})dt,\text{where } T(t)=exp\bigl(-\int^t_{t_n}\sigma(\textbf{r}(s))ds\bigr) C(r)=tntfT(t)σ(r(t))c(r(t),d)dt,where T(t)=exp(tntσ(r(s))ds)其中函数 T ( t ) T(t) T(t)表示射线从 t n t_n tn t t t的累积透明度(accumulated transmittance),即光线从 t n t_n tn t t t而不击中任何其他粒子的概率;

离散化推导

原文中表示,从NeRF去渲染一幅场景图像需要跟踪通过该虚拟相机的每个像素点的相机光线去估计这个积分的值 C ( r ) C(\textbf{r}) C(r),而像素点是离散化的,所以采用计算机进行计算时需要将该表达式离散化。最直观的思路则是运用一种常用于渲染离散体素网络的方法——确定性求积(Deterministic quadrature),其原理是在需要求积的区域均匀地采样N个点进行近似计算;但是原文表示这样使得MLP只会在固定的离散位置集中被查询(query),从而选择性地限制图像表示的分辨率。

Rendering a view from our continuous neural radiance field requires estimating this integral C ( r ) C(\textbf{r}) C(r) for a camera ray traced through each pixel of the desired virtual camera.
Deterministic quadrature, which is typically used for rendering discretized voxel grids, would effectively limit our representation’s resolution because the MLP would only be queried at a fixed discrete set of locations.

所以原文提出了一种新的思路——分层抽样法(stratified sampling approach),即将 t n t_n tn t f t_f tf分为N个均匀区间,然后从每一个区间中随机抽取一个样本点,则第i个采样点可以表示为: t i ∼ U [ t n + i − 1 N ( t f − t n ) , t n + i N ( t f − t n ) ] t_i\sim \mathcal{U} [ t_n+\frac{i-1}{N}(t_f-t_n),t_n+\frac{i}{N}(t_f-t_n) ] tiU[tn+Ni1(tftn),tn+Ni(tftn)]
这样做,由于是随机采样,即使是同一条射线采样点也会不同,保证了MLP在不断的训练优化的过程中被估计在宏观上“连续”的位置,从而确保了场景表示的连续性。基于以上的思路,将积分转化为求和的形式为: C ^ ( r ) = ∑ i = 1 N T i ( 1 − e x p ( − σ i θ i ) ) c i , 其中  T i = e x p ( − ∑ j = 1 i − 1 σ j θ j ) , δ i = t i + 1 − t i 是相邻采样点的距离 \hat{C}(\textbf{r})=\sum^N_{i=1}T_i(1-exp(-\sigma_i\theta_i))\textbf{c}_i,\text{其中 }T_i=exp(-\sum^{i-1}_{j=1}\sigma_j\theta_j),\delta_i=t_{i+1}-t_i\text{是相邻采样点的距离} C^(r)=i=1NTi(1exp(σiθi))ci,其中 Ti=exp(j=1i1σjθj),δi=ti+1ti是相邻采样点的距离

Optimizing a Neural Radiance Field(优化神经辐射场)

技巧1——Positional encoding(位置编码)

请添加图片描述
原文表示,如上图所示,直接将位置信息和观察方向作为MLP网络的输入而得到的图像,在对于高分辨率场景的表示时效果不佳,这说明深度网络适合学习低频函数;而采用Positional encoding的方式使用高频函数将输入数据进行升维,映射到高维空间后,能够有效的拟合并表示出高分辨率细节;
文中运用的编码函数为:
γ ( p ) = ( s i n ( 2 0 π p ) , c o s ( 2 0 π p ) , ⋯   , s i n ( 2 L − 1 π p ) , c o s ( 2 L − 1 π p ) ) \gamma(p)=(sin(2^0\pi p),cos(2^0\pi p),\cdots ,sin(2^{L-1}\pi p),cos(2^{L-1}\pi p)) γ(p)=(sin(20πp),cos(20πp),,sin(2L1πp),cos(2L1πp))
其中L是维度参数,L越大则能够拟合更高频的内容,经过另一篇论文的实验结果,将 γ ( x ) \gamma(\textbf{x}) γ(x)的L设为10, γ ( d ) \gamma(\textbf{d}) γ(d)的L设为4。

技巧2——Hierarchical volume sampling(多层级体素采样)

原本的渲染方法——在每个摄像机射线的N个查询点上密集地评估神经辐射场网络是低效的,因为对渲染图像没有贡献的自由空间和遮挡区域仍然重复采样。 所以原文又提出了一种分层表示的方法——通过按样本对最终渲染的预期效果的贡献比例分配样本来提高绘制效率。

a hierarchical representation that increases rendering efficiency by allocating samples proportionally to their expected effect on the final rendering

文章中同时对两个网络进行优化,分别为粗网络(coarse)和精网络(fine);首先用均匀随机抽样在 N c N_c Nc个点集中进行采样,并通过coarse网络进行估计输出结果;利用网络输出的 σ i \sigma_i σi结果,改写离散求和函数当中的参数: C ^ c ( r ) = ∑ i = 1 N w i c i \hat{C}_c(\textbf{r})=\sum^N_{i=1}w_i\textbf{c}_i C^c(r)=i=1Nwici,令 w i = T i ⋅ ( 1 − e x p ( − σ i δ i ) ) w_i=T_i\cdot(1-exp(-\sigma_i\delta_i)) wi=Ti(1exp(σiδi)),并且对 w i w_i wi进行归一化: w ^ i = w i ∑ j = 1 N c w j \hat{w}_i=\frac{w_i}{\sum^{N_c}_{j=1}w_j} w^i=j=1Ncwjwi,该 w ^ i \hat{w}_i w^i可以被视为是沿着射线的物体的概率密度函数,通过这个概率密度函数,我们可以粗略地得到射线方向上物体的分布情况;
请添加图片描述
接下来根据这个概率密度函数,采用逆变换采样(inverse transform sampling),得到 N f N_f Nf个点,并且用所有 N c + N f N_c+N_f Nc+Nf个样本点通过fine网络计算渲染结果;

网络模型训练

最后定义需要优化的损失函数为: L = ∑ r ∈ R [ ∣ ∣ C ^ c ( r ) − C ( r ) ∣ ∣ 2 2 + ∣ ∣ C ^ f ( r ) − C ( r ) ∣ ∣ 2 2 ] \mathcal{L}=\sum_{r\in R}[||\hat{C}_c(r)-C(r)||^2_2+||\hat{C}_f(r)-C(r)||^2_2] L=rR[∣∣C^c(r)C(r)22+∣∣C^f(r)C(r)22]

参考文献和资料

[1]:RAY TRACING VOLUME DENSITIES
[2]:辐射神经场算法——NeRF算法详解
[3]:NeRF原理解析
[4]:【NeRF论文笔记】用于视图合成的神经辐射场技术

  • 17
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

右边的口袋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值