Neuralangelo

基本信息

项目 内容
论文标题 Neuralangelo
作者 Zhaoshuo Li、Thomas Müller、Alex Evans、Russell H. Taylor、Mathias Unberath、Ming-Yu Liu、Chen-Hsuan Lin
作者单位 NVIDIA Research(主导)、Johns Hopkins University
时间 2023
发表会议/期刊

方法概览

特点 文章性质
输入 标定之后的多视角图像
输出 Mesh
所属领域 MeshMVS

image-20251202195102507

摘要精简

Neuralangelo 是一种用于高保真神经表面重建的方法。它结合了多分辨率3D哈希网格(Instant NGP)的表示能力和神经表面渲染。将多分辨率哈希编码的表示能力融入神经符号距离函数(SDF),实现高保真神经表面重建。其核心创新点在于:1)使用数值梯度计算高阶导数(如表面法线)作为一种平滑操作;2)在控制不同细节层次的哈希网格上进行从粗到精的优化。即使没有深度等辅助输入,Neuralangelo 也能从多视角图像中有效恢复稠密的3D表面结构,其保真度显著超越先前方法,实现了从RGB视频中重建详细的大规模场景。

引言与出发点

  • 问题背景:从多视角图像进行3D表面重建是一个核心任务。传统的多视图立体算法难以处理模糊区域(如大面积单色、重复纹理或强烈颜色变化),导致重建结果存在噪声或缺失表面。现有的神经表面重建方法虽然更优,但其恢复的保真度无法很好地随MLP容量扩展。
  • 动机与目标:近期提出的多分辨率哈希编码(Instant NGP)极大地提高了神经场景表示的表示能力。然而,将其直接应用于表面重建任务时,面临优化不稳定的问题。本文旨在充分释放多分辨率哈希编码在表面重建中的潜力,实现高保真、大规模的3D场景重建。
  • 核心思路:引入数值梯度计算高阶导数以稳定优化,并采用从粗到精的渐进式优化策略来恢复不同层次的细节。

创新点

  1. 哈希编码与神经 SDF 的深度融合:首次将多分辨率哈希编码自然集成到神经 SDF 框架中,利用哈希编码的对数级内存增长特性,在保证高分辨率细节表示的同时,避免 MLP 的表达瓶颈。
  2. 数值梯度驱动的高阶导数计算:通过数值梯度替代解析梯度计算 SDF 的表面法向(高阶导数),打破哈希编码解析梯度的局部性限制,使优化更新传播至多个网格单元,保证表面连续性与平滑性。
  3. 粗到细渐进优化策略:通过两方面实现渐进细节恢复:一是逐步减小数值梯度步长ϵ(从粗网格尺寸到细网格尺寸),二是逐步激活更高分辨率的哈希网格,避免细网格特征被粗优化误导,高效恢复多尺度细节。
  4. 曲率正则化与拓扑预热:引入基于离散拉普拉斯的曲率损失,约束表面平滑性;采用拓扑预热策略(线性提升曲率损失权重),解决初始球形 SDF 难以形成凹形结构的问题。

网络架构

Neuralangelo 采用神经表面渲染框架,以符号距离函数(SDF) 表示场景表面。核心组件包括:

  1. 多分辨率哈希编码器:将3D位置 x\mathbf{x} 编码为高维特征向量 γ(x)\gamma(\mathbf{x})。包含 16 个分辨率层级(2^5至2^11),每个网格单元通过哈希映射存储 8 维特征,负责将 3D 空间位置编码为高维特征向量。

  2. SDF MLP:一个浅层MLP,接收哈希编码特征 γ(x)\gamma(\mathbf{x}),预测该点的SDF值 f(x)f(\mathbf{x})

  3. 颜色 MLP:4 层 MLP,接收 SDF 特征、3D 位置、视图方向、表面法向,预测 3D 点的颜色,支持可选的图像嵌入(处理曝光变化)和本征分解(反照率 + 阴影)。

  4. 基于SDF的体积渲染:使用NeuS [41] 提出的方法,将SDF f(x)f(\mathbf{x}) 转换为体密度 α\alpha,然后通过标准体积渲染公式(Eq.1)合成像素颜色。

  5. 数值梯度计算模块:在 3D 点的 x/y/z 轴附近采样 6 个额外点,计算数值梯度以获取表面法向,用于欧氏正则化和曲率计算。

  6. 粗到细优化调度器:控制哈希网格分辨率的激活顺序和数值梯度步长ϵ的衰减,协调全局结构与局部细节的优化。

整体流程为:输入多视角RGB图像及相机位姿 → 沿光线采样3D点 → 哈希编码 → SDF/颜色预测 → 体积渲染 → 与真实图像计算损失 → 反向传播优化所有参数。

特征提取

特征提取的核心是多分辨率哈希编码,具体步骤如下:

  • 多分辨率网格:设有 LL 个不同空间分辨率的网格 {V1,...,VL}\{V_1,..., V_L\}
  • 位置映射:对于3D点 xi\mathbf{x}_i,在每个分辨率层级 ll 上计算映射位置 xi,l=xiVl\mathbf{x}_{i,l} = \mathbf{x}_i \cdot V_l
  • 哈希查询与插值:在每个层级 ll,根据 xi,l\mathbf{x}_{i,l} 找到其所在的网格单元,取单元8个角点的哈希条目(存储特征向量),并进行三线性插值,得到该层级的特征向量 γl(xi,l)Rc\gamma_l(\mathbf{x}_{i,l}) \in \mathbb{R}^c
  • 特征拼接:将所有 LL 个层级的特征向量拼接起来,形成最终的特征编码 γ(xi)=(γ1(xi,1),...,γL(xi,L))RcL\gamma(\mathbf{x}_i) = (\gamma_1(\mathbf{x}_{i,1}), ..., \gamma_L(\mathbf{x}_{i,L})) \in \mathbb{R}^{cL}
  • 送入MLP:该拼接特征被送入后续的SDF MLP和颜色MLP进行预测。

三维场景生成流程

  1. 初始化:将场景边界框设为单位球,初始化所有哈希网格特征为 0;设置初始数值梯度步长ϵ为最粗网格尺寸,仅激活 4(DTU)或 8(Tanks and Temples)个粗分辨率网格。

  2. 粗到细 SDF 优化:

    • 迭代优化:每次迭代从多视图相机射线中采样 3D 点,通过哈希编码提取特征,预测 SDF 值和颜色;
    • 分辨率激活:每 5000 次迭代,当ϵ衰减至对应网格尺寸时,激活新的更高分辨率网格;
    • 步长衰减:ϵ随迭代指数减小,从粗网格尺寸逐步降至细网格尺寸,平衡全局平滑与局部细节。
  3. 体积渲染与监督:基于 SDF 值计算体密度αi=1−exp(−σiδi),通过神经体积渲染合成图像,与输入图像对比计算损失,反向传播更新哈希特征和 MLP 参数。

  4. 网格提取:优化完成后,对整个场景边界框按固定分辨率(DTU 为 512,Tanks and Temples 为 2048)采样 3D 点,预测 SDF 值;通过 Marching Cubes 算法提取 SDF=0 的零水平集,得到最终 3D 三角形网格。

  5. 数据准备:输入多视角RGB图像及其对应的相机内外参数。

  6. 采样与渲染:对于每个像素,从其相机中心发射光线,在光线上采样一系列3D点 {xi}\{\mathbf{x}_i\}

  7. 前向预测:对每个采样点,使用哈希编码和MLP预测其SDF值 f(xi)f(\mathbf{x}_i) 和颜色 ci\mathbf{c}_i

  8. SDF转密度:使用公式(3)将SDF值转换为体渲染所需的透明度 αi\alpha_i

  9. 体积渲染:根据公式(1)沿光线积分,合成该像素的预测颜色 c^\hat{\mathbf{c}}

  10. 损失计算与优化:计算预测颜色与真实颜色的差异(RGB损失),同时计算Eikonal损失(约束SDF梯度模长为1)和曲率损失(平滑性先验)。总损失为加权和 L=LRGB+weikLeik+wcurvLcurv\mathcal{L} = \mathcal{L}_{RGB} + w_{eik}\mathcal{L}_{eik} + w_{curv}\mathcal{L}_{curv}

  11. 表面提取:训练完成后,在整个场景感兴趣区域内密集评估训练好的SDF场 f(x)f(\mathbf{x}),然后使用Marching Cubes算法从SDF的零水平面提取出三角形网格表面。

损失函数

总损失由三部分加权组成:

L=LRGB+weikLeik+wcurvLcurv\mathcal{L} = \mathcal{L}_{\text{RGB}} + w_{\text{eik}} \mathcal{L}_{\text{eik}} + w_{\text{curv}} \mathcal{L}_{\text{curv}}

  • LRGB\mathcal{L}_{\text{RGB}}:RGB渲染损失。L1距离:

    LRGB=c^c1\mathcal{L}_{\text{RGB}} = \|\hat{\mathbf{c}} - \mathbf{c}\|_1

  • Leik\mathcal{L}_{\text{eik}}:Eikonal损失。强制SDF的梯度模长接近1,是SDF表示有效的关键约束:

    Leik=1Ni=1N(f(xi)21)2\mathcal{L}_{\text{eik}} = \frac{1}{N} \sum_{i=1}^{N} (\|\nabla f(\mathbf{x}_i)\|_2 - 1)^2

    关键:这里的梯度 f(xi)\nabla f(\mathbf{x}_i) 是使用数值梯度计算的,而非解析梯度。

  • Lcurv\mathcal{L}_{\text{curv}}:曲率损失。作为平滑性先验,通过数值方法计算SDF的拉普拉斯算子(二阶导数)的绝对值:

    Lcurv=1Ni=1N2f(xi)\mathcal{L}_{\text{curv}} = \frac{1}{N} \sum_{i=1}^{N} |\nabla^2 f(\mathbf{x}_i)|

训练与测试数据集

  • 训练数据集:论文中模型在特定场景上从头开始优化(per-scene optimization),并未提及在大型数据集上进行预训练。训练数据即待重建场景的多视角图像。
  • 测试(评估)数据集
    1. DTU数据集:包含15个以物体为中心的室内场景,用于评估物体级重建。
    2. Tanks and Temples数据集:包含6个大规模室内/室外场景,用于评估大规模场景重建。
    3. 真实世界采集数据:论文还展示了在NVIDIA总部公园和约翰霍普金斯大学使用消费级无人机拍摄的视频重建结果。

推理与部署输入输出

  • 输入:一组已知相机位姿的多视角RGB图像。
  • 输出:重建出的整个场景的3D三角形网格(通过Marching Cubes从优化后的SDF场提取)。
  • 过程:这是一个每场景优化的过程。给定一个新场景的图像,需要运行完整的优化流程(通常数十万次迭代)来得到该场景的神经表示(SDF场),然后提取网格。并非一个即插即用的“前向”推理模型。

消融实验测试组件

  1. 梯度计算方式
    • AG:使用解析梯度计算 Leik\mathcal{L}_{eik}
    • NG:使用数值梯度计算 Leik\mathcal{L}_{eik}
    • 结论:NG显著优于AG,能产生更平滑、噪声更少的表面。
  2. 渐进式优化策略
    • AG+P:解析梯度 + 渐进激活哈希网格。
    • NG+P(本文方法):数值梯度 + 渐进激活哈希网格。
    • 结论:渐进式激活对两种梯度方式都有帮助,但结合数值梯度(NG+P)效果最佳,能同时保证平滑性和细节。
  3. 曲率正则化 (Lcurv\mathcal{L}_{curv})
    • 比较了使用和不使用曲率损失的效果。
    • 结论:曲率损失作为平滑性先验,能有效去除表面噪声,但需要与拓扑预热结合使用,以防止其阻碍凹形结构的形成。
  4. 拓扑预热
    • 在优化初期不立即使用强曲率正则化,而是经过一个短暂的线性增加阶段。
    • 结论:有助于形成正确的凹形区域几何。
  5. 颜色网络设计(附录):
    • 尝试了将颜色分解为反照率和着色的内在分解网络。
    • 结论:在现有设计中,内在分解并未带来表面质量的提升,有时还会导致平面区域被错误雕刻。
  6. 哈希网格激活数量与步长 ϵ\epsilon 调度
    • 测试了不同初始激活网格数和 ϵ\epsilon 衰减策略的影响,最终确定了文中的方案。