SAM3 模型架构深度解析:从 ViT 到像素级开放词汇分割
本文基于 Meta 开源项目 SAM 3(Segment Anything 3)源码,系统剖析其模型架构设计。SAM3 是一个端到端的开放词汇目标检测与分割模型,融合了 Vision Transformer(ViT)视觉编码、Transformer 文本编码、DETR 风格目标检测以及像素级掩码生成等多项技术,实现了通过自然语言短语驱动的实例分割能力。
1. 架构总览
SAM3 的模型架构可划分为六个核心模块,数据流自上而下依次经过各模块处理:
输入:图像(任意分辨率) + 文本短语(如 "person"、"brown handbag")
│
┌───────────────┴───────────────┐
▼ ▼
┌────────────────┐ ┌────────────────┐
│ ViT 视觉编码器 │ │ 文本编码器 │
│ 1008×1008 输入 │ │ BPE 分词 │
│ 32 层 Transformer│ │ 24 层 Transformer│
│ 输出: 1024-d 特征│ │ 输出: 256-d 特征 │
└───────┬────────┘ └───────┬────────┘
│ │
▼ │
┌────────────────┐ │
│ FPN Neck │ │
│ 多尺度特征金字塔 │ │
│ 4 级: 256-d │ │
└───────┬────────┘ │
│ │
▼ ▼
┌──────────────────────────────────────────┐
│ Transformer Encoder(视觉-语言融合) │
│ 6 层,交叉注意力融合视觉与文本特征 │
└─────────────────────┬────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ Transformer Decoder(目标检测) │
│ 6 层,200 个 Object Queries │
│ 输出: 候选边界框 + 匹配分数 │
└─────────────────────┬────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ 分割头(Segmentation Head) │
│ Pixel Decoder + 掩码预测 │
│ 输出: 像素级二值掩码 │
└─────────────────────┬────────────────────┘
│
▼
输出:N 个边界框 + N 个置信度分数 + N 个实例掩码
整个模型的推理过程为单次前向传播,不涉及自回归生成。给定一张图像和一个文本短语,模型一次性输出所有匹配实例的检测框与分割掩码。
2. ViT 视觉编码器
SAM3 采用大规模 Vision Transformer 作为视觉骨干网络,其具体配置如下:
ViT(
img_size=1008, # 输入分辨率统一为 1008×1008
patch_size=14, # 每 14×14 像素划分为一个 patch
embed_dim=1024, # 每个 patch 编码为 1024 维向量
depth=32, # 32 层 Transformer 块
num_heads=16, # 16 头多头注意力
mlp_ratio=4.625, # FFN 隐藏层维度 = 1024 × 4.625 ≈ 4736
window_size=24, # 窗口注意力的窗口大小
global_att_blocks=(7, 15, 23, 31), # 第 7/15/23/31 层使用全局注意力
use_rope=True, # 使用旋转位置编码(RoPE)
)
2.1 Patch 嵌入
输入图像首先被缩放至 1008×1008 分辨率,随后按 14×14 的 patch 大小划分为 72×72 = 5184 个图像块。每个 patch 经线性投影映射为 1024 维的嵌入向量,形成初始 token 序列。
2.2 混合注意力策略
为平衡计算效率与全局感知能力,SAM3 的 ViT 采用窗口注意力与全局注意力交替使用的混合策略:
- 大部分层(28 层)使用窗口注意力(window size = 24),每个 token 仅与同一窗口内的 token 计算注意力,计算复杂度从 O(N²) 降至 O(N × W²)
- 第 7、15、23、31 层(共 4 层)使用全局注意力,允许所有 token 之间的信息交互,确保模型具备全局上下文感知能力
该设计与 Swin Transformer 的分层窗口策略思路相近,但通过在固定层插入全局注意力实现跨窗口信息传播。
2.3 位置编码
模型同时使用绝对位置编码与旋转位置编码(RoPE)。绝对位置编码在预训练分辨率(336×336)基础上通过 tile 方式扩展至 1008×1008;RoPE 则通过插值适配不同分辨率,为注意力计算提供相对位置信息。
2.4 输出
ViT 最终输出一个空间分辨率为 72×72、通道维度为 1024 的特征图,作为后续模块的输入。
3. FPN Neck(特征金字塔网络)
为支持不同尺度目标的检测与分割,SAM3 在 ViT 输出之上构建了一个简化版特征金字塔网络(SimpleFPN):
Sam3DualViTDetNeck(
d_model=256,
scale_factors=[4.0, 2.0, 1.0, 0.5],
)
该模块将 ViT 输出的单尺度特征通过不同的卷积/池化操作生成四级多尺度特征:
| 尺度因子 | 操作 | 输出分辨率 | 适用场景 |
|---|---|---|---|
| 4.0× | 两次转置卷积(2×2, stride=2) | 288×288 | 小目标检测 |
| 2.0× | 一次转置卷积(2×2, stride=2) | 144×144 | 中小目标 |
| 1.0× | 恒等映射 | 72×72 | 中等目标 |
| 0.5× | 最大池化(2×2, stride=2) | 36×36 | 大目标检测 |
每级特征均通过 1×1 卷积和 3×3 卷积投影至统一的 256 维通道空间。
此外,SAM3 支持双 Neck 配置(add_sam2_neck=True),为 SAM2 兼容的交互式分割任务提供独立的特征通路,两套 Neck 共享 ViT 骨干但拥有独立的卷积权重。
4. 文本编码器
SAM3 使用独立的 Transformer 文本编码器处理输入文本:
VETextEncoder(
d_model=256, # 输出维度
width=1024, # 内部隐藏维度
heads=16, # 注意力头数
layers=24, # 24 层 Transformer
)
4.1 分词与编码
文本编码器使用 BPE(Byte Pair Encoding)分词器将输入短语切分为子词 token,随后通过 24 层 Transformer 编码器提取上下文化的文本特征。最终输出为一组 256 维的 token 级特征向量及对应的注意力掩码。
4.2 设计定位
该文本编码器的架构与 CLIP 文本编码器相似,其设计目标是将文本语义映射到与视觉特征对齐的嵌入空间中,而非实现通用的语言理解或生成能力。因此,SAM3 的文本接口仅支持简短的名词短语输入(如 “person”、“red car”),无法处理复杂的指代表达或推理性查询。
5. Transformer Encoder(视觉-语言融合)
视觉特征与文本特征在 Transformer Encoder 中通过交叉注意力机制进行融合:
TransformerEncoderFusion(
num_layers=6,
d_model=256,
num_feature_levels=1,
)
每层 Encoder 包含:
- 自注意力层(Self-Attention):视觉 token 之间的信息交互
- 交叉注意力层(Cross-Attention):视觉 token 对文本 token 的注意力查询
经过 6 层融合后,视觉特征中已编码了文本查询的语义信息——即特征图"知道"了需要寻找什么目标。该融合机制使得后续的检测器能够根据文本语义定位对应的视觉区域。
6. Transformer Decoder(目标检测)
SAM3 采用 DETR 风格的 Transformer Decoder 实现目标检测:
TransformerDecoder(
num_layers=6, # 6 层解码器
num_queries=200, # 200 个可学习的 Object Queries
box_refine=True, # 逐层边界框精炼
dac=True, # 去重分配约束(De-duplication Assignment Constraint)
presence_token=True, # 存在性判断 token
resolution=1008,
stride=14,
)
6.1 Object Queries
200 个可学习的 query 向量作为"检测槽位",每个 query 通过交叉注意力从编码后的特征中"查询"潜在目标的位置和类别信息。在 6 层解码过程中,每个 query 逐步聚焦于图像中的某个特定区域。
6.2 边界框精炼(Box Refinement)
启用 box_refine=True 后,每层解码器都会输出一组边界框预测,后续层在前一层预测的基础上进行残差修正,实现逐层精炼。
6.3 去重机制(DAC)
DAC(De-duplication Assignment Constraint)机制通过在训练时引入一对多(O2M)匹配的辅助 queries,配合一对一(O2O)匹配的主 queries,有效抑制对同一目标的重复检测。推理时仅使用 O2O queries 的输出。
6.4 评分机制
检测分数通过点积评分模块(Dot Product Scoring)计算:
DotProductScoring(d_model=256, d_proj=256)
该模块将 decoder 输出的 query 特征与文本特征进行点积运算,得到每个候选检测与文本查询的语义匹配分数。结合 presence token 的存在性判断,最终通过置信度阈值(默认 0.5)过滤低质量检测。
7. 分割头(Segmentation Head)
通过置信度阈值的候选检测将进入分割头,生成像素级掩码:
UniversalSegmentationHead(
hidden_dim=256,
upsampling_stages=3, # 3 次上采样
)
7.1 Pixel Decoder
PixelDecoder(
num_upsampling_stages=3,
interpolation_mode="nearest",
hidden_dim=256,
)
Pixel Decoder 将编码器输出的低分辨率特征逐步上采样至接近原图分辨率,为掩码预测提供高分辨率的像素级特征。
7.2 掩码生成
对每个通过阈值的检测 query,分割头执行以下操作:
- 将 query 特征通过交叉注意力与文本特征进一步对齐
- 将对齐后的 query 特征与 Pixel Decoder 输出的高分辨率特征做逐像素点积
- 经过 sigmoid 激活得到每个像素属于该实例的概率图
- 以 0.5 为阈值二值化,生成最终的实例掩码
7.3 输出格式
最终输出以 RLE(Run-Length Encoding)格式编码的二值掩码,配合对应的边界框坐标和置信度分数,构成完整的检测分割结果。
8. 几何提示编码器(Geometry Encoder)
除文本提示外,SAM3 还支持几何提示(点、框)作为辅助输入:
GeometryEncoder(
position_encoding=...,
fuser=CXBlock(dim=256, kernel_size=7),
encoder_layer=TransformerEncoderLayer(...),
mask_encoder=MaskEncoder(...),
)
几何提示编码器将用户提供的点坐标或边界框编码为与视觉特征同维度的嵌入向量,与文本特征拼接后共同参与 Transformer Encoder 的融合过程。该机制使 SAM3 能够同时接受文本和空间位置作为查询条件,支持交互式分割场景。
9. 推理流程总结
SAM3 的完整推理流程可概括为以下步骤:
# 1. 图像编码(仅需执行一次,可复用)
state = processor.set_image(image)
# 内部执行:图像预处理 → ViT 前向 → FPN Neck → 缓存视觉特征
# 2. 文本编码 + 检测 + 分割
state = processor.set_text_prompt(state=state, prompt="child")
# 内部执行:
# 文本编码 → Transformer Encoder 融合 →
# Transformer Decoder 检测 → 置信度过滤 →
# 分割头生成掩码 → 输出结果
值得注意的是,set_image 的结果可被缓存复用。当对同一张图像使用不同文本查询时,无需重复执行视觉编码,仅需重新执行文本编码及后续流程,显著降低了多次查询的计算开销。
10. 模型规模与计算特性
基于源码中的架构参数,SAM3 各模块的规模估算如下:
| 模块 | 层数 | 隐藏维度 | 估算参数量 |
|---|---|---|---|
| ViT 视觉编码器 | 32 | 1024 | ~300M |
| 文本编码器 | 24 | 1024 | ~150M |
| FPN Neck | - | 256 | ~10M |
| Transformer Encoder | 6 | 256 | ~10M |
| Transformer Decoder | 6 | 256 | ~15M |
| 分割头 | - | 256 | ~10M |
| 合计 | - | - | ~500M |
计算特性
- 推理方式:单次前向传播,非自回归生成
- 计算瓶颈:ViT 视觉编码器占据约 60% 的计算量
- 显存占用:主要由 ViT 的 5184 个 token 的注意力计算决定
- 支持半精度:通过
torch.autocast("cuda", dtype=torch.bfloat16)实现 BF16 推理 - 支持编译优化:通过
torch.compile实现算子融合加速
11. 与相关工作的架构对比
| 特性 | SAM3 | Grounding DINO | SAM2 | CLIP |
|---|---|---|---|---|
| 视觉编码器 | ViT-L (32层) | Swin-T/L | Hiera | ViT-L |
| 文本编码器 | 独立 Transformer (24层) | BERT | 无 | Transformer (12层) |
| 检测机制 | DETR Decoder (200 queries) | DETR Decoder | 无(需外部提示) | 无 |
| 分割能力 | 像素级实例掩码 | 边界框 | 像素级掩码 | 无 |
| 文本输入 | 名词短语 | 名词短语 | 不支持 | 句子级 |
| 开放词汇 | ✓ | ✓ | ✗ | ✓(分类) |
SAM3 可视为 Grounding DINO 的分割增强版本与 SAM2 的文本驱动版本的统一体,在单一模型中同时实现了开放词汇检测与像素级分割。
12. 部署与加速
SAM3 作为非自回归的视觉模型,不适用于 vLLM 等面向语言模型的推理引擎,但可通过以下方式实现推理加速:
torch.compile:源码已内置支持,通过compile=True参数启用- TensorRT:将模型导出为优化后的推理引擎,适合生产环境部署
- 半精度推理:BF16/FP16 计算,显存减半且精度损失极小
- 批处理:通过
set_image_batch接口实现多图并行推理 - 图像编码缓存:同一图像的多次文本查询可复用视觉特征
模型权重通过 HuggingFace Hub 分发(facebook/sam3),支持自动下载与本地加载两种方式。
13. 总结
SAM3 的模型架构体现了当前视觉基础模型的几个重要设计趋势:
- 大规模 ViT 骨干:通过混合注意力策略在高分辨率输入上实现高效编码
- 视觉-语言对齐:独立编码后通过交叉注意力融合,实现开放词汇能力
- DETR 范式检测:端到端目标检测,无需 NMS 等后处理(训练时通过 DAC 去重)
- 统一的检测-分割框架:在检测结果基础上直接生成像素级掩码,避免两阶段流水线的信息损失
该架构使 SAM3 能够在单次前向传播中完成从文本理解到像素级分割的全流程,为下游的 Agent 系统和交互式标注工具提供了高效的视觉感知基础。
本文基于 SAM3 开源代码分析撰写,代码版本为 SAM 3.1(2026 年 3 月发布)。文中架构参数均来自源码中的模型构建函数,完整实现请参考原始仓库。
参考资料
- SAM 3 论文:https://arxiv.org/abs/2511.16719
- SAM 3 GitHub 仓库:https://github.com/facebookresearch/sam3
- DETR 论文:https://arxiv.org/abs/2005.12872
- ViTDet 论文:https://arxiv.org/abs/2203.16527
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)