SAM3 与开放词表分割 本节摘要:给模型一段文本提示和一张图,就能拿到每个匹配物体的掩码——SAM 3 让这一切在单次前向里完成。本节区分 SAM(仅视觉提示)、Grounded SAM/SAM 2(检测器+SAM 级联)与 SAM 3(经「可提示概念分割」原生支持文本提示)三代;讲清 SAM 3 的架构(共享主干 + 图像检测器 + 基于记忆的视频跟踪器 + 存在性头 + 解耦的检测-跟踪设计)、2026 年 3 月 Object Multiplex 更新如何高效跟踪同概念的多个实例;用 Hugging Face 跑文本提示的检测、分割、视频跟踪;并在 SAM 3、Grounded SAM 2、YOLO-World、SAM-MI 间按延迟、概念复杂度、部署目标做选择。
本节摘要:给模型一段文本提示和一张图,就能拿到每个匹配物体的掩码——SAM 3 让这一切在单次前向里完成。本节区分 SAM(仅视觉提示)、Grounded SAM/SAM 2(检测器+SAM 级联)与 SAM 3(经「可提示概念分割」原生支持文本提示)三代;讲清 SAM 3 的架构(共享主干 + 图像检测器 + 基于记忆的视频跟踪器 + 存在性头 + 解耦的检测-跟踪设计)、2026 年 3 月 Object Multiplex 更新如何高效跟踪同概念的多个实例;用 Hugging Face
transformers跑文本提示的检测、分割、视频跟踪;并在 SAM 3、Grounded SAM 2、YOLO-World、SAM-MI 间按延迟、概念复杂度、部署目标做选择。读完本节,你理解了 2D 分割、检测、图文落地如何合并进一个模型。
对应原课程:Phase 4 · Lesson 24 ·
sam3-open-vocab-segmentation(原英文phases/04-computer-vision/24-sam3-open-vocab-segmentation/docs/en.md)。
阅读完本节,你应当能够:
transformers 的 SAM 3 集成做文本提示的检测、分割、视频跟踪。2023 年的 SAM 是个仅视觉提示的模型:你点一个点或画一个框,它返回一个掩码。要「给我这张照片里所有的橙子」,你需要一个检测器(Grounding DINO)产出框,再用 SAM 分割每一个。Grounded SAM 把这变成流水线,但它是两个冻结模型的级联,误差累积不可避免。
SAM 3(Meta,2025 年 11 月,ICLR 2026)把级联折叠了。它接受短名词短语或图像范例作提示,在单次前向里返回所有匹配掩码和实例 ID——这就是可提示概念分割(Promptable Concept Segmentation, PCS)。配合 2026 年 3 月的 Object Multiplex 更新(SAM 3.1),它能高效地在视频里跟踪同一概念的多个实例。
本节讲的是这次结构性转变。2D 分割、检测、图文落地已合并进一个模型。生产问题不再是「我该串起哪条流水线」,而是「哪个可提示模型端到端地处理我的用例」。
「概念提示」是短名词短语(「黄色校车」、「条纹红伞」、「握着杯子的手」)或图像范例。模型为图中每个匹配概念的实例返回分割掩码,外加每个匹配的唯一实例 ID。
这与经典视觉提示 SAM 有三点不同:
SAM 3 在 400 万个独特概念上训练,概念由数据引擎用 AI + 人工审核迭代标注纠正生成。新 SA-CO 基准含 27 万独特概念,比先前基准大 50 倍。SAM 3 在 SA-CO 上达人类性能的 75~80%,在图像+视频 PCS 上比现有系统翻倍。
2026 年 3 月更新:Object Multiplex 引入共享记忆机制,一次联合跟踪同一概念的多个实例。以前跟踪 N 个实例要 N 个独立记忆库,Multiplex 折叠成一个带每实例查询的共享记忆,结果:多目标跟踪大幅提速且不掉精度。
模块化流水线仍有位置。多数生产工作里,SAM 3 是更简单的答案。
生产分工:YOLO-World 给只要检测的快流水线(机器人导航、快仪表盘),SAM 3 给任何要掩码或跟踪的场景。
SAM-MI(2025-2026)解决 SAM 的解码器瓶颈,关键思想:
结果:开放词表基准上比 Grounded-SAM 快约 1.6 倍。
都返回同一通用结构(框+标签+分数+掩码+ID),这很有用——下游流水线不必按跑了哪个模型分支。
建一个助手,把用户句子转成 SAM 3 概念提示列表。这是「用户打的字」与「模型消费的」之间的边界。
def split_concepts(sentence): """ 多概念提示的启发式切分器,返回短名词短语列表。 """ for sep in [",", ";", "and", "or", "&"]: if sep in sentence: parts = [p.strip() for p in sentence.replace("and ", ",").split(",")] return [p for p in parts if p] return [sentence.strip()] print(split_concepts("cats, dogs and balloons"))
SAM 3 每次前向接受一个概念;多概念查询时循环或批处理。
把 SAM 3 的原始输出转成匹配第 16 节流水线契约的干净检测列表。
from dataclasses import dataclass from typing import List @dataclass class ConceptDetection: concept: str instance_id: int box: tuple # (x1, y1, x2, y2) score: float mask_rle: str # 游程编码 def rle_encode(binary_mask): flat = binary_mask.flatten().astype("uint8") runs = [] prev, count = flat[0], 0 for v in flat: if v == prev: count += 1 else: runs.append((int(prev), count)) prev, count = v, 1 runs.append((int(prev), count)) return ";".join(f"{v}x{c}" for v, c in runs)
RLE 让即便多张高分辨率掩码的响应载荷也小。同一格式跨 SAM 2、SAM 3、Grounded SAM 2 通用。
把任意后端(SAM 3、Grounded SAM 2、YOLO-World + SAM 2)藏在单一方法后,下游代码在后端更换时不变。
from abc import ABC, abstractmethod import numpy as np class OpenVocabSeg(ABC): @abstractmethod def detect(self, image: np.ndarray, concept: str) -> List[ConceptDetection]: ... class StubOpenVocabSeg(OpenVocabSeg): """ 未加载真实模型时用于流水线测试的确定性桩。 """ def detect(self, image, concept): h, w = image.shape[:2] return [ ConceptDetection( concept=concept, instance_id=0, box=(w * 0.2, h * 0.3, w * 0.5, h * 0.8), score=0.89, mask_rle="0x100;1x50;0x200", ), ConceptDetection( concept=concept, instance_id=1, box=(w * 0.55, h * 0.25, w * 0.85, h * 0.75), score=0.74, mask_rle="0x80;1x40;0x220", ), ]
真实的 SAM3OpenVocabSeg 子类会包装 transformers.Sam3Model 和 Sam3Processor。
真实模型用 transformers 集成:
from transformers import Sam3Processor, Sam3Model import torch processor = Sam3Processor.from_pretrained("facebook/sam3") model = Sam3Model.from_pretrained("facebook/sam3").eval() inputs = processor(images=pil_image, return_tensors="pt") inputs = processor.set_text_prompt(inputs, "yellow school bus") with torch.no_grad(): outputs = model(**inputs) masks = processor.post_process_masks( outputs.masks, inputs.original_sizes, inputs.reshaped_input_sizes ) boxes = outputs.boxes scores = outputs.scores
一个提示,一次调用返回所有匹配。
诚实基准:在真实流水线里把 Grounded SAM 2 换成 SAM 3 会怎样?
结论:SAM 3 是 2026 开放词表分割的默认;需要检测器灵活性或不同授权条款时,Grounded SAM 2 仍是对的选择。
生产部署模式:
Ultralytics 在其 Python 包里包装了 SAM 3:
from ultralytics import SAM model = SAM("sam3.pt") results = model(image_path, prompts="yellow school bus")
与 YOLO、SAM 2 同接口。
本节产出两个可复用文件(位于原课程 outputs/):
prompt-open-vocab-stack-picker.md:按延迟、概念复杂度、授权,在 SAM 3 / Grounded SAM 2 / YOLO-World / SAM-MI 间挑。skill-concept-prompt-designer.md:把用户话语转成格式良好的 SAM 3 概念提示(切分、消歧、降级)。下一节进入视觉语言模型——把视觉编码器接到 LLM 上,让模型看图说话、读图推理、图文对话。