尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
基于GroundingDINO与SAM的开放词汇检测与分割实战指南
简介本资源面向计算机视觉开发者与研究人员提供将GroundingDINO与SAM融合以增强目标检测和图像分割能力的完整项目源码适合具备一定深度学习基础、希望快速上手文本引导定位与通用分割实战的读者。压缩包共132个文件约30.63MB以58个Python脚本为核心辅以6个Jupyter Notebook实验文件、10个tsx与5个js前端组件、若干png/jpg/jpeg示例图以及cpp、cu、cuh等CUDA算子源码和Dockerfile、yaml、sh等部署配置覆盖算法实现、可视化演示与工程化部署多个层面。目前已有125人学习下载。通过源码可直观理解GroundingDINO的文本到图像定位机制与SAM的灵活分割流程掌握二者协同工作的接口设计与推理细节并借助示例图与Notebook快速复现检测分割效果为自动驾驶、遥感分析、医学图像处理等场景的二次开发提供可复用的工程模板与排错参考。1. 从「框不准、分不细」说起这套 GroundingDINO SAM 组合到底解决什么问题做视觉项目的人大多经历过这种场景检测模型能框出目标但框得歪歪扭扭边缘糊成一团想再叠一个分割模型又得重新标注、重新训练标注成本直接劝退。更麻烦的是遇到开放词汇场景——训练集里没见过的类别传统检测器直接哑火。这套基于 GroundingDINO 和 SAM 的增强方案核心思路就是用「开放词汇检测 通用分割」两段式流水线把检测和分割解耦开让你不用为每个新类别重训模型。GroundingDINO 负责根据文本提示比如 person、red car输出候选框SAM 接过这些框作为 prompt生成像素级掩码。两者都是零样本能力极强的模型组合起来就是一套「文本进、掩码出」的通用管线。适合谁做数据标注预处理的、做机器人感知原型的、做图像编辑工具的以及想快速验证开放词汇检测效果但不想从头训模型的从业者。源码包里把推理脚本、权重加载、后处理都串好了拿到就能跑通。2. GroundingDINO 与 SAM 的协作机制为什么这样拼比单模型香2.1 两阶段解耦检测管「在哪」分割管「是什么形状」传统实例分割模型如 Mask R-CNN把检测和分割塞进一个网络联合训练好处是端到端坏处是每换一个数据集就得重训而且类别闭集。GroundingDINO SAM 走的是另一条路检测阶段用文本编码器把类别描述变成 embedding和图像特征做跨模态对齐输出的是与文本相关的候选框分割阶段 SAM 不关心类别只根据框或点生成掩码。这种解耦带来两个实际好处。第一换类别不用重训——改文本提示就行比如把 dog 改成 cat检测框立刻跟着变。第二分割质量不依赖检测模型的训练数据分布SAM 在 SA-1B 上见过足够多的物体形态泛化性有保障。常见做法是先用 GroundingDINO 以较低 box_threshold 召回尽可能多的候选再用 SAM 批量生成掩码最后按面积或置信度过滤。2.2 文本提示工程prompt 怎么写直接影响召回GroundingDINO 对文本提示的写法比较敏感。实测下来用英文单词或短语效果最稳比如 person、traffic light、red apple。如果写成 a photo of a person反而可能因为语义漂移导致框偏移。多个类别用英文句点分隔例如 person . car . dog注意句点前后加空格这是官方推荐的格式。# 文本提示构造示例 # 用句点分隔多个类别前后加空格避免语义粘连 TEXT_PROMPT person . bicycle . car . dog . traffic light # 如果只想检测单一类别直接写单词即可 # TEXT_PROMPT person这里的关键参数是box_threshold和text_threshold。box_threshold控制框的置信度门槛调低召回多但误检也多text_threshold控制文本与区域的匹配门槛。我一般先把box_threshold设到 0.25 左右跑一遍看召回再根据误检情况往上调。如果发现某类目标总是漏优先检查文本提示是不是写得太复杂。2.3 从框到掩码SAM 的 prompt 编码与批量推理SAM 接受两种 prompt点集和框。这里用框模式把 GroundingDINO 输出的每个框作为独立 prompt 送进 SAM 的 prompt encoder。SAM 的图像编码器只跑一次得到 image embedding然后每个框复用这个 embedding 做 mask decoder这样批量推理时不会重复计算图像特征速度能快不少。# 伪代码示意复用 image embedding 做批量掩码生成 # 实际源码中会有更完整的封装 image_embedding sam.image_encoder(image) # 只跑一次 masks [] for box in boxes: # 每个框单独作为 prompt复用 image_embedding mask sam.mask_decoder(image_embedding, box_promptbox) masks.append(mask)参数上注意multimask_output设为 True 时 SAM 会为每个框输出三个候选掩码不同粒度通常选 IoU 预测分数最高的那个。如果做精细分割可以三个都保留后续按面积或边缘平滑度筛选。源码包里默认走的是单掩码输出想改的话在 mask decoder 调用处把参数打开即可。3. 环境搭建与推理跑通从零把管线拉起来3.1 依赖安装与权重准备这套管线依赖 PyTorch、torchvision、以及 GroundingDINO 和 SAM 各自的代码库。常见做法是建一个干净的 conda 环境Python 3.8 或 3.9 都行PyTorch 版本跟 CUDA 对齐。GroundingDINO 需要编译 CUDA 算子如果机器上没有 nvcc可以走纯 Python 推理路径速度慢一些但能跑通。# 创建环境并安装基础依赖 conda create -n gdino_sam python3.9 -y conda activate gdino_sam # 安装 PyTorch按自己的 CUDA 版本选对应命令 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 安装 GroundingDINO 和 SAM 的依赖 pip install groundingdino-py segment-anything权重文件需要单独下载GroundingDINO 的 Swin-T 或 Swin-B 权重SAM 的 ViT-H 或 ViT-B 权重。ViT-H 精度高但显存占用大单卡 8G 显存建议用 ViT-B。权重放到源码包指定的weights/目录下配置文件里的路径要对上。提示GroundingDINO 的 CUDA 算子编译容易因为 nvcc 版本不匹配翻车如果报错先检查nvcc -V和 PyTorch 的 CUDA 版本是否一致不一致就装纯 Python 版绕开。3.2 推理脚本拆解输入输出与关键参数源码包里的推理脚本一般长这样读图 → GroundingDINO 检测 → 框送 SAM → 掩码后处理 → 可视化保存。核心参数集中在检测和分割两个阶段。# 检测阶段关键参数 BOX_THRESHOLD 0.3 # 框置信度门槛调低召回多误检多 TEXT_THRESHOLD 0.25 # 文本匹配门槛影响类别判定 # 分割阶段关键参数 MULTIMASK False # 是否输出多个候选掩码 MIN_MASK_AREA 100 # 过滤过小掩码避免噪点BOX_THRESHOLD和TEXT_THRESHOLD需要联合调。如果发现框位置对但类别标错多半是TEXT_THRESHOLD太低把不相关的文本匹配进来了如果框本身就不准先调BOX_THRESHOLD。MIN_MASK_AREA按像素算小目标场景可以降到 50 甚至更低但要注意别把噪点也留下。3.3 可视化与结果导出掩码叠加和 COCO 格式转换跑通推理后可视化能帮你快速判断效果。常见做法是把掩码以半透明色叠加在原图上框和类别标签一起画。如果要接下游任务比如训练自己的分割模型可以把结果导成 COCO 格式省去手工标注。# 掩码叠加可视化示意 import cv2 import numpy as np def overlay_mask(image, mask, color(0, 255, 0), alpha0.5): # mask 是二值掩码image 是 BGR 图像 colored np.zeros_like(image) colored[mask] color return cv2.addWeighted(image, 1 - alpha, colored, alpha, 0)导出 COCO 格式时注意segmentation字段要存多边形或 RLEbbox存[x, y, w, h]category_id从 1 开始。源码包里如果有导出脚本直接改输出路径就行没有的话按这个结构自己写一个半小时能搞定。4. 避坑与排查那些让我重跑三遍的坑4.1 现象检测框正常但掩码全图乱飞原因SAM 的输入框坐标格式和 GroundingDINO 输出格式不一致。GroundingDINO 输出的是归一化的[cx, cy, w, h]SAM 要的是绝对坐标的[x1, y1, x2, y2]。中间少了一步反归一化和格式转换框的位置就全错了。解决在送 SAM 之前加一步转换把归一化中心宽高转成绝对角点坐标并 clip 到图像边界内。# 归一化 [cx, cy, w, h] 转绝对 [x1, y1, x2, y2] def xywh_to_xyxy(boxes, img_w, img_h): cx, cy, w, h boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3] x1 (cx - w / 2) * img_w y1 (cy - h / 2) * img_h x2 (cx w / 2) * img_w y2 (cy h / 2) * img_h return np.stack([x1, y1, x2, y2], axis1)4.2 现象显存爆了batch size 调到 1 还是 OOM原因SAM 的 ViT-H 图像编码器对高分辨率图像显存占用很大加上 GroundingDINO 的 Swin-B backbone两张卡都不一定扛得住。另外如果没开torch.no_grad()中间激活值会一直留着。解决推理全程包在torch.no_grad()里图像先 resize 到长边 1024 以内SAM 换 ViT-B 权重。如果还不行把 GroundingDINO 和 SAM 分两个进程跑中间用文件传框坐标。4.3 现象文本提示换了但检测结果没变原因文本 embedding 被缓存了或者 tokenizer 把提示截断了。GroundingDINO 的文本编码器有最大 token 限制提示太长会被截断后面的类别就丢了。解决检查 tokenizer 输出长度超过 256 的截断确认每次换提示时重新跑文本编码别复用上一次的 embedding。多个类别时拆成多次推理再合并比一次性塞长提示更稳。4.4 现象小目标掩码边缘锯齿严重原因SAM 的图像编码器下采样倍率较高小目标在特征图上占的像素太少mask decoder 恢复出来的边缘就粗糙。解决把小目标区域裁剪出来单独放大后再送 SAM或者用multimask_outputTrue取三个掩码里边缘最平滑的那个。如果做批量处理可以按框面积分两组小框走裁剪放大路径大框走原图路径。5. 进阶技巧把两段式管线压进实时场景的几个手段跑通之后最现实的问题是速度。GroundingDINO SAM 原版在单张 3090 上处理一张 1080P 图大概要 1.5 到 2 秒离实时差得远。我一般从三个方向压第一GroundingDINO 换 Swin-T backbone精度掉一点但速度翻倍第二SAM 图像编码器只跑一次多个框复用 embedding这个前面提过批量场景下收益明显第三把图像 resize 到长边 800 而不是 1024掩码精度略降但肉眼几乎看不出差别。还有一个取巧办法如果类别固定可以把 GroundingDINO 的文本 embedding 预计算好存下来推理时直接加载省掉文本编码那几十毫秒。源码包里如果没做这个缓存自己加一个字典按提示字符串做 key 就行。验证效果时别只看可视化图量化指标更靠谱。检测阶段算 recall 和 precision分割阶段算 mask IoU。我习惯留 20 张图做固定测试集每次调参后跑一遍对比数值避免被单张图的视觉效果带偏。从那以后我每次改参数都强制走一遍测试集再也没出现过「看着挺好、一上量就崩」的情况。希望帮到你。本文还有配套的精品资源点击获取
RELATED

相关推荐

大屏编辑器数据源接入全攻略:打通MySQL、API与文件不再难

大屏编辑器数据源接入全攻略:打通MySQL、API与文件不再难

在数据可视化大屏项目里摸爬滚打的兄弟们,应该都体会过那种“开发两小时,联调一整天”的滋味。业务方要的是炫酷大屏和实时数据,但真正让我们头疼的从来不是图表组件的样式,而是底下那一堆千奇百怪的数据源——这边是MySQL&#x…

📅 2026/10/11 20:42:05
你读了三百篇文献,却没有一句自己的话:惠构思AI(惠构思AI官网www.huigousi.com)的硕士论文功能,逼你完成学术身份转换

你读了三百篇文献,却没有一句自己的话:惠构思AI(惠构思AI官网www.huigousi.com)的硕士论文功能,逼你完成学术身份转换

一个让我沉默的瞬间 去年帮一个硕士生改论文,他的文献综述写了八千字,引了九十七篇文献。我读完问他:你刚才这八千字里,哪一句话是你自己的? 他愣了很久,说:好像……没有。 这就是硕士论文和本科…

📅 2026/10/11 20:42:05
水下目标检测实战:YOLOv8定制化改造与Jetson Nano部署

水下目标检测实战:YOLOv8定制化改造与Jetson Nano部署

简介:本资源是一套面向人工智能毕设与海洋智能监测场景的YOLOv8深度学习检测系统,聚焦水下四类典型生物(海胆、海参、扇贝、海星)的识别任务,适用于高校计算机视觉方向本科生毕设开发、水产养殖智能化改造及海洋生态保…

📅 2026/10/11 20:37:04
MORE NEWS

更多资讯

📰

从无标题文档到正式发布:先定内核再取标题的创作流程

很多人打开文档软件时,都会看到一个小尴尬:新文档默认名不是“未命名”,就是“无标题”。我自己电脑里,这种文件常年躺了一排,里面有的是灵感碎片,有的是写到一半的草稿,还有的干脆就是空白。但…

📰

斯纳克图书馆管理系统PHP版v6.0实战部署与优化指南

简介:斯纳克图书馆管理系统PHP版v6.0是一套面向中小型图书馆、高校院系资料室及数字资源管理场景的成熟Web应用系统,专为具备PHPMySQL开发基础的IT人员或信息化管理员设计,用于快速部署图书编目、借阅流通、标签打印与多终端认证一体化管理。…

📰

易支付运营版源码部署与支付通道轮询、投诉进件实战解析

简介:面向需要自建聚合支付平台的开发者与站长,这份运营版易支付系统源码提供支付宝、微信、QQ钱包、银联等多渠道免签约接入能力,支持PC扫码、H5、公众号等多种支付场景。系统基于PHP 7.4与MySQL开发,内置轮询投诉、进件管理等运…

📰

基于调频能力裕度的风电场一次调频策略解析

风电场参与电网一次调频这件事,这几年已经从不做不行,变成了怎么做得更稳、更准的问题。早些年并网要求宽松,风电场的态度基本是“有功发满就行,频率的事交给同步机”。现在新能源占比上来以后,电网对风电场调频能力的…

📰

HDFS存储优化实战:纠删码、压缩与小文件治理策略

大数据项目的存储层里,HDFS 通常是最先被塞满、却最后一个被优化的组件。大多数团队在容量告警触发之前,并不会认真考虑副本数、文件格式、冷数据沉降这些事,等磁盘真的快满了,第一反应往往是再加节点。这篇文章是我在生产环境里做…

📰

Oracle 12c SQL查询实战:从v$session到AWR追溯历史执行记录

刚接手一个Oracle 12c库,最常被问到的问题就是:“你帮我看看现在数据库里在跑什么SQL?”或者“这个SQL昨天跑了多少次?”说实话,这类需求我处理过太多回了,但每次在技术群里看到答案还是有人只会贴一个v$se…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬