总览
- 任务:view synthesis: 视图合成。即输入一些同一个静态3D场景的2D照片 with poses,输出任意其他角度的该场景2D图像。
- 方法:
- 用一个mlp网络来表示静态三维场景
- 之后,可以从任意角度该场景渲染为2D图片(视图合成)。
用神经辐射场NeRF来表示场景
- 基本思路:从某个视角看这个场景,会看到其颜色。于是将场景表示为视角-颜色的对应关系。
- F Θ : ( x , d ) → ( c , σ ) F_{\Theta}:(\mathbf{x}, \mathbf{d}) \rightarrow(\mathbf{c}, \sigma) FΘ:(x,d)→(c,σ)
- 输入:5D视角。
- x = ( x , y , z ) \boldsymbol{x} = (x,y,z) x=(x,y,z) . 目标空间点的3D坐标位置。
- d = ( θ , ϕ ) \boldsymbol{d}=(\theta, \phi) d=(θ,ϕ) . 视角方向,从什么方向去看这个空间点。
- 输出:密度和颜色
- c = ( r , g , b ) \boldsymbol{c} = (r,g,b) c=(r,g,b) 颜色认为与方向和xyz都有关。从不同视角看同一个点,颜色是不一样的。
- σ \sigma σ: density,对应3D体素的密度,也有人叫不透明度。可以理解为一条射线r经过这个位置xyz处的一个无穷小的粒子时,被终止的概率(所以可以叫密度也可以叫不透明度)。这个density是物体本身的属性,和视角方向 d \boldsymbol{d} d无关,只和xyz有关。
- 网络结构:MLP
关于density的解释:
我们常见的3D重建中,一个点是否是物体表面通常是有确定的表示,比如隐式场的0等值面,体素表示中值为1的部分。但这里的denstiy就是一个虚一点的概念,是有一个可以积分的概率表示的。
关于θ和φ的定义,找到这个图:
https://blog.csdn.net/Master_Cui/article/details/119787704
从神经辐射场NeRF渲染出2D图片
思路:2D图片的一个像素,对应了一条从相机发出的射线上所有连续空间点。颜色是被挡住的位置的颜色(在哪里被挡住是由density决定的)。
颜色可以表示为density 乘color的积分。
为了可微,需要将积分过程离散化。近似为,将需要积分的区域分成N分,然后每一个小区域内均匀随机采样。然后积分简化为求和。
两个重要的trick
position encoding 非常重要
不直接使用位置xyz作为输入,而是用position encoding。
- 作者发现直接用position的话,得到结果比较模糊。
- 有先前的研究表明神经网络对低频信息比较敏感,容易忽视高频纹理信息
- 所以作者这样操作来引入高频信息:
- 将刚才的映射函数F,理解为符合函数F’ * γ。 网络要学习的是F’, 而γ是一个将实数映射到高位空间的编码函数。也就是说,先对xyz通过γ映射到高维空间,然后网络直接拿γ(x)作为输入
- 实际的网络结构如下:
- https://blog.csdn.net/Vpn_zc/article/details/115729297
可以看到没有这个position encoding就很模糊:
分层抽样
略
去掉神经 Plenoxel(plenoptic volume elements)
Plenoxels: Radiance Fields without Neural Networks
Alex Yu et al.
UC Berkeley
https://baijiahao.baidu.com/s?id=1720283428332813421&wfr=spider&for=pc
- Plenoxel 是一个稀疏体素网格,
- 其中每个被占用的体素的八个角,分别存储一个标量不透明度σ和每个颜色通道的球谐系数向量。
- 三维空间任一点的density和color,通过其所在的体素的角点做三线性插值即可。
- 不用神经网络,而是直接用数据集,optimization方法来优化这个Plenoxel表示。
这似乎解释了为什么只要NerF只需要MLP就可以实现对3D场景的重建。即使只用optimization也可以做到,没有太多玄学的先验知识需要引入。
每个网络只能表示一个场景
每一个静态3D场景都需要训练自己的NeRF网络。
参考
https://zhuanlan.zhihu.com/p/450521986