☰
4D Gaussian Splatting详解:动态场景实时渲染的范式突破
2026/10/3 11:12:51 网站建设 项目流程

第一次把 4D Gaussian Splatting 跑通的时候,我盯着渲染结果看了很久:视频里的物体在运动、相机视角在切换、画面还能维持在实时帧率,那一刻才真正意识到,动态场景渲染这条路被这篇论文彻底改写了。你在三维视觉方向刷文章,大概率见过 4DGS 这个缩写,它解决的问题很直白:既然 3DGS 已经把静态场景做到实时高保真,那动态场景能不能同样用高斯泼溅实时渲染?这篇阅读笔记我会从背景动机、核心设计、模块拆解、实验分析一直讲到复现过程中的实际问题,尽量把“为什么这样做”讲透,而不是贴几个公式就走。

1. 动态场景渲染为什么是个“硬骨头”

动态场景渲染难,难点不在于“多了一维时间”,而是时间维度把原来所有舒服的假设都打破了。

先看静态场景。NeRF 时代我们训练一个场景要几个小时,渲染一帧还要沿光线采样几十上百个点,离线跑一张图都要等好几秒。3D Gaussian Splatting 出来后情况完全变了:场景由一大堆椭球状高斯组成,渲染时把这些高斯直接投影到图像平面做光栅化,训练时间压到分钟级,渲染速度直接进入实时区间。静态场景的难题基本被 3DGS 解决了,于是所有人的目光都转向了动态场景。

动态场景麻烦在哪里?第一,数据是离散的。视频只是一组固定时间戳的图像,中间时刻的场景状态我们看不到,但用户希望任意时刻都能渲染。第二,场景几何在变。人走路、衣服摆动、物体旋转,高斯的中心、朝向、大小每一帧都可能不同。第三,遮挡和外观也在变。物体移走后背景露出来,光照和反射跟着时间走,这些信息必须被模型捕捉到。

早期动态 NeRF 方法,比如 D-NeRF、TiNeuVox、K-Planes,解决这些问题的思路是在隐式神经辐射场里加一个时间编码,让网络同时回归密度和颜色。思路没错,效果也确实在提升,但它们共享同一个致命缺陷:每条光线要采样大量空间点,每个点都要单独过一遍 MLP,训练慢、渲染更慢,跟“实时”完全不沾边。

当时我看到这类工作时的感觉是:精度再涨几个点,离实用也还有很长的距离。真正需要的不是把 NeRF 调得更准,而是换一套渲染范式。4DGS 的出发点就是这个——既然静态场景能用高斯泼溅做到实时,能不能让这些高斯学会随时间运动,从而把动态场景也变成一次光栅化渲染?论文的答案是可以,而且效果和速度同时在线。

2. 核心思路:与其学一个4D场景,不如学会“移动”3D高斯

2.1 把静态高斯看成演员的骨架

4DGS 整个设计可以用一个类比帮助理解:静态 3D 高斯相当于演员的骨架模型,deformation field 是骨骼绑定和动画驱动系统。演员本身没有变,变的是每一帧它的姿态、朝向、缩放、表情——对应高斯的中心、旋转、缩放和颜色。

这个分工非常干净。场景里那些高频的几何细节、纹理细节全部由 3DGS 这个显式表达承担;变形网络只需要负责“怎么动”。静态高斯相当于一个基准参考,变形网络学到的是相对于这个基准的偏移量。所以即使时间维度变化很大,基准场景仍然提供一个强先验,模型不会完全失控。

这也是 4DGS 为什么没有选择逐帧重建 3DGS 的原因。逐帧重建意味着每一帧的高斯互不相关,帧间没有任何一致性约束,最后渲染出来的视频一定是抖动的、闪烁的。用一个共享的静态高斯集合加一个时间连续的变形场,天然就保证了时空一致性。

2.2 输入输出:哪些量参与变形

具体到每个 3D 高斯,它携带的信息包括中心位置、旋转四元数、缩放向量、不透明度、球谐颜色系数。4DGS 的变形网络输入的是高斯的位置和时间戳,输出的是增量:位置增量、旋转增量、缩放增量、球谐系数增量。

注意,不是只让位置动。这一点极其重要。如果只平移高斯的中心,它的朝向和大小不会随形变调整,渲染出来就像贴纸在滑动,物体转个角度画面立刻崩坏。加入旋转增量,高斯可以表达局部朝向的变化;加入缩放增量,高斯可以表达拉伸和收缩。旋转用四元数表示,输出后需要保证单位化,不然会出现旋转奇异点。缩放通常处理成 log 空间,避免出现负值。

球谐系数的增量同样不能少。动态场景里不只是几何在变,颜色也在变,比如人物转身时衣服的明暗变化、灯光闪烁、反射高光移动。如果球谐系数保持不变,外观就锁死在静态基准上,动态光照完全无法体现。

2.3 为什么不直接学习一个4D高斯场

站在事后角度,直接学习 4D 高斯场听起来很顺理成章:给每个高斯加上时间维度,构建一个四维体。但这么做有两个硬伤。

第一是参数爆炸。视频有几十甚至几百帧,如果每个时间步都维护一组独立高斯,高斯数量随帧数线性膨胀,训练和存储都扛不住。第二是数据稀疏。一个高斯在什么时刻应该出现在哪里,只有被观测到的帧才提供监督信息,没被观测到的时刻只能靠插值猜。直接学一个高维场,模型很容易过拟合到离散帧,中间时刻胡乱生成。

变形场思路则绕开了两个问题。时间 t 只是网络的一个额外输入维度,高斯数量不随时间增加。网络学到的是从“3D位置+时刻”到“位移量”的连续映射,天然支持任意时间插值。训练好之后,想渲染第几帧就传第几个 t,整个过程是同一个前向计算,没有任何额外成本。

2.4 与动态NeRF的分工差异

理解 4DGS 的关键在于“责任划分”。K-Planes、HexPlane 这类动态 NeRF 方法,网络要同时回答“哪里有东西”和“东西长什么样”两个问题;4DGS 把后者完全甩给了稳定的 3DGS 显式表达,网络只回答“东西每一刻在什么状态”。

显式表达提供几何和纹理的高频细节,隐式变形场提供时间维度的泛化能力,两者各干各擅长的事。后来大量动态高斯类工作都在沿用这个分工:SC-GS 用稀疏控制点驱动大规模高斯,本质上还是显式高斯表达加一个轻量驱动模块。这说明 4DGS 选的这个架构方向是经得起验证的。

3. 时间怎么塞进高斯:HexPlane与变形网络的设计细节

3.1 HexPlane六平面是什么

要让网络预测高斯在时间 t 的增量,第一步必须把“位置+时间”这个四维坐标编码成有意义的特征向量。4DGS 采用的编码器是 HexPlane,也就是六张特征平面:XY、XZ、YZ、XT、YT、ZT。

前三张平面管空间,负责描述“这个位置在场景里的静态属性”;后三张平面是空间-时间耦合平面,负责描述“这个位置在某个时刻发生了什么变化”。XT 平面编码 x 坐标与时间的关系,YT、ZT 依此类推。对任意一个空间坐标和时间,把它逐一投影到六张特征平面上,用双线性插值取出每个平面的特征向量,最后拼成一个联合时空特征。

你可以把 HexPlane 想象成一个六面的档案柜,每一面贴了一张索引表。要查“某个位置在某个时刻的状态”,就去六张表里分别查到对应的小抄,拼在一起交给下游模块。特征平面是连续存储的,任何浮点坐标和时间点都可以通过插值查到特征,所以这个编码天然支持任意时间查询,这是 4DGS 能插帧的基础。

3.2 变形MLP的输入输出细节

拼接得到的时空特征向量送入一个轻量 MLP。这个 MLP 结构不大,论文实现里就是几层全连接,输出分成两个分支:一个负责几何变形,输出位置、旋转、缩放的增量;另一个负责外观变化,输出球谐系数的增量。

两个分支共享同一个时空特征,这能保证几何和外观之间的耦合关系——物体变形时外观跟着变是符合直觉的。旋转增量是四元数,输出后要归一化;缩放增量在 log 空间计算,最终缩放始终保持为正。这些细节在复现时都要注意,任何一个环节处理不当都会让优化崩溃。

需要特别强调的是,这个 MLP 足够轻量,所以前向推理成本很低。3DGS 每一次渲染前,只要把所有高斯过一遍这个轻量网络,得到变形后的高斯参数,再走原来的光栅化流程。额外的计算开销相比光栅化本身可以忽略不计,这是 4DGS 能保持实时渲染的关键。

3.3 离散帧训练如何保证时间连续

视频数据本质上只有离散的时间戳,如果用已知帧监督网络,模型很容易把中间时刻学坏。4DGS 的训练策略针对这个问题做了两件事。

第一,在已知时间戳上直接监督渲染结果,保证网络在观测帧上准确;第二,在两个已知帧之间随机采样中间时间,把该时刻的相机位姿也做线性插值,然后把中间时刻的渲染结果一起送进损失函数。这一步非常关键,它把“学习离散帧”变成了“学习连续时间回归”,强制网络在任意时间戳上都有平滑输出。

相机位姿做线性插值是合理的,因为相邻帧之间的相机运动通常是渐进的,尤其固定相机拍摄的多视角动态场景,相机位姿本身不随时间变化。即便相机运动更复杂,这个近似也足够提供中间帧的弱监督信息。有了这个策略,训练好的模型才能做到顺滑的时间插值和帧率变换。

3.4 训练流程与损失函数

4DGS 的训练大体分为两个阶段。

第一阶段是热身阶段,也是最容易被忽略的环节。先关闭变形网络,只用 3DGS 做静态重建,让高斯点云先找到一个合理的空间分布。这一步不能省:如果一上来就开启变形网络,初始点云分布还没稳定,变形场会把高斯拽得到处乱跑,训练很难收敛。热身完成后,再启动变形网络和 HexPlane 特征平面的优化。

第二阶段是联合优化阶段。随机采样一个时间 t,让静态高斯过一遍变形网络,得到该时刻的动态高斯,再按 3DGS 的方式渲染出图像,和真实帧计算损失。损失函数沿用 3DGS 的 L1 加 SSIM 两项,权重系数通常取 0.2 左右。整个流程就是在 3DGS 的基础上多了一次变形推理,其他部分完全复用,这也是训练速度快的根本原因。

4. 从实验数据看4DGS的真实水平

4.1 数据集与评价指标

论文实验主要用了两个动态场景基准:D-NeRF 合成动态数据集和 NeRF-DS 动态场景数据集。D-NeRF 包含多个物体的合成运动场景,地面真实值和相机路径都精确可控;NeRF-DS 更贴近真实拍摄,包含透明物体、复杂遮挡和光照变化,难度更高。

评价指标是 PSNR、SSIM、LPIPS,分别衡量像素误差、结构相似度和感知距离。这三项指标是目前新视角合成工作的标配,动态场景研究也基本沿用这套评价体系。

4.2 定量结果:在精度上拉开多大差距

我读论文时先看了 D-NeRF 上的对比表。4DGS 在绝大多数场景上的 PSNR 和 SSIM 都超过了 D-NeRF、TiNeuVox、K-Planes 等方法,而且不是零头级别的提升,是能看到明显差距的领先。主观渲染结果上,动态物体的边缘、遮挡切换区域、细小结构这些重点难点,4DGS 的渲染质量要好出一截。

在 NeRF-DS 真实场景上,因为包含透明和半透明物体,4DGS 的优势略有缩小,但整体指标依然保持领先。这也说明一个事实:动态场景的指标受数据集、相机轨迹、视频帧数影响很大,单看某个数字意义不大,横向对比同一基准下的整体趋势更有参考价值。

下面这个表格反映的是方法量级上的对比,具体数值需要以论文发布结果为准:

方法D-NeRF PSNR/SSIM渲染速度训练耗时
D-NeRF中等极慢小时级
TiNeuVox中等慢小时级
K-Planes / HexPlane中高慢分钟到小时级
4DGS最高实时分钟级

4.3 速度账本:为什么说“实时”成立

4DGS 的实时性不是靠硬件堆出来的,而是整个渲染流程里没有“逐像素查询”这种瓶颈。3DGS 渲染一帧本身就是毫秒级,4DGS 在渲染前只是多了一次变形网络前向。这个前向路径很短,相比光栅化的开销小得多,因此整条 pipeline 仍然能维持高帧率。

在论文展示的实验环境中,D-NeRF 这类分辨率下的渲染速度可以做到实时级别,视频播放流畅。如果分辨率拉到 4K,帧率会下降,但依然远快于任何基于体渲染的方案。训练耗时方面,单个场景在消费级显卡上大约几十分钟内完成,对比动态 NeRF 以小时甚至十小时为单位的训练时间,体验上是质变。

4.4 消融实验透露的信息

论文的消融实验,我理解下来有几点值得记住。

第一,时间平面的贡献不可替代。把 XT、YT、ZT 中任意一张时间平面去掉,动态重建质量都会明显下降,说明时间维度的特征编码不是装饰,而是整个变形场的地基。第二,只预测平移不够。在大形变场景下,如果不预测旋转和缩放,指标会明显掉点,说明高斯的朝向和尺度动态变化对表达真实形变很重要。第三,热身阶段不是可有可无。跳过热身直接训练变形网络,初始点云分布不稳定,最终效果会变差。

这些消融结论也反过来验证了前面的设计选择:六平面缺一不可,几何增量必须完整,训练策略的细节不能省。

5. 复现4DGS时的实际问题清单

阅读笔记读到实验部分,很多人会急着复现。4DGS 官方实现是基于 3DGS 改的,整体代码量不大,但实际跑起来有几类问题几乎人人都会遇到。

5.1 数据准备:多视角同步是生命线

4DGS 的输入要求是同步的多视角视频,所有相机必须在同一时刻拍摄画面,错开一两帧都会导致训练时几何不一致,渲染结果出现重影。数据前期处理需要用 COLMAP 对视频帧做稀疏重建,生成点云和相机位姿,然后按照官方工程要求的数据结构放好。

这里最常见的坑是数据格式不匹配。不同数据集的相机参数存储格式不一样,D-NeRF 的合成数据提供了相机内外参,真实数据集有的给 colmap 输出,有的给 json,最好先仔细读一遍官方代码里的数据加载脚本,把自己的数据转换成要求的格式再开跑,不要在数据格式上浪费时间。

5.2 环境与编译:diff-gaussian-rasterization是最大的坎

3DGS 仓库里的 diff-gaussian-rasterization 光栅化库需要在本地编译,4DGS 也沿用了这个库。编译报错的原因集中在 PyTorch、CUDA、gcc 版本不匹配,显卡驱动过旧导致 CUDA 扩展无法编译。我的建议是严格按官方 README 里的环境组合来装,不要一上来就上最新版 PyTorch,最新版本不一定兼容那个 CUDA 扩展。

另外,训练前确认一下 GPU 显存和驱动支持的计算能力。4DGS 在高斯数量变大后显存压力明显,至少准备一张 12GB 以上显存的卡,否则只能通过降低迭代批次、缩小特征平面分辨率来妥协。

5.3 显存和训练策略:为什么OOM总是找上门

4DGS 训练时,每个时间戳都要把静态高斯过一遍变形网络,生成变形后的高斯集。这意味着显存里至少要有两份高斯参数:静态基准和变形后的结果,同时还要保留梯度给 HexPlane 和 MLP,显存峰值比静态 3DGS 高不少。

如果训练长视频或高分辨率场景时爆显存,优先检查迭代中渲染的图块大小,把渲染分辨率降下来或者分块处理,比盲目减小高斯数量靠谱。高斯数量一旦减得太多,场景细节会明显丢失,反而得不偿失。

5.4 结果检查:什么样算收敛,哪些一眼看出失败

训练完成后渲染视频,如果看到物体边缘闪烁、中间帧出现鬼影、背景像水面一样波动,通常不是网络结构的问题,而是变形场没有学稳。先检查热身步数是否足够,学习率是否过大,再检查数据本身的时间对齐是否准确。

可以打印每一帧的 PSNR 曲线,如果某个时间戳的 loss 一直居高不下,优先检查该帧的相机位姿估计是否异常。很多时候 COLMAP 对个别帧的配准失败,导致这帧的监督信号本身就有错误,模型怎么优化都救不回来,这时要做的不是调参,而是修正这条数据。

6. 4DGS的边界在哪,以及后来者怎么补

6.1 四类典型的边界情况

第一,无法建模拓扑变化。4DGS 的高斯不透明度在时间维度上没有建模,变形网络只管位置、旋转、缩放和颜色。物体出现或消失、烟雾扩散、水面飞溅这类拓扑结构发生变化的内容,4DGS 基本无能为力,因为高斯数量从头到尾没变过。

第二,多视角同步输入门槛高。所有相机必须同步拍摄,意味着真实场景采集只能用多台相机硬同步或者专门的采集设备。手持单相机制作动态场景资产,这条路 4DGS 走不通。

第三,长视频漂移。训练序列拉长之后,变形场覆盖的时间范围变大,HexPlane 的插值特征会模糊,后续帧容易出现位置漂移和细节丢失。如果一段视频上百帧,4DGS 的稳定性会明显下降。

第四,高频细节受限。HexPlane 特征平面的分辨率决定了时空特征的细节上限,高分辨率视频里的微小运动、高速运动造成的运动模糊,都容易被特征插值抹平。

6.2 后续工作的演进方向

4DGS 发表之后,动态高斯方向快速分化出好几条路线。

一条是稀疏控制点路线,代表工作是 SC-GS,用少量控制点驱动大规模高斯的变形,减少参数量的同时增强大范围运动的一致性。另一条是把多视角条件放宽松,比如从单目视频或者视频生成模型重建 4DGS,让动态资产的生产不再依赖多相机同步采集。还有一条专门针对拓扑变化,尝试给不透明度或密度增加时间维度的动态场,把烟雾、流体这类挑战性场景也纳入高斯泼溅的适用范围。

这些工作或多或少都在补 4DGS 的短板,但它们的底座仍然继承了“静态3D高斯加隐式变形场”这套架构。这说明 4DGS 作为一篇方法论文,最重要的价值不在于刷了几个点,而在于提供了一个验证有效的范式。

6.3 把这篇论文放在时间线上看

现在回头看,4DGS 是动态场景实时渲染从“不可能”到“可实现”的一个标志性节点。它做对的事情是:没有发明一个全新的场景表达,而是把已经被验证的静态表达往前推了一个维度。这个思路对工程实践很有启发——当你面对一个新维度的问题,先想想能不能在现有可靠表达上叠加一个轻量驱动模块,而不是推倒重来。

如果让我给刚接触 4DGS 的同学一个建议,我会说:别只盯着那些提升指标的消融表,先把“静态高斯 + 变形场 + 六平面编码”这套分工逻辑吃透。一旦搞明白为什么变形比逐帧重建好、为什么时间平面不能省、为什么热身阶段能防止训练崩溃,你就掌握了分析后续几乎所有动态高斯方法的核心框架。读论文的意义就在于此,不是记住公式,而是看懂作者当时面临的取舍和理由。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询