- 人工智能
- 计算机视觉
- 深度学习
- 基础模型
- AI 应用
【免费下载链接】Grounded-Segment-Anything
Grounded SAM: Marrying Grounding DINO with Segment Anything & Stable Diffusion & Recognize Anything - Automatically Detect , Segment and Generate 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.8pytorch>=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 方案全部接入统一管线,按技术路线可分为四类:
| 变体 | 技术路线 | 关键点 | 仓库对应实现 |
|---|---|---|---|
| FastSAM | CNN 分割模型 | 仅用 SA-1B 数据集的 2% 训练,宣称与 SAM 相当的性能配合约 50 倍推理速度提升 | grounded_fast_sam.py、FastSAM/tools.py |
| MobileSAM | Tiny-ViT 编码器 | 保持 SAM 原始管线,仅将 632M 的 ViT-H 编码器替换为约 5M 的 Tiny-ViT;单 GPU 约 12ms/图(编码器 8ms + 解码器 4ms) | grounded_mobile_sam.py、MobileSAM/setup_mobile_sam.py |
| Light-HQSAM | HQ token + 轻量编码器 | 基于 MobileSAM 的 Tiny-ViT,在掩码解码器中注入可学习的 High-Quality Output Token,并先将 ViT 特征与解码器特征融合以提升掩码细节 | grounded_light_hqsam.py、LightHQSAM/setup_light_hqsam.py |
| Efficient-SAM | SAMI 掩码图像预训练 | 用 SAMI 预训练轻量图像编码器 + 掩码解码器,再在 SA-1B 上微调,实现性能与算力开销的平衡 | grounded_efficient_sam.py |
| Edge-SAM | 纯 CNN 编码器蒸馏 | 将 ViT 版 SAM 图像编码器蒸馏为纯 CNN 架构,更适合边缘设备;并验证了任务无关的编码器蒸馏无法完整迁移 SAM 知识 | grounded_edge_sam.py、EdgeSAM/setup_edge_sam.py |
| RepViT-SAM | RepViT 编码器 | 沿用 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_THRESHOLD | 0.25 | 0.3 | 检测框置信度阈值,过滤低置信框 |
TEXT_THRESHOLD | 0.25 | 0.25 | 文本与视觉特征对齐分数阈值 |
NMS_THRESHOLD | 0.8 | — | 非极大值抑制 IoU 阈值 |
multimask_output | True(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.pt | FastSAM 权重路径 |
--img_path | ./images/dogs.jpg | 输入图片路径 |
--text | the black dog. | GroundingDINO 文本提示 |
--imgsz | 1024 | FastSAM 推理图像尺寸 |
--iou | 0.9 | FastSAM 掩码 IoU 阈值 |
--conf | 0.4 | 目标置信度阈值 |
--output | ./output/ | 输出目录 |
--retina | True | 是否输出高分辨率掩码 |
--device | cuda(可用时) | 推理设备 |
输出与已知限制:结果保存于./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 化改造。
| 变体 | 编码器类型 | 编码器维度/结构要点 | 解码器 |
|---|---|---|---|
| MobileSAM | Tiny-ViT | 4 阶段,输出通道 320→256(embed_dims 末位 320) | 标准 MaskDecoder |
| Light-HQSAM | Tiny-ViT | 同上,解码器侧接入vit_dim=160特征 | MaskDecoderHQ(含 HQ token) |
| Edge-SAM | RepViT(arch=m1,纯 CNN) | 上采样模式 bicubic,输出 256 维 | 标准 MaskDecoder |
| RepViT-SAM | RepViT(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 变体上做分割,便于批量对比实验。
七、注意事项与后续工作
- FastSAM 的多框限制:由于 FastSAM 后处理机制,一次仅能标注一个检测框;多框场景下脚本会为每个框单独保存一张图,官方计划在后续版本中改进(见 grounded_fast_sam.py)。
- 输出文件名拼写差异:README 部分输出文件名存在笔误(如
gronded_mobile_sam_anontated_image.jpg),实际以各脚本源码中的cv2.imwrite路径为准;其中 Efficient-SAM 脚本的gronded_efficient_sam_anontated_image.jpg拼写沿用至今。 - 路径硬编码:Light-HQSAM、Efficient-SAM、Edge-SAM、RepViT-SAM 四个脚本的输入图、类别与权重路径均为硬编码(
bench/example_light_hqsam.png),如需自定义输入,需直接修改脚本内常量(如 grounded_light_hqsam.py);FastSAM 与 MobileSAM 则提供了完整的命令行参数。 - 演示图复用:
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
相关推荐
Segment Anything 高级用法完全指南:SAM 2 视频分割、Grounded SAM 文本提示与生产级集成实战
Segment Anything 高级用法完全指南:SAM 2 视频分割、Grounded SAM 文本提示与生产级集成实战 本篇技术指南围绕 AI Resea
AI 技能人工智能大模型深度学习Kornia 中 Segment Anything (SAM) 的提示式分割:VisualPrompter 与 Sam 模型实战指南
Kornia 中 Segment Anything SAM 的提示式分割:VisualPrompter 与 Sam 模型实战指南 Segment Anythin
计算机视觉深度学习人工智能图像处理终极指南:如何用Grounded Segment Anything实现零样本图像分割与自动标注
终极指南:如何用Grounded Segment Anything实现零样本图像分割与自动标注 Grounded Segment Anything(Ground
人工智能计算机视觉深度学习基础模型AI 应用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考