NeRF

目标:从任意角度渲染出清晰的场景图片

优化隐式的连续场景,利用稀疏的视角作为全连接神经网络的输入

输入:

两个向量:
		1. 空间坐标x(x, y, z三个维度)
		2. 视角方向d(θ, φ两个角度,初步怀疑是直角坐标转化为球坐标时用到的两个角度)
		由于体素渲染的天然可区分性,用于优化视图的输入只有一系列已知相机视角的图片

输出:两个

		1. 体素密度σ
		2. 发散颜色 c = (r, g, b)

映射

		FΘ : (x, d) → (c, σ)
		σ是单纯由x,通过多视图一致限制神经网络进行预测的
		c是由x 和 d一起,通过某个函数预测的

映射过程

映射过程

映射过程

如何渲染图片?

基于辐射场的体素渲染法

经典的体素渲染法

从虚拟的相机射线上从远端到近端(近端指遇到粒子阻隔处)对每一个点的透明度进行求和,在连续射线上近似为积分过程

基于分段随机采样的离散近似volume rendering方式

实际应用场景中,采取数值近似的方法。
将相机射线上需要积分的部分进行均匀划分,在划分出的每一个小块上进行随机采样,借此简化积分表达式。

优化过程

位置编码

为什么要有?
文章中指出,尽管神经网络可以普适地拟合函数,但是在实际过程中,仅依赖五维输入,最终的结果在高频变动的颜色和几何上不尽如人意(perform poorly)

为什么会有上述的缺点?
On the spectral bias of neural networks中指出,神经网络偏向学习低频函数

怎么做?
在把数据丢给网络之前,将其映射到高维空间

具体:
(1)先将x, d在[-1,1]范围内进行标准化
(2)通过γ(p)对分量分别进行映射

多层级体素采样

为什么要有?
原本的渲染策略效率不高,对于一些空的和被遮挡的部分,对渲染图片没有贡献,但是却被重复采样

为什么多层级采样会表现连续的场景?
多层感知机在连续场景下的估计值比优化要好(it results in the MLP being evaluated at continuous positions over the course of optimization)

怎么做?
(1)采取不一致的离散化。
(2)同时优化两个网络,一个“coarse”,一个“fine”。
(3)对于“coarse”网络的采样时偏向信息多、联系多的点。重写积分函数,构造相机射线上的分段连续。
(4)对于"fine"网络,采用的是上一步采样的交集。

代码运行

代码链接:https://github.com/yenchenlin/nerf-pytorch

一共运行了两个数据集,lego和fern(需在运行前对数据集进行下载,具体步骤在代码文件的readme中)
运行时间超过十个小时

运行结果:最终生成视频,连续地展示不同视角下的场景

代码结构

(映射过程的图)

  1. 生成相机虚拟射线
  2. 用生成的虚拟射线rays,生成体素密度和特征向量
  3. 沿光线积分,得到颜色
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐