ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

InfiniSplat解析:大基线视图合成与隐式高斯解码新思路

InfiniSplat解析:大基线视图合成与隐式高斯解码新思路 如果你关注过 3D 视觉或者新视角合成最近大概率绕不开一个词3D Gaussian Splatting3DGS。在 NeRF 之后3DGS 凭借实时渲染速度和清晰的物体边缘迅速成了视图合成方向的新主流。但现实场景并不总是友好的——尤其是当输入图像之间的基线很大时比如无人机绕着建筑飞了一圈、车载摄像头在不同路口拍到同一片区域、或者手机相册里几张跨度很大的旅游照片这类“大基线单目视图合成”任务至今还是让很多模型翻车的重灾区。InfiniSplat 正是冲着这个痛点来的。从名字可以看出两层意思Infini 代表无限、无边界的场景表达Splat 代表 3D 高斯泼溅。它的核心做法不再是像传统 3DGS 那样直接回归每个高斯的属性而是引入隐式高斯解码Implicit Gaussian Decoding用隐式表征去生成高斯参数从而在大基线输入下依然能合成出几何一致、纹理清晰的新视角。这篇文章我会从问题本身讲起先解释为什么大基线单目视图合成这么难再梳理 3DGS 的原理和它在跨视图重建时遇到的瓶颈然后重点拆解 InfiniSplat 的核心思路包括隐式高斯解码到底改在哪一步、训练和推理流程有什么变化、和现有方法比优势在哪里。最后我会给出一个偏工程视角的落地建议包括如果要在自己的项目里尝试这类方法应该怎么评估、怎么选型、会踩到哪些坑。如果你正在做三维重建、自动驾驶仿真、AR 场景理解或者只是对 3DGS 的进阶玩法感兴趣这篇文章应该能帮你省下不少绕路时间。1. 为什么大基线单目视图合成这么难在进入 InfiniSplat 之前先把问题定义清楚。视图合成View Synthesis的任务是给定一组已知视角的图像生成从新的相机角度看过去的画面。听起来像“补全几张照片之间的空隙”但真正做起来牵扯到两个最核心的问题几何推断和外观生成。小基线场景下比如视频帧之间相邻两帧相机只移动了一点点遮挡变化小、光照变化小、纹理匹配容易直接用光流、深度估计甚至简单的插值都能得到不错的结果。但大基线场景完全不同。大基线意味着什么两个视角之间可能相隔数十米甚至更远物体之间的前后遮挡关系发生剧烈变化。比如在一栋建筑左侧拍一张、右侧拍一张中间的正立面在左图里是斜着看到的在右图里又是另一个角度而建筑背后被遮挡的部分两张图里都看不到。模型必须“猜”出这些区域的几何和纹理这已经超出了传统多视图立体匹配的能力范围。还有三个更隐蔽的难点第一特征匹配失效。传统 SFM运动恢复结构依赖特征点在不同视角间稳定出现。基线一大同一点在两张图里的外观差异很大尺度也完全不同特征描述子容易匹配错。特征匹配一旦错了相机位姿、稀疏点云全部跟着错。第二辐射场退化。NeRF 类方法通过优化每个空间点的颜色和密度来重建场景但当输入视角非常稀疏且基线很大时未观察到的区域完全没有约束模型会倾向于用一个“平均模糊”的解去糊弄损失函数。结果是训练集视角过拟合得很好新视角一换位置画面立刻发虚、重影或者出现漂浮物。第三尺度与深度模糊。单目输入本身存在尺度歧义。同一个场景用不同焦距和距离拍摄得到的像素位置可能非常不一样。大基线方法如果处理不好相对位姿的尺度对齐重建出来的场景几何会直接“散架”。InfiniSplat 采取的技术路线本质上是在回答一个问题能不能先在大基线条件下预测出一个可靠的 3D 场景表征再从这个表征中解码出高质量的 3D 高斯从而绕开逐像素优化在稀疏视角下的病态问题这就是隐式高斯解码的出发点。2. 3D Gaussian Splatting 的核心原理速通要理解 InfiniSplat得先弄清 3DGS 是怎么工作的。2023 年Kerbl 等人发表的“3D Gaussian Splatting for Real-Time Radiance Field Rendering”把 NeRF 的体渲染过程替换成了一种更直接的栅格化方式效果和速度同时大幅提升瞬间改变了视图合成和三维重建的工具箱。3DGS 的场景表示是“一堆 3D 高斯分布”。每个高斯不是一个数学上的概率分布而是一个带有颜色、透明度、形状、朝向的空间基元。场景由成千上万个这样的高斯基元组成每个高斯的参数包括中心位置均值决定高斯在空间中的哪里。协方差矩阵决定高斯的椭球形状和朝向。不透明度决定这个高斯对最终颜色的贡献权重。球谐系数决定从不同方向看时这个高斯的颜色变化。渲染时3DGS 把每个高斯投影到图像平面上按照深度排序然后从前到后做 alpha blending 合成像素颜色。这个流程完全可微所以可以端到端地优化所有高斯的参数让渲染图像逼近真实拍摄。对比一下 NeRF 和 3DGS 的差别对比维度NeRF3DGS场景表征连续辐射场MLP离散 3D 高斯集合渲染方式光线采样 体渲染高斯投影 光栅化优化速度小时级分钟级渲染帧率难以实时实时RTX 级别可上百 FPS几何清晰度边缘容易模糊边缘锐利内存占用低中高但 3DGS 有一个很关键的前提它需要针对每个场景做单独优化。也就是说你给它一组某个场景的图像它用几分钟到几十分钟把几百万个高斯参数迭代到能精确复现这个场景。这叫做“场景特定优化”和“前馈重建”是两条路线。所谓前馈重建是训练一个网络输入几张图像直接输出整个场景的 3DGS 表征不需要在推理时再优化。这个方向正是最近两年 feed-forward 3DGS 方法在做的事比如 pixelSplat、MVSplat、latentSplat 等。它们用多视角图像作为输入通过代价体、Transformer 或者特征匹配方式把 2D 图像特征提升成 3D 高斯。InfiniSplat 也属于“前馈重建”这个阵营但它在两个点上做了关键改动一是处理大基线输入二是用隐式表征来解码高斯。3. InfiniSplat 核心思路隐式高斯解码到底改了什么从标题推断InfiniSplat 的完整名称其实已经给出了三个信息无限场景表示Infini、3D 高斯Splat、隐式解码Implicit Gaussian Decoding。把它拆开看每个词都对应一个技术决策。先看“Infini”。大基线场景往往是开放式的场景范围可能非常大而传统 3DGS 用一组有限的高斯去拟合场景遇到无边界区域就容易出现空洞或漂浮物。InfiniSplat 的做法应该是引入一种可以灵活扩展的空间划分方式让高斯只在有信息的区域生成没有观测的区域不放置无意义的高斯。这和 mip-NeRF 360 里处理无边界场景的收缩函数思路类似但在高斯框架下有自己不同的实现路径。再看“Implicit Gaussian Decoding”。传统 3DGS 无论是每场景优化还是前馈预测都是直接回归每个高斯的参数。直接回归的问题在于高斯的数量、位置、协方差、透明度、颜色分布极其不均匀同一张图像里近处物体的高斯应该又小又密远处背景的高斯应该又大又疏。用网络直接输出这种参差不齐的集合需要网络容量非常大而且输出长度必须固定这在结构上就不灵活。隐式解码的思路做出了一项关键改变网络先学习一个隐式场景表征比如一个特征网格、一个特征体积或者一组潜在的 3D 特征点然后当我们需要某个位置的 3D 高斯参数时通过一个轻量解码网络在这个位置查询。换句话说网络不是直接“吐出”高斯参数而是先建立“空间位置到特征”的映射再在查询时生成高斯。这个改动在技术上非常重要因为它带来了两个直接好处第一高斯数量和空间位置不再由网络输出的固定维度决定而是可以根据图像内容自适应采样。这样可以在重建困难的区域放置更多高斯在平滑区域减少高斯提高效率。第二隐式表征天然具有平滑性和上下文感知能力。直接回归每个高斯时网络可能只盯着局部特征忽略了远距离的全局一致性。而隐式特征是在一个连续空间中定义的查询相邻位置会得到相似的特征这能避免生成的高斯出现“邻居不一致”的结构断裂。如果用一句话总结InfiniSplat 的路线不是“直接预测高斯参数”而是“预测高斯参数的生成规则”。4. 从 2D 图像到 3D 高斯InfiniSplat 的技术链路拆解基于方法命名和 3DGS 前馈重建领域的常见设计这里把 InfiniSplat 的技术链路拆成五个阶段。需要说明的是下面内容是基于方法名和技术惯性的合理推断用于帮助读者理解这类方法的通用架构具体网络设计和损失函数以论文原文为准。4.1 多视角特征提取输入是多张 RGB 图像和对应的相机位姿。第一步是用一个共享权重的 2D 网络分别提取每张图像的特征图。为了保证大基线匹配的稳定性特征提取网络通常会结合局部和全局上下文信息让每个像素的特征不仅包含自身颜色纹理还包含周围结构的语义信息。具体来说类似 EfficientNet 或 DINOv2 这类骨干网络都可以充当特征提取器只是不同论文会针对重建任务做专门调整。这里的关键是特征图的分辨率不能太低。大基线条件下物体在两张图中的尺度可能差好几倍如果特征分辨率太低小尺度物体的细节会直接被池化抹掉后续几何推断自然不准。4.2 代价体与几何推断拿到多张特征图后需要判断空间中的哪些位置有物体表面哪些位置是空的。常见做法是在参考视角下构建代价体cost volume把其他视角的特征图通过单应性变换投影到一系列假设深度平面上计算特征之间的匹配代价。匹配代价越小的位置说明多个视角在这个深度上看到了一致的内容越有可能是真实表面。在传统 MVS 中这个过程会输出一个深度图。但在前馈 3DGS 方法里代价体更像是一个“3D 占据概率场”或者“特征体积”下一步会基于它生成高斯。大基线场景中这一步是最容易崩的地方。因为匹配特征时如果某个点在另一个视角中不可见代价体里会出现错误的低代价响应造成伪表面。所以现在很多方法会在代价体解码时加入几何一致性约束或者利用 Transformer 的注意力机制让特征匹配跨越更大的空间范围。4.3 隐式场景表征这是 InfiniSplat 和前一代前馈 3DGS 方法最关键的分歧点。传统方法比如 pixelSplat直接从代价体回归一组高斯参数每个高斯对应一个位置、一个协方差、一个颜色。这样做简单直接但高斯的密度和质量受限于代价体分辨率。InfiniSplat 的做法是在代价体上叠加一个隐式解码器先根据代价体和特征图构建一个连续的特征场然后在这个特征场中查询任意 3D 位置解码得到该位置的高斯参数。这个过程类似于“先建网格再查表”只是这里的“表”是一个被深度特征编码的隐式函数。这种设计还有一个额外优势它天然支持不同分辨率的高斯生成。比如在离相机近的区域可以通过更密集的采样生成更多高斯在远处或者平滑区域可以稀疏采样。高斯密度可以自由调节这是直接回归方法很难做到的。4.4 高斯参数解码当确定了查询位置后隐式解码器需要输出以下参数高斯的中心坐标偏移相对于查询位置协方差矩阵用四元数 三个缩放因子表示不透明度球谐系数决定视角相关颜色解码器通常是一个轻量 MLP。之所以说“轻量”是因为它不需要像 NeRF 的网络那样去记忆整个场景的颜色场它只负责把特征映射成参数。场景的所有信息已经被压缩在隐式特征场里了。这里有一个工程上的关键点协方差矩阵必须保持正定否则渲染时会出 NaN。所以实际实现中一般输出旋转四元数和缩放向量再组合成协方差矩阵。如果直接让网络输出协方差矩阵的六个独立分量优化过程中很容易让矩阵变得不正定导致渲染崩溃。4.5 可微渲染与损失计算最后一步和标准 3DGS 一样把所有生成的高斯投影到目标视角做光栅化和 alpha blending得到渲染图像。损失函数通常是 L1 损失加感知损失LPIPS也可以在训练时加入深度平滑损失或者多视角一致性损失来约束几何。InfiniSplat 的训练目标是让网络做到输入大基线图像一次前向输出 3D 高斯再渲染出新视角。整个流程端到端可微所以梯度可以一直从渲染图像回传到特征提取网络让网络自己学会如何提取对重建最有利的特征。5. 与现有方法对比InfiniSplat 的优势分布在哪些环节为了让你对 InfiniSplat 的定位更清楚这里把当前视图合成的主要技术路线放在一张表里对比。方法类别代表方法输入重建方式大基线表现渲染速度每场景优化 NeRFNeRF、Mip-NeRF 360多张图像逐场景优化差到一般慢每场景优化 3DGS原始 3DGS多张图像逐场景优化一般很快前馈 NeRFIBRNet、PixelNeRF少量图像前馈重建一般慢前馈 3DGSpixelSplat、MVSplat、latentSplat少量图像前馈重建一般快隐式高斯解码InfiniSplat大基线多图前馈重建 隐式解码目标场景快从这张表能看出几个趋势第一前馈重建是大方向。因为它不需要逐场景优化输入几张图像立即输出场景表征适合自动驾驶、机器人、AR 这类需要即时重建的场景。第二大多数前馈 3DGS 方法是针对“小基线多视角”设计的。它们假设输入图像之间的视角足够接近能够形成有效的代价体匹配。一旦基线拉大代价体匹配质量迅速下降重建的几何会变得破碎。第三InfiniSplat 的差异化定位就是大基线。它通过隐式解码器引入更强的几何先验和上下文建模能力希望在前馈速度和大基线鲁棒性之间取得一个更好的平衡点。6. 伪代码示例理解一次前向推理的完整流程为了便于理解下面给出一个基于方法思路整理的推理流程伪代码。注意这里的网络结构和具体维度是示意性的不是论文的精确实现但它能帮你把握整体数据流。# 伪代码InfiniSplat 风格的前馈推理流程 import torch import torch.nn as nn class InfiniSplatInference(nn.Module): def __init__(self, feature_extractor, cost_volume_net, implicit_decoder): super().__init__() self.feature_extractor feature_extractor # 2D 特征提取网络 self.cost_volume_net cost_volume_net # 代价体构建与编码网络 self.implicit_decoder implicit_decoder # 隐式高斯解码器 def forward(self, ref_image, src_images, ref_pose, src_poses): ref_image: 参考视角图像 [B, 3, H, W] src_images: 源视角图像集合 [B, N, 3, H, W] ref_pose: 参考视角相机位姿 [B, 4, 4] src_poses: 源视角相机位姿 [B, N, 4, 4] # 1. 提取多视角特征 ref_feat self.feature_extractor(ref_image) # 返回 [B, C, H, W] src_feats [self.feature_extractor(img) for img in src_images] # 每个 [B, C, H, W] # 2. 构建代价体编码隐式特征场 feature_volume self.cost_volume_net(ref_feat, src_feats, ref_pose, src_poses) # 返回 [B, C, D, H, W] # 3. 在特征场中采样 3D 查询位置密度自适应 query_points self.sample_adaptive_points(feature_volume) # 返回 [B, M, 3]M 为采样点数量 # 4. 查询隐式特征 query_features self.sample_volume(feature_volume, query_points) # 返回 [B, M, C] # 5. 解码高斯参数 gaussians self.implicit_decoder(query_features, query_points) # 返回 dict包含: # means: [B, M, 3] # quats: [B, M, 4] # scales: [B, M, 3] # opacities: [B, M, 1] # sh_coeffs: [B, M, 16, 3] return gaussians这个流程的关键点在于第三步的采样。如果采样点太少重建质量不够如果太多推理速度变慢。一般会在边缘、纹理复杂区域做密集采样在平坦区域做稀疏采样这个策略可以通过一个轻量显著性预测头实现。推理完成后渲染部分直接用标准的 3DGS 光栅化引擎即可。要注意的是不同高斯之间需要按深度排序这个排序在光栅化阶段必须保证正确否则会出现前后遮挡错误。7. 如果要在项目中尝试这类方法环境准备与实现建议虽然 InfiniSplat 的官方代码可能还没完全开源但如果你想在类似任务上做实验下面这套环境准备和实现路径是可以直接参考的。核心依赖和 open3d、torch、pytorch3d 这些工具链完全一致而且你可以基于现有开源 3DGS 项目改造。7.1 环境准备建议使用 Python 3.10 或 3.11PyTorch 2.1 以上NVIDIA GPU 建议显存不低于 16GB。如果只是跑推理验证8GB 也可以但训练时大基线多视角输入会非常吃显存。# 创建虚拟环境 conda create -n infinisplat python3.10 conda activate infinisplat # 安装 PyTorch pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121 # 安装 3DGS 渲染相关依赖 pip install plyfile tqdm wandb opencv-python pip install submodules/diff-gaussian-rasterization如果你需要在训练时用到深度图做监督可能还需要安装一个单目深度估计模型比如 Depth-Anything 或 MiDaS用来生成伪深度标签辅助约束几何。7.2 数据集格式这类方法一般使用类似 COLMAP 的格式图像文件夹加上 sparse 子目录里的相机位姿文件。如果使用 RealEstate10K、DL3DV 这类数据集但相机位姿已经由数据集提供不需要再跑 COLMAP。如果要用自己的数据建议先跑一遍 COLMAP确认稀疏重建点云没有明显漂移再作为训练输入。需要特别提醒的是如果输入图像之间基线太大COLMAP 本身可能匹配不到足够的特征点导致重建失败。这种情况需要先补充中间视角图像或者使用带 IMU 信息的图像序列做引导。7.3 核心训练配置训练前馈 3DGS 模型时有几个配置项需要特别注意# config/train.yaml 示例 data: root: /path/to/dataset views_per_sample: 5 # 训练样本中包含的视图数量 img_size: [512, 512] # 输入分辨率 model: feature_extractor: dino_v2 # 特征提取骨干 cost_volume_depth: 64 # 代价体深度采样层数 decoder_hidden_dim: 256 # 隐式解码器隐藏维度 max_gaussians_per_sample: 4096 # 每个样本最多生成的高斯数 training: batch_size: 1 lr: 1e-4 lr_schedule: cosine lambda_l1: 0.8 lambda_lpips: 0.2 lambda_depth: 0.1 # 深度平滑正则系数这里特别说明一下views_per_sample。训练时每个样本需要包含一个参考视角和至少两个源视角且源视角的位置要模拟大基线条件。如果训练数据全是小基线视频帧模型学不到大基线匹配能力测试时遇到大基线照样翻车。要在数据加载阶段人为控制视角间距让模型在训练中见过足够多的大基线样本。7.4 损失函数设计除了渲染图像的 L1 损失和 LPIPS 感知损失外建议加上深度一致性约束。因为大基线条件下几何错误往往比颜色错误更致命。深度损失可以用预测高斯中心投影到各视角产生的深度图与单目深度估计值做比较。# 损失函数组合示例 def compute_loss(pred_img, gt_img, pred_depth, gt_depth): l1 F.l1_loss(pred_img, gt_img) lpips vgg_perceptual_loss(pred_img, gt_img) depth_loss F.smooth_l1_loss(pred_depth, gt_depth) return 0.8 * l1 0.2 * lpips 0.1 * depth_loss注意上面的gt_depth如果是单目深度估计得到的伪深度它本身存在尺度歧义所以需要做逐样本尺度对齐后再计算损失否则会干扰几何学习。8. 常见问题与排查思路在实际运行 3DGS 相关代码或者复现前馈方法时下面几个问题是最常见的。我直接给出排查顺序和解决方案。问题现象可能原因排查方式解决方案渲染图像出现大量黑色空洞高斯数量不足或采样位置没有覆盖可见表面打印生成高斯的中心分布查看是否集中在图像中心附近增加采样点数量调整采样范围降低表面阈值训练时 loss 不下降学习率设置不当或特征提取器没有收敛查看每个 loss 项的数值变化确认梯度是否能回传到特征提取器降低学习率使用 warmup检查是否冻结了骨干网络大基线输入重建出现重影代价体匹配出现多峰响应可视化代价体的深度响应曲线增加代价体深度分层加入一致性正则项增加源视角数量CUDA memory overflow高分辨率输入 大量高斯同时参与渲染查看最大显存消耗点降低输入分辨率限制最大高斯数量使用梯度检查点协方差矩阵出现 NaN网络输出了非法的旋转/缩放参数在解码器输出后加入 clamp 操作对缩放使用 softplus 激活对四元数做归一化位姿不一致导致渲染闪烁相机位姿精度不足检查 COLMAP 的重投影误差重新跑 COLMAP使用带位姿优化的变体方法这里要特别强调如果是自己采集的数据位姿误差是大基线方法最大的隐形杀手。许多人在合成数据集上复现得很好一上真实数据就废原因不是模型不行而是 COLMAP 在大基线图像上给出的位姿本身就带了几米的漂移。模型再强也不可能在错误的位姿上重建出正确的几何。9. 技术边界与工程选型建议InfiniSplat 这类隐式高斯解码方法很有潜力但不要把它当成万能解药。从技术边界来看下面几个方面仍然需要注意首先大基线不等于任意稀疏。即便模型专门针对大基线优化仍然需要输入视角之间存在一定的共视区域。完全没有任何重叠的两张图任何方法都不可能可靠重建出几何。其次动态场景处理仍是难点。目前的 3DGS 框架主要处理静态场景。如果场景中有行人、车辆在移动或者光照剧烈变化前馈重建方法会把这些动态因素当作噪声处理导致重建结果模糊。第三显存与算力仍然是实际瓶颈。隐式解码器相较于直接回归增加了查询复杂度在百万级高斯量级下推理开销会比直接回归方法高。如果目标是部署到边缘设备上做实时重建需要做量化、剪枝和高斯稀疏化。工程选型上我的建议是分场景看待如果你的输入是小基线视频帧目标只是快速重建静态场景原始的每场景优化 3DGS 就够用了不需要引入前馈方法的复杂度。如果你需要从稀疏大基线图像做快速重建比如自动驾驶环视相机或无人机航拍InfiniSplat 这类前馈 隐式解码的方向值得重点关注。如果你在做一个需要连续重建更新的系统比如机器人 SLAM 或 AR 持久化隐式高斯解码的连续特征场特性可能会带来额外的流畅性和稳定性优势。从论文标题中的“Infini”这个词可以推断这个工作大概率也考虑了场景无边界问题这意味着它可能对户外大场景、航拍数据有更好的适应性。但具体的无边界处理策略还是要以论文正文为准。10. 结语这类方法论到底在改变什么回顾 3DGS 这一两年的演进轨迹其实能看到一条非常清晰的路从逐场景优化到前馈重建从直接回归参数到隐式解码生成。每一步改变都不是为了炫技而是为了解决一个更具体、更棘手的问题。InfiniSplat 所代表的方向本质上是把“重建”这件事从“拟合一个场景”推向“理解一类场景”。当模型能够在看到几张跨度很大的图像后立刻生成一个合理的 3D 高斯场景说明它学到的不再是某个场景的特异性而是“大基线图像之间如何关联”的通用规律。这对三维视觉的未来意义深远因为它让机器第一次有了一种接近人类直觉的空间理解能力——即使只扫了一眼也能大致想象出物体背后的结构。对于开发者来说这个方向的价值更多体现在工程侧推理时不需要逐场景优化省掉了大量迭代时间隐式解码带来的连续特征场让后续的增量更新、场景编辑和语义融合都变得更加方便。无论是做数字人、自动驾驶仿真、还是空间计算应用这套方法论都会是一个值得长期跟踪的技术路线。建议收藏这篇文章等 InfiniSplat 的代码正式开源后再对照论文里的模块设计和训练细节做进一步验证。你也可以先在 pixelSplat 或 MVSplat 的代码库上把特征提取部分换成更强的视觉基础模型把输出改成隐式解码结构提前感受一下这条技术路线带来的变化。
返回列表