GroundingDINO自定义数据微调指南
GroundingDINO自定义数据微调指南
本文档介绍如何使用自己的数据微调GroundingDINO模型,使模型在保持文本泛化能力的同时,提升对目标的定位精度与稳定性。
目录:
基本要求
环境配置
- Python版本:3.11.14
- 操作系统:Windows/Linux
- CUDA版本:推荐11.8或更高
- 编译软件:Microsoft visual studio(2017-2022)、visual c++ build tools >= 14.0
- 适配:CUDA-11.8适配VS<2022,CUDA-12.8可适配VS2022
兼容性验证
已测试可行环境:
- RTX 4060 + CUDA 11.8 + Python 3.11.14 + PyTorch 2.4.1+cu118
- RTX 5090 + CUDA 12.8 + Python 3.12.0 + PyTorch 2.7.0+cu128
安装依赖
已有conda环境
1 | conda create -n 环境名 python==3.11.14 # 创建新的conda环境, python为3.11.14 |
步骤1:安装PyTorch
1 | pip install torch==2.4.1 torchvision==0.19.1 torchaudio==2.4.1 --index-url https://download.pytorch.org/whl/cu118 |
步骤2:安装GroundingDINO
克隆open-GroundingDino和GroundingDINO仓库:
1 | # open-GroundingDino |
将GroundingDINO源码解压到open-GroundingDino目录下,然后执行:
1 | cd GroundingDINO |
⚠️ Windows用户注意事项:
- 确认Visual Studio C++版本为2019(2022版本会报错)
- GroundingDINO绝对路径不允许包含中文,否则会编译错误
步骤3:安装setuptools
1 | pip install setuptools==69.5.1 |
步骤4:安装MultiScaleDeformableAttention模块
1 | cd Open-GroundingDino/models/GroundingDINO/ops |
步骤5:验证安装
1 | python test.py |
正确的输出应该包含以下内容:
1 | * True check_forward_equal_with_pytorch_double: max_abs_err 8.67e-19 max_rel_err 2.35e-16 |
完整流程
数据准备
步骤1:准备训练数据(ODVG格式)
默认已使用labelImg标注得到xml格式的标签文件,使用 voc2jsonl.py 将XML标注文件转换为JSONL格式,保存为训练集文件train.jsonl。
voc2jsonl.py:
1 | import os |
ODVG格式示例:train.jsonl(两张图片的标注):
1 | {"filename": "IMG_20230306_110523.jpg", "height": "4096", "width": "3072", "detection": {"instances": [{"bbox": [1059.0, 1498.0, 1289.0, 1720.0], "label": "0", "category": "cat"}, ...]}} |
步骤2:准备验证数据(COCO格式)
默认已使用labelImg标注得到xml格式的标签文件,使用 voc2coco.py 将验证数据xml转换为COCO格式的JSON文件(如 val.json)。
voc2coco.py:
1 | """ |
COCO格式示例:val.json
1 | { |
步骤3:创建类别标签文件
创建一个标签映射文件(如 label.json),用于记录类别ID和类别名称的对应关系。
标签文件格式:label.json
1 | { |
步骤4:配置数据集路径
参考 ./config/datasets_od_example.json,创建自定义数据配置文件datasets_self.json。
配置文件格式:datasets_self.json
1 | { |
模型训练
步骤1:修改训练配置文件
参考 ./config/cfg_odvg.py 文件,创建自定义配置文件./config/cfg_odvg_self.py,进行以下修改:
修改1:设置类别文本提示
在文件末尾添加:
1 | # 前面不修改,复制cfg_odvg.py即可 |
步骤2:下载预训练模型
必需模型:
- BERT预训练模型:下载
bert-base-uncased(用于文本编码) - GroundingDINO权重:下载预训练权重文件,
groundingdino_swint_cogcoor.pth、Swin-Bgroundingdino_swinb_cogcoor.pth
修改2:选择Backbone(可选)
如需使用 groundingdino_swinb_cogcoor.pth 预训练模型,修改backbone配置:
1 | # 修改前 |
步骤3:启动训练
修改 train_mydata.sh 中的数据路径参数:
train_mydata.sh 代码:
1 | python main.py \ |
运行:
1 | bash train_mydata.sh |
或直接在终端执行脚本中的命令。
1 | python main.py --output_dir ./output/ -c config/cfg_odvg_self.py --datasets ./config/datasets_self.json --pretrain_model_path ./weights/groundingdino_swinb_cogcoor.pth --options text_encoder_type=bert-base-uncased --amp |
模型推理
推理使用
步骤1:主目录下新建一个dino_conf.yaml文件,代码如下:
1 | # ================================================= |
步骤2:主目录下新建infer_dino.py并编辑,修改以下参数:
- cfg_path:配置文件
- image_dir:待推理图片目录路径
- **save_dir **:结果保存目录路径
- text_prompt :文本提示词
infer_dino.py:代码如下
1 | """ |
步骤3:运行推理
1 | python infer_dino.py |
多类别提示词使用:
如需检测多个类别,使用 . 分隔提示词,例如:
1 | text_prompt = "cat" |
常见问题
安装问题
Q1:CUDA 12.2+版本编译错误
问题描述:使用CUDA 12.2及更高版本编译时,显示构建ms_deform_attn_cuda.cu文件报错,或提示:
1 | no suitable conversion function from 'const at::DeprecatedTypeProperties' to 'c10::ScalarType' exists |
解决方案:
修改文件:GroundingDINO/groundingdino/models/GroundingDINO/csrc/MsDeformAttn/ms_deform_attn_cuda.cu
在第65行和第135行,将 value.type() 替换为 value.scalar_type():
1 | # 修改前 |
Q2:NameError: name ‘_C’ is not defined
问题描述:运行时提示 _C 未定义。
解决方案:
检查CUDA环境变量是否正确设置:
1 | echo $CUDA_HOME # 应输出CUDA路径,如 /usr/local/cuda-11.8 |
更多信息参考:GroundingDINO官方文档
Q3:安装时提示缺少torch模块
问题描述:执行 pip install -e . 时报错:
1 | Traceback (most recent call last): |
解决方案:
pip在构建时创建了隔离环境,导致找不到已安装的torch。使用以下命令禁用构建隔离:
1 | pip install -e . --no-build-isolation |
训练问题
Q1:random.sample TypeError错误
问题描述:在 datasets/odvg.py 中运行到以下代码时报错:
1 | vg_labels.extend(random.sample(neg_labels, num_to_add)) |
错误信息:
1 | TypeError: Population must be a sequence. For dicts or sets, use sorted(d). |
原因分析:Python 3.9+版本中,random.sample() 不再接受集合(set)作为输入。
解决方案:
修改 datasets/odvg.py 文件:
1 | # 修改前 |
Q2:COCO验证数据集加载KeyError
问题描述:加载COCO格式验证数据集时报错:
1 | res.dataset['info'] = copy.deepcopy(self.dataset['info']) |
原因分析:pycocotools版本问题,需要在COCO格式数据集中添加 info 字段。
解决方案:
在COCO格式验证数据集JSON文件开头添加 info 键(参考 ./config/instances_val2017.json):
1 | { |
参考资料
- GroundingDINO官方仓库讨论区: https://github.com/IDEA-Research/GroundingDINO/issues