NeRF原理 学习笔记
NeRF原理 学习笔记
假设有一个场景在不同视角中拍的图片
现在给定一个全新的视角,能否预测这个视角下的图像
本质:
已知在 下的散点,是否能在一个给定一个 得到新的
常见的方法是,先拟合出 的函数
显示表征 Explicit
| 方法 | 优势 | 劣势 |
|---|---|---|
| Mesh | 搞渲染 | 复杂拓扑重建困难,严重依赖预设模板 |
| Voxel | 结构化优势 | 内存与分辨率矛盾、细节粗糙 |
| Point Cloud | (雷达、相机)可以直接采集 | 非结构化噪声、要后处理优化 |
直观例子:

隐世表征 Implicit
比如截断符号距离函数TSDF

TSDF为0就是物体的表面。
里面是负,外面是正
TSDF需要融合深度信息
NeRF
Nerf与TSDF有很多相似处
试图将场景变成一个与空间相关的函数
由采样点位置和观测方向组成的五维向量
利用体渲染密度
这一渲染过程
像素颜色真值是可知的
而其本质,就是构建这样一个函数:

给定位置和观测角度,返回RGB和密度
因此我们可以设计一个渲染方法,来得到任意角度的图片了
第一步,进行数据采样
生成直线,不断截断
第二步:神经网络预测,输入多层感知机,
第三步:体渲染,沿光线积分。这个积分是可微分的

第四步:损失计算的优化
计算均方误差,来逐步最小化损失函数

效果:渲染度高、效率高
体渲染 Volume Rendering

我们先看后者,类似不透明度
为什么会存在指数函数?
我们假设有一条射线穿过,会传到多远停止?
假设存在一点 ,在 的密度是均匀的
设 为传到 没有停止的概率
我们现在要推出

这就是一个微分公式。所以必然有exp
我们在看第一条式子,渲染颜色Color

用累计不透明度继续求和
至此,我们得到了体渲染的基本公式。

要离散化处理
采样点越小,就会越精确
同样 表示到这个采样点后不再向前传播的概率
位置编码 Positon Encoding
原理:将位置坐标输入网络前,先用三角函数进行傅里叶变换
目的是MLP网络可以更好去拟合高频信息
神经网络会以相对平均来拟合,那样子会导致最后的模糊
那样子映射到高维后用微小的变化也会有巨大的效果

如上图,如果直接输入就会比较模糊。所以我们要预处理
体素分层采样
存在问题:关键地方少采样,空地方多
方法:
第一次,判断密度集中区域
第二次:对集中区域再采样

所以是把初采样和第二次采样弄在一起
网络结构

颜色要考虑位置量和视角一起串联(第9层)
位置编码信息由3维升级到60维
总结
优点:
- 自监督方式。只需要多视角图像输入
- 可微渲染
缺点:
- 成本较高
- 与传统融合有问题(不可编辑)
- 对输入视角有要求
- 没有泛化能力
相关研究
Mip-NeRF
一种比较简单的方式,对多条射线来采集。但会消耗大量计算资源
另一种:
-
多尺度表示:连续空间预过滤辐射场
-
圆锥体采样:对场景中每个像素,是从相机中心投入一个圆锥。这是一个三维高斯,来渲染预过滤的像素、
那样子就是把像素点改成像素圆台
这样子也可以解决锯齿的问题
-
集成位置编码IPE:允许空间中的位置被三维表示
PlenOctrees
贡献点:
-
引入NeRF-SH模型。它不直接输出某一视角方向的颜色。可以大幅减少训练时间。
广泛用于光照、球形方面
球谐函数是三维高斯的一环
-
采用稀疏八叉树结构
预计每个体素的值,避免重复输入网络
只在信息密集的地方进行多采样渲染
Instant-NGP
用Navid提出
可以在30s训练出传统NeRF要几小时渲染
其关键是多分辨率哈希编码
将输入坐标进行映射
对于任意给定的输入坐标,将整数坐标进行映射