当前位置: 首页 > article >正文

【开放词汇检测】基于MMDetection的MM-Grounding-DINO实战

文章目录

  • 摘要
  • 安装基础环境
    • 新建虚拟环境
    • 安装pytorch
    • 安装openmim、mmengine、mmcv
    • 安装 MMDetection
    • 验证安装
    • 配置OV-DINO环境
  • MMDetection的MM-Grounding-DINO详细介绍
    • 测试结果
      • Zero-Shot COCO 结果与模型
      • Zero-Shot LVIS Results
      • Zero-Shot ODinW(野生环境下的目标检测)结果
        • ODinW13的结果和模型
        • ODinW35的结果和模型
      • 零样本指代表达式理解结果
      • 零样本描述检测数据集(DOD)
      • Pretrain Flickr30k Results
      • 通过微调验证预训练模型的泛化能力
        • RTTS
        • RUOD
        • Brain Tumor
        • Cityscapes
        • People in Painting
        • COCO
        • LVIS 1.0
        • RefEXP
          • RefCOCO
          • RefCOCO+
          • RefCOCOg
          • gRefCOCO
  • MM-GDINO-T 预训练数据准备和处理
    • 用到的数据集
      • 1 Objects365 v1
      • 2 COCO 2017
      • 3 GoldG
      • 4 GRIT-20M
      • 5 V3Det
      • 6 数据切分和可视化
  • MM-GDINO-L 预训练数据准备和处理
    • 用到的数据集
      • 1 Object365 v2
      • 2 OpenImages v6
      • 3 V3Det
      • 4 LVIS 1.0
      • 5 COCO2017 OD
      • 6 GoldG
      • 7 COCO2014 VG
      • 8 Referring Expression Comprehension
      • 9 GRIT-20M
    • 评测数据集准备
      • 1 COCO 2017
      • 2 LVIS 1.0
      • 3 ODinW
      • 4 DOD
      • 5 Flickr30k Entities
      • 6 Referring Expression Comprehension
    • 微调数据集准备
      • 1 COCO 2017
      • 2 LVIS 1.0
      • 3 RTTS
      • 4 RUOD
      • 5 Brain Tumor
      • 6 Cityscapes
      • 7 People in Painting
      • 8 Referring Expression Comprehension
  • 推理与微调
    • MM Grounding DINO-T 模型权重下载
    • 推理
    • 评测
    • 评测数据集结果可视化
    • 模型训练
      • 预训练自定义格式说明
    • 自定义数据集微调训练案例
      • 1 数据准备
      • 2 配置准备
      • 3 可视化和 Zero-Shot 评估
      • 4 模型训练
    • 模型自训练伪标签迭代生成和优化 pipeline
      • 1 目标检测格式
      • 2 Phrase Grounding 格式

摘要

基础环境:Ubuntu 22.04、CUDA 11.7

安装基础环境

新建虚拟环境

conda create --name openmm python=3.9

在这里插入图片描述
输入y。

安装pytorch

conda install pytorch==2.0.0 torchvision==0.15.0 torchaudio==2.0.0 pytorch-cuda=11.7 -c pytorch -c nvidia

在这里插入图片描述

安装openmim、mmengine、mmcv

pip install -U openmim
mim install mmengine
mim install "mmcv==2.0.0rc4"

这里不要用>=,如果使用了默认安装最新版本,不兼容!所以,使用==安装最低要求的版本即可!!
注意: 在 MMCV-v2.x 中,mmcv-full 改名为 mmcv,如果你想安装不包含 CUDA 算子精简版,可以通过 mim install "mmcv-lite>=2.0.0rc1" 来安装。
在这里插入图片描述

安装编译mmcv时间很长,如上图,如果不想安装编译,可以使用编译好的库,链接:
https://mmcv.readthedocs.io/en/latest/get_started/installation.html
在这里插入图片描述
安装本机的环境安装编译!

安装 MMDetection

下载MMdetection,代码链接:https://github.com/open-mmlab/mmdetection, 下载后解压进入到根目录。或者直接使用git获取源码,如下:

git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
pip install -v -e .
# "-v" 指详细说明,或更多的输出
# "-e" 表示在可编辑模式下安装项目,因此对代码所做的任何本地修改都会生效,从而无需重新安装。

或者将 mmdet 作为依赖或第三方 Python 包,使用 MIM 安装:

mim install mmdet

验证安装

为了验证 MMDetection 是否安装正确,我们提供了一些示例代码来执行模型推理。

步骤 1. 我们需要下载配置文件和模型权重文件。

mim download mmdet --config rtmdet_tiny_8xb32-300e_coco --dest .

下载将需要几秒钟或更长时间,这取决于你的网络环境。完成后,你会在当前文件夹中发现两个文件 rtmdet_tiny_8xb32-300e_coco.pyrtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth

步骤 2. 推理验证。

如果你通过源码安装的 MMDetection,那么直接运行以下命令进行验证:

python demo/image_demo.py demo/demo.jpg rtmdet_tiny_8xb32-300e_coco.py --weights rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth --device cpu

你会在当前文件夹中的 outputs/vis 文件夹中看到一个新的图像 demo.jpg,图像中包含有网络预测的检测框。

如果你通过 MIM 安装的 MMDetection,那么可以打开你的 Python 解析器,复制并粘贴以下代码:

from mmdet.apis import init_detector, inference_detector
import mmcv

# 指定模型的配置文件和 checkpoint 文件路径
config_file = 'configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py'
checkpoint_file = 'checkpoints/faster_rcnn_r50_fpn_1x_coco_20200130-047c8118.pth'

# 根据配置文件和 checkpoint 文件构建模型
model = init_detector(config_file, checkpoint_file, device='cuda:0')

# 测试单张图片并展示结果
img = 'test.jpg'  # 或者 img = mmcv.imread(img),这样图片仅会被读一次
result = inference_detector(model, img)
# 在一个新的窗口中将结果可视化
model.show_result(img, result)
# 或者将可视化结果保存为图片
model.show_result(img, result, out_file='result.jpg')

# 测试视频并展示结果
video = mmcv.VideoReader('video.mp4')
for frame in video:
    result = inference_detector(model, frame)
    model.show_result(frame, result, wait_time=1)

你将会看到一个包含 DetDataSample 的列表,预测结果在 pred_instance 里,包含有检测框,类别和得分。

配置OV-DINO环境

安装OV-DINO需要用到的库文件,如下:
首先安装numpy库,默认安装是2.x的版本,不能用,需要切换到1.x的版本。命令如下:

pip install numpy==1.24.3

安装其他的库文件,命令如下:

pip install terminaltables
pip install pycocotools
pip install shapely
pip install scipy
pip install fairscale

安装Transformer,由于用到了Bert,所以要安装Transformer,安装命令

pip install transformers

由于国内不能直接链接huggingface,所以需要用到代理:设置方式如下:
在这里插入图片描述
在image_demo脚本中加入代理链接,代码如下:

import os
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"

然后,运行命令:

python demo/image_demo.py demo/0016.jpg configs/mm_grounding_dino/grounding_dino_swin-b_pretrain_obj365_goldg_v3det.py --weights grounding_dino_swin-b_pretrain_all-f9818a7c.pth --texts 'the standing man . the squatting man' -c --device 'cuda:1'

在这里插入图片描述

MMDetection的MM-Grounding-DINO详细介绍

Grounding-DINO 是一种先进的开放集检测模型,能够处理包括开放词汇检测(OVD)、短语定位(PG)和指代表达式理解(REC)在内的多种视觉任务。由于其有效性,Grounding-DINO 已被广泛采用为各种下游应用的主流架构。然而,尽管它意义重大,但由于训练代码的不可用性,原始的 Grounding-DINO 模型缺乏全面的公共技术细节。为了弥补这一差距,我们推出了 MM-Grounding-DINO,这是一个基于 MMDetection 工具箱构建的开源、全面且用户友好的基线。它采用了丰富的视觉数据集进行预训练,并利用各种检测和定位数据集进行微调。我们对每个报告的结果进行了全面分析,并提供了详细的设置以便复现。在提到的基准测试上的广泛实验表明,我们的 MM-Grounding-DINO-Tiny 优于 Grounding-DINO-Tiny 基线。我们已将所有模型向研究界公开。

测试结果

Zero-Shot COCO 结果与模型

ModelBackboneStyleCOCO mAPPre-Train DataConfigDownload
GDINO-TSwin-TZero-shot46.7O365
GDINO-TSwin-TZero-shot48.1O365,GoldG
GDINO-TSwin-TZero-shot48.4O365,GoldG,Cap4Mconfigmodel
MM-GDINO-TSwin-TZero-shot48.5(+1.8)O365config
MM-GDINO-TSwin-TZero-shot50.4(+2.3)O365,GoldGconfigmodel | log
MM-GDINO-TSwin-TZero-shot50.5(+2.1)O365,GoldG,GRITconfigmodel | log
MM-GDINO-TSwin-TZero-shot50.6(+2.2)O365,GoldG,V3Detconfigmodel | log
MM-GDINO-TSwin-TZero-shot50.4(+2.0)O365,GoldG,GRIT,V3Detconfigmodel | log
MM-GDINO-BSwin-BZero-shot52.5O365,GoldG,V3Detconfigmodel | log
MM-GDINO-B*Swin-B-59.5O365,ALLconfigmodel | log
MM-GDINO-LSwin-LZero-shot53.0O365V2,OpenImageV6,GoldGconfigmodel | log
MM-GDINO-L*Swin-L-60.3O365V2,OpenImageV6,ALLconfigmodel | log
  • 这个*表示模型尚未完全训练。我们将在未来发布最终权重。
  • ALL: GoldG,V3det,COCO2017,LVISV1,COCO2014,GRIT,RefCOCO,RefCOCO+,RefCOCOg,gRefCOCO。

Zero-Shot LVIS Results

ModelMiniVal APrMiniVal APcMiniVal APfMiniVal APVal1.0 APrVal1.0 APcVal1.0 APfVal1.0 APPre-Train Data
GDINO-T18.824.234.728.810.115.329.920.1O365,GoldG,Cap4M
MM-GDINO-T28.130.242.035.7(+6.9)17.122.436.527.0(+6.9)O365,GoldG
MM-GDINO-T26.632.441.836.5(+7.7)17.322.636.427.1(+7.0)O365,GoldG,GRIT
MM-GDINO-T33.036.045.940.5(+11.7)21.525.540.230.6(+10.5)O365,GoldG,V3Det
MM-GDINO-T34.237.446.241.4(+12.6)23.627.640.531.9(+11.8)O365,GoldG,GRIT,V3Det
  • MM-GDINO-T的配置文件是mini-lvis和lvis 1.0

Zero-Shot ODinW(野生环境下的目标检测)结果

ODinW13的结果和模型
MethodGDINO-T
(O365,GoldG,Cap4M)
MM-GDINO-T
(O365,GoldG)
MM-GDINO-T
(O365,GoldG,GRIT)
MM-GDINO-T
(O365,GoldG,V3Det)
MM-GDINO-T
(O365,GoldG,GRIT,V3Det)
AerialMaritimeDrone0.1730.1330.1550.1770.151
Aquarium0.1950.2520.2610.2660.283
CottontailRabbits0.7990.7710.8100.7780.786
EgoHands0.6080.4990.5370.5060.519
NorthAmericaMushrooms0.5070.3310.4620.6690.767
Packages0.6870.7070.6870.7100.706
PascalVOC0.5630.5650.5800.5560.566
pistols0.7260.5850.7090.6710.729
pothole0.2150.1360.2850.1990.243
Raccoon0.5490.4690.5110.5530.535
ShellfishOpenImages0.3930.3210.4370.5190.488
thermalDogsAndPeople0.6570.5560.6030.4930.542
VehiclesOpenImages0.6130.5660.6030.6140.615
Average0.5140.4530.5110.5160.533
  • MM-GDINO-T的配置文件是odinw13
ODinW35的结果和模型
MethodGDINO-T
(O365,GoldG,Cap4M)
MM-GDINO-T
(O365,GoldG)
MM-GDINO-T
(O365,GoldG,GRIT)
MM-GDINO-T
(O365,GoldG,V3Det)
MM-GDINO-T
(O365,GoldG,GRIT,V3Det)
AerialMaritimeDrone_large0.1730.1330.1550.1770.151
AerialMaritimeDrone_tiled0.2060.1700.2250.1840.206
AmericanSignLanguageLetters0.0020.0160.0200.0110.007
Aquarium0.1950.2520.2610.2660.283
BCCD0.1610.0690.1180.0830.077
boggleBoards0.0000.0020.0010.0010.002
brackishUnderwater0.0210.0330.0210.0250.025
ChessPieces0.0000.0000.0000.0000.000
CottontailRabbits0.8060.7710.8100.7780.786
dice0.0040.0020.0050.0010.001
DroneControl0.0420.0470.0970.0880.074
EgoHands_generic0.6080.5270.5370.5060.519
EgoHands_specific0.0020.0010.0050.0070.003
HardHatWorkers0.0460.0480.0700.0700.108
MaskWearing0.0040.0090.0040.0110.009
MountainDewCommercial0.4300.4530.4650.1940.430
NorthAmericaMushrooms0.4710.3310.4620.6690.767
openPoetryVision0.0000.0010.0000.0000.000
OxfordPets_by_breed0.0030.0020.0040.0060.004
OxfordPets_by_species0.0110.0190.0160.0200.015
PKLot0.0010.0040.0020.0080.007
Packages0.6950.7070.6870.7100.706
PascalVOC0.5630.5650.5800.5660.566
pistols0.7260.5850.7090.6710.729
plantdoc0.0050.0050.0070.0080.011
pothole0.2150.1360.2190.0770.168
Raccoons0.5490.4690.5110.5530.535
selfdrivingCar0.0890.0910.0760.0940.083
ShellfishOpenImages0.3930.3210.4370.5190.488
ThermalCheetah0.0870.0630.0810.0300.045
thermalDogsAndPeople0.6570.5560.6030.4930.543
UnoCards0.0060.0120.0100.0090.005
VehiclesOpenImages0.6130.5660.6030.6140.615
WildfireSmoke0.1340.1060.1540.0420.127
websiteScreenshots0.0120.020.0160.0160.016
Average0.2270.2020.2280.2140.284
  • MM-GDINO-T的配置文件是odinw35

零样本指代表达式理解结果

MethodGDINO-T
(O365,GoldG,Cap4M)
MM-GDINO-T
(O365,GoldG)
MM-GDINO-T
(O365,GoldG,GRIT)
MM-GDINO-T
(O365,GoldG,V3Det)
MM-GDINO-T
(O365,GoldG,GRIT,V3Det)
RefCOCO val @1,5,1050.8/89.5/94.953.1/89.9/94.753.4/90.3/95.552.1/89.8/95.053.1/89.7/95.1
RefCOCO testA @1,5,1057.4/91.3/95.659.7/91.5/95.958.8/91.70/96.258.4/86.8/95.659.1/91.0/95.5
RefCOCO testB @1,5,1045.0/86.5/92.946.4/86.9/92.246.8/87.7/93.345.4/86.2/92.646.8/87.8/93.6
RefCOCO+ val @1,5,1051.6/86.4/92.653.1/87.0/92.853.5/88.0/93.752.5/86.8/93.252.7/87.7/93.5
RefCOCO+ testA @1,5,1057.3/86.7/92.758.9/87.3/92.959.0/88.1/93.758.1/86.7/93.558.7/87.2/93.1
RefCOCO+ testB @1,5,1046.4/84.1/90.747.9/84.3/91.047.9/85.5/92.746.9/83.7/91.548.4/85.8/92.1
RefCOCOg val @1,5,1060.4/92.1/96.261.2/92.6/96.162.7/93.3/97.061.7/92.9/96.662.9/93.3/97.2
RefCOCOg test @1,5,1059.7/92.1/96.361.1/93.3/96.762.6/94.9/97.161.0/93.1/96.862.9/93.9/97.4
Methodthresh_scoreGDINO-T
(O365,GoldG,Cap4M)
MM-GDINO-T
(O365,GoldG)
MM-GDINO-T
(O365,GoldG,GRIT)
MM-GDINO-T
(O365,GoldG,V3Det)
MM-GDINO-T
(O365,GoldG,GRIT,V3Det)
gRefCOCO val Pr@(F1=1, IoU≥0.5),N-acc0.539.3/70.439.4/67.5
gRefCOCO val Pr@(F1=1, IoU≥0.5),N-acc0.640.5/83.840.6/83.1
gRefCOCO val Pr@(F1=1, IoU≥0.5),N-acc0.741.3/91.839.8/84.740.7/89.740.3/88.841.0/91.3
gRefCOCO val Pr@(F1=1, IoU≥0.5),N-acc0.841.5/96.841.1/96.4
gRefCOCO testA Pr@(F1=1, IoU≥0.5),N-acc0.531.9/70.433.1/69.5
gRefCOCO testA Pr@(F1=1, IoU≥0.5),N-acc0.629.3/82.929.2/84.3
gRefCOCO testA Pr@(F1=1, IoU≥0.5),N-acc0.727.2/90.226.3/89.026.0/91.925.4/91.826.1/93.0
gRefCOCO testA Pr@(F1=1, IoU≥0.5),N-acc0.825.1/96.323.8/97.2
gRefCOCO testB Pr@(F1=1, IoU≥0.5),N-acc0.530.9/72.533.0/69.6
gRefCOCO testB Pr@(F1=1, IoU≥0.5),N-acc0.630.0/86.131.6/96.7
gRefCOCO testB Pr@(F1=1, IoU≥0.5),N-acc0.729.7/93.531.3/84.830.6/90.230.7/89.930.4/92.3
gRefCOCO testB Pr@(F1=1, IoU≥0.5),N-acc0.829.1/97.429.5/84.2
  • MM-GDINO-T的配置文件位于:refcoco/grounding_dino_swin-t_pretrain_zeroshot_refexp.py

零样本描述检测数据集(DOD)

pip install ddd-dataset
MethodmodeGDINO-T
(O365,GoldG,Cap4M)
MM-GDINO-T
(O365,GoldG)
MM-GDINO-T
(O365,GoldG,GRIT)
MM-GDINO-T
(O365,GoldG,V3Det)
MM-GDINO-T
(O365,GoldG,GRIT,V3Det)
FULL/short/middle/long/very longconcat17.2/18.0/18.7/14.8/16.315.6/17.3/16.7/14.3/13.117.0/17.7/18.0/15.7/15.716.2/17.4/16.8/14.9/15.417.5/23.4/18.3/14.7/13.8
FULL/short/middle/long/very longparallel22.3/28.2/24.8/19.1/13.921.7/24.7/24.0/20.2/13.722.5/25.6/25.1/20.5/14.922.3/25.6/24.5/20.6/14.722.9/28.1/25.4/20.4/14.4
PRES/short/middle/long/very longconcat17.8/18.3/19.2/15.2/17.316.4/18.4/17.3/14.5/14.217.9/19.0/18.3/16.5/17.516.6/18.8/17.1/15.1/15.018.0/23.7/18.6/15.4/13.3
PRES/short/middle/long/very longparallel21.0/27.0/22.8/17.5/12.521.3/25.5/22.8/19.2/12.921.5/25.2/23.0/19.0/15.021.6/25.7/23.0/19.5/14.821.9/27.4/23.2/19.1/14.2
ABS/short/middle/long/very longconcat15.4/17.1/16.4/13.6/14.913.4/13.4/14.5/13.5/11.914.5/13.1/16.7/13.6/13.314.8/12.5/15.6/14.3/15.815.9/22.2/17.1/12.5/14.4
ABS/short/middle/long/very longparallel26.0/32.0/33.0/23.6/15.522.8/22.2/28.7/22.9/14.725.6/26.8/33.9/24.5/14.724.1/24.9/30.7/23.8/14.726.0/30.3/34.1/23.9/14.6

注:

  1. 考虑到跨场景评估时间非常长且性能较低,因此暂时不支持。上述指标是针对单场景(Intra-scenario)的。
  2. concat是Grounding DINO的默认推理模式,它将多个子句用点(.)连接起来形成一个单独的句子进行推理。另一方面,“parallel”模式则在for循环中对每个子句分别进行推理。
  3. MM-GDINO-T的配置文件是concat_dod:dod/grounding_dino_swin-t_pretrain_zeroshot_concat_dod.py和parallel_dod:dod/grounding_dino_swin-t_pretrain_zeroshot_parallel_dod.py

Pretrain Flickr30k Results

ModelPre-Train DataVal R@1Val R@5Val R@10Test R@1Test R@5Test R@10
GLIP-TO365,GoldG84.994.996.385.695.496.7
GLIP-TO365,GoldG,CC3M,SBU85.395.596.986.095.997.2
GDINO-TO365,GoldG,Cap4M87.896.698.088.196.998.2
MM-GDINO-TO365,GoldG85.595.697.286.295.797.4
MM-GDINO-TO365,GoldG,GRIT86.795.897.687.096.297.7
MM-GDINO-TO365,GoldG,V3Det85.995.797.486.395.797.4
MM-GDINO-TO365,GoldG,GRIT,V3Det86.796.097.687.296.297.7

注:

  1. @1,5,10指的是在预测的排名列表中,前1、5和10个位置的精确度。
  2. MM-GDINO-T的配置文件位于:flickr30k/grounding_dino_swin-t-pretrain_flickr30k.py

通过微调验证预训练模型的泛化能力

RTTS
ArchitectureBackboneLr schdbox AP
Faster R-CNNR-501x48.1
Cascade R-CNNR-501x50.8
ATSSR-501x48.2
TOODR-501X50.8
MM-GDINO(zero-shot)Swin-T49.8
MM-GDINOSwin-T1x69.1
  • 参考指标来自 https://github.com/BIGWangYuDong/lqit/tree/main/configs/detection/rtts_dataset
  • MM-GDINO-T 配置文件是:rtts/grounding_dino_swin-t_finetune_8xb4_1x_rtts.py
RUOD
ArchitectureBackboneLr schdbox AP
Faster R-CNNR-501x52.4
Cascade R-CNNR-501x55.3
ATSSR-501x55.7
TOODR-501X57.4
MM-GDINO(zero-shot)Swin-T29.8
MM-GDINOSwin-T1x65.5
  • 参考指标来自 https://github.com/BIGWangYuDong/lqit/tree/main/configs/detection/ruod_dataset
  • MM-GDINO-T 配置文件位于:ruod/grounding_dino_swin-t_finetune_8xb4_1x_ruod.py
Brain Tumor
ArchitectureBackboneLr schdbox AP
Faster R-CNNR-5050e43.5
Cascade R-CNNR-5050e46.2
DINOR-5050e46.4
Cascade-DINOR-5050e48.6
MM-GDINOSwin-T50e47.5
  • 参考指标来自 https://arxiv.org/abs/2307.11035
  • MM-GDINO-T 配置文件是:brain_tumor/grounding_dino_swin-t_finetune_8xb4_50e_brain_tumor.py
Cityscapes
ArchitectureBackboneLr schdbox AP
Faster R-CNNR-5050e30.1
Cascade R-CNNR-5050e31.8
DINOR-5050e34.5
Cascade-DINOR-5050e34.8
MM-GDINO(zero-shot)Swin-T34.2
MM-GDINOSwin-T50e51.5
  • 参考指标来自 https://arxiv.org/abs/2307.11035
  • MM-GDINO-T 配置文件是:cityscapes/grounding_dino_swin-t_finetune_8xb4_50e_cityscapes.py
People in Painting
ArchitectureBackboneLr schdbox AP
Faster R-CNNR-5050e17.0
Cascade R-CNNR-5050e18.0
DINOR-5050e12.0
Cascade-DINOR-5050e13.4
MM-GDINO(zero-shot)Swin-T23.1
MM-GDINOSwin-T50e38.9
  • 参考指标来自 https://arxiv.org/abs/2307.11035
  • MM-GDINO-T 配置文件是 :people_in_painting/grounding_dino_swin-t_finetune_8xb4_50e_people_in_painting.py
COCO

(1) Closed-set performance

ArchitectureBackboneLr schdbox AP
Faster R-CNNR-501x37.4
Cascade R-CNNR-501x40.3
ATSSR-501x39.4
TOODR-501X42.4
DINOR-501X50.1
GLIP(zero-shot)Swin-T46.6
GDINO(zero-shot)Swin-T48.5
MM-GDINO(zero-shot)Swin-T50.4
GLIPSwin-T1x55.4
GDINOSwin-T1x58.1
MM-GDINOSwin-T1x58.2
  • MM-GDINO-T 配置文件是:coco/grounding_dino_swin-t_finetune_16xb4_1x_coco.py

(2) 开放集继续预训练性能

ArchitectureBackboneLr schdbox AP
GLIP(zero-shot)Swin-T46.7
GDINO(zero-shot)Swin-T48.5
MM-GDINO(zero-shot)Swin-T50.4
MM-GDINOSwin-T1x54.7
  • MM-GDINO-T 配置文件是 coco/grounding_dino_swin-t_finetune_16xb4_1x_sft_coco.py
  • 由于COCO数据集的大小较小,仅在COCO上进行继续预训练很容易导致过拟合。上面显示的结果是来自第三个训练周期。我不推荐使用这种方法进行训练。

(3) 开放词汇性能

ArchitectureBackboneLr schdbox APBase box APNovel box APbox AP@50Base box AP@50Novel box AP@50
MM-GDINO(zero-shot)Swin-T51.148.458.966.764.074.2
MM-GDINOSwin-T1x57.256.160.473.673.075.3
  • MM-GDINO-T 配置文件:coco/grounding_dino_swin-t_finetune_16xb4_1x_coco_48_17.py
LVIS 1.0

(1) 开放集继续预训练性能

ArchitectureBackboneLr schdMiniVal APrMiniVal APcMiniVal APfMiniVal APVal1.0 APrVal1.0 APcVal1.0 APfVal1.0 AP
GLIP(zero-shot)Swin-T18.121.233.126.710.814.729.019.6
GDINO(zero-shot)Swin-T18.824.234.728.810.115.329.920.1
MM-GDINO(zero-shot)Swin-T34.237.446.241.423.627.640.531.9
MM-GDINOSwin-T1x50.758.860.158.745.250.256.151.7
  • MM-GDINO-T 配置文件:lvis/grounding_dino_swin-t_finetune_16xb4_1x_lvis.py

(2) 开放词汇性能

ArchitectureBackboneLr schdMiniVal APrMiniVal APcMiniVal APfMiniVal AP
MM-GDINO(zero-shot)Swin-T34.237.446.241.4
MM-GDINOSwin-T1x43.257.459.357.1
  • MM-GDINO-T 配置文件:lvis/grounding_dino_swin-t_finetune_16xb4_1x_lvis_866_337.py
RefEXP
RefCOCO
ArchitectureBackboneLr schdval @1val @5val @10testA @1testA @5testA @10testB @1testB @5testB @10
GDINO(zero-shot)Swin-T50.889.594.957.591.395.645.086.592.9
MM-GDINO(zero-shot)Swin-T53.189.795.159.191.095.546.887.893.6
GDINOSwin-TUNK89.291.986.0
MM-GDINOSwin-T5e89.598.699.491.499.299.886.697.999.1
  • MM-GDINO-T 配置文件:refcoco/grounding_dino_swin-t_finetune_8xb4_5e_refcoco.py
RefCOCO+
ArchitectureBackboneLr schdval @1val @5val @10testA @1testA @5testA @10testB @1testB @5testB @10
GDINO(zero-shot)Swin-T51.686.492.657.386.792.746.484.190.7
MM-GDINO(zero-shot)Swin-T52.787.793.558.787.293.148.485.892.1
GDINOSwin-TUNK81.187.474.7
MM-GDINOSwin-T5e82.197.899.287.599.299.774.096.396.4
  • MM-GDINO-T 配置文件:refcoco/grounding_dino_swin-t_finetune_8xb4_5e_refcoco_plus.py
RefCOCOg
ArchitectureBackboneLr schdval @1val @5val @10test @1test @5test @10
GDINO(zero-shot)Swin-T60.492.196.259.792.196.3
MM-GDINO(zero-shot)Swin-T62.993.397.262.993.997.4
GDINOSwin-TUNK84.284.9
MM-GDINOSwin-T5e85.598.499.485.898.699.4
  • MM-GDINO-T 配置文件:refcoco/grounding_dino_swin-t_finetune_8xb4_5e_refcocog.py
gRefCOCO
ArchitectureBackboneLr schdval Pr@(F1=1, IoU≥0.5)val N-acctestA Pr@(F1=1, IoU≥0.5)testA N-acctestB Pr@(F1=1, IoU≥0.5)testB N-acc
GDINO(zero-shot)Swin-T41.391.827.290.229.793.5
MM-GDINO(zero-shot)Swin-T41.091.326.193.030.492.3
MM-GDINOSwin-T5e45.164.742.565.540.363.2
  • MM-GDINO-T 配置文件:refcoco/grounding_dino_swin-t_finetune_8xb4_5e_grefcoco.py

MM-GDINO-T 预训练数据准备和处理

MM-GDINO-T 模型中我们一共提供了 5 种不同数据组合的预训练配置,数据采用逐步累加的方式进行训练,因此用户可以根据自己的实际需求准备数据。

用到的数据集

1 Objects365 v1

对应的训练配置为:./grounding_dino_swin-t_pretrain_obj365.py

Objects365_v1 可以从https://opendatalab.com/OpenDataLab/Objects365_v1下载,其提供了 CLI 和 SDK 两者下载方式。

下载并解压后,将其放置或者软链接到 data/objects365v1 目录下,目录结构如下:

mmdetection
├── configs
├── data
│   ├── objects365v1
│   │   ├── objects365_train.json
│   │   ├── objects365_val.json
│   │   ├── train
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...
│   │   ├── test

然后使用 coco2odvg.py 转换为训练所需的 ODVG 格式:

python tools/dataset_converters/coco2odvg.py data/objects365v1/objects365_train.json -d o365v1

程序运行完成后会在 data/objects365v1 目录下创建 o365v1_train_od.jsono365v1_label_map.json 两个新文件,完整结构如下:

mmdetection
├── configs
├── data
│   ├── objects365v1
│   │   ├── objects365_train.json
│   │   ├── objects365_val.json
│   │   ├── o365v1_train_od.json
│   │   ├── o365v1_label_map.json
│   │   ├── train
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...
│   │   ├── test

2 COCO 2017

上述配置在训练过程中会评估 COCO 2017 数据集的性能,因此需要准备 COCO 2017 数据集。你可以从 COCO 官网下载或者从 opendatalab 下载

下载并解压后,将其放置或者软链接到 data/coco 目录下,目录结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...

3 GoldG

下载该数据集后就可以训练 :./grounding_dino_swin-t_pretrain_obj365_goldg.py配置了。

GoldG 数据集包括 GQAFlickr30k 两个数据集,来自 GLIP 论文中提到的 MixedGrounding 数据集,其排除了 COCO 数据集。下载链接为 mdetr_annotations,我们目前需要的是 mdetr_annotations/final_mixed_train_no_coco.jsonmdetr_annotations/final_flickr_separateGT_train.json 文件。

然后下载 GQA images 图片。下载并解压后,将其放置或者软链接到 data/gqa 目录下,目录结构如下:

mmdetection
├── configs
├── data
│   ├── gqa
|   |   ├── final_mixed_train_no_coco.json
│   │   ├── images
│   │   │   ├── xxx.jpg
│   │   │   ├── ...

然后下载 Flickr30k images 图片。这个数据下载需要先申请,再获得下载链接后才可以下载。下载并解压后,将其放置或者软链接到 data/flickr30k_entities 目录下,目录结构如下:

mmdetection
├── configs
├── data
│   ├── flickr30k_entities
│   │   ├── final_flickr_separateGT_train.json
│   │   ├── flickr30k_images
│   │   │   ├── xxx.jpg
│   │   │   ├── ...

对于 GQA 数据集,你需要使用 goldg2odvg.py 转换为训练所需的 ODVG 格式:

python tools/dataset_converters/goldg2odvg.py data/gqa/final_mixed_train_no_coco.json

程序运行完成后会在 data/gqa 目录下创建 final_mixed_train_no_coco_vg.json 新文件,完整结构如下:

mmdetection
├── configs
├── data
│   ├── gqa
|   |   ├── final_mixed_train_no_coco.json
|   |   ├── final_mixed_train_no_coco_vg.json
│   │   ├── images
│   │   │   ├── xxx.jpg
│   │   │   ├── ...

对于 Flickr30k 数据集,你需要使用 goldg2odvg.py 转换为训练所需的 ODVG 格式:

python tools/dataset_converters/goldg2odvg.py data/flickr30k_entities/final_flickr_separateGT_train.json

程序运行完成后会在 data/flickr30k_entities 目录下创建 final_flickr_separateGT_train_vg.json 新文件,完整结构如下:

mmdetection
├── configs
├── data
│   ├── flickr30k_entities
│   │   ├── final_flickr_separateGT_train.json
│   │   ├── final_flickr_separateGT_train_vg.json
│   │   ├── flickr30k_images
│   │   │   ├── xxx.jpg
│   │   │   ├── ...

4 GRIT-20M

对应的训练配置为 grounding_dino_swin-t_pretrain_obj365_goldg_grit9m

GRIT数据集可以从 GRIT 中使用 img2dataset 包下载,默认指令下载后数据集大小为 1.1T,下载和处理预估需要至少 2T 硬盘空间,可根据硬盘容量酌情下载。下载后原始格式为:

mmdetection
├── configs
├── data
│    ├── grit_raw
│    │    ├── 00000_stats.json
│    │    ├── 00000.parquet
│    │    ├── 00000.tar
│    │    ├── 00001_stats.json
│    │    ├── 00001.parquet
│    │    ├── 00001.tar
│    │    ├── ...

下载后需要对格式进行进一步处理:

python tools/dataset_converters/grit_processing.py data/grit_raw data/grit_processed

处理后的格式为:

mmdetection
├── configs
├── data
│    ├── grit_processed
│    │    ├── annotations
│    │    │   ├── 00000.json
│    │    │   ├── 00001.json
│    │    │   ├── ...
│    │    ├── images
│    │    │   ├── 00000
│    │    │   │   ├── 000000000.jpg
│    │    │   │   ├── 000000003.jpg
│    │    │   │   ├── 000000004.jpg
│    │    │   │   ├── ...
│    │    │   ├── 00001
│    │    │   ├── ...

对于 GRIT 数据集,你需要使用 grit2odvg.py 转化成需要的 ODVG 格式:

python tools/dataset_converters/grit2odvg.py data/grit_processed/

程序运行完成后会在 data/grit_processed 目录下创建 grit20m_vg.json 新文件,大概包含 9M 条数据,完整结构如下:

mmdetection
├── configs
├── data
│    ├── grit_processed
|    |    ├── grit20m_vg.json
│    │    ├── annotations
│    │    │   ├── 00000.json
│    │    │   ├── 00001.json
│    │    │   ├── ...
│    │    ├── images
│    │    │   ├── 00000
│    │    │   │   ├── 000000000.jpg
│    │    │   │   ├── 000000003.jpg
│    │    │   │   ├── 000000004.jpg
│    │    │   │   ├── ...
│    │    │   ├── 00001
│    │    │   ├── ...

5 V3Det

对应的训练配置为

  • grounding_dino_swin-t_pretrain_obj365_goldg_v3det
  • grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det

V3Det 数据集下载可以从 opendatalab 下载,下载并解压后,将其放置或者软链接到 data/v3det 目录下,目录结构如下:

mmdetection
├── configs
├── data
│   ├── v3det
│   │   ├── annotations
│   │   |   ├── v3det_2023_v1_train.json
│   │   ├── images
│   │   │   ├── a00000066
│   │   │   │   ├── xxx.jpg
│   │   │   ├── ...

然后使用 coco2odvg.py 转换为训练所需的 ODVG 格式:

python tools/dataset_converters/coco2odvg.py data/v3det/annotations/v3det_2023_v1_train.json -d v3det

程序运行完成后会在 data/v3det/annotations 目录下创建目录下创建 v3det_2023_v1_train_od.jsonv3det_2023_v1_label_map.json 两个新文件,完整结构如下:

mmdetection
├── configs
├── data
│   ├── v3det
│   │   ├── annotations
│   │   |   ├── v3det_2023_v1_train.json
│   │   |   ├── v3det_2023_v1_train_od.json
│   │   |   ├── v3det_2023_v1_label_map.json
│   │   ├── images
│   │   │   ├── a00000066
│   │   │   │   ├── xxx.jpg
│   │   │   ├── ...

6 数据切分和可视化

考虑到用户需要准备的数据集过多,不方便对图片和标注进行训练前确认,因此我们提供了一个数据切分和可视化的工具,可以将数据集切分为 tiny 版本,然后使用可视化脚本查看图片和标签正确性。

  1. 切分数据集

脚本位于 这里, 以 Object365 v1 为例,切分数据集的命令如下:

python tools/misc/split_odvg.py data/object365_v1/ o365v1_train_od.json train your_output_dir --label-map-file o365v1_label_map.json -n 200

上述脚本运行后会在 your_output_dir 目录下创建和 data/object365_v1/ 一样的文件夹结构,但是只会保存 200 张训练图片和对应的 json,方便用户查看。

  1. 可视化原始数据集

脚本位于 这里, 以 Object365 v1 为例,可视化数据集的命令如下:

python tools/analysis_tools/browse_grounding_raw.py data/object365_v1/ o365v1_train_od.json train --label-map-file o365v1_label_map.json -o your_output_dir --not-show

上述脚本运行后会在 your_output_dir 目录下生成同时包括图片和标签的图片,方便用户查看。

  1. 可视化 dataset 输出的数据集

脚本位于 这里, 用户可以通过该脚本查看 dataset 输出的结果即包括了数据增强的结果。 以 Object365 v1 为例,可视化数据集的命令如下:

python tools/analysis_tools/browse_grounding_dataset.py configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_obj365.py  -o your_output_dir --not-show

上述脚本运行后会在 your_output_dir 目录下生成同时包括图片和标签的图片,方便用户查看。

MM-GDINO-L 预训练数据准备和处理

用到的数据集

1 Object365 v2

Objects365_v2 可以从 opendatalab 下载,其提供了 CLI 和 SDK 两者下载方式。

下载并解压后,将其放置或者软链接到 data/objects365v2 目录下,目录结构如下:

mmdetection
├── configs
├── data
│   ├── objects365v2
│   │   ├── annotations
│   │   │   ├── zhiyuan_objv2_train.json
│   │   ├── train
│   │   │   ├── patch0
│   │   │   │   ├── xxx.jpg
│   │   │   ├── ...

由于 objects365v2 类别中有部分类名是错误的,因此需要先进行修正。

python tools/dataset_converters/fix_o365_names.py

会在 data/objects365v2/annotations 下生成新的标注文件 zhiyuan_objv2_train_fixname.json

然后使用 coco2odvg.py 转换为训练所需的 ODVG 格式:

python tools/dataset_converters/coco2odvg.py data/objects365v2/annotations/zhiyuan_objv2_train_fixname.json -d o365v2

程序运行完成后会在 data/objects365v2 目录下创建 zhiyuan_objv2_train_fixname_od.jsono365v2_label_map.json 两个新文件,完整结构如下:

mmdetection
├── configs
├── data
│   ├── objects365v2
│   │   ├── annotations
│   │   │   ├── zhiyuan_objv2_train.json
│   │   │   ├── zhiyuan_objv2_train_fixname.json
│   │   │   ├── zhiyuan_objv2_train_fixname_od.json
│   │   │   ├── o365v2_label_map.json
│   │   ├── train
│   │   │   ├── patch0
│   │   │   │   ├── xxx.jpg
│   │   │   ├── ...

2 OpenImages v6

OpenImages v6 可以从 官网 下载,由于数据集比较大,需要花费一定的时间,下载完成后文件结构如下:

mmdetection
├── configs
├── data
│   ├── OpenImages
│   │   ├── annotations
|   │   │   ├── oidv6-train-annotations-bbox.csv
|   │   │   ├── class-descriptions-boxable.csv
│   │   ├── OpenImages
│   │   │   ├── train
│   │   │   │   ├── xxx.jpg
│   │   │   ├── ...

然后使用 openimages2odvg.py 转换为训练所需的 ODVG 格式:

python tools/dataset_converters/openimages2odvg.py data/OpenImages/annotations

程序运行完成后会在 data/OpenImages/annotations 目录下创建 oidv6-train-annotation_od.jsonopenimages_label_map.json 两个新文件,完整结构如下:

mmdetection
├── configs
├── data
│   ├── OpenImages
│   │   ├── annotations
|   │   │   ├── oidv6-train-annotations-bbox.csv
|   │   │   ├── class-descriptions-boxable.csv
|   │   │   ├── oidv6-train-annotations_od.json
|   │   │   ├── openimages_label_map.json
│   │   ├── OpenImages
│   │   │   ├── train
│   │   │   │   ├── xxx.jpg
│   │   │   ├── ...

3 V3Det

参见前面的 MM-GDINO-T 预训练数据准备和处理 数据准备部分,完整数据集结构如下:

mmdetection
├── configs
├── data
│   ├── v3det
│   │   ├── annotations
│   │   |   ├── v3det_2023_v1_train.json
│   │   |   ├── v3det_2023_v1_train_od.json
│   │   |   ├── v3det_2023_v1_label_map.json
│   │   ├── images
│   │   │   ├── a00000066
│   │   │   │   ├── xxx.jpg
│   │   │   ├── ...

4 LVIS 1.0

参见后面的 微调数据集准备2 LVIS 1.0 部分。完整数据集结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── lvis_v1_train.json
│   │   │   ├── lvis_v1_val.json
│   │   │   ├── lvis_v1_train_od.json
│   │   │   ├── lvis_v1_label_map.json
│   │   │   ├── instances_val2017.json
│   │   │   ├── lvis_v1_minival_inserted_image_name.json
│   │   │   ├── lvis_od_val.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...

5 COCO2017 OD

数据准备可以参考前面的 MM-GDINO-T 预训练数据准备和处理 部分。为了方便后续处理,请将下载的 mdetr_annotations 文件夹软链接或者移动到 data/coco 路径下
完整数据集结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   ├── mdetr_annotations
│   │   │   ├── final_refexp_val.json
│   │   │   ├── finetune_refcoco_testA.json
│   │   │   ├── ...
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...

由于 COCO2017 train 和 RefCOCO/RefCOCO+/RefCOCOg/gRefCOCO val 中存在部分重叠,如果不提前移除,在评测 RefExp 时候会存在数据泄露。

python tools/dataset_converters/remove_cocotrain2017_from_refcoco.py data/coco/mdetr_annotations data/coco/annotations/instances_train2017.json

会在 data/coco/annotations 目录下创建 instances_train2017_norefval.json 新文件。最后使用 coco2odvg.py 转换为训练所需的 ODVG 格式:

python tools/dataset_converters/coco2odvg.py data/coco/annotations/instances_train2017_norefval.json -d coco

会在 data/coco/annotations 目录下创建 instances_train2017_norefval_od.jsoncoco_label_map.json 两个新文件,完整结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   │   ├── instances_train2017_norefval_od.json
│   │   │   ├── coco_label_map.json
│   │   ├── mdetr_annotations
│   │   │   ├── final_refexp_val.json
│   │   │   ├── finetune_refcoco_testA.json
│   │   │   ├── ...
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...

注意: COCO2017 train 和 LVIS 1.0 val 数据集有 15000 张图片重复,因此一旦在训练中使用了 COCO2017 train,那么 LVIS 1.0 val 的评测结果就存在数据泄露问题,LVIS 1.0 minival 没有这个问题。

6 GoldG

参见 MM-GDINO-T 预训练数据准备和处理 部分

mmdetection
├── configs
├── data
│   ├── flickr30k_entities
│   │   ├── final_flickr_separateGT_train.json
│   │   ├── final_flickr_separateGT_train_vg.json
│   │   ├── flickr30k_images
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   ├── gqa
|   |   ├── final_mixed_train_no_coco.json
|   |   ├── final_mixed_train_no_coco_vg.json
│   │   ├── images
│   │   │   ├── xxx.jpg
│   │   │   ├── ...

7 COCO2014 VG

MDetr 中提供了 COCO2014 train 的 Phrase Grounding 版本标注, 最原始标注文件为 final_mixed_train.json,和之前类似,文件结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   ├── mdetr_annotations
│   │   │   ├── final_mixed_train.json
│   │   │   ├── ...
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── train2014
│   │   │   ├── xxx.jpg
│   │   │   ├── ...

我们可以从 final_mixed_train.json 中提取出 COCO 部分数据

python tools/dataset_converters/extract_coco_from_mixed.py data/coco/mdetr_annotations/final_mixed_train.json

会在 data/coco/mdetr_annotations 目录下创建 final_mixed_train_only_coco.json 新文件,最后使用 goldg2odvg.py 转换为训练所需的 ODVG 格式:

python tools/dataset_converters/goldg2odvg.py data/coco/mdetr_annotations/final_mixed_train_only_coco.json

会在 data/coco/mdetr_annotations 目录下创建 final_mixed_train_only_coco_vg.json 新文件,完整结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   ├── mdetr_annotations
│   │   │   ├── final_mixed_train.json
│   │   │   ├── final_mixed_train_only_coco.json
│   │   │   ├── final_mixed_train_only_coco_vg.json
│   │   │   ├── ...
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── train2014
│   │   │   ├── xxx.jpg
│   │   │   ├── ...

注意: COCO2014 train 和 COCO2017 val 没有重复图片,因此不用担心 COCO 评测的数据泄露问题。

8 Referring Expression Comprehension

其一共包括 4 个数据集。数据准备部分请参见 微调数据集准备 部分。

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   │   ├── instances_train2014.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...
│   │   ├── train2014
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── mdetr_annotations
│   │   │   ├── final_refexp_val.json
│   │   │   ├── finetune_refcoco_testA.json
│   │   │   ├── finetune_refcoco_testB.json
│   │   │   ├── finetune_refcoco+_testA.json
│   │   │   ├── finetune_refcoco+_testB.json
│   │   │   ├── finetune_refcocog_test.json
│   │   │   ├── finetune_refcoco_train_vg.json
│   │   │   ├── finetune_refcoco+_train_vg.json
│   │   │   ├── finetune_refcocog_train_vg.json
│   │   │   ├── finetune_grefcoco_train_vg.json

9 GRIT-20M

参见 MM-GDINO-T 预训练数据准备和处理 部分

评测数据集准备

1 COCO 2017

数据准备流程和前面描述一致,最终结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...

2 LVIS 1.0

LVIS 1.0 val 数据集包括 mini 和全量两个版本,mini 版本存在的意义是:

  1. LVIS val 全量评测数据集比较大,评测一次需要比较久的时间
  2. LVIS val 全量数据集中包括了 15000 张 COCO2017 train, 如果用户使用了 COCO2017 数据进行训练,那么将存在数据泄露问题

LVIS 1.0 图片和 COCO2017 数据集图片完全一样,只是提供了新的标注而已,minival 标注文件可以从 这里下载, val 1.0 标注文件可以从 这里 下载。 最终结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   │   ├── lvis_v1_minival_inserted_image_name.json
│   │   │   ├── lvis_od_val.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...

3 ODinW

ODinw 全称为 Object Detection in the Wild,是用于验证 grounding 预训练模型在不同实际场景中的泛化能力的数据集,其包括两个子集,分别是 ODinW13 和 ODinW35,代表是由 13 和 35 个数据集组成的。你可以从 这里下载,然后对每个文件进行解压,最终结构如下:

mmdetection
├── configs
├── data
│   ├── odinw
│   │   ├── AerialMaritimeDrone
│   │   |   |── large
│   │   |   |   ├── test
│   │   |   |   ├── train
│   │   |   |   ├── valid
│   │   |   |── tiled
│   │   ├── AmericanSignLanguageLetters
│   │   ├── Aquarium
│   │   ├── BCCD
│   │   ├── ...

在评测 ODinW3535 时候由于需要自定义 prompt,因此需要提前对标注的 json 文件进行处理,你可以使用 override_category.py 脚本进行处理,处理后会生成新的标注文件,不会覆盖原先的标注文件。

python configs/mm_grounding_dino/odinw/override_category.py data/odinw/

4 DOD

DOD 来自 Described Object Detection: Liberating Object Detection with Flexible Expressions。其数据集可以从 这里下载,最终的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── d3
│   │   ├── d3_images
│   │   ├── d3_json
│   │   ├── d3_pkl

5 Flickr30k Entities

在前面 GoldG 数据准备章节中我们已经下载了 Flickr30k 训练所需文件,评估所需的文件是 2 个 json 文件,你可以从 这里 和 这里下载,最终的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── flickr30k_entities
│   │   ├── final_flickr_separateGT_train.json
│   │   ├── final_flickr_separateGT_val.json
│   │   ├── final_flickr_separateGT_test.json
│   │   ├── final_flickr_separateGT_train_vg.json
│   │   ├── flickr30k_images
│   │   │   ├── xxx.jpg
│   │   │   ├── ...

6 Referring Expression Comprehension

指代性表达式理解包括 4 个数据集: RefCOCO, RefCOCO+, RefCOCOg, gRefCOCO。这 4 个数据集所采用的图片都来自于 COCO2014 train,和 COCO2017 类似,你可以从 COCO 官方或者 opendatalab 中下载,而标注可以直接从 这里 下载,mdetr_annotations 文件夹里面包括了其他大量的标注,你如果觉得数量过多,可以只下载所需要的几个 json 文件即可。最终的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   │   ├── instances_train2014.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...
│   │   ├── train2014
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── mdetr_annotations
│   │   │   ├── final_refexp_val.json
│   │   │   ├── finetune_refcoco_testA.json
│   │   │   ├── finetune_refcoco_testB.json
│   │   │   ├── finetune_refcoco+_testA.json
│   │   │   ├── finetune_refcoco+_testB.json
│   │   │   ├── finetune_refcocog_test.json
│   │   │   ├── finetune_refcocog_test.json

注意 gRefCOCO 是在 GREC: Generalized Referring Expression Comprehension 被提出,并不在 mdetr_annotations 文件夹中,需要自行处理。具体步骤为:

  1. 下载 gRefCOCO,并解压到 data/coco/ 文件夹中
mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   │   ├── instances_train2014.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...
│   │   ├── train2014
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── mdetr_annotations
│   │   ├── grefs
│   │   │   ├── grefs(unc).json
│   │   │   ├── instances.json
  1. 转换为 coco 格式

你可以使用 gRefCOCO 官方提供的转换脚本。注意需要将被注释的 161 行打开,并注释 160 行才可以得到全量的 json 文件。

# 需要克隆官方 repo
git clone https://github.com/henghuiding/gRefCOCO.git
cd gRefCOCO/mdetr
python scripts/fine-tuning/grefexp_coco_format.py --data_path ../../data/coco/grefs --out_path ../../data/coco/mdetr_annotations/ --coco_path ../../data/coco

会在 data/coco/mdetr_annotations/ 文件夹中生成 4 个 json 文件,完整的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   │   ├── instances_train2014.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...
│   │   ├── train2014
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── mdetr_annotations
│   │   │   ├── final_refexp_val.json
│   │   │   ├── finetune_refcoco_testA.json
│   │   │   ├── finetune_refcoco_testB.json
│   │   │   ├── finetune_grefcoco_train.json
│   │   │   ├── finetune_grefcoco_val.json
│   │   │   ├── finetune_grefcoco_testA.json
│   │   │   ├── finetune_grefcoco_testB.json

微调数据集准备

1 COCO 2017

COCO 是检测领域最常用的数据集,我们希望能够更充分探索其微调模式。从目前发展来看,一共有 3 种微调方式:

  1. 闭集微调,即微调后文本端将无法修改描述,转变为闭集算法,在 COCO 上性能能够最大化,但是失去了通用性。
  2. 开集继续预训练微调,即对 COCO 数据集采用和预训练一致的预训练手段。此时有两种做法,第一种是降低学习率并固定某些模块,仅仅在 COCO 数据上预训练,第二种是将 COCO 数据和部分预训练数据混合一起训练,两种方式的目的都是在尽可能不降低泛化性时提高 COCO 数据集性能
  3. 开放词汇微调,即采用 OVD 领域常用做法,将 COCO 类别分成 base 类和 novel 类,训练时候仅仅在 base 类上进行,评测在 base 和 novel 类上进行。这种方式可以验证 COCO OVD 能力,目的也是在尽可能不降低泛化性时提高 COCO 数据集性能

(1) 闭集微调

这个部分无需准备数据,直接用之前的数据即可。

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...

(2) 开集继续预训练微调
这种方式需要将 COCO 训练数据转换为 ODVG 格式,你可以使用如下命令转换:

python tools/dataset_converters/coco2odvg.py data/coco/annotations/instances_train2017.json -d coco

会在 data/coco/annotations/ 下生成新的 instances_train2017_od.jsoncoco2017_label_map.json,完整的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_train2017_od.json
│   │   │   ├── coco2017_label_map.json
│   │   │   ├── instances_val2017.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...

在得到数据后,你可以自行选择单独预习还是混合预训练方式。

(3) 开放词汇微调
这种方式需要将 COCO 训练数据转换为 OVD 格式,你可以使用如下命令转换:

python tools/dataset_converters/coco2ovd.py data/coco/

会在 data/coco/annotations/ 下生成新的 instances_val2017_all_2.jsoninstances_val2017_seen_2.json,完整的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_train2017_od.json
│   │   │   ├── instances_val2017_all_2.json
│   │   │   ├── instances_val2017_seen_2.json
│   │   │   ├── coco2017_label_map.json
│   │   │   ├── instances_val2017.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...

然后可以直接使用 配置 进行训练和测试。

2 LVIS 1.0

LVIS 是一个包括 1203 类的数据集,同时也是一个长尾联邦数据集,对其进行微调很有意义。 由于其类别过多,我们无法对其进行闭集微调,因此只能采用开集继续预训练微调和开放词汇微调。

你需要先准备好 LVIS 训练 JSON 文件,你可以从 这里 下载,我们只需要 lvis_v1_train.jsonlvis_v1_val.json,然后将其放到 data/coco/annotations/ 下,然后运行如下命令:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── lvis_v1_train.json
│   │   │   ├── lvis_v1_val.json
│   │   │   ├── instances_val2017.json
│   │   │   ├── lvis_v1_minival_inserted_image_name.json
│   │   │   ├── lvis_od_val.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...

(1) 开集继续预训练微调

使用如下命令转换为 ODVG 格式:

python tools/dataset_converters/lvis2odvg.py data/coco/annotations/lvis_v1_train.json

会在 data/coco/annotations/ 下生成新的 lvis_v1_train_od.jsonlvis_v1_label_map.json,完整的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── lvis_v1_train.json
│   │   │   ├── lvis_v1_val.json
│   │   │   ├── lvis_v1_train_od.json
│   │   │   ├── lvis_v1_label_map.json
│   │   │   ├── instances_val2017.json
│   │   │   ├── lvis_v1_minival_inserted_image_name.json
│   │   │   ├── lvis_od_val.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...

然后可以直接使用 配置 进行训练测试,或者你修改配置将其和部分预训练数据集混合使用。

(2) 开放词汇微调

使用如下命令转换为 OVD 格式:

python tools/dataset_converters/lvis2ovd.py data/coco/

会在 data/coco/annotations/ 下生成新的 lvis_v1_train_od_norare.jsonlvis_v1_label_map_norare.json,完整的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── lvis_v1_train.json
│   │   │   ├── lvis_v1_val.json
│   │   │   ├── lvis_v1_train_od.json
│   │   │   ├── lvis_v1_label_map.json
│   │   │   ├── instances_val2017.json
│   │   │   ├── lvis_v1_minival_inserted_image_name.json
│   │   │   ├── lvis_od_val.json
│   │   │   ├── lvis_v1_train_od_norare.json
│   │   │   ├── lvis_v1_label_map_norare.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...

然后可以直接使用 配置 进行训练测试

3 RTTS

RTTS 是一个浓雾天气数据集,该数据集包含 4,322 张雾天图像,包含五个类:自行车 (bicycle)、公共汽车 (bus)、汽车 (car)、摩托车 (motorbike) 和人 (person)。可以从 这里下载, 然后解压到 data/RTTS/ 文件夹中。完整的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── RTTS
│   │   ├── annotations_json
│   │   ├── annotations_xml
│   │   ├── ImageSets
│   │   ├── JPEGImages

4 RUOD

RUOD 是一个水下目标检测数据集,你可以从 这里下载, 然后解压到 data/RUOD/ 文件夹中。完整的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── RUOD
│   │   ├── Environment_pic
│   │   ├── Environmet_ANN
│   │   ├── RUOD_ANN
│   │   ├── RUOD_pic

5 Brain Tumor

Brain Tumor 是一个医学领域的 2d 检测数据集,你可以从 这里下载, 请注意选择 COCO JSON 格式。然后解压到 data/brain_tumor_v2/ 文件夹中。完整的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── brain_tumor_v2
│   │   ├── test
│   │   ├── train
│   │   ├── valid

6 Cityscapes

Cityscapes 是一个城市街景数据集,你可以从 这里 或者 opendatalab 中下载, 然后解压到 data/cityscapes/ 文件夹中。完整的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── cityscapes
│   │   ├── annotations
│   │   ├── leftImg8bit
│   │   │   ├── train
│   │   │   ├── val
│   │   ├── gtFine
│   │   │   ├── train
│   │   │   ├── val

在下载后,然后使用 cityscapes.py 脚本生成我们所需要的 json 格式

python tools/dataset_converters/cityscapes.py data/cityscapes/

会在 annotations 中生成 3 个新的 json 文件。完整的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── cityscapes
│   │   ├── annotations
│   │   │   ├── instancesonly_filtered_gtFine_train.json
│   │   │   ├── instancesonly_filtered_gtFine_val.json
│   │   │   ├── instancesonly_filtered_gtFine_test.json
│   │   ├── leftImg8bit
│   │   │   ├── train
│   │   │   ├── val
│   │   ├── gtFine
│   │   │   ├── train
│   │   │   ├── val

7 People in Painting

People in Painting 是一个油画数据集,你可以从 这里, 请注意选择 COCO JSON 格式。然后解压到 data/people_in_painting_v2/ 文件夹中。完整的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── people_in_painting_v2
│   │   ├── test
│   │   ├── train
│   │   ├── valid

8 Referring Expression Comprehension

指代性表达式理解的微调和前面一样,也是包括 4 个数据集,在评测数据准备阶段已经全部整理好了,完整的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   │   ├── instances_train2014.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...
│   │   ├── train2014
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── mdetr_annotations
│   │   │   ├── final_refexp_val.json
│   │   │   ├── finetune_refcoco_testA.json
│   │   │   ├── finetune_refcoco_testB.json
│   │   │   ├── finetune_refcoco+_testA.json
│   │   │   ├── finetune_refcoco+_testB.json
│   │   │   ├── finetune_refcocog_test.json
│   │   │   ├── finetune_refcocog_test.json

然后我们需要将其转换为所需的 ODVG 格式,请使用 refcoco2odvg.py 脚本转换,

python tools/dataset_converters/refcoco2odvg.py data/coco/mdetr_annotations

会在 data/coco/mdetr_annotations 中生成新的 4 个 json 文件。 转换后的数据集结构如下:

mmdetection
├── configs
├── data
│   ├── coco
│   │   ├── annotations
│   │   │   ├── instances_train2017.json
│   │   │   ├── instances_val2017.json
│   │   │   ├── instances_train2014.json
│   │   ├── train2017
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── val2017
│   │   │   ├── xxxx.jpg
│   │   │   ├── ...
│   │   ├── train2014
│   │   │   ├── xxx.jpg
│   │   │   ├── ...
│   │   ├── mdetr_annotations
│   │   │   ├── final_refexp_val.json
│   │   │   ├── finetune_refcoco_testA.json
│   │   │   ├── finetune_refcoco_testB.json
│   │   │   ├── finetune_refcoco+_testA.json
│   │   │   ├── finetune_refcoco+_testB.json
│   │   │   ├── finetune_refcocog_test.json
│   │   │   ├── finetune_refcoco_train_vg.json
│   │   │   ├── finetune_refcoco+_train_vg.json
│   │   │   ├── finetune_refcocog_train_vg.json
│   │   │   ├── finetune_grefcoco_train_vg.json

推理与微调

需要安装额外的依赖包:

cd $MMDETROOT

pip install -r requirements/multimodal.txt
pip install emoji ddd-dataset
pip install git+https://github.com/lvis-dataset/lvis-api.git"

请注意由于 LVIS 第三方库暂时不支持 numpy 1.24,因此请确保您的 numpy 版本符合要求。建议安装 numpy 1.23 版本。

MM Grounding DINO-T 模型权重下载

为了方便演示,您可以提前下载 MM Grounding DINO-T 模型权重到当前路径下

wget load_from = 'https://download.openmmlab.com/mmdetection/v3.0/mm_grounding_dino/grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det/grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth' # noqa

模型的权重和对应的配置详见:

ModelBackboneStyleCOCO mAPPre-Train DataConfigDownload
GDINO-TSwin-TZero-shot46.7O365
GDINO-TSwin-TZero-shot48.1O365,GoldG
GDINO-TSwin-TZero-shot48.4O365,GoldG,Cap4Mconfigmodel
MM-GDINO-TSwin-TZero-shot48.5(+1.8)O365config
MM-GDINO-TSwin-TZero-shot50.4(+2.3)O365,GoldGconfigmodel | log
MM-GDINO-TSwin-TZero-shot50.5(+2.1)O365,GoldG,GRITconfigmodel | log
MM-GDINO-TSwin-TZero-shot50.6(+2.2)O365,GoldG,V3Detconfigmodel | log
MM-GDINO-TSwin-TZero-shot50.4(+2.0)O365,GoldG,GRIT,V3Detconfigmodel | log
MM-GDINO-BSwin-BZero-shot52.5O365,GoldG,V3Detconfigmodel | log
MM-GDINO-B*Swin-B-59.5O365,ALLconfigmodel | log
MM-GDINO-LSwin-LZero-shot53.0O365V2,OpenImageV6,GoldGconfigmodel | log
MM-GDINO-L*Swin-L-60.3O365V2,OpenImageV6,ALLconfigmodel | log
  • 这个*表示模型尚未完全训练。我们将在未来发布最终权重。
  • ALL: GoldG,V3det,COCO2017,LVISV1,COCO2014,GRIT,RefCOCO,RefCOCO+,RefCOCOg,gRefCOCO。

推理

在推理前,为了更好的体验不同图片的推理效果,建议您先下载 这些图片 到当前路径下

MM Grounding DINO 支持了闭集目标检测,开放词汇目标检测,Phrase Grounding 和指代性表达式理解 4 种推理方式,下面详细说明。

(1) 闭集目标检测

由于 MM Grounding DINO 是预训练模型,理论上可以应用于任何闭集检测数据集,目前我们支持了常用的 coco/voc/cityscapes/objects365v1/lvis 等,下面以 coco 为例

python demo/image_demo.py images/animals.png \
        configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_obj365.py \
        --weights grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth \
        --texts '$: coco'

会在当前路径下生成 outputs/vis/animals.png 的预测结果,如下图所示

在这里插入图片描述

由于鸵鸟并不在 COCO 80 类中, 因此不会检测出来。

需要注意,由于 objects365v1 和 lvis 类别很多,如果直接将类别名全部输入到网络中,会超过 256 个 token 导致模型预测效果极差,此时我们需要通过 --chunked-size 参数进行截断预测, 同时预测时间会比较长。

python demo/image_demo.py images/animals.png \
        configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_obj365.py \
        --weights grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth \
        --texts '$: lvis'  --chunked-size 70 \
        --palette random

在这里插入图片描述

不同的 --chunked-size 会导致不同的预测效果,您可以自行尝试。

(2) 开放词汇目标检测

开放词汇目标检测是指在推理时候,可以输入任意的类别名

python demo/image_demo.py images/animals.png \
        configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_obj365.py \
        --weights grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth \
        --texts 'zebra. giraffe' -c

在这里插入图片描述

(3) Phrase Grounding

Phrase Grounding 是指的用户输入一句语言描述,模型自动对其涉及到的名词短语想对应的 bbox 进行检测,有两种用法

这里用到了NLTK 库,首先,寻找NLTK 的文件路径,执行代码:

import nltk

if __name__ == "__main__":
    print(nltk.find("."))

如下图:
在这里插入图片描述
下载NLTK ,将其放到上面的任意路径。下载链接:https://gitee.com/qwererer2/nltk_data/tree/gh-pages。解压后将packages重新命名为nltk_data,然后将nltk_data移动上面图片中的任意目录。

在这里插入图片描述

新建任意脚本,运行下面代码:

    from nltk.book import *

出现下图结果则表明没有问题。
在这里插入图片描述

  1. 通过 NLTK 库自动提取名词短语,然后进行检测
python demo/image_demo.py images/apples.jpg \
        configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_obj365.py \
        --weights grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth \
        --texts 'There are many apples here.'

在这里插入图片描述

程序内部会自动切分出 many apples 作为名词短语,然后检测出对应物体。不同的输入描述对预测结果影响很大。

  1. 用户自己指定句子中哪些为名词短语,避免 NLTK 提取错误的情况
python demo/image_demo.py images/fruit.jpg \
        configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_obj365.py \
        --weights grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth \
        --texts 'The picture contains watermelon, flower, and a white bottle.' \
        --tokens-positive "[[[21,31]], [[45,59]]]"  --pred-score-thr 0.12

21,31 对应的名词短语为 watermelon,45,59 对应的名词短语为 a white bottle

在这里插入图片描述

(4) 指代性表达式理解

指代性表达式理解是指的用户输入一句语言描述,模型自动对其涉及到的指代性表达式进行理解, 不需要进行名词短语提取。

python demo/image_demo.py images/apples.jpg \
        configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_obj365.py \
        --weights grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth \
        --texts 'red apple.' \
        --tokens-positive -1

在这里插入图片描述

评测

我们所提供的评测脚本都是统一的,你只需要提前准备好数据,然后运行相关配置就可以了

(1) Zero-Shot COCO2017 val

# 单卡
python tools/test.py configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_obj365.py \
        grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth

# 8 卡
./tools/dist_test.sh configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_obj365.py \
        grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth 8

(2) Zero-Shot ODinW13

# 单卡
python tools/test.py configs/mm_grounding_dino/odinw/grounding_dino_swin-t_pretrain_odinw13.py \
        grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth

# 8 卡
./tools/dist_test.sh configs/mm_grounding_dino/odinw/grounding_dino_swin-t_pretrain_odinw13.py \
        grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth 8

评测数据集结果可视化

为了方便大家对模型预测结果进行可视化和分析,我们支持了评测数据集预测结果可视化,以指代性表达式理解为例用法如下:

python tools/test.py configs/mm_grounding_dino/refcoco/grounding_dino_swin-t_pretrain_zeroshot_refexp \
        grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth --work-dir refcoco_result --show-dir save_path

模型在推理过程中会将可视化结果保存到 refcoco_result/{当前时间戳}/save_path 路径下。其余评测数据集可视化只需要替换配置文件即可。

下面展示一些数据集的可视化结果: 左图为 GT,右图为预测结果

  1. COCO2017 val 结果:

在这里插入图片描述

  1. Flickr30k Entities 结果:

在这里插入图片描述

  1. DOD 结果:

在这里插入图片描述

  1. RefCOCO val 结果:

在这里插入图片描述

  1. RefCOCO testA 结果:

在这里插入图片描述

  1. gRefCOCO val 结果:

在这里插入图片描述

模型训练

如果想复现我们的结果,你可以在准备好数据集后,直接通过如下命令进行训练

# 单机 8 卡训练仅包括 obj365v1 数据集
./tools/dist_train.sh configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_obj365.py 8
# 单机 8 卡训练包括 obj365v1/goldg/grit/v3det 数据集,其余数据集类似
./tools/dist_train.sh configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det.py 8

多机训练的用法请参考 train.md。MM-Grounding-DINO T 模型默认采用的是 32 张 3090Ti,如果你的总 bs 数不是 32x4=128,那么你需要手动的线性调整学习率。

预训练自定义格式说明

为了统一不同数据集的预训练格式,我们参考 Open-GroundingDino 所设计的格式。具体来说分成 2 种格式

(1) 目标检测数据格式 OD

{"filename": "obj365_train_000000734304.jpg",
 "height": 512,
 "width": 769,
 "detection": {
    "instances": [
          {"bbox": [109.4768676992, 346.0190429696, 135.1918335098, 365.3641967616], "label": 2, "category": "chair"},
          {"bbox": [58.612365705900004, 323.2281494016, 242.6005859067, 451.4166870016], "label": 8, "category": "car"}
                ]
      }
}

label字典中所对应的数值需要和相应的 label_map 一致。 instances 列表中的每一项都对应一个 bbox (x1y1x2y2 格式)。

(2) phrase grounding 数据格式 VG

{"filename": "2405116.jpg",
 "height": 375,
 "width": 500,
 "grounding":
     {"caption": "Two surfers walking down the shore. sand on the beach.",
      "regions": [
            {"bbox": [206, 156, 282, 248], "phrase": "Two surfers", "tokens_positive": [[0, 3], [4, 11]]},
            {"bbox": [303, 338, 443, 343], "phrase": "sand", "tokens_positive": [[36, 40]]},
            {"bbox": [[327, 223, 421, 282], [300, 200, 400, 210]], "phrase": "beach", "tokens_positive": [[48, 53]]}
               ]
      }

tokens_positive 表示当前 phrase 在 caption 中的字符位置。

自定义数据集微调训练案例

为了方便用户针对自定义数据集进行下游微调,我们特意提供了以简单的 cat 数据集为例的微调训练案例。

1 数据准备

cd mmdetection
wget https://download.openmmlab.com/mmyolo/data/cat_dataset.zip
unzip cat_dataset.zip -d data/cat/

cat 数据集是一个单类别数据集,包含 144 张图片,已经转换为 coco 格式。

cat dataset

2 配置准备

由于 cat 数据集的简单性和数量较少,我们使用 8 卡训练 20 个 epoch,相应的缩放学习率,不训练语言模型,只训练视觉模型。

详细的配置信息可以在 grounding_dino_swin-t_finetune_8xb4_20e_cat 中找到。

3 可视化和 Zero-Shot 评估

由于 MM Grounding DINO 是一个开放的检测模型,所以即使没有在 cat 数据集上训练,也可以进行检测和评估。

单张图片的可视化结果如下:

cd mmdetection
python demo/image_demo.py data/cat/images/IMG_20211205_120756.jpg configs/mm_grounding_dino/grounding_dino_swin-t_finetune_8xb4_20e_cat.py --weights grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth --texts cat.

测试集上的 Zero-Shot 评估结果如下:

python tools/test.py configs/mm_grounding_dino/grounding_dino_swin-t_finetune_8xb4_20e_cat.py grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.881
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=1000 ] = 1.000
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=1000 ] = 0.929
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = -1.000
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.881
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.913
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=300 ] = 0.913
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=1000 ] = 0.913
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.913

4 模型训练

./tools/dist_train.sh configs/mm_grounding_dino/grounding_dino_swin-t_finetune_8xb4_20e_cat.py 8 --work-dir cat_work_dir

模型将会保存性能最佳的模型。在第 16 epoch 时候达到最佳,性能如下所示:

 Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.901
 Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=1000 ] = 1.000
 Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=1000 ] = 0.930
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000
 Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = -1.000
 Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.901
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.967
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=300 ] = 0.967
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=1000 ] = 0.967
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=1000 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=1000 ] = -1.000
 Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=1000 ] = 0.967

我们可以发现,经过微调训练后,cat 数据集的训练性能从 88.1 提升到了 90.1。同时由于数据集比较小,评估指标波动比较大。

模型自训练伪标签迭代生成和优化 pipeline

为了方便用户从头构建自己的数据集或者希望利用模型推理能力进行自举式伪标签迭代生成和优化,不断修改伪标签来提升模型性能,我们特意提供了相关的 pipeline。

由于我们定义了两种数据格式,为了演示我们也将分别进行说明。

1 目标检测格式

此处我们依然采用上述的 cat 数据集为例,假设我们目前只有一系列图片和预定义的类别,并不存在标注。

  1. 生成初始 odvg 格式文件
import os
import cv2
import json
import jsonlines

data_root = 'data/cat'
images_path = os.path.join(data_root, 'images')
out_path = os.path.join(data_root, 'cat_train_od.json')
metas = []
for files in os.listdir(images_path):
    img = cv2.imread(os.path.join(images_path, files))
    height, width, _ = img.shape
    metas.append({"filename": files, "height": height, "width": width})

with jsonlines.open(out_path, mode='w') as writer:
    writer.write_all(metas)

# 生成 label_map.json,由于只有一个类别,所以只需要写一个 cat 即可
label_map_path = os.path.join(data_root, 'cat_label_map.json')
with open(label_map_path, 'w') as f:
    json.dump({'0': 'cat'}, f)

会在 data/cat 目录下生成 cat_train_od.jsoncat_label_map.json 两个文件。

  1. 使用预训练模型进行推理,并保存结果

我们提供了直接可用的 配置, 如果你是其他数据集可以参考这个配置进行修改。

python tools/test.py configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_pseudo-labeling_cat.py \
    grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth

会在 data/cat 目录下新生成 cat_train_od_v1.json 文件,你可以手动打开确认或者使用 脚本 可视化效果

python tools/analysis_tools/browse_grounding_raw.py data/cat/ cat_train_od_v1.json images --label-map-file cat_label_map.json -o your_output_dir --not-show

会在 your_output_dir 目录下生成可视化结果

  1. 继续训练提高性能

在得到伪标签后,你可以混合一些预训练数据联合进行继续预训练,提升模型在当前数据集上的性能,然后重新运行 2 步骤,得到更准确的伪标签,如此循环迭代即可。

2 Phrase Grounding 格式

  1. 生成初始 odvg 格式文件

Phrase Grounding 的自举流程要求初始时候提供每张图片对应的 caption 和提前切割好的 phrase 信息。以 flickr30k entities 图片为例,生成的典型的文件应该如下所示:

[
{"filename": "3028766968.jpg",
 "height": 375,
 "width": 500,
 "grounding":
     {"caption": "Man with a black shirt on sit behind a desk sorting threw a giant stack of people work with a smirk on his face .",
      "regions": [
                 {"bbox": [0, 0, 1, 1], "phrase": "a giant stack of people", "tokens_positive": [[58, 81]]},
                 {"bbox": [0, 0, 1, 1], "phrase": "a black shirt", "tokens_positive": [[9, 22]]},
                 {"bbox": [0, 0, 1, 1], "phrase": "a desk", "tokens_positive": [[37, 43]]},
                 {"bbox": [0, 0, 1, 1], "phrase": "his face", "tokens_positive": [[103, 111]]},
                 {"bbox": [0, 0, 1, 1], "phrase": "Man", "tokens_positive": [[0, 3]]}]}}
{"filename": "6944134083.jpg",
 "height": 319,
 "width": 500,
 "grounding":
    {"caption": "Two men are competing in a horse race .",
    "regions": [
                {"bbox": [0, 0, 1, 1], "phrase": "Two men", "tokens_positive": [[0, 7]]}]}}
]

初始时候 bbox 必须要设置为 [0, 0, 1, 1],因为这能确保程序正常运行,但是 bbox 的值并不会被使用。

{"filename": "3028766968.jpg", "height": 375, "width": 500, "grounding": {"caption": "Man with a black shirt on sit behind a desk sorting threw a giant stack of people work with a smirk on his face .", "regions": [{"bbox": [0, 0, 1, 1], "phrase": "a giant stack of people", "tokens_positive": [[58, 81]]}, {"bbox": [0, 0, 1, 1], "phrase": "a black shirt", "tokens_positive": [[9, 22]]}, {"bbox": [0, 0, 1, 1], "phrase": "a desk", "tokens_positive": [[37, 43]]}, {"bbox": [0, 0, 1, 1], "phrase": "his face", "tokens_positive": [[103, 111]]}, {"bbox": [0, 0, 1, 1], "phrase": "Man", "tokens_positive": [[0, 3]]}]}}
{"filename": "6944134083.jpg", "height": 319, "width": 500, "grounding": {"caption": "Two men are competing in a horse race .", "regions": [{"bbox": [0, 0, 1, 1], "phrase": "Two men", "tokens_positive": [[0, 7]]}]}}

你可直接复制上面的文本,并假设将文本内容粘贴到命名为 flickr_simple_train_vg.json 文件中,并放置于提前准备好的 data/flickr30k_entities 数据集目录下,具体见数据准备文档。

  1. 使用预训练模型进行推理,并保存结果

我们提供了直接可用的 配置, 如果你是其他数据集可以参考这个配置进行修改。

python tools/test.py configs/mm_grounding_dino/grounding_dino_swin-t_pretrain_pseudo-labeling_flickr30k.py \
    grounding_dino_swin-t_pretrain_obj365_goldg_grit9m_v3det_20231204_095047-b448804b.pth

会在 data/flickr30k_entities 目录下新生成 flickr_simple_train_vg_v1.json 文件,你可以手动打开确认或者使用 脚本 可视化效果

python tools/analysis_tools/browse_grounding_raw.py data/flickr30k_entities/ flickr_simple_train_vg_v1.json flickr30k_images -o your_output_dir --not-show

会在 your_output_dir 目录下生成可视化结果,如下图所示:

  1. 继续训练提高性能

在得到伪标签后,你可以混合一些预训练数据联合进行继续预训练,提升模型在当前数据集上的性能,然后重新运行 2 步骤,得到更准确的伪标签,如此循环迭代即可。


http://www.kler.cn/a/309331.html

相关文章:

  • C语言 | Leetcode C语言题解之第557题反转字符串中的单词III
  • scrapy爬取中信证券销售金融产品信息
  • 使用 Sparkle 实现 macOS 应用自定义更新弹窗
  • vue2.x elementui 固定顶部、左侧菜单与面包屑,自适应 iframe 页面布局
  • 基于Qt/C++全局键盘和鼠标事件监控工具
  • Java复习42(PTA)
  • 动态ip切换过快,会引起我的账号下次登录异常吗
  • CentOS详细解析及其配置方法
  • golang 字符串浅析
  • 使用Python实现深度学习模型:智能家电控制与优化
  • Nginx搭建直播服务器,并用rtmp,http-flv,hls三种模式拉流观看直播的流程
  • iOS 知识点记录
  • 区块链积分系统:革新支付安全与用户体验的未来
  • 【Petri网导论学习笔记】Petri网导论入门学习(三)
  • 启信产业大脑助力市北高新园区数字化升级,开启智慧园区新篇章
  • 自己建网站怎么建
  • OpenCV结构分析与形状描述符(24)检测两个旋转矩形之间是否相交的一个函数rotatedRectangleIntersection()的使用
  • 网络安全学习(五)Burpsuite实战
  • 解决Matlab报错:MEX 文件 ‘D:\MATLAB\toolbox\maple\maplemex.mexw64‘ 无效: 缺少依赖共享库
  • 2024年某大厂HW蓝队面试题分享
  • Github打不开解决方法
  • 产品经理有必要学习大模型技术吗?
  • 【Elasticsearch系列十一】聚合 DSL API
  • 地平线秋招2025
  • 大数据处理技术:企业岗位需求决策
  • 【机器学习】--- 深度学习中的注意力机制