NeRF Review v1.0
先验知识
小孔相机成像原理
参考:https://blog.csdn.net/WYXHAHAHA123/article/details/89186666
几种坐标系变换
参考:https://blog.csdn.net/iispring/article/details/27970937?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-1.pc_relevant_default&spm=1001.2101.3001.4242.2&utm_relevant_index=3
安装COLMAP
参考:https://blog.csdn.net/weixin_44217089/article/details/123401685
NeRF
论文地址:https://arxiv.org/abs/2003.08934
github:https://github.com/yenchenlin/nerf-pytorch
NeRF干了啥?
NeRF是3D场景的一种隐式表达
NeRF 将一个连续的场景表示为一个 5D 向量值函数(vector-valued function),其中:
- 输入为:3D 位置 x = (x, y, z) 和 2D 视角方向 (θ, ϕ)
- 输出为:发射颜色 **c **= (r, g, b) 和体积密度 σ
对于其中的 2D 视角方向可以用下图进行直观解释:
在实际实现中,视角方向表示为一个三维笛卡尔坐标系单位向量 dd,我们用一个 MLP 全连接网络表示这种映射:
F Θ : ( x , d ) → ( c , σ ) ( 1 ) \qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad {\bf F_Θ:(x,d)→(c,\sigma)}\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad\qquad(1) FΘ:(x,d)→(c,σ)(1)
通过优化这样一个网络的参数 Θ 来学习得到这样一个 5D 坐标输入到对应颜色和密度输出的映射。
为了让网络学习到多视角的表示,我们预测体积密度 σ 的网络部分输入仅仅是输入位置 x,而预测颜色*c*** 的网络输入是视角和方向 dd。在具体实现上:
1)MLP 网络 FΘ 首先用 8 层的全连接层(使用 ReLU 激活函数,每层有 256 个通道),处理 3D 坐标 x,得到σ 和一个 256 维的特征向量。
2)将该 256 维的特征向量与视角方向 dd 与视角方向一起拼接起来,喂给另一个全连接层(使用 ReLU 激活函数,每层有 128 个通道),输出方向相关的 RGB 颜色。
本文中一个示意的网络结构如下:
Volume Rendering with Radiance Fields (基于辐射场的体素渲染)
经典体素渲染(volume rendering)
我们的 5D 神经辐射场将场景表示为:其所在空间中任意点的体素密度和有方向的辐射亮度。体素密度σ(x) 定义为光线停留在位置 x 处无穷小粒子的可导概率(或者也可以理解为光线穿过此点后终止的概率)。使用经典的立体渲染的原理,我们可以渲染出任意射线穿过场景的颜色。
因此对于某个视角 o 发出的方向为 d 的光线,其在 t 时刻到达点为:
KaTeX parse error: Undefined control sequence: \mit at position 83: …(t)} ={\bf o}+{\̲m̲i̲t̲ ̲t}{\bf d}\qquad…
那么沿这个方向在范围 ( t n , t f ) \ (t_n,t_f) (tn,tf)对颜色积分,获得最终的颜色值 C ( r ) C(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 ( 3 ) \qquad\qquad\qquad\qquad C({\bf r})=∫_{tn}^{tf}T(t)σ({\bf r(t)})c({\bf r(t)},d)dt, \quad where \ T(t)=exp(∫_{tn}^{t}σ({\bf r(s)})ds \qquad\qquad\qquad\qquad(3) C(r)=∫tntfT(t)σ(r(t))c(r(t),d)dt,where T(t)=exp(∫tntσ(r(s))ds(3)
函数 T ( t ) T(t) T(t)表示光线从 t n t_n tn 到 t t t 累积的透明度 (Accumulated Transmission ittance)。换句话说,就是光线从 $ t_n$ 到 t t t 穿过没有碰到任何粒子的概率。按照这个定义,视图的渲染就是表示成对于 C ( r ) C(r) C(r) 的积分,它是就是虚拟相机穿过每个像素的相机光线,所得到的颜色。
基于分段采样近似的体素渲染方法
不过在实际的渲染中,我们并不能进行连续积分,我们使用求积法(quadrature)进行积分的数值求解。通过采用分层采样 (stratified sampling) 的方式对 [ t f , t n ] [t_f,t_n] [tf,tn] 划分成均匀分布的小区间,对每个区间进行均匀采样,划分的方式如下:
t i ∼ U [ t n + i − 1 N ( t f − t n ) , t n + i N ( t f − t ) ] ( 4 ) \qquad\qquad\qquad\qquad\qquad\qquad\qquad t_i∼\mathit U\ [t_n+\frac {i−1}N(t_f−t_n),t_n+\frac {i}N (t_f −t )] \qquad\qquad\qquad\qquad\qquad\qquad\qquad(4) ti∼U [tn+