NeRF原理 学习笔记

假设有一个场景在不同视角中拍的图片

现在给定一个全新的视角,能否预测这个视角下的图像

本质:

已知在 xyx-y 下的散点,是否能在一个给定一个 xx 得到新的 yy

常见的方法是,先拟合出 y=f(x)y=f(x) 的函数

显示表征 Explicit

方法 优势 劣势
Mesh 搞渲染 复杂拓扑重建困难,严重依赖预设模板
Voxel 结构化优势 内存与分辨率矛盾、细节粗糙
Point Cloud (雷达、相机)可以直接采集 非结构化噪声、要后处理优化

直观例子:

image-20260807113319367

隐世表征 Implicit

比如截断符号距离函数TSDF

image-20260807115012470

TSDF为0就是物体的表面。

里面是负,外面是正

TSDF需要融合深度信息

NeRF

Nerf与TSDF有很多相似处

试图将场景变成一个与空间相关的函数

由采样点位置和观测方向组成的五维向量

利用体渲染密度

这一渲染过程

像素颜色真值是可知的

而其本质,就是构建这样一个函数:

image-20260807115255204

给定位置和观测角度,返回RGB和密度

因此我们可以设计一个渲染方法,来得到任意角度的图片了

第一步,进行数据采样

生成直线,不断截断

第二步:神经网络预测,输入多层感知机,

第三步:体渲染,沿光线积分。这个积分是可微分的

image-20260807115421158

第四步:损失计算的优化

计算均方误差,来逐步最小化损失函数

image-20260807115454308

效果:渲染度高、效率高

体渲染 Volume Rendering

image-20260807115535466

我们先看后者,类似不透明度

为什么会存在指数函数?

我们假设有一条射线穿过,会传到多远停止?

假设存在一点 tt,在 [t,t+dt][t,t+dt] 的密度是均匀的

T(t)T(t) 为传到 tt 没有停止的概率

我们现在要推出 T(t+dt)T(t+dt)

image-20260807115709244

这就是一个微分公式。所以必然有exp


我们在看第一条式子,渲染颜色Color

image-20260807115745091

用累计不透明度继续求和

至此,我们得到了体渲染的基本公式。


image-20260807115834678

要离散化处理

采样点越小,就会越精确

同样 TiT_i 表示到这个采样点后不再向前传播的概率

位置编码 Positon Encoding

原理:将位置坐标输入网络前,先用三角函数进行傅里叶变换

目的是MLP网络可以更好去拟合高频信息

神经网络会以相对平均来拟合,那样子会导致最后的模糊

那样子映射到高维后用微小的变化也会有巨大的效果

image-20260807120101122

如上图,如果直接输入就会比较模糊。所以我们要预处理

体素分层采样

存在问题:关键地方少采样,空地方多

方法:

第一次,判断密度集中区域

第二次:对集中区域再采样

image-20260807120214918

所以是把初采样和第二次采样弄在一起

网络结构

image-20260807120247517

颜色要考虑位置量和视角一起串联(第9层)

位置编码信息由3维升级到60维

总结

优点:

  1. 自监督方式。只需要多视角图像输入
  2. 可微渲染

缺点:

  1. 成本较高
  2. 与传统融合有问题(不可编辑)
  3. 对输入视角有要求
  4. 没有泛化能力

相关研究

Mip-NeRF

一种比较简单的方式,对多条射线来采集。但会消耗大量计算资源

另一种:

  1. 多尺度表示:连续空间预过滤辐射场

  2. 圆锥体采样:对场景中每个像素,是从相机中心投入一个圆锥。这是一个三维高斯,来渲染预过滤的像素、

    那样子就是把像素点改成像素圆台

    这样子也可以解决锯齿的问题

  3. 集成位置编码IPE:允许空间中的位置被三维表示

PlenOctrees

贡献点:

  1. 引入NeRF-SH模型。它不直接输出某一视角方向的颜色。可以大幅减少训练时间。

    广泛用于光照、球形方面

    球谐函数是三维高斯的一环

  2. 采用稀疏八叉树结构

    预计每个体素的值,避免重复输入网络

    只在信息密集的地方进行多采样渲染

Instant-NGP

用Navid提出

可以在30s训练出传统NeRF要几小时渲染

其关键是多分辨率哈希编码

将输入坐标进行映射

对于任意给定的输入坐标,将整数坐标进行映射