Grounding DINO论文解读与代码调试

文章介绍了GroundingDINO,一种基于Transformer架构的开放集目标检测器,它通过跨模态融合和Transformer的优势,改进了GLIP的性能,特别强调了在处理未见过的对象时的泛化能力。作者指出尽管有提升,但模型仍需fine-tuning以达到工业部署水平。
摘要由CSDN通过智能技术生成

一 Referring与Grounding的理解

1.1 目前开放数据集检测共有两条途径,各有很多工作发表,上篇博客写的GLIP,与这篇的Grounding DNIO都属于Grounding类型。
在这里插入图片描述

2.2 关于referring与grounding的直观理解:
在这里插入图片描述

  • 传统的卷积目标检测,是将类别输出投影到类别标签上,选出最大值作为当前box的类别。这里类别标签是预定好监督信号,输出logits不能超出这些类别。这是传统目标检测不能识别未见过的目标的根本原因。
  • referring的做法是,提取box的方法不变。从外部输入文本提取类别token, 然后这些类别经过clip模型转换成tensor向量,这些向量与视觉模型提取的类别logits tensor求相似度,最大的值就是当前box的类别,这种做法是开集检测方法之一。
  • grounding意思是,给定图片和文本描述,预测文本中所提到物体的在图片中的位置, 如上图给定多个物品类别,cat,dog,person。。。,组成文本。同时输入模型后,给出定位框box和类别值。

从损失函数角度理解:
在这里插入图片描述referring对输入文本token后,每个类别token用clip提特征,然后与模型输出求对比损失。
grounding是把输入文本整体(要先经过token分词)用文本模型(如bert)提取token特征,然后与模型输出求对比损失,这里分词可能会把一个单词分词两个,那么这两个分词的标签都为1。

二 引言提炼

开放集检测的关键在于引入语言来对未见过的对象进行泛化。例如,GLIP 将目标检测重新构建为短语定位任务,引入了目标区域和语言短语之间的对比训练,但由于其基于传统的单阶段检测器 Dynamic Head 设计,GLIP 的性能可能受到限制。而本文以此为突破点,将传统单阶段检测替换为基于transformer架构的 DINO检测器,命名为Grounding DINO,这款基于transformer
的模型相对于GLIP有以下优势:

    1. 跨模态融合 它的基于Transformer的架构类似于语言模型,使得处理图像和语言数据更加容易。例如,由于所有的图像和语言分支都是基于Transformer构建的,可以轻松地在整个流程中融合跨模态特征。
    1. 表达能力强 基于Transformer的检测器已经展示出了更强大的能力,可以充分利用大规模数据集。
    1. 端到端的设计 作为类似DETR的模型,DINO可以进行端到端的优化,而无需使用任何硬编码的模块,比如NMS,这极大简化了整体定位模型的设计。

三 跨模态融合

跨模态融合是本文的主要亮点之一:
在这里插入图片描述
开放集检测器是通过将闭集检测器扩展到带有语言信息的开放场景来实现的。

如上图所示,闭集检测器通常具有三个重要模块:特征提取的主干、用于特征增强的颈部和用于区域细化(或框预测)的头部

模型为了对齐跨模态信息,特征融合是必经途径,上图显示特征融合可以在三个阶段进行:颈部(阶段A)、查询初始化(阶段B)和头部(阶段C)。例如,GLIP 在颈部模块(阶段A)中进行早期融合。

闭集检测器可以通过学习语言感知的区域嵌入来泛化以检测新对象,从而使每个区域可以在语言感知语义空间中被分类为新类别。实现这一目标的关键是在颈部和/或头部输出处使用区域输出语言特征之间的对比损失

文本特征与图像特征融合越早,融合层越多,那么文本-图像的特征映射越精准,从而获得更高的性能。以往的模型,如GLIP等因混有传统检测模块难以做到大规模融合,而Grounding DINO是基于transformer的架构,没有此担忧,因为transformer可以同时处理文本与图片特征,既然如此,秉持我全都要的原则,当前模型在所有transformer层中都实现了文本-图像的跨模态融合

四 相关工作

Grounding DINO中,DINO是类似于DINO-detr的架构,因此这部分先介绍DETR的主要发展脉络,再介绍开放数据集检测发展历史,最后再对他们统一打脸,detr是closed-set detection,不能泛化的未知类别,先前的Open-set object detection只在部分阶段融合多模态信息,导致语言泛化能力不佳,总之,突出本文全方位跨模态特征融合优势。

五 模型结构分析

在这里插入图片描述

如果把text blackbone 与image blackbone合并在一起,该模型就是典型的DINO模型结构。

  1. feature enhancer 就是encoder部分,这里的text features与image features分开算self-attention,没有合并在一起,是因为image features数量太多,合并在一起会导致特征数量不均衡。这里image features使用deformable self-attention来减少计算量。image,text的self-attention结果分别作为Q各做一次cross-attention(跨模态注意力)来实现跨模态特征融合。
  2. query初始化 feature enhancer输出的text features与image features,使每个image feature向量与所有text features计算相似度,求最大值。最后排序,找出前n个(query数量)最大的feature作完query向量。
  3. Cross-Modality Decoder 解码器部分,用第2步提取query做为输入,依次与image features,text features进行跨模态注意力计算,最终,获得更新后的decode输出。
  4. 计算loss 如果只做推理,那么到model outputs这步就结束啦。若做fine-tuning,需要求loss,Cross-Modality Decoder输出的是包括物体box的区域,与text features(已token化的向量)求对比损失,另外Decoder输出也要单独做box的定位损失(如iou损失等)。

六 模型效果

在coco数据集上,zero-shot与fine-tuning的效果对比,可见性能还是很不错的。
在这里插入图片描述

ground DINO与Grounding SAM+stable diffusion可实现自动P图的神奇效果,有兴趣的可以去探索下。
在这里插入图片描述

七 代码调试

grounding DION官方代码写的很棒,几乎没有坑,点赞一波。使用方式也与GLIP很像。
我的两个环境测试都没啥问题:cuda11.8 + torch2.0.1, cuda12.1 + torch2.1.2

使用方式

  1. 在项目根目录下执行,生成编译文件,如果编译出错,参考我上一篇GLIP的文章处理。
python setup.py build develop
  1. 之后确保生成的编译文件在groundingdino目录中存在,
  2. 在根目录下建立bert-base-uncased, 存放的文件以及原因说明见GLIP
  3. 再把inference_on_a_image.py从demo文件夹移动到根目录(如果不移动,就要把bert-base-uncased移到demo内,或者更改搜索路径,都挺麻烦的)
    在这里插入图片描述
  • inference_on_a_image.py
  • 源码写的已非常棒,改好配置后可直接使用,就不再做多余的修改了。
    这里仅修改parser部分,在代码中直接传入参数,不必在命令行输入。
if __name__ == "__main__":
    parser = argparse.ArgumentParser("Grounding DINO example", add_help=True)
    # 配置文件路径
    parser.add_argument("--config_file", "-c", type=str,
                        default=r"groundingdino/config/GroundingDINO_SwinB_cfg.py",
                        # required=True,
                        help="path to config file")
    # 模型路径
    parser.add_argument("--checkpoint_path", "-p", type=str,
                        default=r"D:\Downloads\groundingdino_swinb_cogcoor.pth",
                        # required=True,
                        help="path to checkpoint file"
                        )
    # 待推理图片路径
    parser.add_argument("--image_path", "-i", type=str,
                        default=r"D:\Datasets\VOCdevkit\voc_test_300\000200.jpg",
                        # required=True,
                        help="path to image file")
    # -----------------------------------------------------------------------------------------------
    # 提示词(需要检测的类别)
    parser.add_argument("--text_prompt", "-t", type=str,
                        default=r"head . glass",
                        # required=True,
                        help="text prompt")
    # -----------------------------------------------------------------------------------------------
    # 推理结果输出文件夹,如果没有,会自动创建一个
    parser.add_argument("--output_dir", "-o", type=str,
                        default="outputs",
                        # required=True,
                        help="output directory"
                        )

放两张测试案例
第一张检测OK
第二张提示词改为glass(眼镜),当person类别处理?结果很离谱!加粗样式
在这里插入图片描述

八 总结

该模型2023.4月发布,是较新,效果很好的Open-Set Object Detection模型,很好玩,但直接做zero-shot还达不到工业部署的水平。
我对它的整体评价也如GLIP一样。虽然比GLIP有提升,但效果还有继续提升空间。
根据论文结果看,做fine-tuning后效果会有极大提升,甚至超过传统检测算法,这是Open-Set Object Detection应用方向,但肯定是有指定需求才做fine-tuning,tuning后也肯定会专注检测自己训练的类别,这又是变相向close-set Detection转变?!

  • 31
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,Grounding DINO是一种结合了DINO和基于Transformer的检测器的模型,用于开放式目标检测。它的输入是图像和文本,输出是多个[物体框,名词短语]对。具体来说,Grounding DINO使用DINO模型对图像和文本进行编码,然后使用基于Transformer的检测器对编码后的特征进行检测,最终输出[物体框,名词短语]对。 下面是一个简单的示例代码,演示如何使用Grounding DINO进行开放式目标检测: ```python import torch from torchvision.models.detection import fasterrcnn_resnet50_fpn from transformers import ViTFeatureExtractor, ViTForImageClassification from transformers.models.dino.modeling_dino import DINOHead # 加载预训练的DINO模型和ViT模型 dino = ViTForImageClassification.from_pretrained('facebook/dino-vit-base') dino_head = DINOHead(dino.config) dino_head.load_state_dict(torch.load('dino_head.pth')) dino.eval() vit_feature_extractor = ViTFeatureExtractor.from_pretrained('google/vit-base-patch16-224') # 加载预训练的Faster R-CNN检测器 model = fasterrcnn_resnet50_fpn(pretrained=True) model.eval() # 输入图像和文本 image = Image.open('example.jpg') text = 'a person riding a bike' # 对图像和文本进行编码 image_features = vit_feature_extractor(images=image, return_tensors='pt')['pixel_values'] text_features = dino_head.get_text_features(text) image_embedding, text_embedding = dino(image_features, text_features) # 使用Faster R-CNN检测器进行目标检测 outputs = model(image_embedding) boxes = outputs[0]['boxes'] labels = outputs[0]['labels'] # 输出[物体框,名词短语]对 for i in range(len(boxes)): print([boxes[i], labels[i]]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值