从 OmniRe 看 3D 重建里的 Extract Mask:为什么这一步其实决定了上限
这两天在看 OmniRe 这篇做动态城市场景重建的工作。它的主线当然是 Gaussian Scene Graph + dynamic actor reconstruction,但我越看越觉得,真正落到工程里,最容易被低估的一步反而是前面的 extract mask。
更准确地说,论文表面上并没有把“mask 提取”包装成主创新,但如果这一步做不稳,后面的节点建模、监督分配、动态物体重建质量都会被直接拖垮。
结合我前面写过的 SegFormer 和 SAM 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 单独拿出来看,它到底是什么任务
我觉得它不是单一任务,而是三件事叠在一起:
- 语义分离:这块是天空、道路、车辆、行人,还是背景静态结构
- 实例分离:这块到底属于哪一个具体目标
- 边界分离:这个目标的真实轮廓到底到哪里为止
这三件事,恰好对应了 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 问题。
它同时有三种要求:
- 要有全图语义覆盖
- 要有实例级边界精度
- 要有跨帧稳定性
而 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 谁更强”更接近真实系统里的最优解。
这篇先记到这里。