本文档提供了关于 Segment Anything Model (SAM) 架构的详细技术概述。重点关注模型本身的设计和内部组件。有关通过接口使用模型的信息,请参阅 SamPredictor 和 Automatic Mask Generator。
SAM 由三个主要组件组成,它们协同工作以执行分割。
来源:segment_anything/modeling/sam.py18-48
图像编码器是一个经过修改的 Vision Transformer (ViT),它将输入图像处理成特征表示。
ImageEncoderViT 具有以下关键特征:
| 参数 | 描述 | 默认 |
|---|---|---|
img_size | 输入图像尺寸 | 1024 |
patch_size | 图像 patches 的大小 | 16 |
embed_dim | 嵌入维度 | 768 |
depth | Transformer 块的数量 | 12 |
num_heads | 注意力头的数量 | 12 |
out_chans | 输出特征通道数 | 256 |
window_size | 局部注意力的窗口大小 | 0 (全局) |
来源:segment_anything/modeling/image_encoder.py16-116
提示编码器将用户输入的各种提示(点、框或掩码)转换为可由掩码解码器使用的嵌入。
提示编码器处理三种类型的提示:
来源:segment_anything/modeling/sam.py106-110
掩码解码器结合图像嵌入和提示嵌入来预测分割掩码。
掩码解码器的特点:
双向 Transformer 使得信息能够在稀疏提示 token 和密集图像 token 之间双向流动,从而有效地集成这些不同的模态。
来源:segment_anything/modeling/transformer.py16-240
下图显示了 SAM 模型从输入到输出的完整数据流。
ImageEncoderViT 处理以生成嵌入。PromptEncoder 编码成稀疏和密集嵌入。MaskDecoder 使用 TwoWayTransformer 处理这些嵌入并预测掩码。来源:segment_anything/modeling/sam.py54-174 segment_anything/utils/onnx.py107-144
SAM 有三种尺寸,取决于用于图像编码器的 ViT 主干。
| 变体 | 图像编码器 | 参数 | 特性 |
|---|---|---|---|
| SAM-B | ViT-B | 约 9100 万 | 最小的模型,推理速度最快 |
| SAM-L | ViT-L | 约 3.08 亿 | 中等尺寸,平衡性好 |
| SAM-H | ViT-H | 约 6.36 亿 | 最大的模型,最高质量的输出 |
每个变体使用相同的架构,但 ViT 主干的大小不同。有关模型尺寸考虑因素的更多信息,请参阅 使用不同模型尺寸。
来源:segment_anything/modeling/sam.py18-48
图像编码器使用 Vision Transformer 架构,其图像处理流程如下:
关键实现说明:
来源:segment_anything/modeling/image_encoder.py119-182 segment_anything/modeling/image_encoder.py185-240
双向 Transformer 是 SAM 架构的关键创新。
每个 Transformer 块有四个组件:
这种双向流动允许信息在提示和图像表示之间传递。
最后的注意力层对 token 到图像的嵌入执行最终交互。