
Segment Anything SAM 微调完整指南3 个阶段跑通只懂你领域的分割模型【免费下载链接】segment-anythingThe repository provides code for running inference with the SegmentAnything Model (SAM), links for downloading the trained model checkpoints, and example notebooks that show how to use the model.项目地址: https://gitcode.com/GitHub_Trending/se/segment-anything通用版 Segment AnythingSAM什么都能分但放到工业零件、医疗影像这类领域图上掩码边缘经常打飘。这份指南基于 segment-anything 仓库带你走一遍在自己数据集上微调的完整链路先建立可对比的基线再准备标注数据最后分层微调。全程不追求理论推导只关心每步做完之后长什么样算对了。如果本地没有代码先执行git clone https://gitcode.com/GitHub_Trending/se/segment-anything拿到仓库。核心代码都在 segment_anything/ 目录演示样例在 notebooks/。原理速览三个模块各管一件事理解 SAM 的机制微调时才知道该动哪里。它的推理链路是三段式图像编码器像一个先把整张图看熟的摄影师把图像压缩成一份 64×64 的图像 embedding。同一张图只算一次之后所有提示都基于它。提示编码器把你给的点、框转换成和 embedding 同一语言的向量。掩码解码器把图像 embedding 和提示向量拼起来吐出候选掩码和每个掩码的可信度分数。这个结构决定了微调的核心逻辑图像编码器负责看懂像素提示编码器掩码解码器负责听懂指令。领域适配通常只需要后者学你的标注风格所以标准打法是冻结编码器、只训轻量的两个小模块显存省一大截。三个模块的源码分别在 modeling/image_encoder.py、modeling/prompt_encoder.py、modeling/mask_decoder.py。 上手三阶段阶段一微调前先跑通基线目标拿到未微调 SAM在你领域上的表现存档后面所有效果对比都依赖它。动作用仓库自带的 predictor_example.ipynb 思路最小调用只有几行import numpy as np from segment_anything import SamPredictor, sam_model_registry sam sam_model_registryvit_b predictor SamPredictor(sam) predictor.set_image(image_rgb) masks, scores, logits predictor.predict( point_coordsnp.array([[400, 300]]), point_labelsnp.array([1]), multimask_outputFalse, )从你的测试集里挑 30~50 张有代表性的图逐张记录点提示能否框住目标、scores分布如何、掩码和人工标注的重合度IoU。notebooks/ 里的三个 notebook 分别演示了点框提示、稠密预测和 ONNX 推理照着改就行。做对了长什么样一张基线表——每张图一个 IoU 均值和一个典型 badcase 截图。此时你应该能直观说出 SAM 在你领域错在哪是边缘毛糙、小目标漏检、还是把相邻零件连成一片。阶段二准备领域数据集目标把 badcase 变成训练样本标注格式对齐 COCO。动作按 train/val 切分比例 8:2 起步。val 集里的图必须和基线评估用同一批否则数字没法比。标注用 COCO 格式每张图给file_name、width、height每个实例给bboxx, y, w, h、segmentation多边形或 RLE和iscrowd。用 pycocotools 读写不要自己造格式。数量门槛单一目标类别 500 张以上才有稳定提升的迹象只有几十张时微调大概率过拟合优先靠阶段一的提示技巧补救。数据增强只做几何类随机裁剪、翻转、小角度旋转 ≤30°别上重度色彩变换——SAM 的图像归一化参数是写死的pixel_mean[123.675, 116.28, 103.53]见 build_sam.py色彩分布漂移会伤到预训练特征。做对了长什么样用 pycocotools 能无损读回全部标注随机抽 20 张把掩码叠回原图肉眼检查没有错位、漏标。阶段三分层微调目标先训轻量模块再决定是否动编码器。动作分两轮走第一轮冻结图像编码器只训提示编码器 掩码解码器。损失用BCEWithLogitsLoss对掩码 logits 计算配合 IoU 分支的回归损失掩码解码器本身会输出 IoU 预测见 mask_decoder.py。超参从默认值起步AdamW学习率 1e-4权重衰减 1e-4batch 4跑 20~30 个 epoch。第二轮视验证集情况决定若还有明显提升空间解冻编码器学习率降到 1e-5 量级再跑 5~10 个 epoch。做对了长什么样验证集 IoU 曲线平稳上行、没有出现训完 val 反超 train 的过拟合形态最后一轮保存的 checkpoint 在阶段一的 30 张测试图上跑分高于基线。⚖️ 选型与取舍三个模型版本怎么选看 build_sam.py 里的注册表就能确认版本参数量什么时候选它vit_b91M微调首选单卡 24G 显存可跑 batch 4vit_l308Mvit_b 调不动上限后的升级项vit_h636M对精度极端敏感且推理资源充足关键超参数给推荐值附一句理由学习率 1e-4编码器 1e-5解码器是轻模块可以大一点编码器预训练特征贵大了就毁掉。batch 4图像输入 1024 分辨率显存是第一约束不够就降到 2 梯度累积。权重衰减 1e-4默认值即可微调场景别折腾。训练轮数 20~30轻量模块收敛快更多轮数主要贡献过拟合。pred_iou_thresh 0.88官方默认低于该分数的掩码直接丢弃调低它只影响召回不影响精度。✅ 效果验证怎么判断微调真的成功了别只看训练曲线用三组数字交叉验证同图对比拿阶段一那 30~50 张测试图微调前后各跑一遍算平均 IoU。有效微调的门槛均值提升 ≥5 个百分点且 badcase 类别阶段一里说错的那类改善最明显。如果均值没动、只有个别图变好多半是数据量不够。分数校准微调后scores分布应该和掩码真实质量更对齐——高分掩码更准、低分掩码更差。抽查 20 个高分预测若边缘仍然明显错位说明模型在自信地错回查标注一致性。稠密预测兜底用 SamAutomaticMaskGenerator 对一张 val 图跑全图掩码看掩码是否碎片化、是否把目标切碎。这一步抓的是点提示测试发现不了的回归问题。下图是稠密掩码的典型效果你可以用它校准自己分得对的视觉标准⚠️ 避坑清单损失不降原因学习率过高或第一轮就解冻了编码器。 处理先把学习率降到 1e-5 观察 100 step确认编码器确实处于冻结状态再逐步加回。显存溢出OOM原因vit_h 的图像编码器 1024 输入 batch 偏大。 处理换 vit_b、batch 降到 1 再上梯度累积图像编码器支持只算一次后复用别每个 prompt 都重编码。微调后还不如预训练原因数据量不足或标注噪声大过拟合抹掉了通用能力。 处理砍到第一轮配置冻结编码器、加早停、用 500 张门槛重新评估数据规模。掩码边缘锯齿、抖动原因解码后的掩码分辨率低于原图上采样后边缘失真。 处理检查transform的缩放链路确认坐标映射回原图对精度敏感的场景用 ONNX 导出时加--return-single-mask走高分辨率分支见 export_onnx_model.py。 延伸方向推理加速把微调好的模型用 scripts/export_onnx_model.py 导出 ONNX配合 onnx_model_example.ipynb 的加载方式接入线上服务图像 embedding 可以按图缓存二次提示几乎零成本。交互式前端demo/ 里自带一个基于 ONNX 的网页 Demo把你的 checkpoint 塞进去就能给同事做个点一下出掩码的内网演示。下一步动作今天就从阶段一开始——挑 30 张你领域里最刁钻的图跑基线、录 badcase。基线表有了后面所有调参决策都有了标尺。【免费下载链接】segment-anythingThe repository provides code for running inference with the SegmentAnything Model (SAM), links for downloading the trained model checkpoints, and example notebooks that show how to use the model.项目地址: https://gitcode.com/GitHub_Trending/se/segment-anything创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考