尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

大基线单目视图合成:隐式高斯解码如何突破三维重建局限?

大基线单目视图合成:隐式高斯解码如何突破三维重建局限? 做三维视觉的同行应该能共鸣当你拿着手机绕着物体拍了一圈重建出来的效果往往不错可一旦只给你两张相隔很远的照片让算法从这张视角“脑补”到那张视角画面质量就会肉眼可见地下降。这个场景在学术上叫Large-Baseline Monocular View Synthesis中文可以理解为“大基线下单目视图合成”。最近读到的InfiniSplat工作标题里正好把两个关键点放在了一起Large-Baseline和Implicit Gaussian Decoding。这篇笔记会沿着标题逐层拆解先讲清楚大基线视图合成到底难在哪里再回顾 3D Gaussian Splatting 的基础表示最后重点分析“隐式高斯解码”可能的设计思路并补充一套可用于复现和调参的实践框架。适合对 NeRF、3DGS 有一定了解想快速跟进三维视觉新方向的读者如果你刚接触这些名词前两节也会帮你把背景补起来。1. 背景与核心概念1.1 什么是单目视图合成单目视图合成简单说就是输入一张或少量几张图像通过算法生成从其他视角观察同一场景时应该看到的图像。过去几年发展最快的两条技术路线分别是NeRF 系列用多层感知机和体渲染表示连续场景质量高但渲染慢。3D Gaussian Splatting 系列把场景拆成一堆三维高斯点用可微光栅化渲染质量和速度都能兼顾。两条路线的共同点是想重建一个 3D 场景表示再通过这个表示渲染新视角。区别在于“场景怎么存”。传统方法在视角密集、相机位姿变化很小的情况下已经很成熟。也就是一个场景拍几百张照片重建出来几乎可以以假乱真。可一旦把相机距离拉开问题就来了。1.2 大基线到底是什么“基线”在立体视觉里指两个相机光心之间的距离。小基线就是两个相机挨得很近比如双目手机的两个摄像头大基线则是两个相机离得很远比如一个相机在房间门口另一个在窗户边或者无人机拍摄时一个视角在楼顶、另一个在楼底。大基线单目视图合成的难点在于重叠区域小两幅图可能只有很小一部分场景是共同可见的。遮挡严重视角一移动很多原来被前景挡住的区域会暴露出来。深度不可观单张图像本身存在深度歧义大基线进一步放大了不确定性。匹配困难传统 SFM 或光流在大基线场景下很难建立可靠的像素对应。所以“大基线”并不是一个简单的参数调大问题而是整个重建范式都需要改变。算法不能只靠当前图像“修修补补”必须借助 3D 结构先验和生成能力来填补信息空缺。1.3 InfiniSplat 在解决什么问题从题目上理解InfiniSplatInfini无限Splat高斯泼溅核心创新点落在Implicit Gaussian Decoding隐式高斯解码。这个名字传递出两层信号它仍然使用3D Gaussian Splatting作为底层渲染器。它不再直接优化高斯基元的参数本身而是通过一个“隐式解码”过程生成这些参数。在大基线场景下观察信息不足直接优化所有高斯参数很容易陷入局部最优或产生明显畸变。如果能用神经网络从一个共享的潜在表示中解码出高斯参数模型就能借助训练时积累的大量场景先验把“没看到的区域”也合理地补出来。简单打个比方直接优化高斯参数像是让一个画家只对着照片画局部然后强行拼成完整画面隐式解码则是让画家先理解“这是客厅、客厅通常有沙发和电视”再按这个理解去补全画面。显然后者在大视角变换时更稳。2. 大基线单目视图合成的技术难点2.1 深度估计的天然歧义单目深度估计本身就是一个 ill-posed 问题。同一张 2D 图像可能对应无数种合理的 3D 解释。多视角方法能缓解这个问题是因为三角化提供了几何约束。大基线场景下两个视角的公共区域太少可用的三角化约束也随之变弱。这会导致什么结果3D Gaussian 点的深度位置可能发生系统性偏移渲染出来的图像在整体结构上是对的但局部几何变形、厚度异常甚至出现“纸片化”效果。2.2 遮挡与未观测区域大视角变化必然引入两种区域重新可见区域第一视角被遮挡第二视角能看到。全新外推区域两个视角都没见过只能靠模型“编造”。对于第一种区域算法最好能从图像上下文推断出合理的结构对于第二种区域则更像一个生成任务。这也是为什么现在很多大基线方法会引入图像生成模型的先验或者设计多尺度特征融合来降低不确定性。2.3 位姿误差被放大相机位姿是大基线重建的“地基”。小基线情况下位姿角度差 0.1 度可能只造成几个像素的误差大基线情况下同样 0.1 度可能让投影点偏移几十甚至上百像素。任何在优化过程中不够准确的相机参数都会导致几何场崩塌。所以在工程实践中如果自己做这类实验位姿精度的优先级要高于网络结构调整。哪怕网络思路很好而位姿带了明显误差渲染结果都会很糟。2.4 优化不稳定性直接优化 3D Gaussian 的参数时位置、协方差、颜色、透明度是耦合的。初始化的位置如果太差梯度会把高斯点拉向错误区域。大基线场景下没有稠密 SFM 点云作为初始化通常只能用随机点或规则格点起步这会让优化过程极不稳定。“隐式解码”的价值恰恰体现在这里网络不是从空白开始猜每一个点的位置而是基于图像特征生成位置偏移量或直接生成分布。这种“带先验的生成式初始化”比纯随机初始化更容易收敛。3. 3D Gaussian Splatting 基础回顾3.1 高斯基元表示3D Gaussian Splatting 的场景表示非常简单直观。每一个高斯点可以看作一个微小的椭圆体既包含位置和形状又包含颜色和透明度。用数学语言描述每个点的核心属性包括中心位置 μ3D 向量协方差矩阵 Σ通常用缩放 scale 和旋转四元数 quaternion 分解表示颜色 c通常是球谐系数或直接 RGB不透明度 α标量训练时这些参数被当作可学习的变量通过图像重建损失不断更新。推理时把所有高斯点投影到 2D 图像上再按照深度排序、进行 alpha blending 合成最终像素颜色。这里我用 PyTorch 风格给出一个高斯属性结构的示意图帮助理解# 文件路径gaussian_model.py # 说明仅用于展示 3D Gaussian 的属性组织非某个具体项目的完整代码 import torch import torch.nn as nn class GaussianPoint(nn.Module): def __init__(self, num_points100000): super().__init__() # 每个点中心坐标 self.means nn.Parameter(torch.zeros(num_points, 3)) # 每个点缩放 self.scales nn.Parameter(torch.zeros(num_points, 3)) # 每个点旋转四元数 self.quats nn.Parameter(torch.zeros(num_points, 4)) # 每个点颜色 self.colors nn.Parameter(torch.zeros(num_points, 3)) # 每个点不透明度 self.opacities nn.Parameter(torch.zeros(num_points, 1)) def forward(self): # 实际使用时还需要将 scales/opacities 经过激活函数处理 return { means: self.means, scales: torch.exp(self.scales), quats: torch.nn.functional.normalize(self.quats, dim-1), colors: torch.sigmoid(self.colors), opacities: torch.sigmoid(self.opacities), }这里需要注意scales和opacities不能直接用原始向量参与渲染通常要经过指数激活或 Sigmoid确保缩放为正、透明度在 0 到 1 之间。3.2 渲染流程3D Gaussian 的渲染流程可以拆成四步投影把 3D 高斯投影到相机坐标系再投影到 2D 图像平面。排序按每个高斯中心到相机的深度排序。计算权重每个像素点根据 2D 高斯分布计算贡献权重。合成从近到远做 alpha blending得到最终颜色。这个流程完全可微因此可以端到端地通过图像损失优化所有高斯参数。相比 NeRF 的体渲染它不需要对每条光线采样几十上百个点而是直接模拟光栅化过程速度提升非常明显。3.3 传统 3DGS 的局限性传统 3DGS 虽然渲染质量高但有两个明显的依赖依赖SFM 点云初始化比如用 COLMAP 提前算出稀疏点云。依赖稠密多视角图像视角覆盖要足够充分。大基线单目输入恰恰同时击中了这两个弱点没有稠密视角也没有可靠的 SFM 输出。因此近期的很多工作都在思考同一个问题能不能放弃“从 SFM 初始化 后续不断优化高斯基元”的路径改为“直接从输入图像预测高斯基元”这正是“隐式高斯解码”这条技术路线兴起的原因。4. 隐式高斯解码到底在解码什么4.1 “隐式解码”里的“隐式”指什么在 3DGS 语境下“隐式”并不是指 NeRF 那样的连续隐式场而是指参数不直接作为可学习变量存储通过神经网络从一个中间表示中生成。对比一下两种范式范式参数存储更新方式特点显式优化 3DGS高斯参数直接在内存中梯度下降直接更新内存可控收敛快但依赖初始化隐式解码 3DGS高斯参数由网络输出梯度更新网络权重更强先验灵活性高但训练开销更大InfiniSplat 标题里的 “Implicit Gaussian Decoding”指的应该就是第二种思路让神经网络把某种高维特征“解码”成一堆高斯点再用高斯泼溅渲染出目标视角图像。4.2 为什么大基线场景更需要隐式解码大基线场景提供的信息极其有限。如果直接优化高斯参数缺少观测约束的参数维度会自由漂移。而隐式解码有一个潜在好处网络在大量训练数据中学会了“从图像特征到 3D 结构的映射”即使当前输入只包含少量信息网络也能用先验补全缺失部分。具体来说隐式解码器可以完成三件事生成初始几何从 2D 图像特征预测每个 3D 点的位置省去 SFM。生成高质量属性同时预测颜色、透明度、形状参数。支持条件采样把场景级编码作为隐变量让模型在不同输入下生成合理的场景变体。4.3 解码器可能的输入与输出根据 3DGS 领域近年来的发展趋势隐式高斯解码器的输入通常包含图像特征由 CNN 或 Vision Transformer 从输入图像提取。场景级编码一个全局向量描述整个场景的整体布局。查询点坐标需要在哪些位置生成高斯点通常是 anchor 点或由深度图反投影出的点。输出就是一组高斯属性位置偏移缩放旋转颜色不透明度下面给一个概念性的解码器结构示意重点展示思路而非完整实现# 文件路径implicit_decoder.py # 说明隐式高斯解码器结构示意非论文官方源码 import torch import torch.nn as nn class MLPDecoder(nn.Module): def __init__(self, feat_dim256, hidden_dim256, out_dim10): super().__init__() self.net nn.Sequential( nn.Linear(feat_dim 3, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, hidden_dim), nn.ReLU(), nn.Linear(hidden_dim, out_dim), ) def forward(self, feat, query_pos): # feat: [B, N, C] 图像特征 # query_pos: [B, N, 3] 查询点坐标 x torch.cat([feat, query_pos], dim-1) out self.net(x) # 拆分为位置偏移、缩放、旋转、颜色、透明度 pos_offset out[..., 0:3] scale torch.exp(out[..., 3:6]) quat torch.nn.functional.normalize(out[..., 6:10], dim-1) color torch.sigmoid(out[..., 10:13]) opacity torch.sigmoid(out[..., 13:14]) return pos_offset, scale, quat, color, opacity这里把输出向量设计成 14 维是为了便于理解3 维偏移、3 维缩放、4 维四元数、3 维颜色、1 维透明度。实际工作里可能还会加入球谐系数或者输出额外的特征通道用于后续细化。4.4 需要避免的认知误区有一个常见误区是“隐式”一定优于“显式”。实际上两者各有优劣。显式优化在高观测密度下精度更高因为它直接用大量像素级梯度约束每个点。隐式解码在稀疏观测下泛化更强因为网络能补充先验但它的最终质量受限于训练数据的覆盖范围。大基线场景优先考虑隐式解码是因为在这个场景下“泛化性”比“过拟合当前场景”更重要。而如果拿一个超密集采集的室内场景来做重建显式优化的上限通常会更高。理解了这种取舍再看 InfiniSplat 的方法设计就会更清晰。5. InfiniSplat 方向的方法框架拆解5.1 整体流程图这里没有论文源码所以下面的流程是根据 3DGS 领域通用的稀疏视角重建框架结合标题关键词做的一个合理推演。流程可以概括为五个阶段输入图像 - 特征提取 - 生成候选锚点 - 隐式解码高斯参数 - 可微光栅化 - 目标视角图像输入图像一张或少量几张参考视角图像及对应相机位姿。特征提取用 CNN / ViT 提取多尺度 2D 特征。生成候选锚点在相机视锥内产生候选 3D 位置比如根据预测深度反投影或者在规则网格上扰动生成。隐式解码高斯参数利用图像特征和锚点坐标预测高斯属性。可微光栅化调用 3DGS 的光栅化器渲染目标视角计算损失。5.2 两阶段训练思路大基线单目视图合成这类问题直接端到端训练往往不稳定。比较稳妥的做法是分阶段训练第一阶段先训练一个单目深度估计器让网络初步学会场景几何这一步可以借助通用的深度数据集预训练。第二阶段固定或微调深度估计器训练隐式高斯解码器重点学习颜色、透明度和高斯形状的生成。第三阶段端到端联合微调让深度与外观特征进一步对齐。这种方案的好处是每个阶段都有明确的学习目标不容易在训练初期就因为几何预测错误导致渲染全黑或明显重影。5.3 损失函数设计在大基线场景中仅仅使用逐像素 L1 或 L2 损失是不够的。因为图像已经是“脑补”出来的结果像素级损失会倾向于产生模糊的平均效果。实际训练里通常组合以下几类损失# 文件路径losses.py # 说明大基线视图合成训练损失组合示意 def compute_loss(rgb_pred, rgb_gt, depth_predNone, depth_gtNone, use_lpipsTrue): # 1. 像素重建损失 loss_l1 torch.nn.functional.l1_loss(rgb_pred, rgb_gt) # 2. 感知损失约束纹理和结构 if use_lpips: loss_lpips lpips_fn(rgb_pred, rgb_gt) else: loss_lpips 0.0 # 3. 深度平滑正则减少几何抖动 if depth_pred is not None: loss_depth depth_smoothness(depth_pred) else: loss_depth 0.0 # 4. 高斯透明度正则防止大量半透明伪影 loss_opacity opacities.mean() total_loss ( loss_l1 0.1 * loss_lpips 0.05 * loss_depth 0.01 * loss_opacity ) return total_loss这里的损失权重只是一个参考方向实际需要根据数据集和训练阶段调整。L1 保证基础重建LPIPS 保证纹理真实深度平滑保证几何干净透明度正则防止高斯点变成一片模糊的烟雾。5.4 大基线下如何构造训练样本大基线训练数据的构造需要特别小心。如果正负样本差异过大网络会学崩。通常的做法是从密集轨迹中随机采样两个相距较远的视角但要把基线长度控制在一个合理区间内否则完全不可见的区域太多训练信号基本是噪声。常见的策略是先在小基线样本上热身训练。逐步增大采样基线。把较大基线样本的损失权重降低避免网络被难以学习的样本带偏。这本质上是课程学习Curriculum Learning思路在大基线单目视图合成中非常有效。6. 复现环境与实践思路6.1 硬件与软件环境复现这类 3D Gaussian Splatting 方向的工作对硬件有一定要求。通常建议GPU 显存 24GB 以上例如 RTX 3090、RTX 4090、A5000 或 A6000。系统推荐 LinuxUbuntu 20.04 或 22.04因为大多数三维视觉库对 Linux 支持最好。使用 PyTorchCUDA 版本根据显卡驱动灵活选择。需要预编译的 3DGS 光栅化扩展例如diff-gaussian-rasterization。环境版本不要照抄网上某个固定组合建议先确认显卡驱动支持的最高 CUDA 版本再选择对应的 PyTorch。6.2 常用依赖库复现过程中比较关键的依赖如下库名用途PyTorch深度学习框架diff-gaussian-rasterization3DGS 官方可微光栅化器torchvision图像预处理与基础模型lpips感知损失计算einops高维张量变换opencv-python图像读取与几何变换pytorch3d通用三维几何工具有时用于相机投影这些库并不是必需的组合但基本覆盖了从特征提取到可微渲染的常见链路。6.3 数据集选择大基线单目视图合成常用的公开数据集包括RealEstate10K包含大量室内镜头轨迹视角变化丰富是这类方法的常见测试基准。ACID自然场景航拍视频数据集。Mip-NeRF 360适合验证连续大范围场景重建。DTU物体级多视角数据集适合消融实验。实验时建议先把 RealEstate10K 拆成训练集和测试集按照论文常用的输入方式构造样本。具体怎么拆需要根据你的模型输入设计来定。6.4 训练调参建议在大基线场景训练时比较常见的坑是三个学习率过高导致高斯点爆炸。建议先把光栅化器相关参数冻结单独训练特征提取部分等稳定后再开放全部参数。透明度参数全部收敛到 0。说明损失权重设置不合理模型通过“什么都不画”来骗过损失函数。可以增加透明度正则或对透明度做约束。深度预测和外观生成不齐步。两个模块耦合太紧时容易混乱建议用两个不同学习率或者用 gradient stopping 隔开梯度。7. 常见问题与工程思考7.1 大基线是不是等于稀疏视角不完全等价。稀疏视角强调“输入图像数量少”但视角之间可能离得很近。大基线强调“视角之间的距离大”即使只有两张图也可能是大基线。当然大基线单目视图合成往往是极端稀疏的两者在实际场景中经常同时出现。研究时要区分清楚你的模型是解决“信息不足”还是解决“观察覆盖不完整”。前者需要更强的深度先验后者需要更强的生成先验。InfiniSplat 标题里没有细说但在实际项目中我们需要先明确瓶颈在哪。7.2 隐式解码会不会丢失场景细节这是很多人担心的问题。显式优化可以逐像素地拟合场景细节隐式解码则通过有限维度的特征向量生成高斯参数理论上会丢失高频细节。实际工程中可以通过两种方式缓解在解码器输出中增加高频位置编码让网络更容易表达细节。在显式优化之前先用隐式解码结果作为初始化把两个阶段串起来。所以“隐式解码”并不一定要取代显式优化它也可能只是一种更好的初始化方式。如果结合“先隐式粗恢复、再显式细调”的思路理论上既兼顾先验又不失精度。7.3 与扩散生成模型的关系近两年也有不少工作把 Diffusion 模型引入大基线视图合成用来动态补全新视角内容。InfiniSplat 这类 3DGS 方法与 Diffusion 生成模型并不是对立关系反而可能互补3DGS 擅长高质量渲染与几何一致性。Diffusion 擅长填充完全不可见的区域。如果大基线导致的“外推区域”占比很高只靠几何先验可能不够这时可以引入一个图像先验模块。但这也意味着训练和推理复杂度上升。实际选择时不妨先跑一个纯几何版本再评估是否真的需要生成式补全。7.4 InfiniSplat 的“Infini”体现在哪里“Infini”最直接的理解是“无限”这个词在标题里更像是一种目标描述希望方法能够支持更大、更连续、更不受视角范围限制的场景合成。而不是说模型真的能生成无限大的场景。这类方法往往通过多尺度特征和渐进式生成来扩大可表示范围。如果你计划把类似思路用到自己的项目中建议优先考虑“模块是否支持场景尺度扩展”比如固定分辨率的特征网格在场景变大时就很难保持正常表现。8. 总结与学习路线这一篇从前到后梳理了大基线单目视图合成的难点回顾了 3D Gaussian Splatting 的基本原理重点分析了隐式高斯解码可能的设计方向。与直接优化高斯基元的传统 3DGS 相比隐式解码更强调利用图像特征和场景先验来生成 3D 表示这正是应对大基线信息缺失的关键思路。如果你想沿着这个方向深入学习可以按下面顺序递进先搞懂 NeRF 的基本原理理解体渲染和隐式表示。再系统读一遍 3D Gaussian Splatting 原始论文重点看光栅化流程和优化策略。阅读稀疏视角 3DGS 相关的代表工作比如基于图像特征直接预测高斯点的方法理解“由图像到高斯”的映射逻辑。复现一个最小训练流程用真实数据观察大基线场景下模型失效的模式。最后再回到 InfiniSplat 这类方向分析它的隐式解码与现有方法在结构上的差异尝试用消融实验验证哪种设计真正带来收益。做三维视觉研究最大的阻碍往往不是不知道新方法叫什么名字而是拿到一个思路之后无法判断它到底解决了哪个核心痛点。InfiniSplat 标题里的两个关键词其实已经把答案提示得很清楚在大基线下用隐式高斯解码去解决“观测不足”的问题。带着这个理解去消化论文源码会比从零盲读高效很多。
返回列表