NeuS:用体渲染学习神经隐式表面
论文:NeuS: Learning Neural Implicit Surfaces by Volume Rendering for Multi-view Reconstruction
作者:Peng Wang, Lingjie Liu, Yuan Liu, Christian Theobalt, Taku Komura, Wenping Wang
arXiv:2106.10689v3
本地文件:/root/other/paper/2106.10689v3.pdf
官方页面:arXiv 2106.10689
这篇论文解决什么问题
NeuS 研究的是多视角 3D 表面重建:
多张已知相机位姿的 2D 图像
-> 学习一个连续 3D 表面
-> 提取高质量 mesh
它想结合两类方法的优点:
| 方法 | 优点 | 问题 |
|---|---|---|
| IDR / DVR 这类 surface rendering | 用 SDF 或 occupancy 明确约束表面 | 每条 ray 主要依赖一个交点,梯度太局部,复杂遮挡和突变深度容易卡住 |
| NeRF 这类 volume rendering | 沿 ray 多点采样,优化更鲁棒,适合复杂可见性 | 学的是 density field,缺少明确表面约束,提取 mesh 容易噪声大 |
NeuS 的核心想法是:
用 SDF 表示几何表面,但用 volume rendering 的方式从 2D 图像监督它。
这样既保留了 SDF 的清晰几何含义,又利用了体渲染沿 ray 多点传梯度的优化优势。
一句话版本
NeuS 学习两个连续函数:
其中 是 SDF 网络, 是颜色网络。表面由零水平集给出:
训练时,NeuS 沿相机 ray 采样很多点,把这些点的 SDF 转成可体渲染的 opacity / weight,再合成像素颜色,与输入图像做监督。
图源说明:根据 Wang et al., NeuS 的 neural SDF、color field 与 volume rendering 流程重绘,非论文原图。
模型架构:输入与输出
NeuS 的网络由两个主要 MLP 组成:
- SDF MLP:负责几何。
- Color MLP:负责外观。
补充材料中给出的实现细节是:SDF MLP 使用 8 个 hidden layers,每层 hidden size 为 256,激活函数使用 Softplus;Color MLP 使用 4 个 hidden layers,每层 hidden size 为 256。
输入
训练输入是多张带相机位姿的图像:
每次训练会随机采样一批像素,并生成对应 camera rays:
其中:
- :相机中心。
- :ray 的单位方向。
- :沿 ray 的深度参数。
- :ray 上的 3D 采样点。
对每个采样点,SDF 网络输入:
Color 网络输入通常包括:
其中 是 SDF MLP 中间输出的 feature vector。
输出
SDF MLP 输出 signed distance:
Color MLP 输出颜色:
然后 NeuS 通过 SDF 推导每个采样区间的 opacity ,并进行 alpha compositing,得到渲染像素颜色:
这里最终用于训练的输出是:
- 每条 ray 的渲染颜色 。
- 每个 3D 点的 SDF 值 。
- 训练完成后提取的零水平集 mesh。
| 阶段 | 输入 | 计算 | 输出 |
|---|---|---|---|
| 训练 | posed images、像素颜色、camera rays、可选 mask | 沿 ray 采样,预测 SDF 和 color,体渲染得到 | 渲染颜色、loss、更新 SDF/Color 网络 |
| 推理 / 重建 | 训练好的 SDF 网络,大量 3D 查询点 | 查询 ,提取 | 三角网格 mesh |
| 新视角渲染 | 新相机 ray | 沿 ray 采样并体渲染 | 新视角 RGB 图像 |
输出可以用来干什么
| 输出 | 用途 | 具体说明 |
|---|---|---|
| 判断点在内外 | 在内部, 在外部, 在表面 | |
| 零水平集 | 表面重建 | 用 Marching Cubes 提取 mesh |
| 表面法向 | SDF 梯度可以作为 normal,用于颜色预测和渲染 | |
| 2D 图像监督 | 和真实像素颜色比较,反向传播训练网络 | |
| 可见性建模 | 决定 ray 上哪些采样点贡献最终像素颜色 | |
| color field | 新视角合成 | 给定新相机视角,可以渲染 RGB 图像 |
图源说明:根据 Wang et al., NeuS 的训练和推理流程重绘,非论文原图。
为什么不能直接照搬 NeRF 的 density
NeRF 学的是 volume density:
体渲染权重通常写成:
其中:
如果直接把 SDF 附近的 bell-shaped density 当成 :
为什么直接把 SDF 附近的 bell-shaped density 当成 NeRF 的 会有问题?
为了将体积渲染方法应用于 SDF 网络的训练,作者首先引入了一个概率密度函数:
并将其命名为 S-density,也可以记作 S-密度。
这里的含义是:先由 SDF 网络输出 signed distance:
再把这个 SDF 值送进一个以 0 为中心的 logistic density:
因为 在输入为 0 时最大,所以 会在表面 附近最大。直觉上,它像是在 SDF 零水平集附近放了一个 bell-shaped probability density,用来提示“表面最可能在这里”。
先把 NeRF 的体渲染权重拆开看:
这里的 表示 ray 上 位置的体密度,越大表示这里越可能“吸收光线、贡献颜色”。但最终权重不是只看 ,还要乘上前面积累的透射率:
的意思是:光线从相机走到 之前,还没有被前面内容挡住的概率。
如果直接令:
直觉上看很自然,因为 是一个在 附近达到最大值的 bell-shaped density。也就是说,越靠近 SDF 零水平集, 越大;离表面远, 越小。
问题在于,体渲染真正使用的是:
而不是单独的:
沿 ray 从相机走向物体表面时, 会在表面附近逐渐升高;但与此同时, 会因为前面积累了 density 而持续下降。
所以 是两个趋势相乘:
| 项 | 沿 ray 靠近表面时的变化 | 影响 |
|---|---|---|
| 越靠近 越大 | 希望权重峰值靠近表面 | |
| 随着前方 density 积累逐渐变小 | 把后面的权重压低 |
结果就是:即使 自己在 处最大,乘上 以后, 的最大值也可能提前出现在表面之前。
一个很粗略的数值直觉:
| 位置 | |||
|---|---|---|---|
| 表面之前 | 0.80 | 0.90 | 0.72 |
| 真正表面 | 1.00 | 0.65 | 0.65 |
| 表面之后 | 0.80 | 0.40 | 0.32 |
单看 ,真正表面最大;但乘上 以后,最大权重反而落到了表面之前。这就是 naive S-density 会产生几何 bias 的核心原因。
NeuS 要解决的正是这个错位问题:它不是直接把 当成 NeRF density,而是用 SDF 的 CDF 比值构造 opacity,让渲染权重的峰值更稳定地对齐到 的真实表面附近。
传统 NeRF 本身会用 SDF 吗?
传统 NeRF 一般不使用 SDF 表示几何。它学习的是一个 radiance field,网络通常输入 3D 位置和观察方向:
然后输出:
也就是:
- :volume density / opacity density,表示这个空间点有多“不透明”。
- :从方向 看过去的颜色。
所以在传统 NeRF 里,density 通常就是网络直接预测出来的标量;它不是由 SDF 再转换出来的。
这也是 NeRF 和 NeuS 的关键区别:
| 方法 | 几何网络输出 | 表面在哪里 | 体渲染里用的 density / opacity 从哪里来 |
|---|---|---|---|
| NeRF | 直接输出 | 没有显式零水平集,通常从 density 场中后处理提取 | 网络直接预测 |
| NeuS | 输出 SDF | 明确是 | 由 SDF 的 CDF / density 构造 opacity |
因此,NeuS 不是“传统 NeRF 直接应用到 SDF”那么简单,而是把 NeRF 的 volume rendering 优化方式借过来,同时把几何表示换成更适合表面重建的 SDF。
会出现一个问题:权重 的最大值不一定落在真正表面 的位置,而可能偏到表面之前。
这就是论文说的 bias:渲染权重峰值和真实零水平集不对齐,最终会带来几何误差。
图源说明:根据 Wang et al., NeuS 中 naive S-density 与 NeuS weight construction 的 bias 分析重绘,非论文原图。
SDF 如何变成可体渲染的权重
NeuS 先定义 logistic CDF:
它的导数是 logistic density:
把 SDF 值代入后得到 S-density:
这个分布在 附近最大。参数 控制峰的尖锐程度, 可以理解成标准差量级;训练越收敛,表面越清晰,分布越集中。
图源说明:根据 Wang et al., NeuS 的 S-density、opacity 与 volume rendering 公式重绘,非论文原图。
NeuS 的 opaque density
NeuS 不直接令 ,而是定义 opaque density:
然后仍然走 volume rendering:
这套构造的目标是同时满足:
- unbiased:权重峰值落在 的表面交点附近。
- occlusion-aware:如果 ray 穿过多个表面,前面的表面贡献更大,后面的表面会被遮挡。
离散 alpha 公式
实际训练时沿 ray 采样离散点:
NeuS 使用下面的 opacity:
然后:
可以把 理解成“第 个采样区间真正被看到并贡献颜色的概率权重”。
为什么 alpha 公式里是两个 CDF 相减?
可以理解成 SDF 值经过 sigmoid 后的累计量。沿 ray 从外部走向内部时, 会从正数逐渐变成负数,因此 会下降。
两个相邻 section point 的差:
衡量的是这个小区间里“穿过表面附近概率质量”的多少。
再除以:
相当于在“当前还没有被前面完全遮挡”的条件下,计算这个区间产生 opacity 的比例。
最后取:
是为了避免 ray 上某些 SDF 增大的区间产生负 opacity。
所以这个公式不是随便构造的,它是在把 SDF 的零水平集附近概率质量转成 volume rendering 能用的 opacity。
训练目标
训练时没有 3D ground truth SDF 监督,主要靠 2D 图像颜色监督:
color loss
渲染颜色和真实像素颜色做差:
论文使用 L1 loss。
Eikonal regularization
SDF 的一个重要性质是:
所以加入:
它让网络更像真正的 signed distance function,而不只是任意隐式函数。
optional mask loss
如果有 foreground mask,可以用:
其中:
表示该 ray 上累计的不透明度。
采样策略
NeuS 类似 NeRF 使用 hierarchical sampling:
- 先沿 ray 均匀采样。
- 根据 coarse probability 进行 importance sampling。
- 用更集中在表面附近的采样点计算最终颜色。
补充材料给出的设置是:先均匀采样 64 个点,再进行 4 次 importance sampling,每次额外采样 16 个点,总共 128 个点。
和前面几篇论文的关系
| 方法 | 表示 | 输入 | 输出 | 主要用途 |
|---|---|---|---|---|
| DeepSDF | SDF | latent code + query point | signed distance | 单物体形状表示、补全、插值 |
| PointNet | 点集特征 | point cloud | class / point labels / global feature | 点云分类、分割、encoder |
| ConvONet | occupancy field | point cloud / voxel + query point | occupancy probability | 从观测重建物体或场景 |
| NeuS | neural SDF + color field | posed multi-view images | SDF、rendered color、mesh | 多视角表面重建 |
NeuS 和 DeepSDF 都用 SDF,但训练信号不同:
- DeepSDF 通常需要 3D SDF samples。
- NeuS 主要从 2D posed images 通过可微渲染学习 SDF。
NeuS 和 NeRF 都用 volume rendering,但几何表示不同:
- NeRF 学 density,适合新视角合成,但 mesh 不够干净。
- NeuS 学 SDF,表面就是 ,更适合高质量 mesh extraction。
实验结论
论文在 DTU 和 BlendedMVS 上比较了 IDR、NeRF、COLMAP、UNISURF 等方法。
主要结论:
- 在 DTU 上,无论有 mask 还是无 mask,NeuS 的 Chamfer distance 都优于对比方法。
- 对 thin structures、self-occlusion、abrupt depth change,NeuS 比 surface rendering 方法更稳定。
- NeRF 的体渲染优化虽然稳,但 density field 提取出的 mesh 噪声更明显。
- Ablation 显示,weight construction 很关键;naive S-density 方案会引入几何 bias。
- Eikonal regularization 和 geometric initialization 对输出“真正像 SDF”很重要。
局限
论文指出,一个明显失败场景是 textureless regions。原因是没有纹理的区域对多视角重建来说本身存在歧义,图像监督提供的约束不足。
另一个限制是 NeuS 使用单个全局尺度参数 控制 logistic density 的标准差。不同空间位置的局部几何复杂度不同,理想情况下可能需要 spatially varying sharpness。
我的理解
NeuS 最核心的贡献不是“用 SDF”,也不是“用体渲染”,而是把二者连接得更正确:
让 SDF 的零水平集能通过 volume rendering 从 2D 图像中稳定学习,同时避免直接把 S-density 当 NeRF density 带来的几何偏移。
读 NeuS 时要抓住三条线:
- 表示:几何是 SDF,表面是 。
- 监督:没有直接 3D SDF 标签,而是通过渲染颜色和图像颜色比较。
- 关键公式:用 构造 ,让权重既 occlusion-aware 又尽量 unbiased。
阅读时要抓住的主线
- 为什么 surface rendering 的梯度太局部?
- 为什么 NeRF 的 density field 不适合直接提取高质量 mesh?
- SDF 的零水平集为什么适合表示表面?
- S-density 为什么在表面附近最大?
- 为什么 naive 会产生 bias?
- NeuS 的 公式如何把 SDF 转成体渲染 opacity?
- Eikonal regularization 为什么能让网络更像真正 SDF?
后续问题
- NeuS 和 VolSDF 的 SDF-to-density 设计有什么区别?
- NeuS 的 bias-free 是一阶近似意义下的,二阶误差实际影响有多大?
- 为什么后续很多方法会在 NeuS 基础上引入 hash grid、proposal network 或 multi-resolution feature?
- 如果输入是稀疏视角,NeuS 会在哪些地方退化?