Gaussians on Fire: High-Frequency Reconstruction of Flames¶
会议: ECCV 2026
论文: ECCV 原文
领域: 3D 视觉
关键词: 高斯泼溅、火焰重建、稀疏视角重建、4D 动态重建、瞬态体积现象
一句话总结¶
本文把火焰重新定义为"短寿命的体积发光载体"而不是"持续存在的场景基元":给每个 3D 高斯加上生命周期与线性速度,用三视角稠密光流融合出的 3D 流场初始化它们,再配合 ESP32 + LED 的亚帧同步采集与静态/动态解耦,仅用三台消费级相机就重建出时序一致的高频火焰 4D 表示,在火焰区域 PSNR/SSIM/LPIPS、深度一致性以及合成场景的运动场相似度上全面超过 4DGS、Grid4D、FreeTimeGS 等动态高斯基线。
研究背景与动机¶
可微场景表示在过去几年把静态三维重建推到了相当成熟的水平:3D Gaussian Splatting 用一组带视角相关颜色的各向异性高斯加可微光栅化,能在实时帧率下给出高质量新视角合成,已经是事实标准;沿着这条线,动态场景被大量工作扩展成 4D——4DGS 学习 4D 高斯基元,FreeTimeGS 让基元在任意时刻"出现",Grid4D 用分解式哈希编码换取更高的动态保真度,人体与动物这类关节化对象也有成熟的变形场解法。但这些方法共享一条隐含假设:场景内容可以被写成一组持续存在的基元 + 平滑、可追踪的运动。
火焰恰好把这条假设全部踩碎。它没有跨帧稳定的表面对应关系——这一帧的这团火和下一帧的"同一团"火并不是同一个物理实体;它是半透明的体积辐射而非表面,是自发光的(亮度取决于燃烧反应与温度,不能用工况外的表面反射模型解释),并且在高频下持续发生形变与拓扑变化。作者用 4DGS(Wu et al.)、4DGS(Yang et al.)、Grid4D、FreeTimeGS 做了对照,观察到三种反复出现的退化模式:几何吸收(把火焰的运动解释成背景几何在变形,火焰被"吸"进静态场景里)、深度坍塌(渲染图像看起来尚可,但对应的三维结构毫无意义)、时序漂移(渲染出的火焰演化与实拍观测对不上)。采集侧的困难同样现实:真火很难被多机位包围拍摄,消费级相机没有硬件同步接口,而火焰在高速拍摄下的帧间位移大到让任何时间偏差直接变成错误的几何监督。本文于是把问题收紧到一个极端设定——三台标定并同步的相机、稀疏视角、几何严重欠约束。
本文的切入角度不是"换一个更强的渲染器或挂一个物理仿真器"——作者明确强调这个设计是刻意做小的;真正被换掉的是表示的单位。既然火焰的运动学不是"表面在动",就不该用持久基元去拟合它。作者把场景拆成两层:静态背景先用融合了立体匹配与单目深度先验的稠密几何"钉死",动态部分表示成瞬态火焰高斯——短寿命的体积发光载体,只在一段有限时间窗口内存在,位置由显式的线性速度驱动,而速度不是从零学出来的,是由三视角稠密光流反投影融合出的 3D 流场给出的初值。核心 idea:把火焰从"被变形的持久基元"改写为"由多视角稠密运动证据初始化的瞬态体积高斯(带生命周期与线性速度)",让稀疏视角下光度监督学不出来的运动先验在初始化阶段就被注入。
方法详解¶
整体框架¶
输入是三台已标定、已同步的相机拍摄的火焰视频,输出是一个耦合的 4D 表示:静态背景的 3DGS 加上随时间演化的瞬态火焰高斯场。有了它就能做照片级新视角合成、在任意时刻重渲染,并且因为每个高斯的速度是显式参数,还能直接把运动轨迹读出来做下游分析(例如机器人导航要绕开火源)。
整条 pipeline 分四段。采集端先用自制的 ESP32 + LED 装置解决消费级相机的帧间同步;重建端把静态背景与动态火焰解耦,背景用立体深度与单目深度融合出的稠密点云初始化,再用 vanilla 3DGS 优化;动态区域的运动先验来自三路稠密光流的反投影融合,得到一个体素级的 3D 流场;最后用这个流场初始化瞬态火焰高斯(位置取体素位置、速度取流场向量、寿命取若干帧),与背景一起在光度与掩膜监督下联合优化。四段串起来正好对应下面的四个关键设计。
%%{init: {'flowchart': {'rankSpacing': 24, 'nodeSpacing': 28, 'padding': 6, 'wrappingWidth': 400}}}%%
flowchart TD
A["三视角火焰视频<br/>400 Hz 消费级相机"] --> B["亚帧视觉同步<br/>ESP32 + LED 时序编码"]
B --> C["静态 / 动态解耦<br/>立体 + 单目深度融合"]
C --> D["静态背景 3DGS"]
C --> E["3D 流场初始化<br/>多视角光流反投影"]
E --> F["瞬态火焰高斯<br/>生命周期 + 线性速度"]
D --> G["4D 火焰重建<br/>新视角合成 / 速度场分析"]
F --> G
关键设计¶
1. 亚帧视觉同步:让没有同步接口的消费级相机在微秒级对齐
火焰在 400 Hz 拍摄下的帧间位移极大,机位之间哪怕只差半个帧间隔,同一团火在不同视角下也会落在不同位置,多视角监督就退化成"用错位的数据互相纠正",直接毁掉几何。而 GoPro 这类消费级相机没有帧同步接口,于是作者自己做了一套硬件:一块 ESP32 微控制器驱动 21 个逻辑引脚,其中 5 个引脚产生亚帧同步图样(依次切换 5 条 COB LED 灯带),另外 16 个引脚维护一个递增的帧计数器——15 个白色 LED 用格雷码显示帧号,剩下的第 16 个 LED 专门用来消除格雷码在计数翻转处的固有歧义(不处理的话有可能整体错一帧)。
亚帧精度靠卷帘快门换来的:CMOS 传感器逐行曝光,LED 灯带的亮灭在图像里表现为"部分点亮",于是亮度跳变所在的行位置直接编码了曝光时刻。实测行时间约 3 μs、跳变定位精度约 5 像素时,时间精度约 15 μs——比帧间隔小两三个数量级。这套图样在训练与评测时都会被掩掉,不会污染监督。消融里人为引入半个帧间隔的偏移(NoSync),实拍场景火焰区域视觉质量下降、合成场景运动场精度下降(CosSim 0.736 对 0.744),说明这不是锦上添花而是必要前提。
2. 静态 / 动态解耦:先用融合深度把背景钉死
三台相机对背景本身就欠约束,如果让火焰与背景共享同一套可动基元,优化器最容易走的捷径就是把火焰的运动解释成背景几何在变形——这正是前面说的"几何吸收"。作者的应对是把静态部分先固定下来:取不含运动的静止帧;如果拍不到,就利用火焰自发光、亮度高于背景这一物理事实,沿时间维做最小强度投影(minimum intensity projection)估计出干净背景。位姿用 COLMAP 求,稠密几何用 COLMAP 的 PatchMatchStereo 实现得到立体深度,再用 DepthAnythingV2 预测单目深度,并做逐相机的仿射对齐
其中 \(a,b\) 在立体与单目深度重叠的区域上最小二乘拟合(原文式 1,缓存中该式排版有损坏,⚠️ 以原文为准)。把三张立体深度反投影成初始化点云,立体缺失的区域用对齐后的单目深度填补;背景用 vanilla 3DGS 优化,训练时对齐后的单目深度以
的形式作为正则项,防止三视角下出现退化的深度解。直观理解就是:给静态部分一个稠密可信的几何初值,再加一条持续存在的深度约束,等于把"背景不能乱动"写进了优化目标,剩下的自由度才留给火焰。
3. 3D 流场初始化:把三路稠密光流反投影成一个体素级运动场
稠密立体匹配解不出动态部分,原因有两个:相机帧不同步,而且立体匹配给不出连续的运动场。作者的做法是先估计一个粗略运动场,再交给联合优化去精修。具体地,对每个相机的相邻帧用 MEMFOF 估计稠密光流 \(\mathbf{f}_i(u,v)\)(逐像素的二维位移),然后把这些二维流全部投影到一个体素网格上:对网格中的每个三维点,按各相机的深度把它反投影回图像平面取到对应的流向量,就得到该点在各相机下的一份三维运动证据。由于只有三个视角,这些约束联立起来既不充分也不自洽,作者把它写成一个线性系统并加入 Tikhonov 正则抑制欠约束下的不稳定解,正则强度与各相机流向量残差的均值挂钩:
(原文式 5–6,缓存中公式排版损坏,⚠️ 以原文为准);最终的三维流由奇异值分解求解这个最小二乘系统得到。之所以非做这一步不可,消融给了很直接的证据:把动态高斯的速度改成随机初始化(RandFlow),只靠光度监督,优化过程找不回真实的速度场——合成场景的 CosSim 从 0.744 掉到 0.338,L2 从 0.825 涨到 1.519。也就是说,稠密光流在图像域是可靠的,它直接编码了火焰纹理的移动,跨视角融合后得到的运动场是物理上说得通的先验,而不是让优化器从像素颜色里瞎猜。
4. 瞬态火焰高斯:用生命周期与线性速度承载高频辐射
这是整篇论文表示的落脚点。既然火焰没有跨帧持久的表面对应,把火当成"变形的持久基元"必然走向时序漂移。作者为每个高斯额外挂了三个参数:时间 \(t_\mu\)、寿命 \(t_\sigma\)、线性速度 \(\mathbf{v}\)。高斯在任意时刻的位置由恒定速度外推
不透明度再乘一个随"离 \(t_\mu\) 的距离"衰减的时间修饰项 \(\sigma(t)=\exp(\cdot)\)(原文给出的形式在缓存中损坏,⚠️ 以原文为准)。于是每个基元只在有限时间窗口内"活着",这就是瞬态火焰高斯。这个表示有两个直接好处:它的参数能直接从 3D 流场初始化(位置取体素位置、速度取流场向量、\(t_\mu\) 取当前时间),而稀疏视角下本来学不出来的速度先验就此被注入;同时速度场是显式的,可以拿来做运动轨迹分析等下游任务。初始化还有两个细节:寿命取四倍帧间隔,既保证运动平滑又避免过拟合到单帧;位置在体素体积内加一个均匀随机偏移 \(\Delta\mathbf{x}\sim\mathrm{Uniform}([-s/2,s/2]^3)\)(\(s\) 为体素边长),用来消除规则网格带来的摩尔纹。
为了进一步防止动态高斯"长"到静态区域去,训练时还会把动态高斯的累积不透明度 \(A_{\text{dyn}}\) 与预先算好的运动掩膜 \(M\) 比较,加一项权重 0.1 的 alpha 损失,惩罚在输入视频里根本没有火焰的位置放置动态高斯。消融揭示了一个耐人寻味的权衡:去掉这项损失(NoMask)视觉指标反而更好(火焰 PSNR 27.34 对 26.93),但运动场精度明显变差(CosSim 0.697 对 0.744)——因为不加掩膜时模型可以偷偷把动态高斯放进静态区域去"补贴"画质,所以这项损失实质上是在视觉保真与物理正确之间做取舍。
损失函数 / 训练策略¶
静态场景沿用 3DGS 的目标,只是额外挂上深度正则,总损失为三项加权和:
其中 \(\lambda_1=0.8\)、\(\lambda_{\text{SSIM}}=0.2\);为了真正约束住三视角下的几何,深度正则权重比 3DGS 默认值放大 100 倍,并在训练过程中从初值 100 指数衰减到 1(与 3DGS 默认的正则调度形式一致)。动态部分在光度损失之外加上前述权重 0.1 的 alpha 损失(动态高斯不透明度对运动掩膜)。动态高斯的初始化完全来自 3D 流场:位置为对应体素位置(加随机偏移)、速度为体素处的融合流向量、时间戳为当前时刻、寿命为四倍帧间隔。评测时每 8 帧留出 1 帧做验证。光栅化用的是原始 3DGS 的线性透射近似而非指数衰减;作者解释了为什么这样够用:经过流场初始化后,动态场景由大量小高斯构成(每根光线约 300 个),此时线性近似与指数模型非常接近,上指数光栅化器带来的复杂度并不划算。
实验关键数据¶
数据分两部分。真实数据是自建的:三台 GoPro Hero 13 Black 组成固定多机位,每台 400 Hz,每条序列约 15 秒,覆盖丙烷喷流、燃烧木柴、汽油、纸板、纸张等多种燃料与不同背景,共 17 组视频 × 3 机位,每组取 100 帧子序列。合成数据用于运动场评测:在 Mantaflow 里模拟 3 个火焰场景,放进 3 个 Blender 场景、每个场景 3 台相机,每台渲染 50 帧光线追踪图像(对应 2 秒模拟),并提供分辨率 \(640^3\) 的真值速度场,共 150 个合成速度场。基线取 4DGS(Wu et al.)、4DGS(Yang et al.)、Grid4D、FreeTimeGS,除 FreeTimeGS 用自带的 RoMa 初始化外都用 COLMAP 点云初始化,超参沿用作者为 DyNeRF 火焰鲑鱼场景提供的配置。
评测指标除了常规的 PSNR/SSIM/LPIPS,还有两类针对性设计。其一是火焰区域掩膜指标 PSNR_flame / SSIM_flame,只统计画面中有运动的区域,避免大面积静态背景把差异稀释掉(PSNR/SSIM 计算时会掩掉同步图样)。其二是深度一致性 RMSE_depth:把渲染深度与线性对齐后的单目深度预测比较。此外,因为图像指标无法直接衡量动态三维场景的运动正确性,作者提出了密度加权体积评测协议(DVE):对每个高斯用其尺度与不透明度算权重 \(w=s_x s_y s_z \alpha\),把真值速度场在该高斯概率分布下的期望 \(\bar{\mathbf{v}}=\mathbb{E}_P(V)\) 用三阶 Gauss–Hermite 积分近似,然后同时度量幅度误差与方向一致性
(两项的具体归一化写法在缓存中损坏,⚠️ 以原文为准)。这一套协议的意义在于:只比单帧图像指标是不够的,有些方法 PSNR 看着还行,三维结构和时序行为却已经崩了。
主实验¶
真实数据集的对比结果(每 8 帧留 1 帧验证):
| 方法 | PSNR_flame ↑ | SSIM_flame ↑ | RMSE_depth ↓ | LPIPS ↓ | PSNR ↑ | SSIM ↑ |
|---|---|---|---|---|---|---|
| 本文 | 26.93±1.93 | 0.843±0.048 | 0.094±0.038 | 0.035±0.011 | 35.89±2.62 | 0.967±0.011 |
| 4DGS (Yang et al.) | 23.28±1.76 | 0.728±0.069 | 0.113±0.045 | 0.053±0.020 | 32.86 | — |
| 4DGS (Wu et al.) | 20.99±1.14 | 0.601±0.054 | 0.036 | 0.071±0.025 | 31.88±3.12 | 0.933±0.025 |
| FreeTimeGS | 23.48 | 0.132 | 0.131±0.042 | 0.241±0.131 | 25.62±1.83 | 0.794±0.109 |
| Grid4D | 18.52±1.47 | 0.497±0.068 | 0.225 | 0.086±0.025 | 29.16 | 0.909±0.032 |
⚠️ 上表若干单元格在缓存 PDF 文本中解析错位(用 "—" 标出),数值以原文 Tab. 1 为准。可确认的定性结论是:本文在火焰区域指标、全帧指标与深度一致性上均为最优。
合成场景的 DVE 运动场评测(真值速度场来自 Mantaflow 模拟):
| 方法 | L2 ↓ | CosSim ↑ |
|---|---|---|
| 本文 | 0.825±0.058 | 0.744±0.032 |
| 4DGS (Yang et al.) | 1.045±0.194 | 0.225±0.123 |
| FreeTimeGS | 1.164±0.042 | 0.194±0.114 |
| 4DGS (Wu et al.) | 2.218±0.276 | 0.036±0.010 |
| Grid4D | 2.262±1.470 | 0.154±0.014 |
消融实验¶
真实数据上的消融(同一张 Tab. 1 的下半部分)与合成场景的运动指标对照:
| 配置 | PSNR_flame ↑ | LPIPS ↓ | PSNR ↑ | CosSim ↑ | 说明 |
|---|---|---|---|---|---|
| 完整方法 | 26.93±1.93 | 0.035±0.011 | 35.89±2.62 | 0.744±0.032 | 完整模型 |
| NoSync | 26.89±2.00 | 0.035±0.011 | 35.91±2.67 | 0.736±0.034 | 引入半帧时间偏移,火焰区域视觉与运动精度双降 |
| RandFlow | 26.68±2.43 | 0.036±0.013 | 35.67±3.21 | 0.338±0.050 | 动态高斯速度随机初始化,运动场几乎崩掉 |
| JointOpt | 26.52±1.89 | 0.060±0.014 | 33.59±1.89 | 0.749±0.033 | 静态与动态不分离、联合优化:全帧画质下降最明显 |
| NoMask | 27.34±1.98 | 0.034±0.011 | 36.28±2.72 | 0.697±0.035 | 去掉 alpha 掩膜损失:视觉更好但运动场变差 |
关键发现¶
- 流场初始化是运动准确性的命脉:RandFlow 的消融最刺眼——去掉光流初始化后,实拍场景的视觉指标只掉一点点(火焰 PSNR 26.68 对 26.93),但合成场景的方向一致性从 0.744 崩到 0.338,L2 从 0.825 涨到 1.519。说明稀疏视角下仅靠光度监督无法把速度学回来,先验必须来自多视角稠密光流。
- 视觉保真与物理正确存在真实取舍:NoMask 反而拿到最好的视觉分数(火焰 PSNR 27.34、全帧 PSNR 36.28),但运动场 CosSim 从 0.744 掉到 0.697。alpha 掩膜限制了模型把动态高斯塞进静态区域"刷分"的自由度,因此这项损失是拿画质换物理正确,不是无损的增益。
- 解耦主要买的是全帧画质:JointOpt 的退化集中在全帧指标(PSNR 33.59 对 35.89、LPIPS 0.060 对 0.035),其合成场景的运动指标反而略好(CosSim 0.749)。所以静态预训练的价值主要体现在背景/全图的保真度,而不是运动场精度——这一点作者也明确点出了。
- 同步是必要的而非可选的:NoSync 只在实拍火焰区域有明显损失,合成场景的退化也集中在运动指标上(CosSim 0.736),与"时间错位直接变成错误的几何监督"这一解释一致。
- 基线普遍"图像尚可、结构崩坏":FreeTimeGS 拿到次优的火焰重建结果(PSNR_flame 23.48),代价是深度严重退化(RMSE_depth 0.132);4DGS(Yang et al.)的全帧指标是基线中第二好。所有基线的方向一致性都很弱(CosSim 最高 0.225),说明它们重建的是"像火的图像"而不是"火的运动"。
亮点与洞察¶
- 换表示单位而不是换渲染器:论文最有价值的一点是把"火焰重建失败"归因到动态高斯表示的隐含假设(持续基元 + 平滑运动),然后只改这个单位——加时间戳、寿命、线性速度,其余全部沿用 vanilla 3DGS 光栅化。这种"最小改动、精准打点"的做法比堆一个物理仿真器更容易复现,也更容易迁移。
- 把初始化当成注入先验的手段:速度快照本来是要靠优化学出来的参数,作者改用稠密光流反投影融合得到的 3D 流场直接赋值,并强调寿命取四倍帧间隔、位置加体素内随机偏移这类工程细节。RandFlow 消融证明了这个设计的必要性,这个"用几何证据而不是梯度去定运动先验"的思路可以迁移到烟雾、流体、火焰之外的任何瞬态体积现象。
- 用低成本硬件换时间精度:ESP32 + 格雷码 LED 帧计数 + 卷帘快门反推曝光时刻,把消费级相机做成微秒级同步的采集阵列,整套成本极低却解决了稀疏多视角动态重建里最脏的一环。这套图样会被掩膜掉,不影响任何指标,是很干净的可复用工程 trick。
- 自定义评测协议抓住了图像指标的盲区:DVE 用尺度 × 不透明度加权、以高斯分布下的真值速度期望做参考,同时给出幅度误差与方向一致性。因为高斯本身是空间分布而不是质点,只跟踪中心位置不足以刻画它的动力学——这个观察对所有"用高斯表示流体/烟雾"的工作都成立。
局限与展望¶
- 强依赖稠密光流:在强自发光变化或低纹理区域光流本身就不准,误差会直接传进 3D 运动场;更严重的是,光流初始化时漏掉的火焰在后续动态优化中无法被找回——这是整条 pipeline 的单点故障。
- 线性速度模型过于简单:真实火焰是湍流,恒定速度外推会让结果时序模糊或过度平滑;作者在展望里提出要引入燃烧物理先验和更自适应的时序参数化,甚至直接在 3D 空间里做学习式光流估计。
- 线性透射近似:用的还是 3DGS 的线性透射而非指数衰减。作者的理由是初始化后每根光线约有 300 个小高斯,两者数值接近;但这个论证是经验性的,烟雾等更稀薄/更厚的光学条件下是否仍成立没有验证。
- 静态/动态分离假设前景与背景交互很小:对大规模火灾或富烟场景很可能不成立(背景被烟遮挡、被火照亮),这会破坏解耦的前提。
- 同步仍有残余误差:LED 方案消除了帧级到亚帧级的偏移,但亚毫秒级的不确定性在极高运动速度下仍会引入伪影;作者把"把每相机时间偏移也纳入联合优化"列为未来工作。
- 从笔记视角看还有一点:合成评测只有 3 个 Mantaflow 场景、150 个速度场,且真值来自仿真而非实测,DVE 的绝对值(如 CosSim 0.744)不宜当作真实火焰上的普遍水平来解读。
相关工作与启发¶
- vs FreeTimeGS:它是本文最直接的思想来源——同样给高斯挂时间、寿命与线性速度;区别在于 FreeTimeGS 面向一般的动态场景,基元仍然被当作"可以持久存在并通过光滑运动被追踪"的元素,初始化也用 RoMa 匹配,而本文严格限制为短寿命瞬态载体,并把初始化换成多视角稠密光流融合的 3D 流场。代价是本文的方法只适用于稀疏视角下的瞬态体积现象,泛化到刚体/关节对象的动态场景并没有优势。
- vs 4DGS(Wu et al. / Yang et al.)与 Grid4D:它们分别用 4D 基元、分解式时空表示来建模动态,本质仍是"变形/插值的持久表示",在火焰上表现为几何吸收、深度坍塌与时序漂移三种退化;本文的做法是把动态部分完全交给瞬态基元并显式约束其存在时间。劣势是本文需要额外的静态/动态分离与掩膜,流程更长、超参更多。
- vs 物理信息神经场与层析式火焰重建(如 Chu et al. 的烟雾重建、Ihrke & Magnor 的火焰层析):它们重建的物理一致性强得多,但依赖受控多视角或简化运动模型;本文反过来追求"三台消费级相机就能拍",牺牲了物理模型的严格性换取采集的可行性。
- vs 基于时序拉普拉斯金字塔的自由视角动态场景渲染:那类方法能渲出好看的火焰自由视角画面,但目标不是完整的时空几何与外观重建,无法给出可用于分析的显式速度场;本文的速度场是显式参数,这是它相对纯渲染方法的关键差别。
评分¶
- 新颖性: ⭐⭐⭐⭐ 表示层面的改动不大(时间/寿命/速度三参数借鉴 FreeTimeGS),但把"瞬态体积载体"这一表示选择与火焰的物理性质、稀疏视角采集、亚帧同步硬件、评测协议串成一条完整论证,问题定义得比方法本身更出彩。
- 实验充分度: ⭐⭐⭐⭐ 自建 17 组真实火焰 × 3 机位 + Mantaflow 合成速度场,四类指标(图像/火焰区域/深度/运动场)加四项消融,覆盖面完整;但合成场景仅 3 个、真值来自仿真,且缓存表格部分数值损坏,削弱了可复核性。
- 写作质量: ⭐⭐⭐⭐ 三条失败模式的归纳、消融结论与"视觉-物理取舍"的讨论都很诚实;个别公式排版在原文中较密,且大量细节(场景分解、指数光栅化对比、失败模式)被推到补充材料。
- 价值: ⭐⭐⭐⭐ 为"半透明、自发光、高频、无持久对应"这类现象提供了一个成本极低且可复现的重建范式,采集侧的同步方案与 DVE 评测协议都可以直接搬到烟雾、蒸汽、流体等相邻问题上。