SAMosaic3D:以可学习马赛克组装实现实时在线3D实例分割 | CVPR 2026 论文精读
论文信息
标题:SAMosaic3D: Modular Scene Assembly for Real-Time 3D Segment Anything
会议:CVPR 2026
单位:中国人民大学信息学院、中国水运科学研究院
代码:https://penk1ng.github.io/SAMosaic3D/(代码待发布)
一、背景:3D在线分割的两大顽疾
如果你戴过AR眼镜逛房间,大概率遇到过两种尴尬:一是明明是一把椅子,系统愣是把靠背、坐垫、椅腿识别成三个独立物体;二是你转身走两步再转回来,刚才那把椅子直接"换了个ID",系统当新物体重新认了一遍。
这就是在线3D实例分割领域的两大核心难题:
- 空间碎片化:把SAM这类2D大模型的掩码直接升维到3D,单个物体会被拆成多个不相连的碎片,遮挡时尤其严重;
- 身份漂移:用传统3D IoU做时序跟踪,新观测的物体几何信息稀疏、重叠度低,匹配极不稳定,转个视角就认不出同一个物体。
以往的解法基本都是"事后打补丁":先拿到SAM的2D掩码,升维后用几何聚类、手工规则硬凑合并,再用IoU做帧间关联。但这种修补式的方法天生脆弱,一遇到遮挡、拓扑变化就直接崩。

图1 三种3D实例分割范式对比(出自原文Figure 1)
- (a) 离线范式:需要先重建完整场景再做分割,相当于把整个房间扫描完再慢慢认东西,完全不适合实时场景;
- (b) 传统在线范式:把SAM的掩码直接当成最终实例单元,靠手工规则合并,容易出现碎片和错误合并;
- © SAMosaic3D范式:把SAM的细粒度掩码当成"马赛克瓦片",让模型端到端学习如何组装成完整、时序一致的3D实例。
通俗备注:之前的方法像拿到一堆拼图碎片,只靠形状硬凑,经常拼错;本文是直接教AI"拼图的逻辑",让它自己学着把碎片拼成完整物体,还能记住每一块拼好的图对应哪个物体。
二、整体架构概览
SAMosaic3D的核心设计是双层查询推理范式:把空间分组和时序合并解耦,但又保持端到端联合可训练。整个流程每帧输入带位姿的RGB-D图像,输出更新后的全局场景记忆。

图2 SAMosaic3D整体架构(出自原文Figure 2)
整个框架分为两大核心模块:
- 碎片到实例自适应组装(Fragment-to-Instance Adaptive Assembly):单帧内把SAM输出的碎片掩码,通过可微分聚类和软门控注意力,组装成完整的实例表示;
- 实例到场景在线合并(Instance-to-Scene Online Merging):把当前帧的实例和历史场景记忆做关联,通过两级记忆+级联语义-几何匹配,保持物体身份的时序一致性。
通俗备注:第一步是"单帧拼拼图",把碎块拼成完整的物体;第二步是"跨帧认物体",记住之前见过的东西,新看到的能对上号,不会重复计数。
三、模块一:碎片到实例的自适应组装
输入单帧RGB-D图像后,先通过3D稀疏U-Net得到点云特征,再把SAM生成的2D掩码投影到3D,池化得到每个碎片的特征。接下来的核心任务,就是把这些过分割的碎片,自适应拼成完整实例。
3.1 场景自适应碎片分组
传统硬聚类用argmax做分配,梯度断了,没法端到端训练。本文设计了可微分的软分组机制,能根据场景动态预测实例数量,同时保持梯度可传。
核心公式1:软分配矩阵
Aik=exp(−∥fi−ck∥22/τ)∑j=1N^exp(−∥fi−cj∥22/τ)A_{ik}=\frac{\exp (-\left\|f_{i}-c_{k}\right\|{2}^{2} / \tau)}{\sum{j=1}^{\hat{N}} \exp (-\left\|f_{i}-c_{j}\right\|_{2}^{2} / \tau)}Aik=∑j=1N^exp(−∥fi−cj∥22/τ)exp(−∥fi−ck∥22/τ)
符号全解释:
- AikA_{ik}Aik:第iii个碎片属于第kkk个实例中心的软分配概率,取值范围0~1;
- fif_ifi:第iii个SAM碎片的特征向量;
- ckc_kck:第kkk个可学习的实例中心特征;
- τ\tauτ:温度系数,控制分配的"软硬程度",值越小分配越接近硬聚类;
- N^\hat{N}N^:当前帧预测的实例数量;
- ∥⋅∥2\|\cdot\|_2∥⋅∥2:L2范数,即两个特征向量的欧氏距离。
核心公式2:共实例亲和矩阵
Wij=∑k=1N^AikAjkW_{ij}=\sum_{k=1}^{\hat{N}} A_{ik} A_{jk}Wij=k=1∑N^AikAjk
符号全解释:
- WijW_{ij}Wij:第iii个和第jjj个碎片属于同一个实例的概率,取值范围0~1;
- Aik,AjkA_{ik}, A_{jk}Aik,Ajk:两个碎片对应同一个实例中心的分配概率。
通俗备注:先给每个碎片算"我更像哪个小组"的概率,不是非黑即白归组,而是给个软概率;再通过软分配算出"这俩碎片是不是一家的"置信度,给后面的注意力模块当"门禁参考"。
整个分组流程是:
- 把所有碎片特征池化成全局场景描述符;
- 用M(\mathcal{L})P预测当前场景的实例数量,同时生成一组候选实例中心;
- 计算每个碎片到每个中心的距离,通过softmax得到软分配矩阵;
- 由分配矩阵推导共实例亲和矩阵。
3.2 软门控注意力
普通自注意力会让所有碎片互相传递信息,很容易把不同物体的特征混在一起。本文基于前面得到的亲和矩阵,给注意力加了一道"软门":同个实例的碎片顺畅交流,不同实例的抑制干扰。
核心公式3:软门控自注意力
Qfragl=softmax((QcalWlQ)(QcalWlK)⊤dk+βlog(W+ϵ))Qcal,\begin{aligned} Q_{frag }^{l}=softmax( & \frac{\left(Q_{ca}^{l} W_{l}^{Q}\right)\left(Q_{ca}^{l} W_{l}^{K}\right)^{\top}}{\sqrt{d_{k}}} \\ & +\beta \log (W+\epsilon)) Q_{ca}^{l}, \end{aligned}Qfragl=softmax(dk (QcalWlQ)(QcalWlK)⊤+βlog(W+ϵ))Qcal,
符号全解释:
- QfraglQ_{frag }^{l}Qfragl:第lll层解码器输出的碎片特征;
- QcalQ_{ca}^{l}Qcal:经过点-碎片交叉注意力后的碎片特征,用来把特征锚定在几何信息上;
- WlQ,WlKW_{l}^{Q}, W_{l}^{K}WlQ,WlK:第lll层的查询、键投影矩阵;
- dkd_kdk:键向量的维度,用于缩放点积,防止数值过大导致softmax饱和;
- β\betaβ:门控强度系数,控制亲和矩阵对注意力的影响程度;
- WWW:共实例亲和矩阵;
- ϵ\epsilonϵ:极小常量(原文取10−810^{-8}10−8),防止对数运算中出现0;
- softmaxsoftmaxsoftmax:归一化函数,将注意力权重映射到0~1区间。
通俗备注:这个设计就像办公室的门禁系统:同部门的人(同个实例的碎片)可以自由进出交流;别的部门的人(不同实例)门禁权限低,交流通道收窄。这样既能让同个物体的碎片互补信息,又不会把别的物体的特征混进来。
3.3 逐层实例预测
为了提供更强的监督信号,模型在每一层解码器都做一次实例预测:
Qinstancel=A⊤QfraglQ_{instance }^{l}=A^{\top} Q_{frag }^{l}Qinstancel=A⊤Qfragl
符号全解释:
- QinstancelQ_{instance }^{l}Qinstancel:第lll层的实例特征矩阵;
- AAA:软分配矩阵,转置后做加权池化;
- QfraglQ_{frag }^{l}Qfragl:第lll层的碎片特征。
简单说就是用软分配的概率当权重,把碎片特征加权求和,得到每个实例的聚合特征。浅层负责拼出粗略的物体边界,深层逐步细化分割质量。
有趣案例:SAM把一把办公椅拆成了坐垫、靠背、左前腿三个碎片。传统几何聚类因为三者空间不相连,会当成三个独立物体;而SAMosaic3D的分组模块会算出三者都属于同一个椅子实例中心,软门控注意力让三个碎片互相交换特征,补全彼此的几何信息,最终输出一个完整的椅子实例。
四、模块二:实例到场景的在线合并
拼好单帧的实例后,下一步是把它们和历史场景记忆关联起来,保证同一个物体不会因为视角变化就换ID。这里最大的矛盾是:新观测的实例几何稀疏、重叠低,IoU匹配不靠谱;而积累了多帧的实例几何完整,适合做几何验证。
4.1 观测感知的两级场景记忆
为了兼顾效率和精度,模型把场景记忆分成两层:
- 短期记忆:固定容量(默认50个),用FIFO队列维护,存最近观测到的实例;满了就把最老的挪去长期记忆;
- 长期记忆:动态增长,存所有历史出现过的实例;如果长期记忆里的物体重新被观测到,就晋升回短期记忆。
通俗备注:短期记忆就像你脑子里刚见过的东西,细节清晰,用来快速匹配;长期记忆是很久以前见过的东西,存个大概轮廓,等再见到的时候核对一下。容量固定的短期记忆,保证了计算量不会随着场景变大无限膨胀。
4.2 级联语义-几何匹配
针对"新观测稀疏、老实例完整"的不对称性,模型设计了两阶段级联匹配:

图3 实例到场景在线合并流程(出自原文Figure 4)
阶段1:语义匹配(对接短期记忆)
用带空间权重的交叉注意力,基于特征相似度计算合并概率,同时用3D边界框距离和语义类别做引导。这个阶段不依赖高IoU,适合几何稀疏的新观测。
得到软合并矩阵后,推理时用贪心分配:得分超过阈值就认为是同一个物体。
阶段2:几何验证(对接长期记忆)
第一阶段没匹配上的实例,再去长期记忆里做3D IoU匹配。此时的实例特征已经经过第一阶段的语义信息增强,匹配更鲁棒。匹配成功的长期实例会晋升回短期记忆。
两阶段都没匹配上的实例,判定为新出现的物体,加入短期记忆。
通俗备注:第一阶段靠"脸熟不认轮廓",哪怕只看到物体一角,也能靠特征认出是之前见过的;第二阶段靠"轮廓核对",对很久没见的物体,等几何信息攒够了再确认身份,避免认错。
4.3 记忆更新
匹配成功的实例对,会做融合更新:
- 特征和边界框用指数移动平均(EMA)平滑更新;
- 掩码取空间并集,逐步积累完整的几何覆盖;
- 语义类别和置信度取最大值,保留最高置信的预测。
没匹配上的记忆实例会原样保留,等下次再出现时重新匹配。
五、训练策略与损失设计
整个框架采用渐进式训练:先单独训碎片到实例模块,再开启时序合并模块联合训练。总损失由三部分组成。
5.1 碎片到实例监督
基础实例查询损失
Lquery(j,σ(j))=λmaskLmask+λboxLcls+Lobj \mathcal{L}{query }(j, \sigma(j))=\lambda{mask } \mathcal{L}{mask }+\lambda{box } \mathcal{L}{cls }+\mathcal{L}{obj } Lquery(j,σ(j))=λmaskLmask+λboxLcls+Lobj
符号全解释:
- Lquery\mathcal{L}_{query}Lquery:单个实例的匹配损失;
- σ(j)\sigma(j)σ(j):二分图匹配得到的第jjj个预测对应的真值索引;
- λmask,λbox\lambda_{mask}, \lambda_{box}λmask,λbox:掩码损失、分类损失的权重系数;
- Lmask\mathcal{L}_{mask}Lmask:3D点掩码损失;
- Lcls\mathcal{L}_{cls}Lcls:语义分类损失;
- Lobj\mathcal{L}_{obj}Lobj:目标置信度损失。
分配加权实例监督
普通损失对所有实例一视同仁,但有的分组很确定,有的很模糊。本文给每个实例的损失加了权重:
Linstl,t=∑j=1Nwj⋅Lquery(j,σ(j)),where wj=maxiAij \mathcal{L}{inst }^{l, t}=\sum{j=1}^{N} w_{j} \cdot \mathcal{L}{query }(j, \sigma(j)), \quad \text{where}\ w{j}=\max {i} A{i j} Linstl,t=j=1∑Nwj⋅Lquery(j,σ(j)),where wj=imaxAij
符号全解释:
- Linstl,t\mathcal{L}_{inst }^{l, t}Linstl,t:第ttt帧第lll层的总实例损失;
- wjw_jwj:第jjj个实例的损失权重,等于该实例所有碎片分配概率的最大值;
- AijA_{ij}Aij:第iii个碎片对第jjj个实例的软分配概率。
通俗备注:对"拼得很确定"的实例,损失权重大,让模型重点学好靠谱的分组;对"模棱两可"的实例,权重小,避免带偏训练。
5.2 实例到场景监督
为了防止注意力学到"靠位置近就瞎匹配"的假规律,加入了显式的合并监督:
Lmerget=BCE(MLshort,Gt) \mathcal{L}{merge }^{t}=\text{BCE}\left(M{L}^{short }, G^{t}\right) Lmerget=BCE(MLshort,Gt)
符号全解释:
- Lmerget\mathcal{L}_{merge }^{t}Lmerget:第ttt帧的合并损失;
- BCE\text{BCE}BCE:二元交叉熵损失;
- MLshortM_{L}^{short}MLshort:解码器最后一层输出的软合并矩阵;
- GtG^{t}Gt:真值对应关系的二值矩阵,同一ID对应位置为1,否则为0。
5.3 总损失
L=1T∑t=1T(λcountLcountt+∑l=1LLinstl,t+λmergeLmerget) \mathcal{L}=\frac{1}{T} \sum_{t=1}^{T}\left(\lambda_{count } \mathcal{L}{count }^{t}+\sum{l=1}^{L} \mathcal{L}{inst }^{l, t}+\lambda{merge } \mathcal{L}_{merge }^{t}\right) L=T1t=1∑T(λcountLcountt+l=1∑LLinstl,t+λmergeLmerget)
符号全解释:
- L\mathcal{L}L:总损失;
- TTT:训练序列的帧数;
- LLL:解码器层数;
- λcount,λmerge\lambda_{count}, \lambda_{merge}λcount,λmerge:数量预测损失、合并损失的权重;
- Lcountt\mathcal{L}_{count }^{t}Lcountt:实例数量预测的分类损失;
- Linstl,t\mathcal{L}_{inst }^{l, t}Linstl,t:逐层实例分割损失;
- Lmerget\mathcal{L}_{merge }^{t}Lmerget:时序合并监督损失。
六、实验结果与性能分析
6.1 数据集与评价指标
实验在4个主流室内3D数据集上验证:
- ScanNet:1513个室内场景,20个语义类别;
- ScanNet200:ScanNet的细粒度版本,200+物体类别;
- SceneNN:50个标注室内场景;
- 3RScan:46个快速相机运动的测试场景,考验运动鲁棒性。
评价指标采用标准AP(平均精度),同时报告AP50AP_{50}AP50(IoU阈值0.5)和AP25AP_{25}AP25(IoU阈值0.25)。
6.2 同数据集性能对比
表1 ScanNet与SceneNN验证集同数据集评测结果(出自原文Table 1)
| 方法 | ScanNet | SceneNN | ||||
|---|---|---|---|---|---|---|
| AP | AP₅₀ | AP₂₅ | AP | AP₅₀ | AP₂₅ | |
| 离线方法 | ||||||
| TD3D | 46.2 | 71.1 | 81.3 | -- | -- | -- |
| OneFormer3D | 59.3 | 78.8 | 86.7 | -- | -- | -- |
| 在线方法 | ||||||
| INS-Conv | -- | 57.4 | -- | -- | 57.6 | -- |
| TD3D-MA | 39.0 | 60.5 | 71.3 | 26.0 | 42.8 | 59.2 |
| ESAM-E † | 41.6 | 60.1 | 75.6 | 27.5 | 48.7 | 64.6 |
| ESAM-E+FF †‡ | 42.6 | 61.9 | 77.1 | 33.3 | 53.6 | 62.5 |
| AutoSeg3D † | 43.4 | 62.5 | 77.4 | 33.1 | 52.6 | 63.8 |
| SAMosaic3D (本文) | 45.3 | 65.9 | 78.5 | 33.2 | 56.5 | 69.3 |
| SAMosaic3D † (本文) | 46.5 | 67.7 | 80.1 | 35.1 | 58.2 | 71.8 |
注:† 表示使用FastSAM骨干;‡ 表示额外融合FastSAM提取的图像特征到点云。
结果分析 :
在同数据集训练评测的设置下,SAMosaic3D在在线方法中全面领先。使用与AutoSeg3D相同的SAM骨干时,ScanNet上AP高出1.9,SceneNN上高出0.1;切换到更快的FastSAM后,性能进一步提升。这说明性能增益并非来自更强的2D分割模型,而是源于可学习组装框架本身。
6.3 细粒度类别无关分割与速度
表2 ScanNet200验证集类别无关3D实例分割结果(出自原文Table 2)
| 方法 | VFM骨干 | AP | AP₅₀ | AP₂₅ | FPS |
|---|---|---|---|---|---|
| 离线方法 | |||||
| SAMPro3D | SAM | 18.0 | 32.8 | 56.1 | -- |
| SAI3D | SemanticSAM | 28.2 | 47.2 | 67.9 | -- |
| 在线方法 | |||||
| SAM3D | SAM | 20.2 | 35.7 | 55.5 | 0.4 |
| ESAM | SAM | 42.2 | 63.7 | 79.6 | 0.7 |
| ESAM-E | FastSAM | 43.4 | 65.4 | 80.9 | 10.6 |
| AutoSeg3D | SAM | 45.5 | 66.7 | 81.0 | 0.7 |
| AutoSeg3D-E | FastSAM | 46.2 | 67.9 | 81.7 | 10.1 |
| SAMosaic3D (本文) | SAM | 46.1 | 68.5 | 84.2 | 0.7 |
| SAMosaic3D (本文) | FastSAM | 48.7 | 69.3 | 85.4 | 11.2 |
结果分析 :
在更细粒度的ScanNet200数据集上,SAMosaic3D同样保持SOTA。尤其关键的是,搭配FastSAM时推理速度达到11.2 FPS,真正满足实时交互要求,同时AP达到48.7,比AutoSeg3D-E高出2.5。对机器人、AR等具身智能场景来说,"又快又准"是落地的核心前提。
6.4 零样本跨数据集泛化
表3 从ScanNet200到SceneNN、3RScan的零样本跨数据集泛化结果(出自原文Table 3)
| 方法 | ScanNet200 → SceneNN | ScanNet200 → 3RScan | ||||
|---|---|---|---|---|---|---|
| AP | AP₅₀ | AP₂₅ | AP | AP₅₀ | AP₂₅ | |
| 离线方法 | ||||||
| SAMPro3D | 12.6 | 25.8 | 53.2 | 3.9 | 8.0 | 21.0 |
| SAI3D | 18.6 | 34.7 | 65.7 | 8.1 | 16.9 | 37.0 |
| 在线方法 | ||||||
| SAM3D | 15.1 | 30.0 | 51.8 | 6.2 | 13.0 | 33.9 |
| ESAM | 28.8 | 52.2 | 69.3 | 14.1 | 31.2 | 59.6 |
| ESAM-E † | 28.6 | 50.4 | 71.0 | 13.9 | 29.4 | 58.8 |
| AutoSeg3D | 29.7 | 53.6 | 71.9 | 16.0 | 32.4 | 60.7 |
| AutoSeg3D-E † | 30.2 | 54.1 | 72.8 | 16.8 | 34.3 | 61.0 |
| SAMosaic3D (本文) | 31.7 | 56.8 | 74.2 | 16.3 | 34.7 | 63.1 |
| SAMosaic3D (本文) † | 32.4 | 57.8 | 74.7 | 17.0 | 35.5 | 63.7 |
注:† 表示使用FastSAM骨干。
结果分析 :
零样本泛化是检验模型是否学到真本事的试金石------只在ScanNet200上训练,不做任何微调直接拿到新数据集上跑。结果显示,SAMosaic3D在SceneNN上AP达到31.7,比第二名高出1.5;在相机运动更剧烈的3RScan上,也达到了16.3 AP。这说明模型学到的是"组装碎片、关联时序"的通用能力,而非拟合特定数据集的分布。
6.5 消融实验
整体系统消融
表4 整体系统消融实验(出自原文Table 4)
| F2I模块 | I2S模块 | 实例损失 | 数量损失 | 合并损失 | AP | AP₅₀ | AP₂₅ |
|---|---|---|---|---|---|---|---|
| ✗ | ✗ | ✓ | ✗ | ✗ | 40.5 | 60.2 | 78.5 |
| ✓ | ✗ | ✓ | ✓ | ✗ | 44.8 | 65.3 | 82.1 |
| ✓ | ✓ | ✓ | ✓ | ✗ | 48.2 | 68.9 | 85.0 |
| ✓ | ✓ | ✓ | ✓ | ✓ | 49.1 | 69.8 | 85.7 |
结果分析 :
从基线到完整模型,AP一共提升了8.6。其中碎片到实例模块贡献4.3的涨幅,说明可学习软分组相比硬聚类提升巨大;实例到场景模块贡献3.4,说明两级记忆和级联匹配对时序一致性至关重要;显式合并监督再涨0.9,进一步强化身份保持能力。
碎片到实例模块消融
表5 碎片到实例模块消融实验(出自原文Table 5)
| 软分配 | 亲和矩阵 | 门控注意力 | 分配加权 | AP | AP₅₀ | AP₂₅ |
|---|---|---|---|---|---|---|
| ✗ | - | - | - | 42.5 | 62.8 | 80.1 |
| ✓ | ✗ | ✓ | max | 44.6 | 64.9 | 81.8 |
| ✓ | ✓ | ✗ | max | 46.8 | 67.5 | 84.2 |
| ✓ | ✓ | ✓ | uniform | 47.3 | 68.2 | 84.6 |
| ✓ | ✓ | ✓ | sum | 47.6 | 68.4 | 84.7 |
| ✓ | ✓ | ✓ | max | 49.1 | 69.8 | 85.7 |
结果分析 :
共实例亲和矩阵是贡献最大的组件,单独带来2.2 AP提升;软分配解决梯度回传问题,涨2.1 AP;软门控注意力和max分配加权进一步带来增益。最终完整模块相比硬聚类基线涨了6.6 AP。
实例到场景模块消融
表6 实例到场景合并模块消融实验(出自原文Table 6)
| 记忆层级 | 合并阶段 | 合并损失 | AP | AP₅₀ | AP₂₅ |
|---|---|---|---|---|---|
| 0+∞(纯长期) | S2(仅几何) | ✓ | 43.8 | 64.1 | 81.0 |
| 50+∞(两级) | S1(仅语义) | ✓ | 46.9 | 67.2 | 83.7 |
| 50+∞(两级) | S1+S2(级联) | ✗ | 48.2 | 68.9 | 85.0 |
| 50+∞(两级) | S1+S2(级联) | ✓ | 49.1 | 69.8 | 85.7 |
结果分析 :
纯几何匹配基线只有43.8 AP,换成两级记忆+语义匹配后直接涨到46.9,说明面对稀疏新观测,语义特征比IoU靠谱得多;级联语义+几何再涨1.3,两者互补;显式合并监督再涨0.9。
短期记忆大小敏感性
表7 短期记忆大小超参数敏感性分析(出自原文Table 7)
| 短期记忆容量 | AP | AP₅₀ | AP₂₅ | 单帧延迟(ms) |
|---|---|---|---|---|
| 20 | 48.4 | 69.0 | 85.1 | 58 |
| 50 | 49.1 | 69.8 | 85.7 | 69 |
| 100 | 49.0 | 69.7 | 85.4 | 88 |
| 无限大 | 48.0 | 68.5 | 84.7 | - |
结果分析 :
短期记忆不是越大越好。容量50时达到精度和速度的最佳平衡;容量太小记不住足够多的近期物体,太大则会引入远古噪声,精度反而下降,延迟还会升高。
6.6 运行时间分解
表8 单帧推理时间分解(不含视觉基础模型,出自原文Table 8)
| 3D-Unet骨干 | 碎片到实例模块 | 实例到场景模块 | 总计 | |||
|---|---|---|---|---|---|---|
| 分组 | 注意力 | 阶段1 | 阶段2 | 更新 | ||
| 41.0 | 3.0 | 17.0 | 5.0 | 1.0 | 2.0 | 69.0 |
单位:毫秒
结果分析 :
整个框架不含VFM的单帧延迟仅69ms,其中3D骨干占了大头,核心的组装和合并模块加起来才28ms,效率很高。
6.7 定性可视化
图5 3D实例分割定性对比(出自原文Figure 5)
图中从左到右分别是真值、ESAM方法结果、SAMosaic3D结果。可以明显看出,ESAM存在显著的过分割问题,单个物体被拆成多个碎片;而SAMosaic3D的结果更接近真值,实例边界更完整,碎片数量显著减少,直观验证了组装机制的有效性。
七、核心代码实现
以下是两个核心模块的简化PyTorch实现,还原论文中的核心逻辑。
7.1 场景自适应软分组
python
import torch
import torch.nn as nn
import torch.nn.functional as F
class SceneAdaptiveGrouping(nn.Module):
def __init__(self, feat_dim=128, max_inst=50, temperature=0.1):
super().__init__()
self.feat_dim = feat_dim
self.max_inst = max_inst # 最大实例数 N_max
self.tau = temperature # 温度系数 \(\tau\)
# 实例数量预测头
self.count_head = nn.Sequential(
nn.\(\mathcal{L}\)inear(2 * feat_dim, feat_dim),
nn.Re\(\mathcal{L}\)U(),
nn.\(\mathcal{L}\)inear(feat_dim, max_inst)
)
# 实例中心生成头
self.center_gen = nn.Sequential(
nn.\(\mathcal{L}\)inear(2 * feat_dim, feat_dim),
nn.Re\(\mathcal{L}\)U(),
nn.\(\mathcal{L}\)inear(feat_dim, max_inst * feat_dim)
)
def forward(self, frag_feats):
"""
Args:
frag_feats: [M, C] M个碎片的特征
Returns:
assign_matrix: [M, N_hat] 软分配矩阵 A
affinity_matrix: [M, M] 共实例亲和矩阵 W
inst_count: 预测的实例数 N_hat
"""
M, C = frag_feats.shape
# 1. 生成全局场景描述符(最大池化+平均池化拼接)
global_max = torch.max(frag_feats, dim=0)[0]
global_avg = torch.mean(frag_feats, dim=0)
global_desc = torch.cat([global_max, global_avg], dim=-1) # [2C]
# 2. 预测当前场景的实例数量
count_logits = self.count_head(global_desc) # [N_max]
inst_count = torch.argmax(count_logits).item() + 1 # 预测的N_hat
# 3. 生成候选中心,取前N_hat个激活
centers = self.center_gen(global_desc).view(self.max_inst, C) # [N_max, C]
active_centers = centers[:inst_count] # [N_hat, C]
# 4. 计算软分配矩阵 A
dist = torch.cdist(frag_feats.unsqueeze(0), active_centers.unsqueeze(0)).squeeze(0) ** 2 # [M, N_hat]
assign_matrix = F.softmax(-dist / self.tau, dim=-1) # [M, N_hat]
# 5. 计算共实例亲和矩阵 W
affinity_matrix = assign_matrix @ assign_matrix.T # [M, M]
return assign_matrix, affinity_matrix, inst_count
7.2 软门控自注意力
python
class SoftGatedSelfAttention(nn.Module):
def __init__(self, feat_dim=128, beta=1.0):
super().__init__()
self.beta = beta # 门控强度 \(\beta\)
self.q_proj = nn.\(\mathcal{L}\)inear(feat_dim, feat_dim)
self.k_proj = nn.\(\mathcal{L}\)inear(feat_dim, feat_dim)
self.v_proj = nn.\(\mathcal{L}\)inear(feat_dim, feat_dim)
self.scale = feat_dim ** -0.5 # 1/sqrt(d_k)
def forward(self, x, affinity):
"""
Args:
x: [M, C] 输入碎片特征
affinity: [M, M] 共实例亲和矩阵 W
Returns:
out: [M, C] 输出特征
"""
Q = self.q_proj(x) # [M, C]
K = self.k_proj(x)
V = self.v_proj(x)
# 计算原始注意力分数
attn_scores = Q @ K.T * self.scale # [M, M]
# 加入亲和矩阵偏置(log空间)
eps = 1e-8
attn_scores = attn_scores + self.beta * torch.log(affinity + eps)
# softmax归一化
attn_weights = F.softmax(attn_scores, dim=-1)
# 加权求和得到输出
out = attn_weights @ V
return out
代码备注:第一段实现了"动态算实例数、软分配碎片"的核心逻辑,全程可微分;第二段实现了带门禁的自注意力,同实例碎片多交流,不同实例少干扰。
八、总结与展望
核心贡献
- 范式创新:把在线3D实例分割从"事后修补"重构为"可学习组装"问题,端到端可训练;
- 碎片组装模块:场景自适应软分组+软门控注意力,有效解决SAM过分割带来的空间碎片化;
- 时序合并模块:两级记忆+级联语义-几何匹配,解决稀疏观测下的身份漂移问题;
- 性能领先:在多个数据集上取得SOTA,零样本泛化能力强,搭配FastSAM可实现11.2 FPS实时推理。
局限与未来
目前框架主要做类别无关的实例分割,还不支持开放词汇语义查询;未来工作会集成视觉语言模型,扩展到视觉语言导航任务,并将长期记忆机制适配到更大规模的室外场景。
总的来说,SAMosaic3D提供了一种很优雅的思路:不强行修正大模型的输出,而是顺着大模型的输出特点,设计配套的可学习组装机制------这或许是2D基础模型向3D具身感知迁移的一条高效路径。