3. Fusion++ 的完整工作流程
步骤一:基于RGB-D帧的实例分割(每帧)
- 输入每一帧RGB-D图像。
- 使用2D实例分割网络(如Mask R-CNN)处理RGB图像。
- 输出:一系列实例掩码(Instance Mask),每个掩码对应一个检测到的物体,并带有语义标签(如“chair”, “monitor”)和置信度。
步骤二:实例到3D的关联与子图管理(核心)
这是最关键的步骤,系统需要决定如何将2D检测结果与3D的TSDF子图关联起来。
- 创建新的实例子图:
- 当检测到一个高置信度的物体实例,并且在现有的3D实例子图库中找不到与之匹配的实例时,系统会为该实例创建一个新的TSDF子图。
- 这个新的子图只专注于重建这个物体。初始时,它的坐标系可以与第一帧检测到该物体时的相机坐标系对齐。
- 更新现有的实例子图:
- 当在当前帧中检测到的实例与已有的某个实例子图匹配成功时,系统就将当前帧中属于该实例的深度数据融合到对应的实例子图中。
- 匹配如何实现? 这是一个数据关联问题。Fusion++ 使用几何和外观特征进行匹配:
- 几何匹配:将现有实例子图的模型渲染到当前相机视角,与2D检测框进行IoU(交并比)计算。
- 外观匹配:比较实例子图的历史外观(颜色)与当前检测区域的外观相似性。
- 处理遮挡和不确定性:
- 如果某个实例在连续多帧中未被观察到(可能被遮挡),其子图会被暂时“休眠”,但不会被删除。
- 当它再次出现时,可以通过匹配重新激活并继续更新。
匹配问题
Fusion++ 绝对不可能使用暴力匹配,因为那在计算上是完全不可行的。它采用了一种非常巧妙的分层筛选和高效数据关联策略。
第1步:基于语义标签的极速筛选
这是最快速、最有效的一层筛选,能立刻将候选实例数量降低几个数量级。- 场景:当前帧的RGB图像经过2D实例分割网络(如Mask R-CNN),得到了几个检测结果,例如:
{标签: ‘椅子’, 置信度: 0.95},{标签: ‘显示器’, 置信度: 0.98}。 - 动作:系统只会去现有的实例库中寻找那些语义标签相匹配的实例。
- 示例:效果:如果数据库中有1000个实例,但只有10个是“椅子”,那么这一下就排除了99%的候选,只剩下10个需要进一步考虑。
- 对于当前检测到的“椅子”,系统会完全忽略实例库中所有的“显示器”、“桌子”、“杯子”等。
- 它只会在标签为“椅子”的实例子图集合中进行下一步匹配。
效果:如果数据库中有1000个实例,但只有10个是“椅子”,那么这一下就排除了99%的候选,只剩下10个需要进一步考虑。
第2步:基于可见性/重投影的几何筛选
这一层利用简单的几何规则,从剩下的少数同标签实例中进一步筛选。- 原理:一个物体只有可能出现在相机视野内(Frustum) 并且没有被完全遮挡时,才可能被当前帧看到。
- 具体操作:
- 视锥体剔除:对于每个候选实例子图,系统知道它的6D姿态(位置和朝向)。它可以快速判断该实例的3D包围盒是否位于当前相机的视锥体内。不在视野内的实例被立即剔除。
- 粗略深度检查:将候选实例的包围盒重投影到图像平面,检查其预估深度与当前帧的深度图是否在合理范围内。如果实例应该出现在距离相机5米的地方,但深度图显示那里是10米(意味着可能被遮挡),则该实例的匹配优先级会降低。
第3步:基于外观/几何的精细数据关联
经过前两层筛选,剩下的候选实例通常已经非常少了(比如只有1-3个)。这时,系统才会进行计算量稍大的精细匹配。匹配方法通常有两种(或结合使用):
A. 基于外观的匹配(Image-based)
- 操作:将候选实例子图存储的外观纹理(颜色)渲染到当前相机视角,得到一个预测的“贴图”。然后将这个预测贴图与当前帧RGB图像中实际检测到的物体区域进行相似度比较(例如,使用直方图相似度或简单的像素级差异)。
- 目的:判断“这个候选物体看起来像不像我当前看到的物体?”
B. 基于几何的匹配(Geometry-based)
- 操作:将候选实例子图的3D模型(从其TSDF体积中提取的网格或点云)渲染到当前相机视角,得到一个预测的“轮廓”或“深度图”。然后将这个预测轮廓/深度与当前帧实例分割的Mask和深度图进行比较。目的:判断“这个候选物体的形状和位置是否与我当前看到的物体吻合?”
- 轮廓IoU:计算预测轮廓和实际检测Mask的交并比。重叠度越高,匹配可能性越大。
- 深度一致性:检查预测深度和实际观测深度是否一致。
- 目的:判断“这个候选物体的形状和位置是否与我当前看到的物体吻合?”
匹配歧义性:很多不同实例可能几何形状相似(如多把相同的椅子),仅靠几何匹配容易出错。
结合语义标签和粗略位置信息,可以极大地消除这种歧义。
因此,Fusion++ 采用的 “语义标签 → 几何视锥 → 外观/几何精细匹配” 的分层数据关联策略,是其在复杂场景中实现高效、鲁棒实例级重建的关键所在。这是一种将高层语义信息与底层几何信息紧密结合的典范。
骤三:独立的姿态估计与优化
每个实例子图都有两个关键的姿态需要估计和优化:
- 物体姿态(Object Pose): TW,Oi
- 定义:实例子图(物体)相对于世界坐标系的位姿。
- 作用:描述了这个物体在全局场景中的位置和方向。
- 优化:通过物体级别的闭环检测进行优化。例如,相机从不同角度观测同一个椅子,这些观测可以共同优化这把椅子的全局位姿。
- 相机姿态(Camera Pose): TW,C
- 定义:相机相对于世界坐标系的位姿。
- 优化:传统的SLAM前端里程计和后端的姿态图优化。
这种将物体姿态和相机姿态解耦的表示,被称为 “对象中心”的SLAM,是Fusion++的一大贡献。
4. 技术优势与深远影响
1. 生成真正意义上的“物体级”地图
输出不再是一个无法区分的三角网格,而是一个结构化的场景表示:
场景 {背景模型: 一个TSDF子图 (用于墙壁、地板等非实例部分),实例列表: [实例1: { 标签: “chair”, 网格: chair.ply, 位姿: T_world_chair, 置信度: 0.95 },实例2: { 标签: “monitor”, 网格: monitor.ply, 位姿: T_world_monitor, 置信度: 0.98 },...]
}
2. 极大提升对动态物体的鲁棒性
- 动态物体(如一个被移动的杯子)会被识别为一个独立的实例。
- 当它移动时,系统会更新的是该杯子实例子图的位姿 TW,cup,而不是错误地扭曲背景几何。这彻底解决了动态物体带来的“鬼影”问题。
3. 实现高级别的场景理解和交互
- 查询:“客厅里所有的椅子在哪里?”
- 编辑:“把这张桌子从虚拟模型中删除。”
- 物理仿真:可以对每个独立物体的模型进行物理属性赋值和仿真。
- 重定位:通过识别独特的物体实例(如一台特定的电脑)来实现更鲁棒的重定位。
4. 提升SLAM的精度和鲁棒性
物体可以作为强大的闭环检测标志物。识别出同一个物体实例,可以提供非常强烈的位姿约束,从而有效减少里程计漂移。
5. 总结
Fusion++ 中 “在独立的TSDF子图中表示每个语义实例” 这一设计,本质上是将SLAM的表示基础从几何空间提升到了语义对象层面。
- 传统方法:
世界 = {子图1(区域A), 子图2(区域B), ...} - Fusion++方法:
世界 = {背景, 实例子图1(物体A), 实例子图2(物体B), ...}
这种范式转变使得3D重建结果不再是冰冷的几何点云,而是富含语义信息的、可被计算机理解和操作的结构化数字孪生,为机器人导航、增强现实和虚拟现实等应用开辟了新的可能性。