拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Grounded-Segment-Anything 高效 SAM 系列实战:六种轻量模型零样本检测与分割完全指南

Grounded-Segment-Anything 高效 SAM 系列实战:六种轻量模型零样本检测与分割完全指南
  • 人工智能
  • 计算机视觉
  • 深度学习
  • 基础模型
  • AI 应用

【免费下载链接】Grounded-Segment-Anything

Grounded SAM: Marrying Grounding DINO with Segment Anything & Stable Diffusion & Recognize Anything - Automatically Detect , Segment and Generate Anything

项目地址:https://gitcode.com/gh_mirrors/gr/Grounded-Segment-Anything
点击查看免费下载

导读:本文以 EfficientSAM/README.md 为核心骨架,系统讲解如何在 Grounded-Segment-Anything 仓库中,将文本检测模型 Grounding DINO 与 FastSAM、MobileSAM、Light-HQSAM、Efficient-SAM、Edge-SAM、RepViT-SAM 六种高效 SAM 变体结合,构建"输入文本提示 → 输出检测框与分割掩码"的零样本标注流水线。读完本文,你将掌握每种变体的安装方式、权重下载、Demo 运行命令、关键参数含义,以及各脚本背后的源码级调用链与轻量图像编码器结构。

一、为什么需要 Efficient Grounded-SAM

Grounded-Segment-Anything 仓库的核心思路是将 Grounding-DINO(开放词汇文本检测器)与 Segment Anything 系列分割模型"配对"(Marrying),实现"用一句话检测并分割图像中任意目标"。原始 Grounded-SAM 使用完整版 SAM(ViT-H 编码器,约 6.32 亿参数),推理开销大,不适合高频标注场景。

EfficientSAM 子模块(即EfficientSAM/目录)的目标非常明确:用高效 SAM 变体替换原始 SAM,换取更快的零样本检测与分割(faster annotating)。由于 Grounding DINO 负责"找到目标在哪",SAM 变体只负责"把框变成精细掩码",分割阶段的延迟瓶颈几乎完全取决于图像编码器。因此,将编码器从 632M 参数的 ViT-H 换成几十 M 甚至几 M 的轻量网络,就能在不改变整体管线的前提下大幅提速。

说明:仓库 README 中曾有一段被注释的组合方案(Grounding-DINO × Fast-SAM),最终正式路线是统一采用 GroundingDINO 与六种高效 SAM 变体的组合,本文以此为准。

二、环境与安装

2.1 安装 Grounded-SAM 主项目

EfficientSAM 的全部 Demo 都运行在 Grounded-Segment-Anything 仓库根目录下,因此第一步是安装主项目。根据仓库根目录 README.md,环境要求为:

  • python>=3.8
  • pytorch>=1.7、torchvision>=0.8(强烈建议安装带 CUDA 支持的版本)

在非 Docker 的本地 GPU 环境中,先设置编译环境变量,再以可编辑模式安装两个核心子项目:

export AM_I_DOCKER=False export BUILD_WITH_CUDA=True export CUDA_HOME=/path/to/cuda-11.3/ # 安装 Segment Anything python -m pip install -e segment_anything # 安装 Grounding DINO(注意关闭 build isolation) pip install --no-build-isolation -e GroundingDINO

此外还可按需安装opencv-python pycocotools matplotlib onnxruntime onnx ipykernel等可选依赖(用于掩码后处理、COCO 格式保存与 Notebook 演示)。

2.2 安装 Fast-SAM

FastSAM Demo 基于 Ultralytics 的YOLO接口封装(见 grounded_fast_sam.py 的from ultralytics import YOLO),需要单独安装 Fast-SAM 及其依赖,详见 FastSAM 官方安装说明(仓库内对应实现位于 EfficientSAM/FastSAM/tools.py,提供box_prompt、fast_process等后处理工具)。

2.3 下载 Grounding DINO 权重

所有六个 Demo 共享同一个 Grounding DINO 配置与权重:配置文件为 GroundingDINO_SwinT_OGC.py,权重为groundingdino_swint_ogc.pth,需下载到仓库根目录:

cd Grounded-Segment-Anything wget https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth

六个脚本内部硬编码的 checkpoint 路径均为./groundingdino_swint_ogc.pth,请务必放置于仓库根目录。

2.4 准备演示图片

各 Demo 的默认输入图EfficientSAM/LightHQSAM/example_light_hqsam.png(一张含长椅的场景图)是仓库专门准备的标准测试图,目的是便于横向对比不同高效 SAM 变体的推理效果(README 明确说明"we may use the sam image as the demo image in order to compare the inference results of different efficient-sam variants")。对 FastSAM 与 MobileSAM 两个可自定义输入的 Demo,README 分别选用了 assets/demo4.jpg(黑狗)与 assets/demo2.jpg(奔跑的狗)。

三、六种高效 SAM 变体一览

EfficientSAM 子模块将主流轻量 SAM 方案全部接入统一管线,按技术路线可分为四类:

变体技术路线关键点仓库对应实现
FastSAMCNN 分割模型仅用 SA-1B 数据集的 2% 训练,宣称与 SAM 相当的性能配合约 50 倍推理速度提升grounded_fast_sam.py、FastSAM/tools.py
MobileSAMTiny-ViT 编码器保持 SAM 原始管线,仅将 632M 的 ViT-H 编码器替换为约 5M 的 Tiny-ViT;单 GPU 约 12ms/图(编码器 8ms + 解码器 4ms)grounded_mobile_sam.py、MobileSAM/setup_mobile_sam.py
Light-HQSAMHQ token + 轻量编码器基于 MobileSAM 的 Tiny-ViT,在掩码解码器中注入可学习的 High-Quality Output Token,并先将 ViT 特征与解码器特征融合以提升掩码细节grounded_light_hqsam.py、LightHQSAM/setup_light_hqsam.py
Efficient-SAMSAMI 掩码图像预训练用 SAMI 预训练轻量图像编码器 + 掩码解码器,再在 SA-1B 上微调,实现性能与算力开销的平衡grounded_efficient_sam.py
Edge-SAM纯 CNN 编码器蒸馏将 ViT 版 SAM 图像编码器蒸馏为纯 CNN 架构,更适合边缘设备;并验证了任务无关的编码器蒸馏无法完整迁移 SAM 知识grounded_edge_sam.py、EdgeSAM/setup_edge_sam.py
RepViT-SAMRepViT 编码器沿用 MobileSAM 思路,把重编码器替换为 RepViT 模型,宣称相对 MobileSAM 有更好零样本迁移能力与约 10 倍推理速度提升grounded_repvit_sam.py、RepViTSAM/setup_repvit_sam.py

表格中的性能数据(如 2% SA-1B、12ms、50×、10×)均转录自官方论文/项目描述(README 原文),本文仅如实转述论文作者声明,不额外评估其真伪。

四、统一推理管线:文本 → 检测框 → 分割掩码

除 FastSAM 外,其余五个 Demo 的推理管线高度一致,可抽象为四步,本文以 grounded_mobile_sam.py 为例拆解(Edge-SAM、RepViT-SAM、Light-HQSAM 的写法几乎逐行相同)。

4.1 构建 Grounding DINO 检测模型

from groundingdino.util.inference import Model GROUNDING_DINO_CONFIG_PATH = "GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py" GROUNDING_DINO_CHECKPOINT_PATH = "./groundingdino_swint_ogc.pth" grounding_dino_model = Model( model_config_path=GROUNDING_DINO_CONFIG_PATH, model_checkpoint_path=GROUNDING_DINO_CHECKPOINT_PATH )

4.2 文本提示检测

detections = grounding_dino_model.predict_with_classes( image=image, classes=[args.CAPTION], # 文本提示,如 "The running dog" box_threshold=BOX_THRESHOLD, # 默认 0.25 text_threshold=TEXT_THRESHOLD # 默认 0.25 )

4.3 NMS 后处理去重

Grounding DINO 可能对同一目标输出多个重叠框,脚本用 torchvision 的 NMS 在检测框上按置信度去重:

nms_idx = torchvision.ops.nms( torch.from_numpy(detections.xyxy), torch.from_numpy(detections.confidence), NMS_THRESHOLD # 默认 0.8 ).numpy().tolist()

4.4 框提示驱动分割

将每个检测框作为 box prompt 送入 SAM 变体,输出掩码后由 supervision 库(sv.BoxAnnotator/sv.MaskAnnotator)叠加绘制:

def segment(sam_predictor: SamPredictor, image: np.ndarray, xyxy: np.ndarray) -> np.ndarray: sam_predictor.set_image(image) result_masks = [] for box in xyxy: masks, scores, logits = sam_predictor.predict(box=box, multimask_output=True) index = np.argmax(scores) # 取 IoU 分数最高的掩码 result_masks.append(masks[index]) return np.array(result_masks)

4.5 关键超参数速查

参数MobileSAM/Light-HQSAM/Edge-SAM/RepViT-SAM 默认值FastSAM 内 Grounding DINO 调用值作用
BOX_THRESHOLD0.250.3检测框置信度阈值,过滤低置信框
TEXT_THRESHOLD0.250.25文本与视觉特征对齐分数阈值
NMS_THRESHOLD0.8—非极大值抑制 IoU 阈值
multimask_outputTrue(MobileSAM)/ False(HQ 类)—是否输出多候选掩码

注意:Light-HQSAM、Edge-SAM、RepViT-SAM 三个脚本在sam_predictor.predict中传入了hq_token_only=True(且multimask_output=False),这是源自 LightHQSAM 与 EdgeSAM 的 HQ 分支特有接口,表明只使用高质量 token 输出路径。MobileSAM 脚本则使用标准的multimask_output=True并取分数最高掩码。

五、六个 Demo 逐个实战

5.1 Run Grounded-FastSAM Demo

权重准备:从 FastSAM 官方 Model Checkpoints 页面下载FastSAM-x.pt(README 中的默认路径为./FastSAM-x.pt)。

运行命令:

cd Grounded-Segment-Anything python EfficientSAM/grounded_fast_sam.py \ --model_path "./FastSAM-x.pt" \ --img_path "assets/demo4.jpg" \ --text "the black dog." \ --output "./output/"

源码拆解(grounded_fast_sam.py):此脚本与其余五个的架构不同——它先用 UltralyticsYOLO加载 FastSAM 权重并对整图做实例分割(imgsz=1024、iou=0.9、conf=0.4、max_det=100、retina_masks=True),再用 Grounding DINO 检测出文本对应的框,最后通过FastSAM.tools.box_prompt从 FastSAM 的整图掩码中裁剪出与框重叠的目标掩码,交给fast_process渲染。

可调参数:

参数默认值说明
--model_path./FastSAM/FastSAM-x.ptFastSAM 权重路径
--img_path./images/dogs.jpg输入图片路径
--textthe black dog.GroundingDINO 文本提示
--imgsz1024FastSAM 推理图像尺寸
--iou0.9FastSAM 掩码 IoU 阈值
--conf0.4目标置信度阈值
--output./output/输出目录
--retinaTrue是否输出高分辨率掩码
--devicecuda(可用时)推理设备

输出与已知限制:结果保存于./output/,命名格式为{图片名}_{框索引}_caption_{文本短语}.jpg。README 明确提示:受 FastSAM 后处理限制,一次只能标注一个框;若 Grounding DINO 检出多个框,脚本会为每个框分别保存一张标注图,此行为将在后续版本中改进(对应源码见 grounded_fast_sam.py 的逐框循环)。

5.2 Run Grounded-MobileSAM Demo

权重准备:从 MobileSAM 官方 weights 目录下载mobile_sam.pt至EfficientSAM/下。

运行命令:

cd Grounded-Segment-Anything python EfficientSAM/grounded_mobile_sam.py \ --MOBILE_SAM_CHECKPOINT_PATH "./EfficientSAM/mobile_sam.pt" \ --SOURCE_IMAGE_PATH "./assets/demo2.jpg" \ --CAPTION "the running dog"

源码拆解:脚本通过 MobileSAM/setup_mobile_sam.py 的setup_model()构建模型——其保留原始 SAM 的 PromptEncoder 与 MaskDecoder,仅将图像编码器替换为 Tiny-ViT(embed_dims=[64, 128, 160, 320]、depths=[2, 2, 6, 2]、num_heads=[2, 4, 5, 10]、window_sizes=[7, 7, 14, 7]、mlp_ratio=4.0),随后load_state_dict(checkpoint, strict=True)加载权重并包装为SamPredictor。

输出文件(均为脚本默认文件名,保存于仓库根目录):

  • groundingdino_annotated_image.jpg:仅含检测框的中间结果;
  • grounded_mobile_sam_annotated_image.jpg:框 + 掩码的最终标注图;
  • grounded_mobile_sam_bin_mask.jpg:第一个目标的二值掩码图。

提示:README 中写的是./gronded_mobile_sam_anontated_image.jpg(拼写有误),源码 grounded_mobile_sam.py 的实际默认输出名为grounded_mobile_sam_annotated_image.jpg,以源码为准。

可调参数:--BOX_THRESHOLD(0.25)、--TEXT_THRESHOLD(0.25)、--NMS_THRESHOLD(0.8)、--OUT_FILE_BOX、--OUT_FILE_SEG、--OUT_FILE_BIN_MASK、--DEVICE。

5.3 Run Grounded-Light-HQSAM Demo

权重准备:从 sam-hq 官方 Model Checkpoints 页面下载sam_hq_vit_tiny.pth,脚本默认读取./EfficientSAM/sam_hq_vit_tiny.pth。

运行命令:

cd Grounded-Segment-Anything python EfficientSAM/grounded_light_hqsam.py

源码拆解:与 MobileSAM 的关键区别在掩码解码器。LightHQSAM/setup_light_hqsam.py 使用MaskDecoderHQ(来自 segment_anything/modeling/mask_decoder_hq.py)替换标准MaskDecoder,并通过vit_dim=160将 Tiny-ViT 末层(160 维)特征注入解码器,配合可学习 HQ token 预测高质量掩码;分割时以hq_token_only=True走 HQ 分支。输入图与类别在 grounded_light_hqsam.py 中硬编码为EfficientSAM/LightHQSAM/example_light_hqsam.png与["bench"]。

输出文件:EfficientSAM/LightHQSAM/grounded_light_hqsam_annotated_image.jpg(框 + 掩码标注图)及同目录下的groundingdino_annotated_image.jpg。

下图左侧为该 Demo(及 Efficient-SAM/Edge-SAM/RepViT-SAM 共用)的标准输入图,右侧为 Light-HQSAM 的标注输出:

5.4 Run Grounded-Efficient-SAM Demo

权重准备:从 EfficientSAM 官方 Model 页面下载efficientsam_s_gpu.jit,并放置于Grounded-Segment-Anything/EfficientSAM目录下(脚本硬编码路径./EfficientSAM/efficientsam_s_gpu.jit)。

运行命令:

cd Grounded-Segment-Anything python EfficientSAM/grounded_efficient_sam.py

源码拆解:Efficient-SAM 与前面几个变体接口不同——它没有走SamPredictor,而是直接加载 TorchScript 模型torch.jit.load(...)(grounded_efficient_sam.py),并通过自定义函数efficient_sam_box_prompt_segment以(图像张量, 检测框, 框标签[2,3])三元组调用模型前向,得到 logits 后以sigmoid > 0.5二值化,再按预测 IoU 分数挑选最佳掩码。

输出文件:EfficientSAM/gronded_efficient_sam_anontated_image.jpg(注意:此文件名在源码中即为该拼写,与 README 描述一致,属于仓库现状)。

5.5 Run Grounded-Edge-SAM Demo

权重准备:按 EdgeSAM 官方 Usage 说明,将两个权重下载到EfficientSAM/目录:

cd Grounded-Segment-Anything wget -P EfficientSAM/ https://huggingface.co/spaces/chongzhou/EdgeSAM/resolve/main/weights/edge_sam.pth wget -P EfficientSAM/ https://huggingface.co/spaces/chongzhou/EdgeSAM/resolve/main/weights/edge_sam_3x.pth

运行命令:

cd Grounded-Segment-Anything python EfficientSAM/grounded_edge_sam.py

源码拆解:EdgeSAM/setup_edge_sam.py 的build_edge_sam使用RepViT(arch="m1", upsample_mode="bicubic")作为纯 CNN 图像编码器,其余(PromptEncoder、MaskDecoder、TwoWayTransformer)与标准 SAM 保持一致;Demo 脚本默认加载edge_sam_3x.pth(3× 训练版本),分割时同样走hq_token_only=True分支。

输出文件:EfficientSAM/grounded_edge_sam_annotated_image.jpg。

5.6 Run Grounded-RepViT-SAM Demo

权重准备:按 RepViT 官方安装说明下载:

cd Grounded-Segment-Anything wget -P EfficientSAM/ https://github.com/THU-MIG/RepViT/releases/download/v1.0/repvit_sam.pt

运行命令:

cd Grounded-Segment-Anything python EfficientSAM/grounded_repvit_sam.py

源码拆解:RepViTSAM/setup_repvit_sam.py 通过timm.models.create_model('repvit')构建图像编码器(对应 RepViTSAM/repvit.py),其余组件为标准 SAM 配置;build_sam_repvit加载./EfficientSAM/repvit_sam.pt权重并置于 eval 模式。Demo 脚本在分割时同样启用hq_token_only=True。

输出文件:EfficientSAM/grounded_repvit_sam_annotated_image.jpg。

六、源码视角:轻量编码器与统一模型骨架

从四个 setup 脚本可以看出一个共同规律:所有变体都复用segment_anything的标准Sam骨架(PromptEncoder + MaskDecoder + TwoWayTransformer),唯一的分歧点在于图像编码器,以及 Light-HQSAM 对解码器的 HQ 化改造。

变体编码器类型编码器维度/结构要点解码器
MobileSAMTiny-ViT4 阶段,输出通道 320→256(embed_dims 末位 320)标准 MaskDecoder
Light-HQSAMTiny-ViT同上,解码器侧接入vit_dim=160特征MaskDecoderHQ(含 HQ token)
Edge-SAMRepViT(arch=m1,纯 CNN)上采样模式 bicubic,输出 256 维标准 MaskDecoder
RepViT-SAMRepViT(timmrepvit)输出 256 维 prompt_embed_dim标准 MaskDecoder
Efficient-SAM自研轻量编码器(SAMI 预训练)以 TorchScript 整体加载,box+label 直接前向内置,不暴露 SamPredictor 接口

各骨架统一使用prompt_embed_dim=256、image_size=1024、vit_patch_size=16、pixel_mean=[123.675, 116.28, 103.53]、pixel_std=[58.395, 57.12, 57.375](与 segment_anything/modeling/sam.py 的标准设置一致),这意味着同一份 Grounding DINO 检测结果可以无缝切换到任意 SAM 变体上做分割,便于批量对比实验。

七、注意事项与后续工作

  1. FastSAM 的多框限制:由于 FastSAM 后处理机制,一次仅能标注一个检测框;多框场景下脚本会为每个框单独保存一张图,官方计划在后续版本中改进(见 grounded_fast_sam.py)。
  2. 输出文件名拼写差异:README 部分输出文件名存在笔误(如gronded_mobile_sam_anontated_image.jpg),实际以各脚本源码中的cv2.imwrite路径为准;其中 Efficient-SAM 脚本的gronded_efficient_sam_anontated_image.jpg拼写沿用至今。
  3. 路径硬编码:Light-HQSAM、Efficient-SAM、Edge-SAM、RepViT-SAM 四个脚本的输入图、类别与权重路径均为硬编码(bench/example_light_hqsam.png),如需自定义输入,需直接修改脚本内常量(如 grounded_light_hqsam.py);FastSAM 与 MobileSAM 则提供了完整的命令行参数。
  4. 演示图复用:EfficientSAM/LightHQSAM/example_light_hqsam.png被多个变体用作标准输入,便于在同一场景下横向对比不同模型的分割细节与速度。

通过本文的六条命令与源码拆解,你可以在同一套 Grounded-Segment-Anything 环境中快速搭建"文本驱动、轻量分割"的零样本标注方案,并根据设备算力(从移动端到边缘端)灵活选择 FastSAM、MobileSAM、Light-HQSAM、Efficient-SAM、Edge-SAM 或 RepViT-SAM。

  • 人工智能
  • 计算机视觉
  • 深度学习
  • 基础模型
  • AI 应用

【免费下载链接】Grounded-Segment-Anything

Grounded SAM: Marrying Grounding DINO with Segment Anything & Stable Diffusion & Recognize Anything - Automatically Detect , Segment and Generate Anything

项目地址:https://gitcode.com/gh_mirrors/gr/Grounded-Segment-Anything
点击查看免费下载

相关推荐

上一篇:fp-ts Semiring 模块全解析:加法与乘法代数结构的类型化建模
下一篇:LibreChat activity-label 评测基架解析:用固定语料与逐因素变体度量提示词文本质量

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

返回列表