OmniRe 训练全流程拆解:五类参数联合优化,以及你会踩到的那些坑

上一篇聊了 OmniRe 里 extract mask 为什么比看起来重要得多。这篇接着往下走,进入真正的训练阶段:拿到 mask 和初始化之后,OmniRe 到底是怎么把整个动态场景一起训出来的,以及这中间哪些地方最容易出问题。

论文里把训练写得很简洁——一个公式、几行 loss、一句”jointly optimize”。但如果真的要理解它为什么能 work,或者想复现、改进它,就必须把这个”jointly optimize”拆开看。

先整体看一遍:到底在优化什么

OmniRe 的训练是单阶段联合优化,30000 次迭代,一次性把所有东西一起训。

具体来说,被同时优化的参数包括五大类:

1. 各类节点的 Gaussian 属性

每个 Gaussian 都有五种属性:opacity、位置、旋转、缩放、外观(球谐系数)。

而这些 Gaussian 分布在四种不同的节点类型里:

  • 背景节点 G_bg:静态,不随时间变
  • 刚体节点 G_rigid:车辆,local space 里不变,靠位姿变换到世界坐标
  • SMPL 节点 G_SMPL:行人,canonical space 里定义,靠 LBS 驱动形变
  • Deformable 节点 G_deform:骑行者等模板外目标,靠形变网络驱动

所有节点的 Gaussian 属性都是可学习的。

2. 刚体和非刚体节点的位姿

每个动态节点在每一帧都有一个世界坐标系下的位姿 T(t)
训练时这些位姿也是可优化的——不是死用数据集给的 box,而是一边训一边微调。

3. SMPL 节点的人体姿态参数

对于行人节点,除了全局位姿,还有 SMPL 的关节参数 θ(t) 和体型参数 β
这些参数控制的是人的具体姿势:手臂抬多高、腿迈多大步、身体弯曲程度。

4. 形变网络的权重

Deformable 节点不用 SMPL 模板,而是用一个共享的形变网络 F_φ 来预测每一帧的形变量。
这个网络的权重 φ 也在训练中被优化。

5. 天空模型的参数

天空用一张可优化的环境贴图表示,单独渲染后和 Gaussian 渲染结果做 alpha blending。

所以 OmniRe 的训练,本质上是在一个巨大的联合参数空间里做优化。
背景的几何和外观、每辆车的形状和位姿、每个行人的体型和动作、每个骑行者的形变模式、天空的颜色——全部同时学。

损失函数:四层监督叠在一起

论文的总 loss 是:

L = (1 - λ_r) * L1 + λ_r * L_SSIM + λ_depth * L_depth + λ_opacity * L_opacity + L_reg

看起来像一个标准的多项加权求和,但每一项背后都有它自己的设计考量。

图像重建损失:L1 + SSIM

这是最基础的监督——渲染出来的图要和真实图像像。

一个关键细节是:动态区域会被加权放大。

论文里的做法是,用渲染出来的 dynamic mask 识别出动态区域,对这些区域的图像损失乘以 5 倍权重。

为什么?因为动态物体在整张图里只占很小一部分像素,但它们恰恰是最难重建、也最需要关注的。如果不加权,背景的大面积像素会主导梯度,模型很容易”放弃”精细重建那些只占几百个像素的行人。

深度损失:L_depth

用 LiDAR 投影到图像平面生成稀疏深度图,和渲染深度做 L1 比较。

这层监督对几何至关重要。纯靠图像损失,Gaussian 很容易在深度方向上”滑动”——看起来颜色对了,但实际位置不对。LiDAR 深度相当于给了一组硬约束:这个像素背后的东西到底离相机多远。

Opacity 损失:L_opacity

这一项要求渲染出来的 Gaussian 不透明度和 sky mask 对齐。

具体来说:

  • 有物体的区域,Gaussian 的累积不透明度应该高
  • 天空区域,Gaussian 的累积不透明度应该低

这就是我上一篇提到的”mask 会进入训练目标本身”。sky mask 的质量直接影响这个 loss 是在帮忙还是在添乱。

正则化项:L_reg

论文里提到了多种正则化,其中最值得关注的是人体姿态平滑正则

L_pose = 0.5 * ||θ(t-δ) + θ(t+δ) - 2θ(t)||₁

这是一个经典的二阶差分平滑约束:要求相邻帧的人体姿态变化不能太剧烈。

为什么这个很重要?因为 SMPL 姿态参数的初始化本身就是有噪声的,如果不加约束,优化器很可能把某一帧的姿态拉到一个物理上不合理的位置来”凑”图像损失。

初始化:训练能不能收敛,很大程度上取决于起点

OmniRe 的训练虽然是端到端的,但它对初始化非常依赖。如果初始化质量太差,30000 次迭代可能根本跑不到一个好的解。

背景初始化

背景用的是 LiDAR 点云 + 随机采样点。

具体是 60 万个 LiDAR 点加上 40 万个随机点(其中 20 万近距离均匀分布、20 万远距离按逆距离分布)。

这里有一个前置依赖:必须先把动态物体的 LiDAR 点过滤掉。
如果 extract mask 或 box 不干净,动态物体的点就会混进背景初始化里,后续优化再怎么跑也很难把它们分开。

刚体节点初始化

车辆的 Gaussian 初始化靠的是 bounding box 内的 LiDAR 点。
box 的质量直接决定了初始点云是不是只属于这辆车。

SMPL 节点初始化

行人的 Gaussian 初始化是在 SMPL 模板 mesh 上做 tessellation——把 mesh 的每个顶点变成一个 Gaussian。

这意味着 SMPL 参数的初始化质量直接决定了:

  • Gaussian 的初始位置对不对
  • LBS 驱动出来的形变合不合理
  • 后续优化是在”微调”还是在”大修”

Deformable 节点初始化

和刚体类似,靠 box 内 LiDAR 点初始化。
但因为这些目标本身在形变,canonical space 的选取和初始几何会直接影响形变网络能不能收敛。

训练中最容易踩的坑

读完论文和 ablation,再结合我对这类系统的理解,我觉得以下几个问题是训练里最容易遇到的。

1. 监督信号泄漏:梯度串到了不该去的节点

这是上一篇就强调过的问题,但在训练阶段会以更具体的方式暴露出来。

举个例子:一个行人正好站在一辆车前面。如果这个行人没有被正确建模,那么来自行人区域的颜色监督就会试图让车辆节点或背景节点去”解释”这些像素。

结果就是:

  • 车辆表面可能长出行人的纹理
  • 背景里可能出现行人的”鬼影”
  • 行人节点因为缺少正确监督而越训越差

论文的 ablation 直接验证了这一点:去掉 SMPL 建模后,不只是 human PSNR 掉了(28.15 → 24.71),连整体 full image PSNR 也掉了(34.25 → 32.80)。这说明没有正确建模的动态物体会污染整个场景的训练

2. 人体姿态初始化的噪声

OmniRe 用 4D-Humans 做初始人体姿态估计。但驾驶场景里的行人观测条件非常差:

  • 严重遮挡:行人经常被车辆、树木、其他行人遮挡
  • 远距离:很多行人在画面里只有几十个像素高
  • 多相机不一致:同一个人在不同相机里的检测 ID 可能不同
  • 运动模糊:快速移动的行人容易模糊

所以初始 SMPL 估计往往带有明显噪声。论文为此设计了两个额外步骤:

Tracklet Matching:通过计算 2D 投影的 IoU,把不同相机对同一个人的检测结果对齐到同一个 ID。

Pose Completion:对于因遮挡而缺失的帧,用插值补全姿态。

即使做了这些,初始姿态仍然不够准。所以训练时还要联合优化人体姿态——让姿态参数也参与梯度下降。ablation 显示这一步带来的提升是 PSNR 从 26.97 到 28.15(human region)。

但这里有一个微妙的平衡:
如果让姿态参数完全自由优化,它可能会跑到物理上不合理的状态来”凑”像素损失。
所以才需要 L_pose 这个平滑正则来约束。

3. Box 不准导致的连锁反应

论文里特别做了一个 ablation:去掉 box refinement 后,full PSNR 从 34.25 掉到 33.04,vehicle PSNR 从 28.91 掉到 25.57。

这个降幅非常大,说明数据集提供的 GT box 本身就不够精确

box 不准会导致什么?

  • 刚体节点的位姿估计偏移
  • LiDAR 点被错误地分配给相邻目标
  • Gaussian 初始化包含大量背景点
  • 渲染时目标和背景的边界处出现伪影

OmniRe 的解决方案是训练时同时优化 box 参数(位移和旋转)。box 的平移学习率从 5×10⁻⁴ 衰减到 1×10⁻⁴,旋转学习率从 1×10⁻⁵ 衰减到 5×10⁻⁶。

这个设计很工程,但很有效。本质上是承认了:输入数据不完美,让优化器自己去修。

4. Deformable 节点的收敛困难

对于骑行者、轮椅使用者这类没有 SMPL 模板的目标,OmniRe 用共享形变网络来建模。

这个网络面临的挑战比 SMPL 节点更大:

  • 没有模板先验:不知道目标长什么样、怎么动
  • 观测更少:这类目标通常出现频率低、尺寸小
  • 形变模式更复杂:骑车的人加上自行车,形变自由度比单纯走路高得多

为了让不同实例共享一个网络同时保持区分度,每个实例有一个可学习的 embedding e_h
但即使这样,这类节点的重建质量通常还是不如有 SMPL 先验的行人。

ablation 也证实了这一点:去掉 deformable nodes 后,human PSNR 从 28.15 掉到 25.26。
虽然 deformable 和 SMPL 管的不是完全同一批目标,但这个数字说明那些”不好建模”的目标一旦被忽略,它们的监督信号就会去毒害其他节点

5. 显存和计算效率的平衡

一个容易被忽略的工程挑战:OmniRe 在单卡 RTX 4090 上训练一个场景大概 1 小时。

听起来不算慢,但考虑到:

  • 每个场景大约 150 帧
  • 每帧有 3 个前向相机
  • 场景里可能有几十个动态物体
  • 每个物体都是独立的 Gaussian 集合
  • SMPL 节点还要做 LBS 变换
  • Deformable 节点还要过形变网络

这个计算量其实相当可观。

论文里提到两个关键的效率设计:

AbsGrad densification:用 Gaussian 的绝对梯度来控制 densification,而不是默认的梯度范数。这会控制内存使用,避免 Gaussian 数量爆炸。论文在 appendix 里做了 ablation,证明 AbsGrad 对性能影响很小(约 0.1 PSNR),但对显存控制很重要——不用的话 DeformableGS 直接 OOM。

共享形变网络:所有 deformable 节点共享一套网络权重,只用 instance embedding 区分身份。这比给每个实例单独训一个网络要高效得多。

6. 不同节点类型的学习率需要分别调

这是一个非常工程化但很关键的细节。

论文在 appendix 里列出了不同参数的学习率:

  • Gaussian 旋转:SMPL 节点用 5×10⁻⁵,其他节点用 1×10⁻⁵
  • 球谐系数阶数:背景和刚体用 3 阶,SMPL 节点只用 1 阶
  • Box 平移和旋转各自有独立的学习率和衰减策略
  • 人体姿态参数也有专门的学习率

为什么要这么分?

因为不同节点的优化难度和自由度差异太大。SMPL 节点的 Gaussian 会被 LBS 大幅移动,如果旋转学习率和背景一样,很容易震荡。而外观方面,行人的观测通常很稀疏,如果用 3 阶球谐系数,很容易过拟合到训练视角。

这种”每类参数单独调”的做法不优雅,但在复杂系统里几乎不可避免。

训练流程的全貌

把上面的内容串起来,OmniRe 的训练全流程大概是这样的:

1. 数据预处理
   ├── extract mask(语义分割 + 实例分离)
   ├── 人体姿态估计(4D-Humans + tracklet matching + pose completion)
   └── 点云准备(LiDAR 过滤 + 动态/静态分离)

2. 初始化
   ├── 背景:LiDAR 点 + 随机采样
   ├── 刚体节点:box 内 LiDAR 点
   ├── SMPL 节点:模板 mesh tessellation
   ├── Deformable 节点:box 内 LiDAR 点
   └── 天空:环境贴图

3. 联合优化(30K 迭代)
   ├── 前向:所有节点 → 世界坐标 → 渲染
   ├── 损失计算:L1 + SSIM + depth + opacity + regularization
   ├── 反向:梯度回传到所有可学习参数
   ├── Gaussian densification / pruning
   └── 学习率调度(不同参数不同策略)

4. 输出
   ├── 每个节点的重建 Gaussian 资产
   ├── 优化后的位姿轨迹
   ├── 优化后的人体姿态序列
   └── 可编辑、可组合的场景图

哪些困难是这篇论文解决了的,哪些还没有

已经解决得不错的

  • 非刚体建模的统一框架:SMPL + deformable 的双路线设计,覆盖了大部分城市场景里的动态目标
  • 人体姿态的多相机处理:tracklet matching + pose completion + joint refinement,形成了一条完整的 pipeline
  • box 不准的容忍:通过联合优化 box 参数来吸收输入噪声
  • 监督分配问题:通过显式建模几乎所有动态物体,减少了梯度泄漏

还在的困难

光照建模缺失:论文自己也承认,目前没有显式建模光照。这意味着把不同场景、不同时间的资产拼在一起时,光照不一致会很明显。

训练视角依赖:和所有 per-scene optimization 方法一样,如果测试视角偏离训练轨迹太远,渲染质量会快速下降。

长尾目标仍然难:虽然 deformable node 提供了一个通用框架,但对于极端罕见的目标形态,观测太少、先验太弱,重建质量仍然受限。

单场景优化的可扩展性:每个场景独立训 1 小时,如果要处理几千段驾驶日志,计算成本还是很高。目前没有跨场景的知识迁移。

我的理解

写到这里,我对 OmniRe 训练的总体感受是:

它不是一个”设计一个 loss 然后 end-to-end 训就行”的系统,而是一个需要非常精细的初始化、分类型参数管理、多层正则化才能跑起来的复杂工程。

论文用一个公式把 loss 写出来,看起来很简洁。但真正让它 work 的,是背后那一整套:

  • mask 质量决定了监督分配
  • 人体姿态初始化决定了 SMPL 节点能不能收敛
  • box refinement 决定了刚体节点的几何基线
  • 动态区域加权决定了小目标会不会被忽略
  • 姿态平滑正则决定了优化会不会跑飞
  • 不同节点的学习率差异决定了各部分能不能协调收敛

所以如果要用一句话总结 OmniRe 的训练:

它是一个多类型、多尺度、多约束的联合优化问题,表面上是”一起训”,实际上处处都在精细管理不同子系统之间的平衡。