从 OmniRe 看 3D 重建里的 Extract Mask:为什么这一步其实决定了上限

这两天在看 OmniRe 这篇做动态城市场景重建的工作。它的主线当然是 Gaussian Scene Graph + dynamic actor reconstruction,但我越看越觉得,真正落到工程里,最容易被低估的一步反而是前面的 extract mask

更准确地说,论文表面上并没有把“mask 提取”包装成主创新,但如果这一步做不稳,后面的节点建模、监督分配、动态物体重建质量都会被直接拖垮。

结合我前面写过的 SegFormerSAM 3,我现在越来越觉得:OmniRe 这类 3D 重建系统里的 extract mask,不是一个普通预处理步骤,而是整个重建管线里的“监督路由器”。

OmniRe 真正在做什么

先用一句话概括 OmniRe:

它想把真实驾驶日志里的动态城市场景,拆成可控的场景图,再用 Gaussian 表示分别重建背景、车辆、行人和其他非刚体目标。

论文的核心结构大概是:

  • 背景:一套 static Gaussians
  • 车辆:刚体节点,用位姿变换驱动
  • 行人:SMPL 节点,用人体参数驱动局部形变
  • 其他动态体:deformable 节点,用形变场建模

也就是说,OmniRe 的关键不只是“把场景重建出来”,而是把不同对象分开建模
因为只有分开,后面才有编辑、重放、交互模拟、human-vehicle interaction 这些能力。

而一旦你要“分开建模”,就会立刻碰到一个非常基础的问题:

每个像素、每条监督信号、每个观测区域,到底属于谁?

这就是 extract mask 的本质。

为什么说 extract mask 决定了上限

我现在觉得,在 OmniRe 这类系统里,mask 至少承担了三层作用。

1. 它决定监督是不是被错误传播

论文里有一句很关键的话:如果人没有被单独建模,那么来自人区域的颜色、深度等监督,很可能会错误地影响车辆或背景建模。

这其实就是 mask 问题的核心。
如果前景和背景、车辆和行人、目标 A 和目标 B 没有被足够干净地分开,那么训练时的梯度就会“串味”:

  • 行人的颜色被吸收到背景里
  • 骑行者的轮廓被糊进车辆或路边结构里
  • 遮挡边界处的监督同时拉扯多个节点

最后结果通常不是“有一点误差”,而是整个 scene decomposition 从一开始就偏了。

所以从这个角度看,extract mask 做的不是简单抠图,
而是在回答:

哪些观测应该归哪个 node 来解释。

2. 它决定 dynamic actor 初始化是不是靠谱

OmniRe 里对人和其他非刚体目标的处理是分开的:

  • 行人走 SMPL 路线
  • 其他模板外目标走 deformable node

这意味着系统必须先知道:
这个区域大概是人、车、骑行者,还是某个更长尾的动态体。

论文本身更多依赖数据集提供的 box、tracklet 和多相机人体姿态估计流程;但如果把它往更完整的真实工程里推,光有 box 往往是不够的。原因很简单:

  • box 太粗,会把大量背景一起裁进去
  • 城市场景遮挡很多,框内常常不只一个目标
  • 行人、婴儿车、自行车这种细长结构,box 对几何边界表达太差

这时 mask 的价值就出来了。
你不是只想知道“目标大概在这里”,而是想知道:

哪些像素真属于这个 actor,哪些只是它周围的背景、阴影、反射或遮挡物。

这会直接影响:

  • SMPL 初始化时看到的外观是否干净
  • deformable node 学到的是目标形变还是背景噪声
  • Gaussian 初始化是不是被污染

3. 它决定合成与正则是不是稳定

OmniRe 训练目标里有一个细节很值得注意:
它用 opacity loss 去约束渲染出来的高斯透明度和 non-sky mask 对齐。

这说明 mask 并不只在“前处理”里出现一次,而是会进入训练目标本身。
换句话说,mask 不只是告诉系统“裁哪块”,还告诉系统“这块应该不应该被高斯解释”。

这类约束如果质量高,会帮助模型把天空、背景和前景分开。
但如果 mask 本身很脏:

  • 天空漏了一部分进前景
  • 玻璃反射被错分成目标
  • 遮挡边缘锯齿严重

那它会把错误先验直接写进优化过程。

所以这一步不是可有可无的工程细节,而是会反过来塑造最终 reconstruction 的几何和外观。

如果把 OmniRe 的 extract mask 单独拿出来看,它到底是什么任务

我觉得它不是单一任务,而是三件事叠在一起:

  1. 语义分离:这块是天空、道路、车辆、行人,还是背景静态结构
  2. 实例分离:这块到底属于哪一个具体目标
  3. 边界分离:这个目标的真实轮廓到底到哪里为止

这三件事,恰好对应了 SegFormer 和 SAM 3 的长短板差异。

为什么 SegFormer 很适合 OmniRe 的第一步

我之前写过一句话:SegFormer 更像专科医生。

放到 OmniRe 这里,这句话依然成立。
它特别适合做那种类别空间稳定、需要全图密集预测的工作。

比如在自动驾驶重建里,很多大类其实非常稳定:

  • 天空
  • 路面
  • 建筑
  • 植被
  • 车辆
  • 行人

这些类别不需要开放词汇理解,也不需要用户交互提示。
你需要的是:快速、稳定、成批地把整张图切成几种大语义区域。

SegFormer 在这一步的优势很明显:

  • 对全图做 dense prediction,适合大规模离线跑数据
  • 固定类别任务上效率高
  • 对自动驾驶这类结构化场景很友好
  • 很适合直接产出 non-sky / drivable / foreground 这类粗粒度掩码

如果你只是想给 OmniRe 先打一层“语义底稿”,比如:

  • 哪些区域肯定不是天空
  • 哪些区域属于静态背景
  • 哪些区域大概率是动态类

那 SegFormer 其实非常顺手。

但仅靠 SegFormer 不够

问题在于,OmniRe 需要的不只是“语义类别”,还需要实例级、边界级的干净分离

而这恰恰是纯语义分割最容易吃亏的地方。

比如:

  • 两个相互遮挡的行人,语义上都叫 person,但重建时必须分成两个 node
  • 骑车的人和自行车可能语义相近,但在建模里未必应该强行合并
  • 婴儿车、轮椅、施工推车这类长尾目标,固定类别表未必覆盖
  • 遮挡、反光、运动模糊下,语义类别对了,边界却可能很粗

而 3D 重建对边界误差比普通 segmentation 更敏感。
2D 上一点点糊边,到了多视角几何或 Gaussian 优化里,经常会被放大成:

  • 漂浮碎片
  • 边缘重影
  • 目标和背景相互“吃掉”
  • 时序闪烁

这也是为什么我觉得,OmniRe 这种系统如果真要把 extract mask 做稳,不能只靠一个封闭类表的语义分割器。

SAM 3 在这里补的不是“分类”,而是“对象边界”

我之前写 SegFormer vs SAM 3 时,给过一个简单总结:

SegFormer 负责固定类别的密集理解,SAM 3 负责开放目标的精细分割。

放到 OmniRe 这里,SAM 3 的价值会更具体一些:

1. 它适合做 box-to-mask 和 click-to-mask

OmniRe 本身就大量依赖 box、tracklet、多相机观测。
这类输入天然很适合拿来给 SAM 3 当 prompt:

  • 有 box,就做 box-to-mask
  • 框不准,就加 click 修一下
  • 有视频连续帧,就沿时间传播

这比直接把粗 box 当监督要强得多。

2. 它更适合处理长尾动态体

论文里一个很重要的点,是它不只想重建车,还想覆盖:

  • pedestrian
  • cyclist
  • 其他 template-less dynamic actors

而越往这些长尾目标走,固定类别语义分割就越容易掉链子。
SAM 3 这类 promptable segmentation 的意义就在于:它不要求目标一定在预定义类表里。

这点对 OmniRe 非常重要,因为城市场景里真正麻烦的,往往不是大车,而是那些:

  • 常被遮挡
  • 外形变化大
  • 类别不稳定

的目标。

3. 它更适合做时序一致的目标提取

OmniRe 处理的是 driving log,不是静态单帧。
一旦进入视频,多帧 mask 的一致性就变得极其关键。

如果单帧分得都还行,但跨帧:

  • 一会儿把背包算进人
  • 一会儿又把自行车轮漏掉
  • 一会儿把行人腿边的阴影也收进去

那后面的 pose refinement、deformation modeling、Gaussian optimization 都会变得很痛苦。

SAM 3 这类视频分割/提示式分割模型,至少在产品形态上,天然更接近这种“持续追踪同一个目标”的需求。

我现在比较认同的方案:SegFormer 打底,SAM 3 精修

如果让我把 OmniRe 里的 extract mask 单独设计成一个工程模块,我大概率会走这条路线:

第一步:SegFormer 做全图语义底图

先把每一帧切出比较稳定的粗语义:

  • sky / non-sky
  • road / building / vegetation
  • vehicle / person / rider 这类主要动态类

这一步的目标不是追求极致边界,而是:

  • 给背景节点和前景节点做第一层分流
  • 为后续 prompt 生成提供候选区域
  • 快速生成训练里可用的 coarse prior

第二步:检测 / 跟踪提供实例提示

用已有 tracklet、box 或 detector 输出,把“这一帧有哪些 actor”先列出来。
这一步回答的是“谁是谁”,还没回答“边界到哪”。

第三步:SAM 3 把实例边界扣干净

拿 box 或少量点击去驱动 SAM 3,把每个 actor 变成实例级 mask。
尤其是:

  • 行人四肢
  • 骑行者和车体交界
  • 婴儿车、轮椅这类细碎结构
  • 复杂遮挡边界

这一步更像是真正把“目标从背景里分离出来”。

第四步:用时序和几何一致性再筛一遍

单帧好看的 mask 不一定适合 3D 重建。
还得继续检查:

  • 相邻帧形状变化是不是过于跳跃
  • 多相机之间投影是不是一致
  • mask 是否和 LiDAR / box / track 几何关系冲突

这一层其实非常重要,因为 3D reconstruction 比 2D segmentation 更怕“看起来像对,其实时序不稳”的结果。

为什么我会觉得这套组合比“只用一个模型”更靠谱

因为 OmniRe 这里的 extract mask,本质上不是一个单纯的 segmentation benchmark 问题。
它同时有三种要求:

  1. 要有全图语义覆盖
  2. 要有实例级边界精度
  3. 要有跨帧稳定性

而 SegFormer 和 SAM 3 恰好各自覆盖其中一部分:

需求 SegFormer SAM 3
全图固定类别解析 一般
实例级精细边界 一般
长尾开放目标
批量自动化处理 一般
交互修正能力
视频对象连续跟踪

所以在 OmniRe 这种任务里,我不太会把它们看成竞争关系,
更像是:

  • SegFormer 负责把世界先分粗
  • SAM 3 负责把对象再扣细

我的结论

如果只从论文标题看,OmniRe 的主角是 scene graph、Gaussian 和 human modeling。
但如果从真正把系统做稳的角度看,extract mask 是整个管线里非常前置、但又决定上限的一环。

它影响的不是一张 2D mask 好不好看,而是:

  • 监督有没有被分配给正确的节点
  • 动态 actor 初始化是不是干净
  • 时序建模会不会抖
  • 背景和前景会不会互相污染
  • 最后 3D 重建能不能既清晰又可控

所以我现在对这个问题的判断是:

在 OmniRe 这类 3D 重建系统里,extract mask 更像“结构化监督分解”问题,而不只是图像分割问题。

而如果要把它做得更靠谱,我会优先考虑:

用 SegFormer 提供稳定语义底图,用 SAM 3 补实例边界和长尾目标,再用时序与几何一致性做最后过滤。

这可能比单纯争论“SegFormer 和 SAM 3 谁更强”更接近真实系统里的最优解。

这篇先记到这里。