尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

如何用 3000 张标注图把 SAM 微调到 0.9 mIoU:Segment Anything 自定义训练完整指南

如何用 3000 张标注图把 SAM 微调到 0.9 mIoU:Segment Anything 自定义训练完整指南 如何用 3000 张标注图把 SAM 微调到 0.9 mIoUSegment Anything 自定义训练完整指南【免费下载链接】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 默认权重漏掉了 23% 的微小划痕人工复核排起了队。模型没坏它只是没见过你的数据。我们给它做了一轮 SAM 自定义训练完整过程如下。 先别急着跑训练——搞清楚 SAM 到底在分割什么SAM 的前向传播一句话讲完给一张图和一个提示输出一个掩码。三个组件各干各的事图像编码器ViT把图像变成一组 embedding 特征每张图只算一次这是同一张图反复切新区域速度快的原因。提示编码器把点、框、上一轮掩码等提示编码成向量回答切哪里。掩码解码器融合两者输出最终掩码还给每个掩码打 iou 分。modeling 源码里每个模块对应一个文件。为什么微调时通常冻结图像编码器它在千万级训练图上已经吃透了通用视觉特征你几千张图教不了它新东西只会搅乱它解码器参数少得多缺的恰恰是怎么把你们领域的提示转成掩码这类知识。冻编码器、只训解码器成本低、收益直接、且不容易把预训练权重搞坏这是默认策略的由来。三条微调路线选哪条取决于你的数据量和显存全参数微调三个模块全部更新梯度。适用一万张以上高质量标注、多卡最低显存约 40G/卡vit_b、batch 4预期 mIoU 0.90-0.94训练时长数十 GPU 天。分层解冻微调SAM 分层解冻策略先冻编码器训练后半程再解冻。适用2000 到 1 万张图、单卡或双卡最低显存约 16G/卡预期 mIoU 0.88-0.92几个 GPU 天。LoRA 轻量微调在解码器注意力层插入低秩矩阵只训百分之几的参数。适用两千张以下、单卡 8-16G最低显存约 8G预期 mIoU 0.85-0.90几个 GPU 小时。如果你的标注图少于 5000 张且只有单卡 24G直接选分层解冻别折腾全参数。LoRA 适合早期验证想法数据长起来后再切分层解冻。 数据工程标注质量才是模型上限SAM 数据集标注格式常用 COCO分三块images 记录每张图的路径和尺寸categories 定义类别annotations 是核心每条指向一个区域。其中 bbox 给矩形外框用于粗定位和质检数据segmentation 给精确轮廓多边形或 RLE 压缩编码才是训练真正吃的监督信号。两者是框住与被框住的关系bbox 永远是 segmentation 的最小外接矩形。工具如果只能画框可以先用默认 SAM 从 bbox 自动生成掩码再人工修轮廓这是常见的冷启动做法。数据增强只挑真正有用的几样随机裁剪逼模型学会尺度不变性防止它只认大目标随机水平/垂直翻转几乎零成本直接翻倍样本多样性颜色抖动亮度、对比度、饱和度模拟拍摄条件差异户外和车间场景尤其重要小角度旋转 ±15°对物体可能任意朝向的任务有效。一个容易忽略的点所有几何增强必须同步变换标注坐标——裁剪要改 bbox 原点翻转要换 x 和宽旋转要逐顶点变换多边形。不少损失不降不是模型问题是掩码和图像错位了。训练过程不是调参是管理一个系统我们用阶段任务卡管理训练每阶段有目标、退出标准和回滚方案Phase 1前 15 轮冻结图像编码器只训提示编码器 掩码解码器学习率 1e-4。退出标准验证 mIoU 进入平台期不再上涨。Phase 215-40 轮解冻全参数学习率降到 1e-5。退出标准验证 mIoU 比 Phase 1 最优高 2 个点以上否则跳到 Phase 3 回滚。Phase 3在验证集上跑 SAM 模型 mIoU 评估mIoU 回退就回滚到 Phase 1 最优 checkpoint。几个超参的选型理由初始学习率 1e-4 适合从好 checkpoint 续训大了会把解码器学到的映射搅乱小了又赶不上数据适配warmup 跑 3-5 轮防的是前几个 batch 梯度不稳污染优化器状态weight decay 1e-4 控制解码器输出层的泛化太强会把轮廓压糊。训练循环骨架并不复杂for epoch in range(cfg.epochs): for step, batch in enumerate(loader): masks, _ model(batch[image], batch[point_coords], batch[point_labels], multimask_outputFalse) loss F.binary_cross_entropy_with_logits(masks, batch[gt_masks]) loss loss / cfg.accum_steps # 梯度累积模拟大 batch loss.backward() if (step 1) % cfg.accum_steps 0: clip_grad_norm_(model.parameters(), 1.0) optimizer.step() optimizer.zero_grad() val_miou evaluate(model, val_loader) if val_miou best_miou: save_checkpoint(model, fbest_{val_miou:.4f}.pth)怎么证明你的模型真的变好了两个指标就够。mIoU 看预测与真值的重叠面积占并集的比例是严格考官Dice 用两倍交集除以两者面积之和对不重叠区域更宽容数值通常比 mIoU 高两三个点。两个必须一起报只看单指标容易自欺。评估纪律三条少一条结果都不可信验证集与训练集零泄漏同一物体出现在两边就剔掉至少跑 3 个不同 seed报均值和方差单次跑分仅供参考低分 case 肉眼抽查最差 10 例往往包含模型真实短板 80% 的信息。判断标准mIoU 比预训练基线高 8 个点以上微调才算真正生效。提升只有两三个点先怀疑数据量或标注质量不够别急着怪训练策略。肉眼抽查比看曲线可靠把预测掩码和真值用不同颜色叠在原图上哪里漏了、哪里外溢一眼可见。从 notebook 到生产部署不是复制粘贴SAM ONNX 导出部署三步先把模型拆成图像编码器、提示编码器、掩码解码器分别导出官方的 export_onnx_model.py 就是这么做再用一组测试样例核对导出模型与原版 PyTorch 输出一致最大差值小于 1e-4 才算通过最后用 onnxruntime 加载并接进 serving。最容易踩的坑是 opset低了新版 runtime 报错高了老版 TensorRT 可能不认识算子14-17 是安全区间导出参数记得连同记录存档。推理加速三招图像 embedding 缓存图像编码器是 SAM 最重的部分同一张图绝不能编码两次用图像哈希做 key 缓存 embeddingSamPredictor 的 set_image 就是这个设计混合精度fp16 推理显存和时延接近减半掩码观感几乎无差TensorRT INT8 量化进一步压时延但要先用你领域的图校准否则细轮廓容易碎。推理代码骨架class SAMInfer: def __init__(self, enc_path, dec_path): self.enc ort.InferenceSession(enc_path, providers[CUDAExecutionProvider]) self.dec ort.InferenceSession(dec_path, providers[CUDAExecutionProvider]) self._cache {} def predict(self, image, points, labels): key hash(image.tobytes()) emb self._cache.get(key) if emb is None: # 每张图只编码一次 emb self.enc.run(None, {x: to_tensor(image)})[0] self._cache[key] emb sparse, _ self.dec.run(None, { image_embeddings: emb, point_coords: points, point_labels: labels}) return upsample(sparse, image.shape) # 还原到原图分辨率⚠️ 踩坑实录教程不会主动告诉你的事损失 20 轮不动。先怀疑学习率太小真凶是一个翻转增强只翻了图没翻 bbox掩码监督整个错位。解法写个小脚本随机抽 100 张图把标注多边形画在图上肉眼看五分钟省二十轮训练。1024 分辨率下 batch2 就 OOM。第一反应是缩 batch但 batch 缩了梯度噪声也变大。正确做法是梯度累积攒 4 个 mini-batch 再 step等效 batch 8显存停留在 batch 2 水平时间只多 20%。单张推理时延 400ms。排查发现图像编码器每个 prompt 都跑一次一张图标 10 个提示就编码了 10 遍。加上前面的 embedding 缓存后降到 60ms 左右。mIoU 不错但产线投诉没少。因为验证集分布离训练集太近产线实拍有更强反光和遮挡。解法把产线最近一周的 badcase 按 2:1 比例混进验证集让验证集代表真实目标域。下一步行动清单先用 500 张图跑通 Phase 1不追求数据量确认 mIoU 相对预训练基线有提升再扩数据搭好标注坐标一致性检查脚本随机抽样 可视化做成每轮训练前的前置检查每次导出记录 opset、runtime 版本和导出参数出问题好二分定位Phase 2 结束后冻结一个基线版本把 mIoU、Dice、低分 case 数量写进版本备注。剩下的事交给 GPU跑起来再说。【免费下载链接】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),仅供参考
返回列表