NeRF1 全称 Neural Radiance Field,是一个函数,将一个三维空间中的位置和方向(可用二维球坐标表示)映射到密度和颜色。这个 Formula 和图像渲染没太大区别,比如传统的计算机图形学中,光线追踪也是将一个三维空间中的位置和方向映射到颜色。NeRF 的输出多了一个密度,对应的就是 Volume Rendering。

Volume Density可以理解为射线(这里的射线是指从相机出发的采样射线,也就是光线的反方向)最终停在处某个无穷小的粒子上的概率。

Volume Rendering: 对于一个从出发,沿方向射出的射线(射线的范围是),它的期望颜色是

其中,也就是因为遮挡导致的颜色权重系数。本质上这个公式就是把每个点点密度和颜色乘起来,然后按照射线方向做一个 alpha blending 类似的累加。

要算这个积分的话其实可以等距取点去算。但是如果 NeRF 的连续性足够好的话是可以做一个类似黎曼积分的方法(stratified sampling):等距划分区间,每个区间里随机选一个点。

前面讲了怎么去用一个 NeRF。接下来是怎么造一个 NeRF。这篇文章里一个 NeRF 就是一个 MLP。

Positional Encoding:作者在这里提了一个观点来解释 Positional Encoding 的重要性。我理解了一下,举个例子,要想让神经网络在学习表示的过程中,学会把一个数字变成它的 onehot 是很困难的,所以不如我直接把这部分的 input 转成 onehot vector 再给到神经网络去学习。所以把三维坐标中的每一维分别变成它的 Positional Encoding 能够极大程度提升训练效果。

Hierarchical Volume Sampling:allocating samples proportionally to their expected effect on the final rendering。初衷是因为有些对渲染结果影响很小的 volume(例如空气的部分)应该减少采样,提高效率。这里的方法是搞两个 NeRF 模型 coarse 和 fine。先用 stratified sampling 在 coarse 模型上拿到每个采样点的信息(不算积分),然后根据这些信息弄一个 PDF 出来,用这个 PDF 再采样一些点,然后把两部分的采样点合到一起去在 fine 模型上算积分来渲染。

训练 NeRF 的输入是若干张图片以及其相机 Pose、内参(相机 Pose 可以用 SFM 算)。Loss 定义为

为啥要分 coarse 和 fine(个人思考):因为 coarse 的采样点比较平均,fine 的采样点是有分布的,所以优化的效果是 coarse 在 average space 上整体预测都不错,而 fine 对于那些对渲染有较大影响的点的预测更准。

1. Mildenhall, B., Srinivasan, P. P., Tancik, M., Barron, J. T., Ramamoorthi, R., & Ng, R. (2022). NeRF: representing scenes as neural radiance fields for view synthesis. In Communications of the ACM (Vol. 65, Issue 1, pp. 99–106). https://doi.org/10.1145/3503250