NeRF论文
-
传统方法存在的问题
-
- 优化一个表达复杂场景的神经辐射场,存在很难收敛到高分辨率表达的问题
-
- 采样效率低
-
-
解决问题的创新点
-
- 将5D坐标和positional encoding一起输入到MLP训练
-
- 使用hierarchical sampling提高采样效率
-
- 新的渲染公式继承了传统体渲染技术可微的特点
-
-
Pipeline
- Input
- 5D coordinates
- Positional encoding
- MLP
- Output
- color
- volume density
- Volume Rendering
- Rendering Loss
- Input

Neural Radiance Field Scene Representation
密度信息 σ \sigma σ仅仅由三维点坐标 x \bold x x进行预测,而颜色信息 c \bold c c允许同时由位置信息 x \bold x x和方向信息 d \bold d d进行预测。
具体的MLP网络结构与上述策略对应。
- 将位置信息 d \bold d d作为输入过第一个网络,8层全连接层,每一层256通道,使用ReLU函数作为激活函数。此网络输出密度信息 σ \sigma σ,以及一个256维的特征向量
- 接着,将次特征向量和方向向量 d \bold d d做拼接,作为第二个网络的输入,128通道,ReLU做激活,输出即为颜色信息 c \bold c c

nerf Pytorch版本中的对应如下:
pts_linears
: 前八层,得到输出为h
- h通过
alpha_linear
得到体密度1维输出 - h和观察视角通过
views_linears
得到128的输出 - 最后得到RGB和σ拼接得到四维输出
Volume Rendering with Radiance Fields
假设前提:发射的光不为观察角度发生改变
因此对于某个视角 o \bold o o发出的方向为 d \bold d d的光线,其在 t \bold t t时刻到达点为: r ( t ) = o + t d \bold r(\bold t)=\bold o+t\bold d r(t)=o+td
那么沿这个方向在范围 ( t n , t f ) (t_n,t_f) (tn,tf)对颜色积分,获得最终的颜色值 C ( r ) C(\bold r) C(r)为:
C ( r ) = ∫ t n t f T ( t ) σ ( r ( t ) ) c ( r ( t ) , d ) d t , w h e r e T ( t ) = e x p ( ∫ t n t σ ( r ( s ) ) d s ) C(\mathbf{r} ) = \int_{t_n}^{t_f} T(t)\sigma (\bold r(t))\bold c(\bold r(t),\bold d)dt,where \, T(t) = exp(\int_{t_n}^{t}\sigma (\bold r(s))ds) C(r)=∫tntfT(t)σ(r(t))c(r(t),d)dt,whereT(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穿过没有碰到任何粒子的概率。按照这个定义,视图的渲染就是表示成对于 C ( r ) C(\bold r) C(r)的积分,它是就是虚拟相机穿过每个像素的相机光线,所得到的颜色。

T ( s ) T(s) T(s)推导过程
σ ( s ) \sigma(s) σ(s):在s处,光线碰撞粒子(光线被阻碍)的概率密度
C ( s ) C(s) C(s):在s处粒子发出的颜色
T ( s ) T(s) T(s):在特定的一段距离内,光线没有撞击其他粒子的概率
根据 P ( A B ) = P ( A ) P ( B ) P(AB) = P(A)P(B) P(AB)=P(A)P(B), s s s到 d s ds ds的路程中没有碰到粒子的概率等于 0 − > s 0->s 0−>s处没有碰到粒子的概率乘 d s ds ds阶段没有碰到粒子的概率;这两个事件为独立事件,推导如下:
T ( s + d s ) = T ( s ) ( 1 − σ ( s ) d s ) T ( s + d s ) − T ( s ) = − T ( s ) σ ( s ) d s T ′ ( s ) = − σ ( s ) d s T ( s ) = e ∫ 0 t σ ( t ) d t C ^ ( t ) = ∫ 0 + ∞ T ( s ) σ ( s ) c ( s ) d s \\ T(s + ds) = T(s)(1 − \sigma(s)ds) \\T(s + ds) − T(s) = −T(s)\sigma (s)ds \\ T^{'}(s) = −\sigma (s)ds \\ T(s) = e^{\int_{0}^{t}\sigma (t)dt} \\ \hat{C}(t) = \int_0 ^{+\infin} T(s) \sigma(s)c(s)ds T(s+ds)=T(s)(1−σ(s)ds)T(s+ds)−T(s)=−T(s)σ(s)dsT′(s)=−σ(s)dsT(s)=e∫0tσ(t)dtC^(t)=∫0+∞T(s)σ(s)c(s)ds
不过在实际的渲染中,我们并不能进行连续积分,因为计算机只能处理离散数据,我们使用求积法(quadrature)进行积分的数值求解。 通过采用分层采样 (stratified sampling) 的方式对 [ t n , t f ] [t_n,t_f] [tn,tf]划分成均匀分布的小区间,对每个区间进行均匀采样,划分的方式如下:
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}\left[t_{n}+\frac{i-1}{N}\left(t_{f}-t_{n}\right), t_{n}+\frac{i}{N}\left(t_{f}-t_{n}\right)\right]