GroundingDINO 零样本目标检测:给一句自然语言,就把图里的东西框出来
【免费下载链接】GroundingDINO[ECCV 2024] Official implementation of the paper "Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection"项目地址: https://gitcode.com/GitHub_Trending/gr/GroundingDINO
想让模型找出"图里所有戴红帽子的人"并标出位置,不标注、不训练?GroundingDINO 就是为此而生的零样本目标检测工具,输入图片和自然语言提示,直接返回对应物体的边界框。
能力速览:GroundingDINO 能做什么
- 输入图片 + 类别名提示(
cat . dog .)→ 得到所有实例的边界框;多类别用点号分隔,一次推理全部框出。 - 输入整句参考表达 + token 位置 → 得到句中指代对象的精确位置,例如"左边那只狮子"。
- 输出检测框 → 配合 Stable Diffusion / GLIGEN,得到只改写指定区域的编辑图。
- 边界也说清:它只出框不出 mask;仓库只提供推理代码,训练代码未开源,微调要自己备数据。
5分钟安装与验证:GroundingDINO 怎么跑起来
装的东西:克隆仓库后执行安装,会顺带编译 CUDA 版注意力扩展,并下载 Swin-T OGC 权重。装之前确认CUDA_HOME指向与 PyTorch 匹配的 CUDA 版本,否则按纯 CPU 模式编译,后面速度感人。
git clone https://gitcode.com/GitHub_Trending/gr/GroundingDINO && cd GroundingDINO && pip install -e . ; mkdir -p weights && cd weights && wget -q https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth验证就一条命令(以 Swin-T 配置为例,图片换成你自己的):
python demo/inference_on_a_image.py \ -c groundingdino/config/GroundingDINO_SwinT_OGC.py -p weights/groundingdino_swint_ogc.pth \ -i .asset/cat_dog.jpeg -o outputs -t "cat . dog ."看到outputs/pred.jpg里原图上画出彩色框、框角标着cat (0.9xx)这样的标签,就说明整条流水线通了。
三个典型工作流:批量检测、精确定位与局部编辑
场景一:批量检测已知几类物品
场景一句话:盘点一张照片里同时出现的猫、狗和椅子。关键做法:提示词写成点号分隔的类别列表cat . dog . chair .,跑 推理脚本;脚本默认按 box_threshold 0.3 过滤,输出的每个框都带命中的词和分数。效果:一次推理得到所有实例的框与标签,直接落盘成标注图。
场景二:用整句话精确定位某个短语
场景一句话:图中有多只动物,只想框出"戴红帽子的那个人"。关键做法:把完整句喂给模型,再用--token_spans按 token 下标切出目标短语,例如"a cat and a dog"里"cat"是[2, 5];指定 token_spans 后 text_threshold 自动失效,只按该短语打分。效果:同一张图、同一句话,可以只输出"那只猫"而不带出"那只狗"。
场景三:检测框驱动的局部图像编辑
场景一句话:只想把图里的狗换成金毛,狮子保持原样。关键做法:先让 GroundingDINO 框出目标,把框和类别喂给 Stable Diffusion 或 GLIGEN 做局部改写,仓库的 图像编辑 notebook 里是完整流程。效果:只改检测到的区域,背景和其他物体基本不动。
关键参数怎么调:box_threshold 与 text_threshold 调优
box_threshold(默认 0.3):决定哪些框保留,分数低于它直接丢弃。漏检多就往 0.2 调,误框多往 0.4~0.5 调;杂背景场景普遍比干净图更吃低阈值。text_threshold(默认 0.25):决定哪些词算"命中标签"。调太低会把无关词混进标签,一般跟着 box_threshold 微调即可,不用单独大动。token_spans:不填就走默认打分逻辑;填了则只检测指定短语,且与 text_threshold 互斥,二选一。
容易踩的坑
- 现象:import 时抛
NameError: name '_C' is not defined→ 原因:CUDA_HOME未设置或安装步骤跳步,CUDA 扩展没编译 → 解法:重设环境变量后重新 clone 并严格走完全部安装步骤,官方 README 点名了这个错。 - 现象:输出标签串词、框对不上 → 原因:提示词格式不对,不同类别间要用
.分隔且句尾要有句号 → 解法:照cat . dog .的写法来,模型会自动补末尾句号,但类别间的点号自己得加。 - 现象:纯 CPU 跑一张图要等半天,或 GPU 显存吃紧 → 原因:Swin-B 权重约两倍显存,大图高分辨率也会爆 → 解法:资源有限就用
--cpu-only顶一下、降分辨率,正式用回 Swin-T。
想再深入,可以从 groundingdino/models/ 读 feature enhancer 与跨模态 decoder 的实现,弄清 900 个框如何跟 256 个文本维度互相打分。下一步自然的延伸是把检测框接上 SAM 转成 mask,做开放词表的实例分割。
【免费下载链接】GroundingDINO[ECCV 2024] Official implementation of the paper "Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection"项目地址: https://gitcode.com/GitHub_Trending/gr/GroundingDINO
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考