SAM3 推理链路逐行解析:文本提示词如何变成像素级分割 mask

📅 发布时间:2026/10/18 1:53:47
SAM3 推理链路逐行解析:文本提示词如何变成像素级分割 mask
人工智能大模型模型推理服务本地部署计算机视觉Ascend【免费下载链接】sam3项目地址https://ai.gitcode.com/leiwenhu/sam3点击查看免费下载SAM3 是 Meta 推出的提示式分割基础模型输入一张图片加一句文本提示如a flag pole就能返回每个实例的分割 mask、边界框与置信度分数。本文沿 inference.py 这条真实推理入口逐站拆解从一句提示词到像素级 mask中间经过 ViT 骨干、CLIP 文本编码器、DETR 编码器-解码器与分割头的完整推理链路。整条链路可以浓缩成 6 步图片 ──Resize/Normalize──▶ ViT(72×72 tokens) ──FPN neck──▶ 图像特征 文字 ──BPE tokenize──▶ CLIP 文本编码器 ──Linear──▶ 文本向量 ┌──────────────────────┐ 图像特征 ─▶ Transformer encoder ─▶ decoder(200 queries) ─▶ 分割头 ─▶ mask └──────────────────────┘ 阈值过滤 坐标还原 ─▶ JSON(mask_rle / box / score)一键启动CLI 与 FastAPI 双入口想动手跟读源码先看运行入口。本项目提供两种模式inference.py模式命令说明命令行单次推理python3 inference.py --image test.jpg --prompts a flag pole直接打印 mask/box/scoreHTTP 推理服务python3 inference.py --server --port 8003POST /segment上传图提示词segment()方法就是链路的总调度先对同一张图做一次特征提取再为每个提示词复用该特征各跑一次推理inference.pystate self.processor.set_image(image) # 一次性提取图像特征 for prompt in prompts: st dict(state) # 每个提示词独立 state共享 backbone_out out self.processor.set_text_prompt(prompt, st)这个设计很关键图像特征最贵约 1.9s而每个文本提示只要约 0.25s所以一图多提示词几乎零额外图像开销。模型装配线build_sam3_image_model 拼出 2.1B 参数模型构建逻辑集中在 model_builder.py 的build_sam3_image_model()各部件规格如下部件规格源码位置ViT 视觉骨干patch 14embed 1024depth 3216 头RoPEmodel_builder.pyFPN neckscale_factors[4.0, 2.0, 1.0, 0.5]d_model 256model_builder.py文本编码器24 层 / width 1024 / 16 头BPE 词表 49408model_builder.pyTransformer encoder6 层d_model 256model_builder.pyTransformer decoder6 层200 个 queriesbox 迭代精修model_builder.py分割头3 级上采样 跨注意力 promptmodel_builder.py权重文件sam3.pt约 3.45GBREADME.mdCPU 构建加载约 30s之后整体model.to(device)迁移到目标设备inference.py。第一站 set_image图像变成 72×72 的 token 序列预处理管道只有 4 步但每步都影响后续精度sam3_image_processor.pyv2.Resize(size(1008, 1008)) v2.Normalize(mean[0.5, 0.5, 0.5], std[0.5, 0.5, 0.5])原图被强制 resize 到1008×1008这也是--resolution参数的默认值随后 ViT 以 14×14 切 patch得到72×72 5184 个 token送入 32 层带 RoPE 的自注意力。注意骨干有 4 个全局注意力层global_att_blocks(7, 15, 23, 31)见 model_builder.py其余层走窗口注意力window 24这是精度与算力的折中。neck 部分再输出 4 级 FPN 特征图写入state[backbone_out]缓存sam3_image_processor.py——这就是后面多个提示词能共享的原因state[backbone_out] self.model.backbone.forward_image(image)第二站 set_text_prompt提示词如何被编码set_text_prompt()是整个文本→mask魔法的起点sam3_image_processor.pytext_outputs self.model.backbone.forward_text([prompt], deviceself.device) state[backbone_out].update(text_outputs) return self._forward_grounding(state)文本侧的完整旅程是BPE 分词 → 24 层 Transformer → 线性降维。CLIP 风格编码器读入bpe_simple_vocab_16e6.txt.gz词表tokenizer_ve.py把句子切成 ≤32 个 token逐 token 过 1024 维的 Transformer最后由一层nn.Linear(1024, 256)压到与 DETR 相同的 d_modeltext_encoder_ve.pytokenized self.tokenizer(text, context_length32).to(device) # [b, 32] text_memory self.encoder(tokenized) # [b, 32, 1024] text_memory_resized self.resizer(text_memory) # [b, 32, 256]⚠️新手易踩的坑词表是英文 BPE中文提示词如背景会被分到未知 token检测效果较差——README 明确建议用英文提示词README.md。第三站 forward_grounding四步图文交互流水线forward_grounding()sam3_image.py是链路最核心的 4 个阶段编码提示_encode_prompt取出文本 token 序列language_features用几何编码器把空 box 提示编码成geo_feats图文特征拼成统一 prompt 序列sam3_image.py。Encoder 融合6 层TransformerEncoderFusion让 5184 个图像 token 与文本 token 做交叉注意力——这是提示词引导图像特征发生的地方encoder.py。Decoder 查询200 个可学习 query 在 6 层 decoder 里迭代精修边界框box_refineTrue输出pred_boxes、pred_logits同时带有一个presence token——判断图中到底存不存在这个东西。分割头UniversalSegmentationHead用 3 级 nearest 上采样把 72×72 的特征图逐级放大并通过跨注意力注入 prompt 向量得到与 query 一一对应的 mask 图maskformer_segmentation.py。一句话概括encoder 决定看哪里decoder 决定框多大分割头决定像素级轮廓。最后一站logits 到二值 mask 的后处理_forward_grounding()把原始 logits 变成最终可用的三件套sam3_image_processor.py每一步都有讲究out_probs out_logits.sigmoid() # 0~1 置信度 out_probs out_probs * presence_score # 乘 presence 分抑制图中没有 keep out_probs self.confidence_threshold # 阈值过滤(默认0.5) boxes box_cxcywh_to_xyxy(out_bbox) * scale_fct # 归一化坐标还原到原图 out_masks interpolate(out_masks, (img_h, img_w), modebilinear).sigmoid() state[masks] out_masks 0.5 # 二值化像素级 mask关键细节mask 是在 1008×1008 特征空间产出的必须双线性插值回原图分辨率再二值化box 同理按[img_w, img_h]缩放回原始像素坐标。全 NPU 推理链路权重、张量、后处理各在哪本项目把整条链路跑在昇腾 NPU 上npu:0适配要点见 README.md环节设备说明模型权重 中间张量npu:0全程无 cuda 调用NMS 后处理自动降级非 CUDA 设备走generic_nms_cpuperflib/nms.pymask/box/score 序列化CPU.to(cpu).numpy()后转 RLE/base64NPU 上实测图像特征提取约 1.9s单个文本提示约 0.25sREADME.md。下面是 NPU 设备上运行推理服务时的实际终端输出可以看到设备初始化、权重加载与推理结果的完整过程另外addmm_act融合算子、位置编码缓存设备、decoder 坐标缓存等几处devicecuda硬编码都被打上了兼容补丁README.md保证model.to(npu)后链路不中断。工程化输出RLE、PNG base64 与 HTTP 服务推理结果最终被_format_detections()序列化成 JSON 友好的结构inference.py字段含义还原方式score置信度已乘 presence 分直接读box原图坐标[x1, y1, x2, y2]直接画框mask_rleCOCO RLE 编码pycocotools.mask.decode还原二值图mask_png_base64mask 的 PNG base64解码后即是像素级 mask 图detections 列表按 score 降序排列num_detections告诉你这个提示词在图中找到了几个实例。HTTP 模式下POST /segment直接返回该结构前端解码mask_png_base64叠回原图即可README.md。项目维护中还用下面的工作流记录了 NPU 适配与验证过程方便回溯每一处改动链路全景速查表与文件索引阶段入口函数核心文件启动/调度Sam3Model.segment()inference.py图像特征Sam3Processor.set_image()sam3_image_processor.py文本编码backbone.forward_text()text_encoder_ve.py四阶段推理Sam3Image.forward_grounding()sam3_image.py后处理_forward_grounding()sam3_image_processor.py模型构建build_sam3_image_model()model_builder.py调参速查结果太少 → 调低--threshold默认 0.5边界偏糙 → 检查原图是否被 1008 resize 过度压缩中文提示没效果 → 换英文BPE 词表限制。理解这条链路后你会发现一句提示词变成像素级 mask其实只是 6 个模块的接力ViT 看懂像素CLIP 读懂句子encoder 把两者缝合decoder 定位实例分割头放大到像素后处理把一切还原到原图坐标。赞分享人工智能大模型模型推理服务本地部署计算机视觉Ascend【免费下载链接】sam3项目地址https://ai.gitcode.com/leiwenhu/sam3点击查看免费下载相关推荐HsMod技术深度解析基于BepInEx框架的55项炉石传说增强功能全攻略HsMod技术深度解析基于BepInEx框架的55项炉石传说增强功能全攻略 HsMod是一款基于BepInEx框架开发的高级炉石传说游戏修改插件为技术爱好者游戏开发COCO Mask API终极指南如何实现像素级实例分割的10个技巧COCO Mask API终极指南如何实现像素级实例分割的10个技巧 COCO Mask API是计算机视觉领域最重要的工具之一专门用于处理微软COCO数据计算机视觉数据集数据标注一段提示词如何生成一个电影级画面Opus 5.5 案例提示词逐句拆解一段提示词如何生成一个电影级画面Opus 5.5 案例提示词逐句拆解 Claude Opus 5.5 发布后中文社区最出圈的讨论几乎都围绕一个词展开上一篇Twinkle Tray终极指南3分钟掌握Windows多显示器亮度控制技巧下一篇终极Switch存档编辑器轻松修改《塞尔达传说旷野之息》游戏数据创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考