SAM技术简介
SAM技术简介
介绍 SAM 的能力边界、是否「通用」、与检测/分类的关系,以及在 医学或体表局部成像 类项目中的典型用法;说明 「高质量标注」能带来什么、不能推出什么;并概括 如何面向固定任务训练更轻量的分割模型。不涉及具体业务数据、路径或内部工程细节,便于对外分享与脱敏引用。
1. 一句话
SAM 是 Meta 发布的一类 大规模预训练的交互式图像分割 模型:给定一张图和 提示(点、框、粗略 mask 等),输出 像素级前景 mask。它强在 零样本或弱适配 下对多种物体轮廓的泛化,不是「自动说出图上有什么语义类别」的万能识别器。
官方论文与项目(公开资料):
- 论文:Segment Anything(arXiv:2304.02643)
- 代码与模型说明:facebookresearch/segment-anything
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. 领域适配:医学与体表局部成像(泛化叙述)
公开文献中常见三类做法(仅举逻辑,不绑定具体仓库):
- 提示生成器:用轻量检测器在图上给出 舌、病灶、器官等 的框,再输入 SAM/MedSAM 系模型做 mask(端到端或半自动)。
- 领域微调:在目标域 mask 标注上 只训部分层 或 Adapter,保留 SAM 的泛化又贴近域内分布。
- 替换编码器:在医学影像上已有 MedSAM 等工作,思路仍是 提示 + 解码,但预训练数据与医学更对齐。
若仅做技术调研,可检索:MedSAM、SAM 医学、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. 延伸阅读(公开链接)
- SAM 论文:https://arxiv.org/abs/2304.02643
- SAM 官方仓库(含 checkpoint 列表):https://github.com/facebookresearch/segment-anything
- 将 SAM 用于 特定器官分割、并与检测提示结合 的公开学术实现示例(仅作方法论参考):TongueSAM 论文 https://arxiv.org/abs/2308.06444(标题与摘要中说明了 SAM + Prompt Generator 的端到端思路)
