GroundingDINO 配置选型指南:SwinT 与 SwinB 选型对比
【免费下载链接】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 让你用一句话写出想检测的目标,而快慢与精度由配置文件里的一行决定。本文逐参数对比 SwinT/SwinB,读完你能按自己的场景选配置并跑通第一次推理。
🏗️ GroundingDINO 架构速览:一张图看懂五个模块
大白话:输入是一张图和一句短语,输出是 900 个候选框,每个框带着对短语里每个词的置信度,超过阈值的框就是最终检测结果。它由五个模块串成:BERT 读文本、Swin Transformer 读图像、特征增强器把两路特征对齐、文本引导查询生成让查询知道要找什么,最后解码器迭代细化出框。
GroundingDINO 核心模块拆解:从文本输入到框输出
图像骨干:Swin Transformer 提取多尺度特征
它是什么:backbone/ 封装 Swin Transformer 并用 timm 加载预训练权重。解决什么:输出 3 层特征(return_interm_indices = [1, 2, 3]),让检测器同时看得到大目标和小目标。关键参数:backbone,两个配置文件的唯一差异就在此处。
文本编码器:BERT 把短语变成特征
它是什么:bertwarper.py 封装bert-base-uncased。解决什么:把 "a cat and a dog" 变成模型可计算的 token 级特征。关键参数:max_text_len = 256是短语长度上限,官方建议用句号.分隔多个类别名。
特征增强器:双向交叉注意力对齐文本与图像
它是什么:fuse_modules.py 里的 text-to-image 与 image-to-text 两个交叉注意力模块。解决什么:文本和图像特征本来各说各话,双向注意力让两边先感知对方再进入解码。关键参数:use_text_enhancer、use_fusion_layer、use_text_cross_attention默认全为 True。
查询选择:用语言引导 900 个检测查询
它是什么:Language-guided Query Selection 用文本特征生成跨模态查询。解决什么:普通 DETR 的查询不知道"要找什么",文本引导后每个查询都带着任务先验。关键参数:num_queries = 900,即候选框数量上限。
跨模态解码器:迭代细化出最终框
它是什么:transformer.py 实现的 6 层多尺度可变形注意力解码器。解决什么:从参考点出发每层修正一次框,最终输出框坐标加逐词置信度。关键参数:dec_layers = 6、num_feature_levels = 4、hidden_dim = 256、nheads = 8。
⚖️ GroundingDINO SwinT 与 SwinB 配置差异横向对比
先说个反直觉的事实:逐行对比 config 目录 下的两个文件,差异只有一行——backbone。其余hidden_dim、nheads、num_queries全部相同。
| 配置项 | SwinT | SwinB |
|---|---|---|
| backbone 取值 | swin_T_224_1k | swin_B_384_22k |
| 预训练集 | ImageNet-1K | ImageNet-22K |
| 输入分辨率 | 224 | 384 |
| 训练数据 | O365、GoldG、Cap4M | COCO、O365、GoldG、Cap4M、OpenImage、ODinW-35、RefCOCO |
| COCO box AP(官方表) | 48.4 零样本 / 57.2 微调 | 56.7 |
数据给出的结论:SwinB 用更大的骨干、22K 预训练和 384 输入,换来更强的特征和更小目标占的像素更多,代价是显存占用更高、单帧推理更慢。SwinT 版本(172M 参数)在 ODinW 基准上零样本 AP_avg 达 22.3、full-shot 达 70.7,已经是可用的强基线。
🚀 跑通第一条 GroundingDINO 推理命令
克隆并安装(需设置CUDA_HOME才能编译 CUDA 算子,否则自动退回 CPU 模式):
git clone https://gitcode.com/GitHub_Trending/gr/GroundingDINO cd GroundingDINO pip install -e .下载 SwinT 权重:
mkdir -p weights wget -O weights/groundingdino_swint_ogc.pth -q https://github.com/IDEA-Research/GroundingDINO/releases/download/v0.1.0-alpha/groundingdino_swint_ogc.pth对仓库自带的猫狗图跑第一次推理:
CUDA_VISIBLE_DEVICES=0 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 logs/demo \ -t "a cat and a dog"跑完会在logs/demo/pred.jpg得到框好的猫和狗。在自己的脚本里可以直接调 inference.py:
from groundingdino.util.inference import load_model, load_image, predict, annotate model = load_model("groundingdino/config/GroundingDINO_SwinT_OGC.py", "weights/groundingdino_swint_ogc.pth")想切 SwinB,只需替换这两行参数:
-c groundingdino/config/GroundingDINO_SwinB_cfg.py \ -p weights/groundingdino_swinb_cogcoor.pth🎯 按你的场景选 SwinT 还是 SwinB
- 如果你的 GPU 显存低于 8GB,或者要在视频流上做实时检测,选 SwinT:224 输入加更小的骨干,单帧推理更快。
- 如果你做工业质检、场景复杂或目标很小,选 SwinB:22K 预训练加 384 输入让小目标占据更多像素。
- 如果你只是验证 demo 或搭自动标注流水线,选 SwinT:默认阈值已能给出可用的框。
- 如果机器没有 GPU,选 SwinT 并加
--cpu-only,SwinB 在 CPU 上不实际。 - 如果你两个都想试,同一张图各跑一次,对比 pred.jpg,小目标场景差异最明显。
🎛️ 调整这 5 个参数改变检测速度与精度
推理期即生效的阈值:
box_threshold(默认 0.3):框置信度阈值 → 调高到 0.5 减少误检,调低到 0.2 提高召回但会多出假框。text_threshold(默认 0.25):标签用词匹配阈值 → 调高后只保留高置信度用词。
架构参数(仓库只发布推理代码,改动需要你自己训练):
num_queries(900):候选框数量 → 减到 600 解码更快,但目标密集时会被框数截断。hidden_dim(256):整个 Transformer 的特征宽度 → 改了会破坏预训练权重形状,必须重新训练。use_checkpoint(True):梯度检查点 → 用算力换显存,训练大骨干时保持开启。
GroundingDINO 检测效果展示:跑起来长这样
左到右三列分别是 COCO 预定义类别、人输入的新类别、以及 "The left lion" 这类指代表达,最后一列展示与 Stable Diffusion 结合的编辑应用。下面这张就是上面命令的输入图:
GroundingDINO 配置选型速查
- 最小可用路径:SwinT + 默认阈值,先验证流水线
- 精度优先、小目标、复杂场景:SwinB
- 误检多:
box_threshold调到 0.5 - 漏检多:降到 0.2,再配合
text_threshold - 无 GPU 环境:
--cpu-only,只跑 SwinT
【免费下载链接】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),仅供参考