文章

SAM技术简介

SAM技术简介

SAM技术简介

介绍 SAM 的能力边界、是否「通用」、与检测/分类的关系,以及在 医学或体表局部成像 类项目中的典型用法;说明 「高质量标注」能带来什么、不能推出什么;并概括 如何面向固定任务训练更轻量的分割模型不涉及具体业务数据、路径或内部工程细节,便于对外分享与脱敏引用。


1. 一句话

SAM 是 Meta 发布的一类 大规模预训练的交互式图像分割 模型:给定一张图和 提示(点、框、粗略 mask 等),输出 像素级前景 mask。它强在 零样本或弱适配 下对多种物体轮廓的泛化,不是「自动说出图上有什么语义类别」的万能识别器。

官方论文与项目(公开资料):


2. 为什么看起来「哪都能用」

SAM 在 极大规模、多样化 的标注上训练,学习的是:「在提示引导下,把与提示一致的区域抠出来」。因此:

  • 同一套权重 可试用于自然场景、产品、部分医学/显微图像等,常被称为 基础模型(foundation model) 在分割方向的一种形态。
  • 「能用」≠「开箱即用就最优」:光照、尺度、纹理与训练分布差得远时,mask 质量会掉,往往需要 更好的提示领域微调 或与 专用检测头 联用。

所以更准确的说法是:架构与预训练使其具有很强的跨域「试分割」能力,是否满足产线指标要 按域评测,而不是默认「通用解决方案」。


3. 「好标注就能分一切」吗?需要先分清三件事

不少文章把 SAM 描述得很强,容易产生一种印象:只要把标注数据做得很漂亮,什么都可以像素级抠出来。更接近事实的说法在下面。

(1)训练阶段的「高质量标注」≠ 推理时随便给个 mask 就能通灵

  • SAM 原始工作是在 超大规模 SA-1B 等与提示配合的标注上完成 预训练 的;你手里的「高质量标注」若用于 微调 / 领域适配,确实能 拉高在目标域上的 Dice、IoU,但前提是:数据量与场景覆盖面足够(少数几张「完美标注」通常撑不起复杂域迁移),且 训练策略、解冻层、分辨率 等与任务匹配。
  • 推理 everyday 使用时,常见输入并不是「再给模型喂一整套训练标注」,而是 点、框、粗 mask 等提示。此时「高质量」更多指 提示是否对准目标(框是否贴边、点是否落在前景上)。提示错了或含糊,再强的预训练也会跟错对象。

(2)即便提示与数据都合理,也不是「任何概念都能无歧义地分出来」

  • 边界本身模糊:毛发与皮肤、烟雾、透明物体、强反光等,人类标注也会不一致,模型只能学到某种折中,不会存在单一「真值」。
  • 划分不唯一:同一图像里「一个物体」可以按功能、按部件、按实例切分,SAM 跟提示走;没有提示或提示不足时,不存在唯一正确的「全图自动抠图」语义。
  • 域外模态与外观:训练以自然图像为主(及后续医学等变体的再训练);内镜纹理、遥感特殊波段、工业缺陷等与预训练分布差得远时,仅靠小规模高质量标注,往往仍要面对 欠拟合、过拟合、泛化到新中心/新批次 的问题。

(3)工程上的天花板:分辨率、速度与后处理

  • 特征图分辨率、输入最长边缩放等会带来 细碎结构丢失(小血管细丝、极小病灶),这不是「多加两条好标注」在推理瞬间能消失的。
  • 实时或边缘部署会限制模型体量,常用 小号 ViT,与论文里大尺寸演示的观感可能不一致。

一句话收束:高质量标注主要体现在「训得好 / 提示得准」两条线上;SAM 仍然是 在给定提示下做前景–背景分割的强基座,既不是 无需提示的全自动语义分割,也不是 在任意概念、任意模态上都能达到人类一致界面的神话——是否够用,始终要用目标域指标和失败样例清单来说话


4. 结构直觉(不写公式)

典型三段式(与公开 SAM 描述一致):

模块作用(白话)
Image Encoder读整图,得到多尺度特征图(如 ViT 骨干)。
Prompt Encoder把点、框等编码成可与图像特征对齐的向量。
Mask Decoder融合图像特征与提示,预测 二值 mask(或少量候选 mask 供选)。

推理时:提示越准,mask 往往越稳。全自动场景下常见做法是:用另一个模型生成框/点当提示,再交给 SAM 出精细轮廓——这是许多 「X + SAM」 医学或工业项目的共同套路。


5. 「在脸上分出各种器官」算不算 SAM 的本职?

  • SAM 不内置「眼睛、鼻子、嘴唇」等语义表;它做的是 分割实例/区域,类别名需要 你自己定义 或通过 多提示、多通道后处理 组织。
  • 可行路径:对人脸图用 人脸检测 + 各器官的框/关键点 作为提示,再调用 SAM 细化边界;或使用 已在人脸/医学数据上微调过的变体,效果通常优于裸 SAM + 乱点。
  • 与通用性的关系:SAM 提供 「跟提示走的分割引擎」器官级语义流水线 仍要 检测、关键点、规则或多任务头 来补齐。

6. 与目标检测、图像分类的关系

任务输出与 SAM 的分工
检测框 + 类别常负责 粗定位,框可作 SAM 的 box prompt
分割(含 SAM)像素级区域负责 轮廓与区域形状,可减少框内背景。
分类整图或 ROI 的类别多在 裁切后另一支网络 上完成;SAM 本身不替代 细粒度类别学习。

因此:分割解决「区域在哪、边界多紧」;分类解决「区域内语义/表型标签」。临床或表型分析里,常见 pipeline 是 定位/分割 → 规范 ROI → 再分类或特征工程


7. 领域适配:医学与体表局部成像(泛化叙述)

公开文献中常见三类做法(仅举逻辑,不绑定具体仓库):

  1. 提示生成器:用轻量检测器在图上给出 舌、病灶、器官等 的框,再输入 SAM/MedSAM 系模型做 mask(端到端或半自动)。
  2. 领域微调:在目标域 mask 标注上 只训部分层Adapter,保留 SAM 的泛化又贴近域内分布。
  3. 替换编码器:在医学影像上已有 MedSAM 等工作,思路仍是 提示 + 解码,但预训练数据与医学更对齐。

若仅做技术调研,可检索:MedSAMSAM 医学promptable segmentation 等关键词,结合 ISO/国标舌诊术语 等规范理解「分割结果」与「诊断语义」仍是两层事。


8. 怎样训练自己想要分割的「小模型」?

本节面向 「目标固定、要可控算力与延迟」 的实践:例如只想分 舌体轮廓 / 某类缺陷 / 单一器官,且希望模型 比 SAM 大块头更轻、或推理时 不再需要人工点框。思路与是否使用 SAM 预训练可以拆开看。自用微调时,建议先完成 §8.1~8.2(选档、下载 checkpoint、对齐训练链),再自 §8.3 起做任务定义、数据与路线选择。

8.1 下载预训练模型:vit_b / vit_l / vit_h 怎么选

Meta 在官方仓库提供了 三套不同体量 的 SAM 权重,可按 显存、延迟与精度诉求 挑选。下表列出常用的体量与典型适用场景对照。

模型版本参数量(量级)权重文件体量(量级)常见适用场景
vit_h(超大)约 6.4 亿约 2.4 GB精度优先、有充足 GPU 显存的科研或可接受高算力成本的生产验证
vit_l(大)约 3 亿约 1.2 GB通用折中:多数离线微调与离线推理的默认「甜点」档位之一
vit_b(基础)约 9100 万约 375 MB快速试验、笔记本或显存偏小、或对 吞吐量/延迟 更敏感的部署预研

下载入口以官方为准:facebookresearch/segment-anything — Model checkpoints(页面列有各变体文件名,如 sam_vit_b_01ec64.pth 等,与 README 保持一致即可)。教程常 以 vit_b 为例贯穿「下载路径 → 训练脚本 --checkpoint(或等价参数)→ 验证」,换 vit_l / vit_h 时务必 整套配置与权重名称同步更换,否则会因 Vision Transformer 深度、embed 维度不一致load_state_dict 阶段直接报错。

8.2 从「下载权重」接上训练流水线(自用微调语境)

以下为 Meta 原版「造 SA-1B」全量预训练,而是在 选定 vit_b/l/h 任一 checkpoint 之后的 领域微调 中,与官方推理脚本及常见微调代码结构一致的推荐顺序:

1
2
3
4
5
6
7
8
9
10
11
12
(1)落盘 checkpoint:如 work_dir/sam/sam_vit_b_01ec64.pth(路径随意,与配置一致即可)
       │
(2)数据:原图 + GT mask │ train / val 划分 │ 分辨率与文件名规则与 DataLoader 一致
       │
(3)读入模型构件:SAM 构造函数的 model_type ∈ {vit_b,vit_l,vit_h} 与权重 **必须同属一档**
       │
(4)训练策略(常见微调):Image Encoder **eval + requires_grad=False**;只对 Mask Decoder /
     Prompt Encoder(及可选 Adapter)反传 │ 或由 GT mask 自动生成框/点充当「仿真提示」
       │
(5)损失与验证:像素级 focal / Dice / CE 等与 GT 对齐;val 上算 Dice、IoU │ 可视化错例
       │
(6)保存 best 权重;推理时再 load **同一 model_type + 微调后 state_dict**,避免混用档位

实践提示vit_b 更适合先跑通数据管线与小学习率冒烟训练;若在 val 上 边界仍明显不达产线,再升级到 vit_l 做小步对照实验——同时接受 更长迭代时间与更大显存vit_h 多在 离线、精度敏感 场景尝试,部署前仍建议做 蒸馏或量化§8.5 中的轻量路线对照。


8.3 先定任务形状

维度你该先想清楚
输出二值前景(一类)还是 多类别语义分割(每像素一个类 id)?是否要 实例级(多块同类也要分开)?
推理形态全自动(整张图进网络出 mask)还是需要 先检测再裁 ROI?ROI 往往能降低分辨率、减轻小目标问题。
成功标准Dice、IoU、边界 Hausdorff / 像素误差 等写进验收表;是否要面向 最差分位(如尾部 10% 难例)单独设门槛。

和 SAM 的分工:若业务是 固定的「图上永远只抠这一块」,训练一个 端到端小分割头 往往比在线维护「检测 + SAM + 多点提示」更简单;若 目标形体变化极大、强依赖交互修正,仍可保留 SAM 或大模型微调路线。

8.4 数据与标注——小模型成败的大头

  • 标注形式:语义 mask(单通道整数图)、或多边形导出为 COCO/JSON 后再栅格化;需统一 -ignore 或边界过渡 的约定(尤其医学薄边界)。
  • 数量与分层:划分 train / val / test 时最好按 采集批次、设备、中心 分层,避免「验证集其实只是训练同分布」,上线后翻车。
  • 增强:翻转、缩放、裁剪、photometric jitter;生物医学里 弹性形变、轻微模糊 常有助于边界泛化。增强不能替代 真实疑难样本
  • 类不平衡:前景占比极小时(小病灶),光有「高质量几张图」不够,需在 采样、损失加权、难例挖掘 上一起做(见下文损失)。

8.5 三条常见技术路线

路线 A——在 SAM 上做参数高效微调(仍带提示链路)

  • 做法:大范围 冻结 ViT Image Encoder,只训 Mask Decoder,或在 Encoder 上加 Adapter / LoRA,用你域内的 图像 + (点/框/bbox)提示 + GT mask 做监督。
  • 提示从哪来:交互产品可继续人工点;离线训练时可从 GT mask 自动生成 框、中心点、随机前景点 等,让模型学成「常规提示下的域内形状」。
  • 适合:你已确认 SAM 零样本不够好,但仍想利用其 Mask Decoder 与高维特征,且部署端仍能接受 SAM 量级或 vit_b 级骨干。

路线 B——轻量语义分割网络(端到端、「小模型」最常见)

  • 做法:encoder 采用 MobileNet / EfficientNet / ResNet18 等,解码用 FPN / U-Net 式跳转 / SegFormer-Tiny / DeepLabV3+ Mobile 一类成熟结构;输入固定分辨率或按需使用可变形卷积等。
  • 监督:整张图送进网络,像素级 CE + Dice(或 Lovász、focal)最常用。
  • 适合单模态固定场景、要 GPU/CPU 皆可推无需提示 的产线或 App;参数量可到 几百万~几千万 级,远小于 SAM。

路线 C——蒸馏或伪标签

  • 做法:用大模型(含微调后的 SAM 或教师 Segmentation)在无标或弱标图上生成 mask 伪标签,再训学生小网;或对 ** logits / 特征** 做 KD。
  • 风险:伪标签误差会带进学生,需 置信度滤波、人机抽检、仅用高置信样本
  • 适合:标数据贵,但 能接受一轮清洗;或需要 速度与精度折中

8.6 损失函数与训练小技巧

常见问题可考虑的方向
前景极小Dice / Tversky / focal loss;或 正负样本加权 CE
边界锯齿边界加权 CE;辅助 boundary map 分支;评测时多看 boundary F-score
过拟合更强增强、dropout、更小模型、早停EMA;检查标注噪声。

优化器与学习率:AdamW + warmup + cosine 是一类稳妥默认;Encoder 更小 lr、Decoder 正常 lr 的分组常见。

8.7 选型一句话

你的情况可优先考虑的路线
已有 SAM baseline,只差域内最后一公里、仍要交互SAM 局部微调(路线 A)
固定类别、全天候自动跑、延迟/功耗敏感轻量语义分割(路线 B)
标数据极少,但有大批量无标图像教师伪标签 + 小网(路线 C),严控噪声

训练完成后:在「未参与训练的设备/季节/批次」上留测试集,并保留 可视化失败相册,比单纯盯平均 IoU 更有利于上线决策。


9. 能力边界与成本

  • 数据与语义上限:单靠「标注很精细」并不等于突破 任务歧义性、域差距、分辨率 的限制;更系统的讨论见 §3
  • 算力:ViT-H 等变体推理与显存明显高于小检测网络;边缘端常选 vit_b 级或蒸馏方案。
  • 提示依赖:无提示时 SAM 并非「全自动语义分割」;全自动需 级联模块
  • 评价指标:分割看 Dice、IoU、边界距离 等;是否与下游 分类/检索 指标一致,要 单独验证

10. 小结

问题简要结论
SAM 是什么?提示驱动的通用分割基础模型,输出 mask,不是分类器。
是否通用解决方案?在「跟提示做分割」这一子问题上泛化很强;完整业务需 检测/提示/微调/后处理 组合,域内效果要靠评测
有好标注是不是「啥都能分」?不是微调数据能改善域内曲线,仍需 量级与覆盖推理靠提示,ambiguous/域外场景仍有上限;见上文 §3
想自己要「小模型」怎么训?先按需下载并对齐 SAM 档位(§8.1~8.2);再定任务与路线(§8.3~8.5),配套损失与正则(§8.6);总表见 §8.7。

11. 延伸阅读(公开链接)

本文由作者按照 CC BY 4.0 进行授权