
SAM 微调教程用 1024 张图把 mIoU 从 0.62 拉到 0.85【免费下载链接】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 Anything本项目推理给划痕框一个 box期望得到一个干净的 mask。实际跑下来SAM 微调前的问题很典型——mask 会把划痕旁边的高光、压痕阴影一起圈进来密集排列的划痕经常两个粘连成一个。原因不复杂SAM 预训练时的图像分布以日常场景为主对工业表面的弱纹理、高光反射几乎没有针对性。微调就是在你的自有数据集上把这个提示 → mask的映射继续优化。先说清楚边界微调不是从头训练。encoder 学到的通用视觉表征大部分能直接复用真正要改的是如何把领域图像翻译成 mask这一段改动量比预训练小几个数量级。选型速查ViT-B / L / H 选哪个版本参数量微调显存参考batch 1什么时候选它vit_b91M24G 显存卡即可数据量 ≤ 1 万张先把流程跑通vit_l308M40G 显存卡B 版 mIoU 卡在 85% 上不去想要精度上限vit_h636M80G 显存卡预算和算力都富余追求极限指标原则一句话数据少就从 B 开始B 的指标到瓶颈再考虑 L/H。大模型不是免费午餐它对你的标注质量要求也更高。先把数据集准备好字段、RLE 与三种标注来源数据占整个 SAM 微调工作量的六成以上这一节值得多看两遍。标注文件里哪些字段不能少推荐 COCO 格式作为交换格式仓库的 notebook 也是用pycocotools读写 RLE mask 的。最小结构长这样{ images: [ { id: 1, width: 1024, height: 768, file_name: line03_0042.jpg } ], annotations: [ { id: 1, image_id: 1, segmentation: { size: [768, 1024], counts: .... } } ] }必填images里的id / width / height / file_nameannotations里的id / image_id / segmentation。可省bbox、area、category_id、iscrowd——训练 mask 损失用不到评估脚本需要时再补。RLE 是什么从哪来RLErun-length encoding把二值 mask 按行扫描把连续的 0/1 压成长度 值的游程序列一张 1024×768 的 mask 编码后通常只有几 KB所以 SA-1B 才能用 JSON 存下 11 亿个 mask。生成它有两条路标注工具直接导出CVAT、Label Studio 的 COCO exporter 都内置或者自己从多边形/box 转——用pycocotools.mask.encode把二值图编成 RLE十几行代码的事。三种标注来源按成本从低到高已有标注工具导出CVAT、Label Studio 直接导 COCO检查完字段就能用。box 转 mask手里只有框标注时不要直接把 box 当 mask 喂——框内背景和真实目标差异极大会教坏模型。正确做法是拿 SAM 本身在 box 约束下生成候选 mask再人工修正。SAM 伪标注 人工修正用 自动掩膜生成 对每张图输出候选 mask把与目标重叠的合并成一张标注。仓库 notebook 里就是这个流程。修正时抓大放小重点核对漏了没有和错圈成别的物体没有边界毛刺不必抠到像素级错误目标比粗糙边界伤害大得多。数据增强为什么加加多少目的只有一个你产线拍出来的图视角、光照高度单一增强是在模拟没拍到的那些条件。注意增强必须图像和 mask 同步变换。变换建议幅度理由水平/垂直翻转p0.5无信息损失白捡的泛化亮度/对比度抖动±15%覆盖光照变化随机旋转±10°p0.3拍摄姿态偏差别用大角度会改变目标方向语义高斯噪声、随机裁剪默认不加SAM 输入固定 1024裁剪会改变目标占比收益低训练怎么跑分层冻结与参数联动先冻 encoder 再放开分层训练的实际收益SAM 微调教程里最常用、也最稳的策略是两段式。直觉encoder 负责看懂图decoder 负责把提示翻译成 mask。你的领域图像 encoder 大多已能看懂缺的是翻译所以先只训后者成本低、收敛快还不容易把通用特征训坏。解冻后 decoder 已经对齐了领域特征encoder 只需小步修正所以学习率必须降一个量级否则前几百步 loss 尖峰会把刚学到的东西冲掉。学习率、batch size、warmup 怎么联动三个参数不是独立旋钮关系是学习率随 batch size 近似线性缩放warmup 的作用是让 AdamW 的二阶矩统计先稳定通常给 200~500 步解冻阶段重新 warmup。下面这段伪代码把关系摆在一起stage1 dict(lr1e-4, batch8, warmup_steps300, freeze_encoderTrue) # 数据 ≤ 1 万张 stage2 dict(lr1e-5, batch8, warmup_steps200, freeze_encoderFalse) # 解冻后降一个量级 # batch 翻倍 → lr 近似翻倍 → warmup 相应拉长显存不够就先降 batch 再调 lr不用手写训练循环社区里已有多套基于本仓库推理代码的 SAM 微调脚本重点是改配置和接好你的 Dataset训练循环本身没有技术含量。仓库内可参考 推理脚本、ONNX 导出 和notebooks/下的示例数据加载的写法对齐 预处理变换 即可。怎么判断训好了把指标嵌进训练流程不要只盯着 loss。每个 epoch 结束或每 N 个 batch在固定验证集上算 mIoU 和 DicemIoU 是主指标Dice 对边界更敏感两个一起看。loss 持续下降但 mIoU 不涨说明模型在背训练集噪声该加增强或降学习率了。曲线长这样判断该查哪里loss 平滑下降验证 mIoU 上升后进入平台正常取平台前最优 checkpoint平台期后继续训会过拟合前 500 步 loss 几乎不动大概率配置问题学习率是否被 warmup 吃掉、label 与图像是否错位loss 震荡幅度过大学习率偏高降 lr或加大 warmup验证 mIoU 先升后降过拟合回退最优 checkpoint加增强或早停mIoU 高但人眼觉得边界毛指标没暴露的问题抽 50 张 bad case 人工看调阈值或补难例从实验到上线两个最值的优化点ONNX 导出官方 导出脚本 只导出 prompt encoder mask decoderencoder 仍留在 PyTorch 侧。decoder 换轻量 runtime 后浏览器、移动端、边缘设备都能跑。高推理压力场景可加--return-single-mask少输出两个 mask--quantize-out做动态量化再省体积。图像 embedding 缓存encoder 是整条链路里最重的部分而同张图换十个提示也只需过一遍 encoder把输出缓存下来即可复用cache {} def embed(image): key image.tobytes() return cache.setdefault(key, sam(image).to(device)) # 之后每次提示只走 prompt encoder mask decoder踩坑速查现象先查什么loss 从第一个 batch 起就不降数据管线标注 image_id 与图像是否对上了、RLE 解码出的 mask 是否全 0loss 正常但 mask 全黑/全白坐标缩放是否漏了 ResizeLongestSide 这一步segment_anything/utils/transforms.pyCUDA out of memory降 batch、开混合精度、别把 1024 原图再复制多份进 decodermask 边缘随提示点位置轻微跳动正常现象调高阈值或只取 iou 最高的那个输出微调后通用场景效果反降领域数据占比过大混入 10%~20% 通用图像做正则方向上往下游走视频和时序场景看 SAM-2它把提示能力扩展到图像序列提示形式上可以把点、框与外部检测信号组合进 prompt encoderdecoder 参数量很小蒸馏出轻量版部署在产线边缘设备是顺理成章的下一步。【免费下载链接】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),仅供参考