NeRF+高度场协同优化:攻克行星下降图像三维重建难题
1. 项目概述与核心挑战
在行星科学和深空探测领域,获取高精度的地表三维模型——也就是数字高程模型(DEM)——是理解行星地质历史、规划着陆点乃至寻找潜在生命迹象的基石。传统上,我们依赖轨道器拍摄的立体像对来构建全球地形图,但这套方案成本高昂,且分辨率受限于轨道高度。一个更具性价比的思路是利用着陆器在下降过程中拍摄的广角图像序列进行三维重建。想象一下,一个搭载鱼眼镜头的相机从数公里高空垂直降落,一路对着行星表面“狂拍”,这些图像理论上包含了从宏观到微观、分辨率逐渐提高的丰富地形信息,是弥合轨道全局视图与着陆点局部特写之间“分辨率鸿沟”的绝佳数据源。
然而,理想很丰满,现实却很骨感。用这些下降图像做三维重建,面临着几个“先天不足”的硬骨头。首先,强径向畸变:鱼眼镜头为了获得超宽视野,引入了严重的图像扭曲,直线在图像边缘会变成曲线,这直接挑战了传统基于针孔相机模型的几何计算。其次,有限的视差与视角多样性:在近乎垂直的下降过程中,相机主光轴基本指向正下方(天底方向),相邻图像之间的视差变化非常小。视差是立体视觉感知深度的生命线,它的匮乏会导致深度估计模糊不清,重建出的地形要么“浮”在空中(漂浮物伪影),要么干脆是一片模糊。最后,极端的光照条件:行星表面没有大气散射或只有极其稀薄的大气,光照模型与地球截然不同,呈现出高对比度、尖锐的阴影和强烈的方向性反射特性。
面对这些挑战,传统的多视图立体视觉(MVS)流水线,即便是像Agisoft Metashape这样的工业级软件,也常常力不从心,重建结果要么覆盖不全(存在大量孔洞),要么噪声显著。近年来,神经辐射场(NeRF)技术横空出世,它通过一个多层感知机(MLP)隐式地学习一个连续场景的体积表示(颜色和密度),在复杂场景的新视角合成和几何重建上展现了惊人潜力。但“通用”的NeRF模型(如我们选作基线的Nerfacto)直接套用到行星下降图像重建上,就像让一位全科医生去做神经外科手术——虽然基础扎实,但缺乏针对性的“手术刀”和“解剖学知识”,同样会产生几何不一致和漂浮伪影。
因此,我们的核心工作就是为这个特定的“手术”——基于广角下降图像的行星表面三维重建——设计一套专用的神经重建框架。我们不是简单地调用现成工具,而是深入问题本质,将神经渲染的灵活性与行星表面的强几何先验、物理光照模型深度融合,提出了一种神经辐射场与显式高度场协同优化的新方法。简单来说,我们让网络同时学习两种场景表示:一个自由度的NeRF用于捕捉复杂细节和优化稳定性;一个显式的高度场网络,强制将表面约束为一个连续的、无悬垂的单值高度函数,这完美契合了行星表面“大体平滑、连续、固态”的物理事实。下文,我将为你彻底拆解这套方法的每一个技术环节、背后的设计逻辑,以及我们在实战中趟过的坑和总结出的调参心得。
2. 方法论深度解析:为什么是“NeRF + 高度场”?
我们的方法并非凭空构想,而是针对前述挑战的逐项精准打击。其核心思想是双表征协同优化与领域知识注入。下面,我们来拆解这套组合拳的每一招。
2.1 双引擎驱动:NeRF与高度场的角色与协同
我们构建了两个并行的场景表示网络,它们在训练中共同优化,相互补充。
神经辐射场(NeRF)分支:这部分继承自改进的Nerfacto框架。它接收一个三维空间坐标 (x, y, z),通过多分辨率哈希编码进行高效的位置编码后,输入到一个MLP(MLP_ρ)中,预测该点的体积密度 ρ 和一个特征嵌入 emb。随后,另一个MLP(MLP_c)根据这个特征嵌入预测该点的与视角无关的基础颜色。这个基础颜色会与一个基于物理的Hapke光照模型计算出的光照系数相乘,得到最终的颜色。NeRF分支的优势在于其优化灵活性,不易陷入局部最优,能够处理一些高度场难以表达的微妙几何变化。
显式神经高度场分支:这是我们的核心创新之一。我们假设行星表面可以近似为一个单值函数,即对于水平面上的每一个点 (x, y),其表面高度 h(x, y) 是唯一确定的。我们用一个独立的MLP网络 HeightField 来学习这个映射。对于空间中的任意一点 (x, y, z),高度场分支的工作流程是:
- 将
(x, y)输入HeightField,得到预测的表面高度h_xy和该“地面柱”的特征嵌入emb_xy。 - 该点的密度
ρ不再由另一个MLP自由预测,而是由一个以(h_xy - z)为输入的Sigmoid函数决定。具体地,ρ = k2 * sigmoid(k1 * (h_xy - z))。这意味着,在预测高度h_xy以下,密度趋近于一个常数k2(表示实体);在预测高度以上,密度平滑衰减至0(表示空气)。这强制几何体是一个“实心”的表面,从根本上杜绝了漂浮的、孤立的密度团块。 - 该“地面柱”内所有
z位置的点,共享由emb_xy通过MLP_c预测出的同一个基础颜色(再与Hapke光照相乘)。这隐含了“同一地面位置材质相同”的假设,是一个合理的正则项。
设计逻辑剖析:为什么需要两个分支?可以只用一个高度场吗?理论上可以,但实践中有大问题。在训练初期,高度场网络的预测可能误差很大,如果只依赖它,渲染出的图像与真实输入图像差异会巨大,梯度回传不稳定,容易导致训练崩溃。NeRF分支作为一个更灵活、更“宽容”的表示,在初期能更快地拟合图像数据,提供相对合理的密度分布。我们的协同机制通过一个额外的损失函数(
L_height;AB),让高度场网络去学习NeRF分支所隐含的几何信息,实现知识蒸馏。最终,我们可以直接从训练好的HeightField网络查询生成高分辨率的DEM,而NeRF分支则充当了训练过程中的“稳定器”和“教师”。
2.2 物理光照模型:告别“黑盒”光照学习
标准的NeRF通常将观察方向编码后输入颜色MLP,让网络自己隐式地学习复杂的、视角相关的反射特性。这对于地球上千变万化的材质和光照是有效的,但对于行星表面,我们拥有强大的先验知识:主要光源是遥远的太阳(平行光),表面反射遵循特定的物理模型。
我们摒弃了隐式学习的方式,引入了Hapke双向反射分布函数(BRDF)模型。这是一个广泛应用于行星科学的光照模型,能够模拟在无大气或稀薄大气环境下,由单一太阳光照射下的行星表面反射行为,考虑了阴影遮蔽、次表面散射等效应。
在我们的框架中,MLP_c 只预测与视角无关的“反照率”或基础反射率。最终的颜色由这个基础值乘以Hapke模型根据已知的太阳方向、观察方向以及估算的表面法线(可从高度场梯度计算)计算出的光照系数 light_d 得到。
实操心得与避坑指南:引入物理模型绝非简单替换。首先,你需要精确知道每张下降图像拍摄时,太阳相对于着陆点的方位角和高度角。这通常可以从任务轨道力学数据中获取。其次,Hapke模型本身有一系列参数(如单次散射反照率、相函数参数等),这些参数可以作为可学习的变量,也可以根据行星全球遥感数据(如月球矿物学绘图仪M3数据)进行区域性的初始化。我们的实验表明,即使使用简化的、参数固定的Hapke模型,其带来的物理约束也远超让网络自己“瞎猜”,它能显著改善在低太阳角(长阴影)条件下的重建精度,并减少因错误解释明暗变化而导致的几何失真。图7的消融实验清晰显示,使用隐式光照的模型在覆盖率上大幅落后。
2.3 角度感知的畸变损失:应对鱼眼镜头的“边缘效应”
NeRF在训练中常使用一个“畸变损失”(Distortion Loss)来鼓励每条光线上的权重分布更加集中,从而抑制漂浮物和背景坍塌。传统的畸变损失(公式5)计算的是沿光线采样点之间权重和距离的乘积积分,它对所有像素一视同仁。
但在鱼眼镜头下,这会产生问题。如图3所示,图像中心的像素对应的光线锥角很小,采样点间隔密,其畸变损失本征值就低。而图像边缘的像素,由于强烈的径向畸变,对应到3D空间是角度跨度极大的光线,采样点间隔很疏,计算出的畸变损失值会被不成比例地放大。这导致优化过程过度惩罚边缘光线,迫使网络为了降低损失而扭曲边缘区域的几何,最终在重建的DEM边缘产生明显的拉伸或压缩伪影(见图7左列对比)。
我们的解决方案是引入角度感知的畸变损失(公式8)。我们在原有损失项上乘以一个 cos(θ_d) 因子,其中 θ_d 是当前光线方向与相机光轴(通常是天底方向)的夹角。对于中心区域接近天底的光线,cos(θ_d) ≈ 1,损失强度保持;对于边缘的大角度光线,cos(θ_d) 变小,从而减弱了畸变损失对该区域的影响。这相当于告诉网络:“边缘区域的几何不确定性本来就高,允许你更灵活一点,别太死板。” 这一改进显著提升了重建DEM的整体平滑度和边缘质量。
2.4 训练目标与MVS监督的融合
我们的总损失函数是几个部分的加权和:
L = L_c;A + L_c;B + L_dist;A + L_height;AB + (可选) L_MVS
L_c;A和L_c;B:分别是NeRF分支和高度场分支渲染颜色与真实图像像素颜色的均方误差(MSE)损失。这是驱动模型学习外观的主损失。L_dist;A:上述的角度感知畸变损失,作用于NeRF分支,用于正则化几何。L_height;AB:高度对齐损失。我们在一个水平网格上采样,分别用NeRF分支和高度场分支预测每个点的“表面”位置(NeRF通过期望深度,高度场直接输出高度),并用L1损失约束它们一致。这是实现双分支知识传递的关键桥梁。L_MVS:可选的MVS监督损失。我们可以先用传统方法(如Metashape)对输入图像跑一遍稀疏重建,生成一个粗糙的、可能有噪声但覆盖某些区域的高度估计。在训练早期,我们以较高的权重将此作为高度场网络的监督信号(L1损失),引导其快速找到合理的几何初始值。随着训练进行,这个监督的权重会逐渐衰减,让模型更多地依赖图像本身的photometric loss进行优化。这相当于用传统方法的“经验”给神经网络“启蒙”。
3. 实验配置与实操复现指南
理论需要实践检验。为了验证方法的有效性,我们构建了高保真的模拟数据集,并设计了严谨的对比实验。如果你想复现或在此基础上进行开发,以下细节至关重要。
3.1 数据制备:高保真模拟是关键
我们无法轻易获取真实的行星下降图像序列,因此高质量的模拟数据是研究的前提。我们使用了两个公开的高分辨率行星DEM作为真实地形:
- 月球场景:基于LROC WAC数据生成的GLD100全球月球100米分辨率DEM。
- 火星场景:围绕盖尔陨石坑的火星背景相机(CTX)DEM镶嵌图。
模拟流程(使用SIMply或其他物理渲染器如Blender+Cycles):
- 相机轨迹:定义一条垂直下降的轨迹,相机光轴始终指向天底方向。下降高度范围需覆盖从数公里到数百米。
- 相机模型:使用150°视场角的理想鱼眼镜头模型(等距投影或立体投影),并精确标定其内参和畸变参数
(K, ξ)。 - 光照与材质:根据任务时间(如着陆时的太阳高度角)设置平行太阳光。使用Hapke BRDF模型赋予地表材质属性,可以结合月球或火星的全球反照率图来增加纹理真实性。
- 渲染:在轨迹的多个离散位置(如30-40个)渲染出1000x1000像素的RGB图像。务必同时渲染对应的二值掩码图像,用于在训练中排除图像中可能出现的着陆器支架、相机外壳等非地表部分。
- 数据划分:按8:1:1的比例随机划分训练集、验证集和测试集。确保时间或空间上的连续性不被破坏。
注意事项:模拟的保真度直接决定方法的泛化能力。务必确保渲染引擎的物理准确性(光线追踪、精确的BRDF)。图像中的噪声(如传感器噪声)可以适当添加以增加鲁棒性,但不宜过度。
3.2 模型实现与训练细节
我们基于Nerfstudio框架进行开发。以下是关键实现步骤和超参数设置参考:
-
环境搭建:
BASH# 创建Python虚拟环境conda create -n planetary_nerf python=3.9conda activate planetary_nerf# 安装PyTorch (CUDA版本根据你的显卡选择)pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118# 安装Nerfstudio及其依赖pip install nerfstudio# 安装可能需要的额外包,如用于Hapke模型计算的scipypip install scipy -
数据预处理:
- 将图像、掩码、以及对应的相机位姿(外参
[R|t])和鱼眼内参{K, ξ}整理成Nerfstudio支持的格式(如COLMAP格式或自定义数据解析器)。 - 相机位姿通常由模拟器直接给出。如果使用真实数据,则需要通过带有鱼眼模型的SfM(如COLMAP)事先估计。
- 将图像、掩码、以及对应的相机位姿(外参
-
网络结构:
HeightField网络:一个8层的MLP,每层256个神经元,使用ReLU激活,输出层使用tanh并将输出缩放/平移至预期的高度范围。MLP_ρ和MLP_c:沿用Nerfacto的配置,使用多分辨率哈希编码(哈希表大小2^19,特征维度16,4个层级)。- 将Nerfacto中预测RGB的MLP修改为仅预测基础颜色(3通道),移除视角方向输入。
-
损失函数权重(需网格搜索调优,以下为我们的有效设置):
PYTHONlambda_c_A = 1.0 # NeRF颜色损失权重lambda_c_B = 1.0 # 高度场颜色损失权重lambda_dist_A = 0.01 # 角度感知畸变损失权重lambda_height_AB = 0.1 # 高度对齐损失权重lambda_MVS = 0.5 # MVS监督损失初始权重,使用余弦退火衰减 -
训练参数:
- 优化器:Adam,初始学习率
5e-4,应用指数衰减。 - 训练轮数:
30k - 50kiterations。 - 批量大小:
4096条射线(Ray)每批。 - 每条射线采样点数:
128个(粗采样)+64个(重要性采样)。 - 场景收缩(Scene Contraction):启用,以处理无界场景。
- 优化器:Adam,初始学习率
-
MVS监督数据生成:
- 使用Agisoft Metashape或OpenMVS对训练图像进行稀疏重建和稠密点云生成。
- 将稠密点云插值或栅格化成一个粗糙的参考高度图
H_MVS。这个图可能有很多孔洞和噪声,没关系,它只是初期引导。
3.3 评估指标解读
我们使用三个互补的指标来全面评估生成的DEM:
| 指标 | 公式/描述 | 物理意义 | 侧重 |
|---|---|---|---|
| 绝对高程差 (AED) | (1/N) * Σ |Ĥ(p) - H(p)| |
预测高度与真实高度的绝对平均误差。 | 全局绝对精度。对系统性的高度偏移(如整体下沉或上浮)非常敏感。单位是米。 |
| 相对高程差 (RED) | 先对Ĥ和H各自减去局部(如1km窗口)均值,再计算绝对差值的平均。 |
预测地形与真实地形在局部形状上的差异。 | 局部地形保真度。它消除了全局偏移的影响,关注的是山丘、沟壑的相对起伏是否正确。 |
| 覆盖率@0.1 (Coverage@0.1) | (1/N) * Σ I( |Ĥ-H| / |H| ≤ 0.1 ) |
预测高度与真实高度的相对误差在10%以内的像素所占的比例。 | 重建的可用范围与精度平衡。一个模型可能在某些点很准(RED低),但很多区域重建失败(NaN),这个指标就会很低。它衡量的是“有多少区域是既重建出来又比较准的”。 |
结果分析要点:看表1中的数据。我们的方法(无论是否用MVS监督)在Coverage@0.1上全面超越了Metashape和Nerfacto基线,尤其是在地形更复杂的火星数据上,优势巨大。这说明我们的方法能从有限的、畸变的图像中“挤出”更多可用的地形信息。在AED和RED上,加入MVS监督后,我们的方法取得了最佳结果,这证明了融合传统几何先验与神经表示的有效性。Nerfacto的AED和RED很高,尤其是火星数据,说明它产生了严重的几何失真或漂浮物。
4. 常见问题、排查技巧与调优实录
在实际实现和训练过程中,我们遇到了诸多挑战。以下是总结出的“避坑指南”和调优策略。
4.1 训练不稳定或重建结果充满“浮云”
- 症状:训练损失震荡,渲染图像模糊,或者生成的密度场在空间中到处是孤立的团块(漂浮物)。
- 根本原因:这是NeRF类方法在有限视差和强畸变下的典型病态问题。优化过程缺乏足够的几何约束,容易陷入将颜色“涂抹”在空间中以拟合图像,而非形成清晰表面的局部最优解。
- 排查与解决:
- 强化几何先验:确保
L_height;AB损失和L_dist;A损失的权重设置得当。如果漂浮严重,可以尝试逐步增加lambda_dist_A(例如从0.001到0.05)。同时,检查HeightField网络输出的高度范围是否合理,过大的初始化范围会导致Sigmoid密度函数过于平缓。 - 检查光线起点和终点:对于垂直下降数据,相机的
near和far平面设置至关重要。near不能为0,应略高于场景最高点(相对于相机);far必须覆盖从最高到最低相机位置所能看到的最远地表点。错误的设置会导致大量采样点落在空区域或地表之下。 - 引入MVS监督:这是最有效的稳定手段。在训练前1000-2000轮,使用一个较高的
lambda_MVS(如1.0),让高度场网络快速锁定一个粗糙但大体正确的地形。之后随着训练进行,按余弦计划将其衰减至0.01或更低。 - 启用背景模型:Nerfacto通常包含一个背景模型来处理无界场景。但在我们的设置中,背景就是“太空”,是纯黑的。可以考虑禁用或极大弱化背景模型,因为它的存在可能会“吸收”本应属于远处地表的密度。
- 强化几何先验:确保
4.2 重建表面模糊,缺乏细节
- 症状:生成的DEM过于平滑,丢失了陨石坑边缘、岩石等高频细节。
- 根本原因:可能是模型容量不足、哈希编码分辨率不够,或者损失函数中数据保真项 (
L_c) 的权重相对于正则化项 (L_dist,L_height) 太低。 - 排查与解决:
- 提升编码分辨率:增加多分辨率哈希编码的层级数或每层的特征维度。例如,将哈希表大小从
2^19增加到2^21,特征维度从16增加到24。这会显著增加模型捕捉高频细节的能力,但也会增加显存消耗和训练时间。 - 调整损失权重:尝试稍微降低
lambda_dist_A和lambda_height_AB,让模型有更多自由度去拟合图像细节。但要注意平衡,避免引发漂浮物问题。 - 精细化采样策略:增加每条射线上重要性采样(fine sampling)的点数。在训练后期,当粗糙几何已经形成后,更多的采样点能帮助刻画表面细节。
- 检查Hapke模型参数:如果使用了简化的或固定的Hapke参数,可能无法准确模拟某些光照条件下的细节反射。可以考虑将Hapke的某些关键参数(如单次散射反照率)作为可学习参数,与网络一同优化。
- 提升编码分辨率:增加多分辨率哈希编码的层级数或每层的特征维度。例如,将哈希表大小从
4.3 图像边缘重建质量差
- 症状:重建的DEM在图像中心区域质量尚可,但在边缘区域出现拉伸、扭曲或完全错误的高度值。
- 根本原因:鱼眼镜头边缘畸变极大,且像素对应的光线角度大,几何不确定性高。传统的畸变损失会过度惩罚这些区域。
- 排查与解决:
- 确认角度感知损失已启用:这是解决该问题的核心。确保你的
L_dist;A实现中正确计算了每条光线与天底方向的夹角θ_d,并应用了cos(θ_d)衰减因子。 - 验证相机模型:确保在光线投射(Ray Casting)时,使用的鱼眼畸变模型(如Kannala-Brandt模型)与模拟数据生成时使用的模型完全一致。一个微小的参数误差在边缘会被放大。
- 边缘区域数据增强:在训练时,可以适当提高从图像边缘区域采样射线的概率,迫使模型更多地关注这些困难区域。
- 确认角度感知损失已启用:这是解决该问题的核心。确保你的
4.4 训练速度慢,显存占用高
- 症状:迭代缓慢,无法使用较大的批量或较高的分辨率。
- 根本原因:双分支网络、密集采样和哈希编码都会增加计算和存储开销。
- 排查与解决:
- 梯度累积:如果受限于显存只能使用小批量,可以通过梯度累积来模拟大批量的效果,稳定训练。
- 混合精度训练:使用PyTorch的AMP(自动混合精度)工具包,可以显著减少显存占用并加速计算,通常对精度影响很小。
- 降低初始分辨率:在训练初期,可以使用较低分辨率的图像或对图像进行下采样,让模型先学习粗糙的几何和外观,再在后期微调阶段切换到全分辨率。
- 分阶段训练:先只用NeRF分支训练几千轮,得到一个初步的密度场,然后再引入高度场分支和联合损失进行精调。这有时比从头开始联合训练更稳定、更快。
5. 未来方向与个人思考
这项工作将神经渲染前沿技术引入行星科学的具体问题,只是一个起点。在实际部署前,还有几个关键方向值得深入探索:
对真实数据的泛化能力:我们的实验基于高保真模拟数据。真实的下行图像包含传感器噪声、镜头眩光、动态模糊(着陆器震动)以及更加复杂多变的光照条件(如火星尘暴)。下一步的核心是构建一个包含真实-模拟混合数据的数据集,并研究领域自适应技术,例如在模拟数据上预训练,在少量真实数据上微调,或者设计对噪声和不确定光照更鲁棒的损失函数。
实时性与机载应用:目前的NeRF方法训练耗时,推理也需要体积渲染。对于未来需要在线进行地形感知和避障的智能着陆器或漫游车,轻量化模型和快速推理是关键。方向包括:1) 将训练好的HeightField网络蒸馏成更小的网络;2) 探索基于3D高斯泼溅(3D Gaussian Splatting)等显式表示的方法,它们具有更快的渲染速度;3) 研究在下降过程中增量式更新地形模型的算法。
多模态数据融合:下降图像并非唯一数据源。着陆器可能同时搭载激光高度计(LIDAR)或雷达。一个更强大的框架应该能融合稀疏但精确的激光测高点和密集但可能有噪声的视觉重建。这可以通过在损失函数中加入一个LIDAR点云对齐项来实现,让神经场不仅拟合图像颜色,还要穿过这些精确的三维控制点。
从重建到理解:生成的DEM是“是什么”,行星科学家更关心“为什么”。我们可以探索让网络在重建几何的同时,联合反演地表物理参数,如反照率、粗糙度、甚至初步的岩性分类。这需要将更复杂的物理模型(如多种BRDF的混合)嵌入到可微分渲染框架中。
从我个人的实验经验来看,神经方法在解决这类特殊成像几何下的重建问题上展现出了巨大的灵活性和潜力。其核心优势在于能够将各种先验知识(物理的、几何的)以可微分损失函数的形式优雅地融入优化过程。最大的挑战不再是设计复杂的特征匹配算法,而是如何设计出更贴合物理事实的网络架构和损失函数。这个过程更像是在“教导”一个网络如何去理解这个世界,而不仅仅是计算它。对于从事行星探测或特殊环境三维感知的工程师来说,掌握这套“基于优化的、可微分”的思维方式,或许比精通某个特定的网络代码更为重要。