GroundingDINO 配置选型:SwinT 还是 SwinB,从一行 backbone 参数说起
【免费下载链接】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。两个 config 只差一行backbone参数,它决定了输入分辨率、预训练数据和参数量,进而决定你的显存账单和推理速度。
🚀 从最小推理命令看配置入口
装好后跑通一条推理命令,就能看清配置是怎么参与的:
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 your_image.jpg \ -o outputs/ \ -t "cat . dog"-c指向超参文件,-p指向权重。这两者成对出现:官方给了groundingdino_swint_ogc.pth配GroundingDINO_SwinT_OGC.py,groundingdino_swinb_cogcoor.pth配GroundingDINO_SwinB_cfg.py,不能混搭。环境安装很简单:
git clone https://gitcode.com/GitHub_Trending/gr/GroundingDINO cd GroundingDINO && pip install -e .装完如果报NameError: name '_C' is not defined,是 CUDA 扩展没编译成功,按 README 设置CUDA_HOME后重装即可。
📝 两个 config 文件的逐行 diff
把两个配置文件并排看:43 行里只有第 3 行不同,其余 42 行一字不差。
# 两个文件唯一的差异 backbone = "swin_T_224_1k" # SwinT_OGC.py backbone = "swin_B_384_22k" # SwinB_cfg.pyTransformer 主干的参数两个文件完全一致:enc_layers = 6、dec_layers = 6、nheads = 8、hidden_dim = 256、num_queries = 900(默认输出 900 个候选框,再按box_threshold/text_threshold过滤)、num_feature_levels = 4。也就是说,配置是可插拔的:换骨干网络时,上层推理代码一行不用改,只改命令里的-c和-p。
🔍 backbone 一个参数决定了什么
backbone这一行编码了三件事:SwiN 变体、输入分辨率、预训练数据集。swin_T_224_1k= Swin-Tiny + 224×224 输入 + ImageNet-1K 预训练;swin_B_384_22k= Swin-Base + 384×384 输入 + ImageNet-22K 预训练。
| 维度 | SwinT(GroundingDINO_SwinT_OGC.py) | SwinB(GroundingDINO_SwinB_cfg.py) | 实际影响 |
|---|---|---|---|
| 输入分辨率 | 224×224 | 384×384 | 特征图面积 3 倍差,小目标定位 |
| 预训练数据 | ImageNet-1K | ImageNet-22K | 见过的语义类别数量差一个量级 |
| 相对规模 | 1× | 约 4×(参数量级) | 显存占用与耗时 |
- 分辨率:384 的特征图面积是 224 的 3 倍,细节更多。同一张图,SwinB 更容易框准小目标,代价是预处理和推理都更久。
- 预训练语料:1K 还是 22K 个类别,直接关系"给一句没见过的描述能不能听懂",这正是 GroundingDINO 开放词汇检测的核心能力来源。
- 参数量级:约 4 倍的差距决定了显存账单的档位差。
📊 COCO 数据与显存账单
官方 README 的 checkpoint 表给出两组数字:
| 模型 | 训练数据 | COCO box AP |
|---|---|---|
| GroundingDINO-T(SwinT) | O365, GoldG, Cap4M | 48.4(零样本)/ 57.2(微调) |
| GroundingDINO-B(SwinB) | COCO, O365, GoldG, Cap4M, OpenImage, ODinW-35, RefCOCO | 56.7(微调) |
注意:这两行数字不能直接比。SwinB 的训练数据混入了 COCO,SwinT 刻意避开了 COCO,所以 57.2 是纯零样本迁移的结果,含金量更高。SwinB 的优势更多体现在 ODinW 这类跨领域泛化基准上,趋势见官方图。
部署时真正卡脖子的还是显存和速度:
- 8GB 显存跑 SwinT 推理绰绰有余,batch size 还有空间;SwinB 推理需要 3090/4090 级别的卡,batch size 基本只能设为 1。
- 同一张图,SwinB 的总耗时约为 SwinT 的 2 倍,384 分辨率的预处理开销也更大。
- 两个配置默认都开了
use_checkpoint = True(梯度检查点:重算中间激活换显存),微调时可以直接依赖它,不必自己降 batch 硬扛。
🧭 部署选型:先问瓶颈在精度还是延迟
选型别从"哪个更强"开始,先问:你的瓶颈是模型精度,还是工程优化?
- 实时视频流、边缘盒子、8GB 卡 →选 SwinT,别犹豫。224 输入的预处理开销小,单卡能持续出帧。
- 服务器端离线批处理、漏检代价高 →选 SwinB。384 输入对小目标更友好,单张慢约 2 倍在离线场景里无感。
- 想给推理加速:两个配置都走 TensorRT/ONNX 路线,但注意加速不改变两者相对差异,别指望把 SwinB 优化到 SwinT 的水平。
选型速查 ✅
- 默认 SwinT;只有确认精度瓶颈来自模型本身(而非后处理阈值调优)且卡是 3090/4090 级别时,再考虑 SwinB。
- 权重与配置必须成对:
swint_ogc权重配GroundingDINO_SwinT_OGC.py,swinb_cogcoor权重配GroundingDINO_SwinB_cfg.py,混搭会加载失败或精度异常。 - 换配置只改命令行
-c和-p两个参数,上层代码零改动——这是官方可插拔设计,放心用。 - 微调显存不够时,先确认
use_checkpoint = True已开启(两个配置默认就是),再谈梯度累积等其他手段。 - 跑新配置前先用 demo/test_ap_on_coco.py 过一遍,确认 COCO 零样本结果与官方 48.5 左右一致,排除 CUDA 扩展没编译成功的坑。
【免费下载链接】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),仅供参考