0


4D Gaussian Splatting 是怎么工作的:从规范 Gaussian 到形变场的原理拆解

实时渲染静态 3D 场景是很麻烦的,因为现实世界并不是静止的:人在移动,液体在流动,物体在变形。把 3D-GS 扩展到动态场景(4D)听起来只需要一步,随时间跟踪每个点,但是实际操作起来却很麻烦,因为显存瓶颈非常棘手。

4D Gaussian Splatting(4D-GS)的架构的方法相当巧妙,所以本文记录一下 4D-GS 如何用一个因子分解的形变场取代暴力跟踪,从而绕开动态渲染的显存爆炸问题。

显存瓶颈:原始跟踪方式为何行不通

要理解 4D-GS 的精妙之处,得先弄清楚它要解决的问题。

传统动态 NeRF 把一个 8 维输入空间(x、d、t、λ)映射到颜色和密度,λ 是用来处理表面分裂或合并等拓扑变化的潜在编码。这套方案效果不错但 NeRF 的隐式表示天然限制了渲染速度。

3D Gaussian Splatting 把场景显式表示为数百万个类点的 Gaussian,靠光栅化快速渲染,解决了速度问题。但如果为每一帧都存一份每个 Gaussian 的位置、旋转和缩放(1 亿个 Gaussian × 100 帧),显存需求会线性爆炸。

4D-GS 的做法是彻底放弃逐帧存储 Gaussian,只维护一组规范(canonical)3D Gaussian,再用一个轻量神经网络作为形变场,计算这组基础 Gaussian 在任意时间戳下应该如何位移、拉伸、旋转。

渲染方程由此简化为:

G' = G + ΔG

形变后的场景 G' 等于静态基线 G 加上神经网络预测的变化量 ΔG。

拆解形变场

如何在不引发显存爆炸的前提下算出 ΔG?4D-GS 把这个任务拆成两个阶段:观察者(编码器)和导演(解码器)。

1、时空结构编码器(观察者)

要形变一个点,得先知道它的上下文:位置在哪,此刻是什么时间,邻居在做什么。

最简单的的做法是把场景塞进一个庞大的 4D 神经体素网格(x、y、z、t),但 O(N⁴) 的显存开销是不现实的。4D-GS 借用了 HexPlane 和 K-Planes 里的一个技巧:分解。

把庞大的 4D 空间拍平成 6 个轻量、多分辨率的 2D 平面:

  • 空间平面:XY、XZ、YZ
  • 时间平面:XT、YT、ZT

网络查询一个连续的 Gaussian 坐标(比如 μ = (1.234, 5.678, 2.0))在时间 t 的值时,这个坐标不会正好落在网格顶点上。编码器用双线性插值找到每个平面上最近的四个网格角点,算出距离加权平均,提取出 6 个特征向量。

这 6 个向量通过逐元素(Hadamard)乘积绑定在一起:

这个稠密向量 f_h 再送进一个很小的 MLP,得到最终压缩后的上下文向量 f_d。

HexPlane 怎么初始化

网络能不能训好很大程度上取决于起点,4D-GS 里六个特征平面的初始化方式其实是很值得研究的。第一次前向传播之前,显式特征网格要先填好数值:空间平面(XY、XZ、YZ)用 [0.1, 0.5] 区间内的均匀随机值初始化,给网络留出学习空间特征的余地;时空平面(XT、YT、ZT)则统一初始化为 1。

时间特征为什么要设成 1?

不同平面的特征通过逐元素相乘组合。如果时间特征是 1,乘上空间特征不会有任何变化:x × 1 = x。

模型一开始的行为就等同于把整个世界当成静止的。这是刻意为之:网络不预设到处都有运动,而是从静态场景出发,只有当损失函数说明必须靠运动才能解释观测数据时,才去修改时空特征。

运动不是模型自带的,得靠优化过程"挣"出来。这样网络只会在真正存在运动的地方学习形变,得到的动态场景表示也更稳定、更符合物理规律。

2、多头解码器(导演)

拿到上下文向量后,多头解码器把 f_d 翻译成具体的物理指令。几个独立的线性头分别预测:

  • 位置偏移:ΔX
  • 旋转偏移:Δr
  • 缩放偏移:Δs

这些值加到规范 Gaussian 上,场景交给可微分光栅化器做实时的、基于图块的 splatting。

不过这里有一个有意思的架构限制:4D-GS 主流程并不预测颜色 ΔC 或不透明度 Δα 的变化。

为什么要卡死这两项?神经网络一旦有机会偷懒就会偷懒。要是能自由改颜色和不透明度,网络完全可以不老老实实把 Gaussian 从 A 点挪到 B 点,而是把 A 点的不透明度调成零、B 点调成一,颜色再一闪,伪造出物体在移动的假象。

这样一来场景的物理几何结构就被破坏了,下游的 3D 跟踪也没法做。锁死颜色和不透明度,逼着网络去学真正的物理形变。(作者也提到,遇到流体或极端非刚性运动这类边缘情况,可以把 ΔC 和 Δα 的预测重新打开。)

损失函数与训练过程

从零训练一个动态场很容易乱套:优化器要同时琢磨清楚基础几何和运动。4D-GS 用两阶段训练来稳住这个过程。

  1. 静态预热:前 3000 次迭代里,形变场完全关闭,模型的行为等同于一个普通 3D-GS,逼着规范 Gaussian 先找到最优的静态几何。
  2. 4D 优化:打开形变场,网络开始预测运动,通过可微分 splatting 渲染图像并计算损失。

目标函数在准确性和平滑性之间做了权衡:

L1 损失约束渲染结果去匹配真实图像 Î;全变分损失 L_tv 直接作用在 HexPlane 网格上,惩罚相邻网格单元间的剧烈跳变,从数学上强制运动保持平滑连续。

反向传播:两条路径

splatting 函数 S 是可微分的,总损失 L 可以通过链式法则一路反传回整个流程。

反向传播时,优化器计算损失相对于所有可学习参数的梯度,这些梯度分成两条路径。

路径 A:更新规范 Gaussian(G)

梯度一路传回基础的规范点云,更新起始位置和属性。dL/dG 更新基础几何,保证规范形状准确。

路径 B:更新形变场(F)

梯度经过加法操作

G' = G + ΔG

流入神经网络,调整网络对运动的预测方式。

所以就需要一套很细的学习率调度,用来保证训练稳定:

解码器权重(θD):dL/dθD 更新多头 MLP 的权重。论文里这部分训练得比较保守,学习率从 1.6 × 10⁻⁴ 衰减到 1.6 × 10⁻⁵。

HexPlane 特征(Rl):dL/dRl 更新六个多分辨率 HexPlane 里存的实际特征值。这些是显式网格参数,不是深度网络权重,学习速度快一些,学习率从 1.6 × 10⁻³ 衰减到 1.6 × 10⁻⁴。

跑完最多 20000 次迭代,规范 Gaussian 逐渐稳定到最优的基础形状,HexPlane 和 MLP 也不断调整参数,直到预测出的形变能准确还原视频里的动态。

多视角与单目:两种不同的现实

动态渲染器的真正考验在于数据输入方式。多视角场景下(比如 Neu3D),15—20 台相机同时拍摄,网络每个时间戳只算一次 4D 形变,但会从 20 个角度分别 splatting、算损失;密集的反馈信息能防止模型为了骗过单一视角而把几何"压扁"。单目场景(比如 D-NeRF)只有一个相机角度,网络得靠 HexPlane 的时间连续性去推断 3D 运动。

在 HyperNeRF 这类相机本身在向前移动的数据集里,形变场容易陷入局部极小值,很难把相机的运动和被拍摄主体的运动区分开。极端快速的运动、又缺乏多视角重叠的场景,对目前的编码器设计来说仍然是个难题。

总结

从静态点云渲染跳到动态渲染,不只是多加一个时间变量那么简单,信息的存储和查询方式得整个重新设计。

  • 用形变取代跟踪:只维护一组规范 Gaussian、预测形变,显存开销取决于运动网络的复杂度,而不是视频长度。
  • 分解是核心:把 4D 空间因子分解成六个 2D 平面,靠双线性插值快速查询特征,绕开了 4D 体素的 O(N⁴) 显存问题。
  • 用约束换真实:不让网络碰颜色和不透明度,逼它去学真正的物理运动,代价是多花点训练技巧,换来的是渲染之外还能做 3D 跟踪。

所以4D-GS 靠合适的因子分解和几个关键约束,显式表示照样能搞定时间维度,而不用牺牲让它一开始就站住脚的实时性能。

作者:Prajas Wadekar

“4D Gaussian Splatting 是怎么工作的:从规范 Gaussian 到形变场的原理拆解”的评论:

还没有评论