ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

点一下就能出分割掩码?Segment Anything(SAM)模型架构全链路拆解

点一下就能出分割掩码?Segment Anything(SAM)模型架构全链路拆解 点一下就能出分割掩码Segment AnythingSAM模型架构全链路拆解【免费下载链接】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的模型架构最省事的路线是顺着一次点击走完全程。你点一个坐标SAM 就在几毫秒内交出一张分割掩码——这个交互式图像分割背后的数据流其实只有三段图像特征只进一次重算力提示信号每次现算最后在一台小 Transformer 里汇合出餐。本文用中央厨房点单窗口出餐口的比喻把 sam.py 里Sam类统筹的整条链路讲透不重复任何模块说明书只讲数据怎么走、为什么这么走。 中央厨房图像特征为什么只算一次先问一句用户每点一下难道整张图都要重新编码一遍显然不划算所以 SAM 把最贵的一步单独拆出来而且只在set_image时执行一次。ImageEncoderViT 的入口是一口 1024×1024 的标准锅任何输入先做 ImageNet 均值方差归一化再补零成正方形。接着按 16×16 切块64×64 的网格给出 4096 个 patch每个 patch 被一层卷积投影成 768 维向量ViT-H 档是 1280 维再叠上可学习的位置嵌入。真正的算力大头在 Transformer 主干它玩了一个混合注意力的花活绝大多数层只在 14×14 的窗口内部做局部注意力token 之间不必两两比较计算量从 n² 掉到接近线性——4096 个 token 的输入才扛得住每隔几层插入一次全局注意力比如 ViT-B 的 12 层里第 2、5、8、11 层看全图专门负责跨区域的长程信息。主干吐出的特征还太厚尾部一个由 1×1 卷积3×3 卷积夹 LayerNorm 组成的小颈部把它压成 256 通道、64×64 的空间张量。这个规格是刻意对齐下游的解码器只吃 256 维提示编码器也只产出 256 维。一句话收束重算力只做一次并缓存是点一下就有结果体验的物理基础。 点单窗口坐标、框、旧掩码如何变成向量窗口小工要解决一个麻烦事点、框、上一轮的掩码形态完全不同怎么塞进同一条流水线答案是翻译成两种形态——稀疏 token 序列和稠密特征图。点坐标先整体偏移 0.5 对齐像素中心然后进入随机位置编码。它没有用可学习的查表而是拿一张固定的随机高斯矩阵把归一化坐标投影到一组随机频率上再取 sin/cos 拼起来coords 2 * coords - 1 # 归一化到 [-1, 1] coords coords self.positional_encoding_gaussian_matrix coords 2 * np.pi * coords return torch.cat([torch.sin(coords), torch.cos(coords)], dim-1)白话解读编码函数对任意坐标都是连续、确定的换个分辨率只要重新归一化即可不用重训也不用插值——这就是随机频率比可学习位置表更抗变形的原因。上面那段 prompt_encoder.py 里的PositionEmbeddingRandom就是点、框以及整张特征图共用同一套空间语言的关键。身份区分靠四枚可学习向量正点、负点、框左上角、框右下角各一枚。一个框被拆成两个角点各自加上专属向量。若一次请求只有框没有点会追加一枚坐标为零、身份是非点的占位 token保证序列长度稳定。掩码走完全不同的路径三卷下采样把 256 维的输入图压到 64×64没给掩码时整张稠密图用同一个 no_mask 向量铺满。一句话收束点、框进稀疏通道掩码进稠密通道两条轨互不干扰。️ 出餐口掩码与质量分是怎么长出来的出餐口拿到四样东西256 维图像特征、稠密位置编码、稀疏 token、稠密提示图。内部是一台只有两层的 TwoWayTransformertoken 侧和图像侧互相注意——token 去图像里取信息图像也反过来被提示位置改写两轮之后各归其位。接下来是生成环节。4 个 mask token 各过一个超网络 MLP产出一组滤波器权重与上采样到高分辨率的特征图做点积直接摊出 4 个候选掩码for i in range(self.num_mask_tokens): hyper_in_list.append(self.output_hypernetworks_mlpsi) hyper_in torch.stack(hyper_in_list, dim1) masks (hyper_in upscaled_embedding.view(b, c, h * w)).view(b, -1, h, w)白话解读每个候选掩码本质是一组可学习滤波器×特征图的内积滤波器由对应 token 现算所以一个 token 对应该候选互不串味。同时 iou token 过一个 3 层 MLP给每个候选打出 0~1 的质量分。为什么要 3 个候选而不是一张单点天然有歧义点在同一只狗身上你要的可能是一大坨轮廓、整只主体或某个局部部位。3 个候选各占一层语义分数帮你排序multimask_outputFalse时取 0 号最佳单解为True时取 1~3 号全部交出去。低分掩码最后经双线性插值还原到 1024 尺度、裁掉补零区、再缩回原图尺寸阈值化后才是你拿到的布尔掩码。一句话收束多候选质量分是 SAM 把歧义显式建模出来的地方。 点得越多越准迭代回路藏在低分辨率 logits 里为什么交互式分割点第二下、第三下会明显更收敛因为每轮都会把上一轮的低分 logits 当作mask_input喂回点单窗口——稠密提示图这一轨从此带上了上一轮干到哪的记忆。predict返回的第三个值low_res_masks就是这个回路专用256×256 的 logits 不用重新变换直接回灌。一句话收束提示编码器里那条稠密通道正是迭代式交互的挂载点。 没人点单时怎么办自动撒点生成全图掩码自动掩码生成器SamAutomaticMaskGenerator的思路很直白没有提示就自己造提示。它在图上排 32×32 的点网格默认每边 32 个点共 1024 个点分批喂给预测器然后把海量候选过两道筛子预测 IoU 超过 0.88 才保留——模型自评质量关稳定性分数超过 0.95 才保留——对阈值扰动不敏感的掩码才算立得住。再用 NMS 去重、剔除贴边裁剪框最后输出每个物体的掩码、框、面积与打分记录。一句话收束自动模式不是另一套模型只是把人点换成了网格点再加质量过滤。 部署形态ONNX 导出与浏览器推理落地时通常不跑完整 PyTorch 图。仓库提供 export_onnx_model.py把图像编码器和掩码解码器导出为 ONNX前端直接用 onnxruntime-web 在浏览器里推理——demo/目录里那套 React 小应用就是活例子拖图、点选、叠掩码全程不出浏览器。SAM 部署到端侧时编码器重、解码器轻的拆分恰好和 ONNX 的两个算子文件一一对应。一句话收束按显存选 ViT-H / L / B 三档编码器走 ONNX解码器随点随算。下一步你可以这么做顺着 segment_anything/ 读三个文件就够image_encoder.py 看 16×16 切块与混合注意力怎么排层prompt_encoder.py 看随机位置编码与四枚身份向量mask_decoder.py 看超网络出掩码与 iou 打分。想跑通手感从notebooks/predictor_example.ipynb的set_image → predict循环开始把low_res_masks回灌一轮你就亲手走完了一次迭代分割。【免费下载链接】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),仅供参考
返回列表