两份权重先下哪个?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 你会遇到两个 .pth 权重和两套配置文件,不确定先跑哪个。这个开放集检测模型接收"图片 + 一句话",直接输出框和类别文字;SwinT 与 SwinB 的核心差别只在骨干网络和输入分辨率。本文先把最小可跑流程讲通,再讲清楚 GroundingDINO 配置该怎么选。
GroundingDINO 最小安装步骤:装完就能跑一次推理
git clone https://gitcode.com/GitHub_Trending/gr/GroundingDINO && cd GroundingDINO export CUDA_HOME=/usr/local/cuda # 指向你的 CUDA 目录;没有 GPU 就跳过 pip install -e . mkdir -p weights # 放下载好的权重文件权重文件名为groundingdino_swint_ogc.pth(SwinT)和groundingdino_swinb_cogcoor.pth(SwinB),官方下载地址见 README 的 Checkpoints 表格,下载后丢进weights/即可。
from groundingdino.util.inference import load_model, load_image, predict, annotate import cv2 model = load_model("groundingdino/config/GroundingDINO_SwinT_OGC.py", "weights/groundingdino_swint_ogc.pth") image_source, image = load_image(".asset/cat_dog.jpeg") boxes, logits, phrases = predict(model, image, "cat . dog .", box_threshold=0.35, text_threshold=0.25) cv2.imwrite("out.jpg", annotate(image_source, boxes, logits, phrases))类别之间建议用.分隔,和 README 示例保持一致。想换 SwinB,不改代码,把load_model里两个路径换成 SwinB 配置和 cogcoor 权重就行。下面这张图展示了文本驱动定位的效果,包括"指代式"表达(如 the left lion):
SwinT 和 SwinB 配置文件到底差在哪
先说一个关键事实:逐行对比 groundingdino/config/GroundingDINO_SwinT_OGC.py 和 groundingdino/config/GroundingDINO_SwinB_cfg.py,唯一实质差异就是backbone一行——swin_T_224_1k对swin_B_384_22k。其余hidden_dim = 256、num_queries = 900、num_feature_levels = 4等参数完全相同。
| 对比项 | SwinT | SwinB |
|---|---|---|
| 骨干网络 | Swin-T | Swin-B |
| 输入分辨率 | 224×224 | 384×384 |
| 骨干预训练数据 | ImageNet-1K | ImageNet-22K |
| 参数量级 | 约 172M(论文口径) | 约 230M |
| 推理显存(经验值) | 6–8GB 可跑 | 12GB 以上更稳妥 |
| 相对速度 | 基准 | 约慢 2–3 倍(分辨率像素量约为 3 倍) |
| 官方 COCO box AP | 48.4(zero-shot)/ 57.2(fine-tune) | 56.7 |
架构上三个关键模块各管一段(见 groundingdino/models/GroundingDINO/groundingdino.py):特征增强器做文本-图像双向交叉注意力,让文本特征和图像特征互相补充;语言引导查询选择根据文本内容生成 900 个跨模态查询,决定"往哪找";跨模态解码器迭代精修框的位置,用对比损失保证框和词匹配、定位损失保证框贴边。
基准数据怎么说:ODinW 零样本成绩怎么读
ODinW 覆盖 35 个检测数据集,是开放集检测常用的零样本基准,官方表在.asset/ODinW.png:
- Grounding-DINO-T(172M)Zero-Shot AP 平均 20.0、中位 9.5:当时超过同量级的 GLIP-T(19.6),说明"小模型 + 文本接地"这条路走得通。
- 同模型 Full-Shot AP 平均 70.7、中位 76.2:当 35 个数据集都有标注数据可微调时,它对其它方法的领先幅度反而拉大,说明它吃标注的能力强。
- 论文里 Grounding DINO L(Swin-L,341M)Zero-Shot 平均 26.1、中位 18.4:这是该框架的能力上限参照,SwinB 权重(COCO 56.7 AP)介于 T 和 L 之间。
- Few-Shot AP 中位 51.1:少量样本场景下稳定性也好,适合"手头只有几十张标注"的业务。
按场景对号入座:你的部署该用哪个配置
| 你的情况 | 推荐配置 | 一句话理由 |
|---|---|---|
| 实时视频流(要帧率) | SwinT | 224 输入 + 小骨干,推理约快 2–3 倍,帧率瓶颈主要在这 |
| 边缘 / 移动 / CPU 部署 | SwinT | 显存占用低,且官方 demo 支持--cpu-only纯 CPU 模式 |
| 快速原型验证 | SwinT | 权重小、下载快,48.4 的零样本 AP 足以验证想法是否成立 |
| 高精度质检(医学影像、工业检测、需微调) | SwinB | 384 输入对小目标和细节更友好,微调起点 56.7 AP 留有余量 |
前提说明:显存和速度是经验值,具体以你机器的nvidia-smi实测为准;如果你的目标本来就大且文本提示写得好,SwinT 的精度损失未必明显。
GroundingDINO 性价比调参:4 个值得动的参数
两份配置默认值一致,以下按"改成多少 → 换来什么 → 代价是什么":
num_queries:900 → 500–600。换来解码更快、输出框更少、后处理省算力;代价是密集场景会漏检——模型按 900 训练,减少查询属于降级使用,不是无损。num_feature_levels:4 → 3。换来每层注意力少算一个特征金字塔层级,推理提速;代价是小目标召回下降,目标偏小的数据集别动。use_checkpoint:True → False(配置里默认开着)。换来速度明显提升(梯度检查点只影响前向/反向的重复计算开销);代价是显存峰值上升,小卡上可能 OOM。hidden_dim:256 → 384。换来更强的特征表达能力;代价最大——权重形状全变,预训练权重无法直接加载,必须重训,显存也更高。只建议自研模型时用。
三句话决策:SwinT 还是 SwinB
- 默认选 SwinT:显存 ≤8GB、要实时、或只是验证想法,就用
swint_ogc.pth起步,跑通 demo/inference_on_a_image.py 再谈其它。 - 只有两种情况升级到 SwinB:你要在自己的领域数据上微调,或者目标小、细节关键且能拿出 12GB 以上显存。
- 两者切换零成本:只改配置文件和权重两个路径,代码、prompt、阈值全部通用。
- 先跑一次默认配置拿到基线,确认瓶颈是速度、显存还是漏检,再回头查上一节的参数表,不要一上来就改参数。
【免费下载链接】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),仅供参考