公司动态

Segment Anything 微调:在领域数据集上把 mIoU 拉上去的完整路径

📅 2026/8/30 9:27:00
Segment Anything 微调:在领域数据集上把 mIoU 拉上去的完整路径
Segment Anything 微调在领域数据集上把 mIoU 拉上去的完整路径【免费下载链接】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 微调fine-tuning就是把模型拉回自己数据上的一套操作——不是从头重训而是只动模型的一小部分。这篇文章沿着官方仓库的源码结构讲清楚看懂它—动手改—跑起来这条完整路径。️ 从一批不可用的掩码说起场景很具体工业缺陷检测的项目里SAM 原样跑在缺陷图上缺陷区域是能分出来的但掩码边界锯齿明显偶尔还会把缺陷和金属边框连成一块。换提示点、换框都救不回来——通用 backbone 从没见过缺陷这个概念。这是领域用户的通病SAM 的预训练数据以自然场景为主先验分布和专业领域差得太远。微调不是可选项是必选项。这篇文章可以带走的东西一分钟看懂 SAM 内部三个模块的分工以及微调该介入哪一块标注格式、冻结策略、学习率三个选择的决策依据过拟合、不收敛、显存爆三种翻车模式的排查表一个明天就能接进业务的最小部署建议海滩上奔跑的两只狗是 SAM 开箱即用的舒适区自然场景、目标与背景对比清晰。场景一旦切到缺陷检测这类领域差距就开始显现。 核心拆解让模型在你的数据上变好看懂它三个模块微调的介入点先给结论SAM 不是一个黑盒而是图像编码器 / 提示编码器 / 掩码解码器三块串联微调的全部艺术在于决定动哪一块、动多少。一个生活类比图像编码器像把整幅图看一遍记在脑子里——把图像压缩成 64×64 的特征网格一次计算、多次复用提示编码器像把你手指的位置翻译成通用语言——把点、框、掩码编码进同一特征空间掩码解码器像根据线索把形状画出来——两层双向交叉注意力加 hypernetwork吐出最终掩码和 IoU 自评。参数分布决定了微调成本三个版本横向对比版本编码器配置dim/depth/heads参数量级定位ViT-B768 / 12 / 12约 91M24G 单卡微调首选ViT-L1024 / 24 / 16约 308M精度与速度均衡ViT-H1280 / 32 / 16约 636M多卡、精度敏感推理在 segment_anything/build_sam.py 里三个版本只差几个数字——sam_model_registry里一查便知。提示编码器和掩码解码器共享 256 维配置三个版本完全一致。这正是微调便宜的前提你真正要动的是解码器这个小部件。官方 notebook 给了最直观的演示一个红星点加一个绿框车轮就从车身上剥出来了。微调时你做的恰恰是这件事的自动化——每一轮迭代都喂提示 真值掩码让解码器学会怎么画边界。notebooks/predictor_example.ipynb 里的调用流程可以直接改造成训练循环的骨架。动手改数据、冻结、学习率三处修改标注格式掩码任务选 COCO交互选择选点标注。一句话取舍COCOpolygon/RLE bbox给模型完整的物体真值loss 有直接对像点标注坐标 label轻得多但模型只学会点指向哪里学不到物体整体形状。所以任务是分出这类物体就用 COCO RLE主流标注工具都能直接导出任务本身就是交互式选择工具点标注够了。冻结策略先冻编码器只放开解码器。别一上来全放开。图像编码器是在上十亿张自然图上练出来的通用 backbone你的领域数据大概率只有几千张直接动它等于拆承重墙提示编码器和掩码解码器才是决定输出质量的最后一公里也最吃领域数据。标准打法第一阶段冻结编码器只训后两块直到验证 mIoU 走平第二阶段再解冻编码器最后 2-4 层学习率降一档接着练。# 第一步冻结图像编码器只训提示编码器 掩码解码器 for p in sam.image_encoder.parameters(): p.requires_grad False trainable [p for p in sam.parameters() if p.requires_grad] optimizer torch.optim.AdamW(trainable, lr1e-4, weight_decay1e-4)真正要改的就上面这几行第二阶段撤掉冻结、把 1e-4 降到 1e-5 即可。学习率1e-4 是安全量级1e-3 必炸。解码器阶段用 1e-4解冻后的编码器组用 1e-5分参数组设置即可1e-3 基本一步到飞地loss 前几十个 step 就震荡。配 cosine 衰减加 3-5 个 epoch 的 warmup不玩花活。跑起来盯两个指标查三种翻车评估不用多两个指标就够平均 mIoU 加IoU 0.8 的物体占比。前者看平均水平后者看长尾——SAM 解码器自带 IoU 自评头这个指标和 inference 时的过滤阈值天然对齐。每个 epoch 在验证集上算一次写进 TensorBoard 标量。翻车模式收进一张表现象最可能原因先查什么对策loss 不降、来回震荡学习率过大解码器是否已放开、lr 是否 1e-4降到 1e-5加 warmup训练 loss 降、验证 mIoU 反降领域数据量太小增强是否只有水平翻转加随机旋转、颜色抖动早停OOM 爆显存batch 过大或解冻后版本太大nvidia-smi看显存峰值batch 减半加梯度累积显存 ≥ 24G 直接开 AMP没有副作用顺带一提整图模式scripts/amg.py 的 Automatic Mask Generator 不需要提示直接把全图覆盖成几千个掩码。微调后它的边缘质量同样受益训练中用它抽查比逐张点提示快得多。 落地与延伸最小部署导出 ONNX 缓存 image embedding。两句讲清其一用仓库自带的 scripts/export_onnx_model.py 把微调后的 checkpoint 导出成 ONNXinference 换 onnxruntime 跑其二segment_anything/predictor.py 里SamPredictor的设计本来就是set_image 一次、predict 多次——图像 embedding 算一次就缓存在实例里业务接口按图片级缓存它同一张图的多次提示复用同一份 embedding平均时延直接砍掉一大半。python scripts/export_onnx_model.py \ --checkpoint path/to/fine-tuned.pth --output sam_finetuned.onnx下一步有两个方向值得走。一是蒸馏把微调好的大模型当 teacherViT-B 当 student 在同一批领域数据上训练用一个小得多的编码器保住领域先验inference 侧收益最直接。二是迭代训练让微调后的模型自预测无标注的领域图取解码器自评 IoU 高的结果当伪标签回灌训练——数据少的场景这通常比继续堆增强更管用。看懂、改对、跑稳这条链对任何 SAM 系列模型都成立想清楚模块分工冻该冻的只动小的那部分领域差距就填平了。【免费下载链接】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),仅供参考