点击下方卡片,关注「3D视觉工坊」公众号
选择星标,干货第一时间送达
3D视觉硬件汇总,包括结构光3D相机(支持室内外,焊接,机械臂抓取等场景),相位偏折术、散斑、机械臂抓取和焊接软件,手持扫描仪(支持定位、重定位、稠密建图)、四足狗和小车定位和导航,底盘。点击->查看详情:
一、多视角分割的“身份危机”:同一个物体,换个视角就不认识了
让机器人在真实世界中抓取目标物体或整理房间,它必须能够在不同视角下可靠地识别同一个物理物体。然而,一致的多视角物体分割至今仍是3D感知和机器人应用的核心瓶颈。
当前的方法大致走两条路。第一条路直接在点云等显式3D表示上做实例分割。这类方法高度依赖重建质量,而且3D标注极其稀缺——标注一个3D场景的成本远超标注一张2D图像。第二条路先用SAM等2D分割模型逐帧生成掩码,再通过离线投影和匹配管线关联跨帧掩码。但这种方法有一个致命弱点:当视角变化剧烈时,物体身份会变得模糊——同一把椅子从正面和侧面看外观差异巨大,颜色相近的不同物体在不同视角下可能被错误关联。
近期的一些前馈方法如IGGT,通过端到端学习实例感知的几何特征来避免显式重建和离线关联,但它们没有利用2D基础模型的强大分割先验,导致跨视角掩码预测困难。另一项并发工作MV-SAM虽然也意识到稀疏提示必须接地到多视角几何中,但它选择将提示提升到3D空间解决,而SAM-V则保持提示和输出都在原始2D视图中,减少了对重建质量的依赖。
文章的核心判断是:将强2D分割先验与多视角几何先验直接融合,是一条更有前景的路径。但简单的特征融合远远不够——单个视图中指定的稀疏提示仍然是视角无关的,解码器无法判断提示指的是哪个视图、哪个位置,预测会随着视角变化而漂移。实现一致性的关键在于让提示本身接地到多视角几何中。
图1:展示了SAM-V的核心能力
二、方法:几何感知的提示融合,让每个提示“知道自己来自哪里”
SAM-V是一个端到端框架,核心设计是在掩码解码之前,将SAM的2D分割先验和VGGT的多视角几何先验在特征层面深度融合。
任务定义方面,给定N张RGB图像 ,目标是在每个视图上分割出同一个物体。目标由点提示 指定,其中 是2D坐标, 是帧索引。输出是逐帧掩码 ,如果目标在某帧不可见,对应掩码应为全零。
实例与几何特征融合
SAM-V使用冻结的SAM和VGGT编码器提取图像嵌入 和 。SAM特征提供强2D分割线索,VGGT特征编码多视角一致的几何信息。两者沿通道维度拼接后投影回SAM嵌入维度:
所有N个视图的融合特征被展平为单一token序列,掩码解码器可以联合关注所有视图。位置编码相应调整,使每个提示与其提示视图对齐。
几何感知提示输入:整个方法的核心
原始SAM中,提示只在单张图像的特征图上解释。在SAM-V中,解码器需要关注跨越N帧的融合特征,因此每个提示必须同时传达它来自哪个视图以及它查询哪个位置。文章的做法是用VGGT派生的视图级和点级上下文增强SAM提示嵌入。
图2:SAM-V的架构概览
对于每个提示 ,收集两部分几何上下文。第一是提示帧的相机token,指示提示来自哪个视图。第二是局部几何特征,取自VGGT中对应提示坐标的patch,锚定查询位置的空间信息。两者拼接为提示上下文 ,通过交叉注意力与SAM提示嵌入融合:
相机token解决“来自哪个视图”的问题,局部VGGT特征解决“在场景中哪个位置”的问题。两者结合,给解码器一个既视图感知又空间接地的提示表示。
训练策略
SAM图像编码器、VGGT编码器和SAM提示编码器全程冻结。可训练组件包括特征融合MLP、几何感知提示融合模块和SAM掩码解码器(从预训练SAM权重初始化)。
训练分两阶段:先在Hypersim合成数据集上大规模预训练,利用渲染的真值提供精确的多视角实例掩码;然后在ScanNet++上微调以适应真实世界采集。掩码监督采用焦点损失和Dice损失的加权组合:
在ScanNet++微调阶段,额外加入掩码置信度损失 ,确保候选掩码能在推理时被可靠排序。
训练中一个关键设计是负帧监督:每个训练样本包含8帧(4个正帧+4个负帧),模型被明确监督在没有目标的视图中预测全零掩码。这迫使模型学会判断目标是否存在,而不仅仅是在每个视图上都输出一个掩码。
图3 对比了SAM-V与SAM2在Hypersim上的表现
全物体推理
SAM-V原生支持从稀疏提示进行目标特定分割,但真实世界的自主性往往需要场景级理解。文章引入全物体推理过程,让SAM-V从提示条件化跟踪过渡到跨场景一致地分割所有物体实例。
具体做法是:在每帧上独立运行SAM获取2D提案掩码,对每个提案在其掩码区域内采样点提示,将提示组与所有N帧一起输入SAM-V,预测候选多视角掩码。由于每个候选已经是一个多视角掩码,同一物体的重复候选在所有视图中高度重合,因此基于掩码重叠的非极大值抑制即可去除冗余预测。
三、实验:从受控评估到场景级分割的全面领先
文章在Hypersim、ScanNet++和ScanNet三个基准上进行了评估,回答三个核心问题:模型能否在包括大视角变化和物体消失的视图间一致分割目标?提示条件化模型能否扩展到场景级推理?局部VGGT特征对提示接地的贡献有多大?
受控提示条件化评估
在Hypersim上,文章构建了多视角单实例分割评估集,从与训练不重叠的留出场景中选取至少在8帧中可见且面积超过阈值的实例,共1,788个。
每个实例构建包含8个正帧和8个负帧的输入序列,随机交错。正帧选择分两种设置:Continuous使用相机位姿最近点采样,视角变化小;Diverse使用最远点采样,视角变化大。两种设置解耦了困难来源:连续采样测试视频式时序理解,多样采样隔离大视角变化。
表1展示了Hypersim测试集上与SAM2的对比。在Diverse设置下,SAM-V将O-IoU从48.1提升至62.4,R@50从59.6提升至71.9。在Continuous设置下,两者表现相近。这表明融入VGGT几何特征在输入视图存在大相机位姿变化时尤为有益。
场景级分割
在ScanNet++和ScanNet上,文章遵循IGGT 3D跟踪基准,使用58个ScanNet++物体和66个ScanNet物体进行全物体分割评估。
表2 展示了ScanNet++和ScanNet上的对比。在ScanNet++上,SAM-V在所有指标上领先:T-mIoU 78.4,O-IoU 79.4,P@50 79.4,R@50 89.2。相比IGGT,T-mIoU高出12.9,O-IoU高出11.5,P@50高出19.8,R@50高出17.5。相比最强基线PanSt3R,T-mIoU高出5.7,R@50高出11.8。在零样本ScanNet评估上,SAM-V再次在全部四个指标上领先。
图4展示了IGGT 3D跟踪基准上的定性对比。每个场景9帧,展示4帧。颜色和ID表示跨视图身份。SAM-V产生更准确、更一致的多视角物体掩码,而基线在目标模糊、大视角变化或跨视图跟踪不完整等挑战性情况下会失败
文章指出,查询式方法(PanSt3R、ODIN)虽然高效,但召回率有代价:场景级查询发现实例的粒度并不总是匹配标注,最常见的是欠分割。一个典型案例是预测整个椅子,而目标是放在椅子上的物体。SAM-V从SAM提案派生提示,继承了SAM的实例粒度。此外,PanSt3R和ODIN自主发现实例,目标实例无法在推理时指定,而SAM-V在一个模型中同时支持提示模式和全物体模式。
消融实验
表3展示了提示融合输入的消融。文章比较了三种渐进丰富的提示表示:仅SAM提示嵌入、融合相机token、以及完整设计(额外融入局部VGGT特征)。
在Continuous设置下,完整设计将O-IoU从21.3提升至64.2;在Diverse设置下,从23.0提升至62.4。局部VGGT特征对空间接地至关重要。
图5展示了提示融合输入的定性消融。仅使用SAM提示token或仅添加VGGT相机token可能导致预测漂移到邻近区域,而进一步融入VGGT局部特征后,空间接地改善,跨视图产生更准确的掩码
四、训练配置与代码使用
代码仓库https://github.com/gong208/SAM-V提供了从环境搭建到文章复现的完整工具链。仓库的核心模块包括 model/(融合模块与SAM解码器)、masks/(全物体模式与全景NMS)、training/(训练器与配置)、benchmarks/(所有评估入口)、preprocessing/(数据集准备与离线SAM嵌入)以及 demos/web/(浏览器演示)。
环境配置
SAM-V 需要 Python 3.10 和 CUDA 12.1(PyTorch 2.3.1 会拉取自带的 CUDA 运行时)。创建虚拟环境后安装依赖:
python -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
需要特别注意的是,timm、matplotlib、scikit-image 和 scikit-learn 已经包含在 requirements.txt 中,不要单独安装,否则会升级版本并破坏依赖锁定。
克隆仓库时有两种方式。完整克隆会拉取所有基线方法的嵌套子模块(Point-SAM 会拖入 NVIDIA/apex,体积达数 GB)。如果只需要运行 SAM-V 本身,可以只初始化 vggt 和 sam-hq 两个子模块:
git clone https://github.com/gong208/SAM-V.git && cd SAM-V
git submodule update --init submodules/vggt submodules/sam-hq
sam-hq 是经过修补的 fork,使用普通的 MaskDecoder,移除了 HQ 特有的 hq_token_only、interm_embeddings 和 vit_dim 参数,无需手动打补丁。
模型权重下载
SAM-V 需要三类权重。基础骨干包括 VGGT-1B(下载到 submodules/vggt/checkpoints/model.pt)和 SAM ViT-H(下载到 submodules/sam-hq/checkpoints/sam_vit_h_4b8939.pth)。SAM-V 检查点包括两个文件:sam_v_stage2.pth 是第二阶段检查点,用于所有全物体分割评估和推理;sam_v_stage1.pth 是第一阶段 Hypersim 预训练检查点,作为第二阶段微调的初始化。
两个检查点都托管在 Hugging Face 上,可以使用 hf 命令行工具下载(该工具已包含在 huggingface_hub 中,而 huggingface_hub 已在 requirements.txt 内):
hf download Frank-Gong123/SAM-V sam_v_stage2.pth --local-dir checkpoints
PYTHONPATH 必须显式设置,这一点容易忽略。仅设置仓库根目录是不够的——vggt 子模块自带一个 training 包,会遮蔽 SAM-V 自己的 training 包。必须同时导出三个路径:
export PYTHONPATH="$PWD:$PWD/submodules/sam-hq:$PWD/submodules/vggt"
下表列出了完整的训练配置。优化器 AdamW,学习率 1×10⁻⁴,权重衰减 0.01,批量大小 2,余弦退火调度,Tmax=200,ηmin=1×10⁻⁶。Hypersim 阶段使用 20 个提示点,ScanNet++ 微调阶段从 {3, 4, 5} 随机采样。Hypersim 阶段使用 8 张 NVIDIA L40S GPU,ScanNet++ 阶段使用 14 张。训练分为两个阶段:Hypersim 预训练运行 212 个 epoch,选择验证 IoU 最高的 epoch 206 检查点初始化第二阶段;ScanNet++ 微调运行 20 个 epoch,同样按验证 IoU 选择检查点。Hypersim 阶段在前 70 个 epoch 应用渐进采样课程:两个概率从 0 线性增长至 1,第一个是正帧采样从最近点转向最远点,第二个是所有提示点从单个正帧采样而非分散在四帧中。

数据集准备
SAM-V 使用三个数据集。Hypersim 用于第一阶段预训练和表 1 评估,从 apple-aiml-research/ml-hypersim 下载。完整发布版远大于 SAM-V 所需,使用 contrib/99991/download.py 并通过 --contains 过滤器选择性下载。每个场景需要三样东西:color/NNNNN.jpg(RGB 输入)、instance/NNNNN.png(uint16 格式的真值实例掩码)和 pose/NNNNN.txt(4×4 相机到世界变换)。实例 ID 是场景全局的,同一个 ID 在每一帧中对应同一个物理物体——这是多视角监督得以良定义的关键。下载后需要运行两个预处理脚本生成派生目录:preprocessing/valid_instance_id.py 和 preprocessing/precompute_instance_presence.py。
ScanNet++ v2 用于第二阶段微调,使用 IGGT 发布的已处理版本(lifuguan/InsScene-15K 的 processed_scannetpp_v2 子目录)。该数据集是一个 zip 文件按字节分割成 53 个部分(约 227 GB),需要先 cat 拼接再解压。训练/验证划分使用 ScanNet++ 官方的 nvs_sem_train.txt(855 个场景)和 nvs_sem_val.txt(50 个场景),而非 InsScene-15K 自带的划分。除了运行 valid_instance_id.py 和 precompute_instance_presence.py 之外,还需要运行 preprocessing/precompute_sam_embeddings_scannetpp.py 生成离线 SAM 图像嵌入——这是第二阶段微调的必需输入,因为配置文件 configs/paper/scannetpp_finetune.yaml 设置了 use_offline_sam_embeddings: true。
IGGT 3D 跟踪基准用于表 2 评估,从 lifuguan/IGGT_Benchmark 下载。上游目录名称为“3D Tracking Benchmark”(含空格),需要重命名为 3DTrackingBenchmark。基准包含 ScanNet 和 ScanNet++ 两个划分,每个场景有 /images/ 目录下的 frame_*.jpg 和对应的真值 frame_*_label.npy。表 2 评估不需要原始 ScanNet 或原始 ScanNet++ 数据,基准已经包含了它评分的帧。
训练命令
第一阶段(Hypersim 预训练)使用 torchrun 启动,配置文件为 configs/train/hypersim_pretrain.yaml,该配置正是发布阶段 1 检查点所使用的配方:
torchrun --nproc_per_node=8 training/trainer.py \
--config configs/train/hypersim_pretrain.yaml
第二阶段(ScanNet++ 微调) 需要先设置 STAGE1_CHECKPOINT 环境变量指向第一阶段检查点,然后使用 configs/paper/scannetpp_finetune.yaml 配置运行:
export STAGE1_CHECKPOINT=/path/to/stage1.pth
torchrun --nproc_per_node=8 training/trainer.py \
--config configs/paper/scannetpp_finetune.yaml
两个阶段都只接受一个 YAML 配置文件,未知键会被拒绝,拼写错误会直接报错。
推理与评估
浏览器演示提供最直观的快速上手方式。启动 FastAPI 服务后,在浏览器中上传同一场景的多帧图像,点击任意帧上的正点提示,即可获得该实例在所有帧上的掩码:
pip install -r requirements-web.txt
SAM_V_CKPT=/path/to/sam_v_stage2.pth \
PYTHONPATH="$PWD:$PWD/submodules/sam-hq:$PWD/submodules/vggt" \
uvicorn demos.web.app:app --host 127.0.0.1 --port 7860
打开 http://localhost:7860 即可使用。不需要真值,也不需要特定文件名,同一场景的任意图像都可以。
全物体分割 使用 benchmarks/sam_vggt_3dtracking_benchmark.py:
python benchmarks/sam_vggt_3dtracking_benchmark.py \
--sam_v_ckpt /path/to/sam_v.pth \
--benchmark_root "$BENCH/scannetpp" \
--prompt_source sam_dense_masks \
--prompt_sampling_method pole_plus_diverse \
--prompt_points_per_mask 5 \
--nms_score iou_preds \
--nms_iou_type box \
--device cuda:0 \
--output_dir results/3dtracking_scannetpp
将 scannetpp 替换为 scannet 即可评估另一个划分。文章使用 --nms_iou_type box 进行全物体评估。运行完成后会输出 dataset_summary.json、precision_recall_summary.csv、每个场景的 summary.json,以及 provenance.json 和 git_diff.patch,记录确切的提交和命令。
提示条件化单实例分割 使用 benchmarks/compare_baseline_sam2.py:
python benchmarks/compare_baseline_sam2.py \
--sam_v_ckpt /path/to/sam_v.pth \
--dataset_root "$HYPERSIM_ROOT" --split test \
--strategies pose_near,pose_diverse --num_points 10 --seed 0 \
--frame_count 16 --scene_limit 0 \
--output_dir results/sam2_baseline
仓库中的策略名称为 pose_near / pose_diverse,对应文章中的 continuous / diverse 两种设置。此评估使用 sam_v_stage1.pth 检查点。
基线复现与许可
benchmarks/baselines/ 目录包含 PanSt3R、Point-SAM 和 ODIN 的适配器。每个基线都使用与 SAM-V 完全相同的冻结 evaluate_scene 函数和相同的帧列表进行评分,确保比较公平。各阶段的具体命令和所需环境参见 benchmarks/baselines/README.md。
许可证方面,SAM-V 代码采用 Apache-2.0。需要特别注意 NOTICE 文件的内容:VGGT 采用 Meta 研究材料协议而非 OSI 许可,是运行 SAM-V 的必需组件;PanSt3R 基线采用 NAVER 非商业许可。发布的检查点单独采用 CC BY-NC 4.0 许可,商业使用前需要仔细阅读相关条款。
五、局限与未来方向
文章坦诚地指出了当前工作的局限。SAM-V目前仅在内景数据集(Hypersim和ScanNet++)上训练,对户外或物体中心域的泛化尚未测试。公式假设静态环境中的刚性物体,处理可变形实体或动态场景需要针对非刚性运动的时空建模。SAM-V聚焦于提示条件化跟踪,而非开放词汇或语言引导分割。
这些局限也为未来工作指明了方向。克服这些限制将进一步优化这些轻量级3D推理算法,服务于下游机器人应用,如实时人形控制和家庭整理任务。文章还提到,将SAM-V的提示融合机制与视频基础模型或动态场景表示结合,可能是在保持轻量化的同时扩展到动态环境的可行路径。
写在最后
SAM-V的核心贡献不在于提出更复杂的网络架构,而在于用几何感知的提示融合重新思考了2D基础模型与3D几何理解的连接方式。将VGGT的相机token和局部几何特征注入SAM的稀疏提示嵌入,让每个提示都“知道自己来自哪个视图、在场景中哪个位置”,解码器就能在单次前向传播中输出跨视角一致的掩码,而不需要离线匹配或显式3D重建。
文章最值得关注的数字是5.7 T-mIoU和12 R@50。在ScanNet++上,SAM-V相比最强基线PanSt3R的T-mIoU高出5.7,R@50高出11.8;相比IGGT,R@50高出17.5。在零样本ScanNet上,所有四个指标全部领先。
从更宏观的视角看,SAM-V代表了一类新的思路:不是把2D基础模型和3D基础模型在输出层面拼起来,而是在特征和提示层面深度融合。VGGT提供几何,SAM提供分割,两者在解码前就已经融为一体。对于正在探索3D感知和机器人视觉的研究者而言,这种“在解码前融合”的设计哲学可能比具体的架构选择更具启发意义。代码和模型权重已公开,研究者可以基于这一框架探索更广泛的3D感知应用。
本文仅做学术分享,如有侵权,请联系删文。
。




扫码添加微信,备注:姓名+方向+单位,邀请入群。