【开放集目标检测】Grounding DINO

一、引言

论文: Grounding DINO: Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection
作者: IDEA
代码: Grounding DINO
注意: 该算法是在Swin Transformer、Deformable DETR、DINO基础上的改进,在学习该算法前,建议先掌握相关知识。
特点: 该方法融合了文本和图像两个模态的数据,实现了开放集目标检测,即给定一个文本提示,自动框出目标所在,该目标可以是训练集中没有的类别。该方法主要通过特征增强模块、语言指导查询选择模块、跨模态解码模块实现上述功能。

二、详情

如上图所示,该方法从下到上主要包括五大模块:特征提取模块(Backbone)、特征增强模块(Feature Enhancer)、语言指导查询选择模块(Language-guide Query Selection)、跨模态解码模块(Cross-Modality Decoder)、损失计算模块(Loss)。

2.1 特征提取模块

Grounding DINO需要同时使用文本和图像两个模态的数据。因此,需要对两个模态的数据分别进行特征提取并统一特征维度,从而使它们能够相互进行交叉注意力的计算。

对于文本数据,要求以点.分割不同的目标提示,提示可以是带描述的caption或者直截了当的类别,例如,如下左子图的提示可以是dog.a stick.Two dogs.,预测结果如下右子图。

为了避免不同提示间的无效交互,作者提出Sub-sentence级的注意力掩码设置方法。如下为Sentence级、Word级、Sub-sentence级的掩码设置方法:

Sentence级的特征提取将一个句子提取为一个单词,它们独立进行forward,互不干扰,会丢失一些相关信息;Word级的特征提取会用同一个forward处理所有单词,每个单词间均相互作用,会引入一些无关信息浪费计算资源;Sub-sentence级的特征提取也用同一个forward进行处理,但是由.分割的特征之间不会相互干扰,这是通过引入注意力掩码实现的,这样就实现了相关与无关信息的交互折衷。

文本特征由BERT获取。BERT输出的特征维度为768,需要经一个MLP层映射到256的维度以达到与图像特征的统一。

对于图像数据,图像特征由Swin Transformer获取。Swin Transformer输出的是多尺度特征(通道数分别为96、192、384、768),所以也要将各层特征维度统一至256。可以通过1*1的2D卷积实现,之后通过GroupNorm归一化。

两类特征都要有对应的位置编码,图像使用Sinusoidal position embedding(空间位置编码),文本使用sine position embedding(正弦位置编码)。

2.2 特征增强模块

特征增强模块相当于DETR系列方法中的解码器,如下为特征增强模块中一个解码层的结构图:

首先,文本特征经过自注意力进行特征增强,图像特征经过Deformable DETR中的可变形自注意力进行特征增强。

其次,依次通过图像-文本交叉注意力文本-图像交叉注意力进行跨模态的注意力交互实现特征融合。跨模态交叉注意力中两个模态均需要提供自己的 Q u e r y Query Query V a l u e Value Value,图中还给出了 K e y Key Key其实并不需要,所以跨模态交叉注意力中两个模态都有自己的输出

以图像-文本交叉注意力为例,具体公式如下:

其中, O O O P P P分别为自注意力输出的图像和文本特征; W ( q , I ) W^{(q,I)} W(q,I) W ( q , L ) W^{(q,L)} W(q,L)分别为加权 O O O P P P以获得 O ( q ) O^{(q)} O(q)(图像 Q u e r y Query Query)和 P ( q ) P^{(q)} P(q)(文本 Q u e r y Query Query)的全连接参数; W ( v , I ) W^{(v,I)} W(v,I) W ( v , L ) W^{(v,L)} W(v,L)分别为加权 O O O P P P以获得 O ( v ) O^{(v)} O(v)(图像 V a l u e Value Value)和 P ( v ) P^{(v)} P(v)(文本 V a l u e Value Value)的全连接参数; A t t n Attn Attn为注意力参数,相当于标准注意力的 Q K T d \frac{QK^T}{\sqrt{d}} d QKT,只是这里的 Q Q Q K K K分别为 O ( q ) O^{(q)} O(q) P ( q ) P^{(q)} P(q) O t 2 i O_{t2i} Ot2i P i 2 t P_{i2t} Pi2t分别为图像-文本交叉注意力输出的图像特征和文本特征。

O t 2 i O_{t2i} Ot2i的下标为 t e x t   t o   i m a g e text~to~image text to image,所以它通过 SoftMax ( A t t n ) \text{SoftMax}(Attn) SoftMax(Attn)加权 P ( v ) P^{(v)} P(v)再经全连接 W o u t , I W^{out,I} Wout,I获得。其实该计算过程与标准交叉注意力一致,Query由图像提供、Key、Value由文本提供,分别为 O ( q ) O^{(q)} O(q) P ( q ) P^{(q)} P(q) P ( v ) P^{(v)} P(v)
P i 2 t P_{i2t} Pi2t的下标为 i m a g e   t o   t e x t image~to~text image to text,所以它通过 SoftMax ( A t t n T ) \text{SoftMax}(Attn^{T}) SoftMax(AttnT)加权 O ( v ) O^{(v)} O(v)再经全连接 W o u t , L W^{out,L} Wout,L获得。 A t t n T Attn^{T} AttnT需要转置,因为 A t t n Attn Attn O ( v ) O^{(v)} O(v)的维度不匹配,主要原因是Key、Value中token个数相同但与Query中token个数不同。

最后,各自经过FNN(全连接+激活+Dropout+全连接+Dropout)即可的获得两个模态各自的输出。

2.3 语言指导查询选择模块

查询选择模块的结构图如下:

上图缺少很多细节。事实上,语言指导查询选择模块是以上一模块输出的图像特征memory_img和文本特征memory_txt为输入,利用文本特征指导图像特征的选择来初始化后续解码模块的查询(内容查询query_content和位置查询query_position)和参考点ref_point 详细的流程图如下:

可见,图中memory_new是获取后续内容的关键。首先,需要为memory_img中不同特征层上的所有像素点分配一个预设的建议框proposals_init(这与YOLO比较相似)。滤除其中不满足条件的建议框(例如,超界)得到proposals,再滤除与超界建议框对应的memory_img得到memory,memory经过全连接和LayerNorm即可获取memory_new(此时memory_new中token数量不确定,维度与memory_img一致)。

有了memory_new之后,我们可以结合memory_txt找出希望保留的特征索引idx_top900,获取过程如下:

可见,需要先计算memory_new(image_features)与memory_txt(text_features)的点积得到logits,它表示每个图像特征与每个文本特征间的相似度。我们希望留下与提示文本相似的图像特征作为查询,保留个数为900,于是得到idx_top900

之后,我们可以依次获取内容查询query_content、位置查询query_position、参考点ref_point

  • 对于内容查询,可以直接按照idx_top900从memory_new中抽取。

对于位置查询和参考点,我们需要先获取ref_embed,它包括两个部分:proposals和box_embed。可以理解为proposals是先给定一个初始框,然后memory_new经 MLP \text{MLP} MLP预测一个修正项,两者相加得到最终的框。再在这些框中选出得分最高的900个,即为ref_embed

  • 对于位置查询,可通过将ref_embed进行正弦位置编码,再经过 MLP \text{MLP} MLP映射获取。
  • 对于参考点,ref_embed的前两个值就是参考点,后两个值在进行可变形注意力时会加权在偏移量上,来定位用于计算注意力所需要用的像素点。

2.4 跨模态解码模块

跨模态解码模块是以特征增强模块输出的图像特征memory_img、文本特征memory_txt以及语言指导查询选择模块输出的内容查询query_content、位置查询query_position、参考点ref_point为输入,层层更新查询和参考点。其单层结构图如下:

自注意力 Q u e r y Query Query K e y Key Key V a l u e Value Value为语言指导查询选择模块输出的内容查询query_content、位置查询query_position

图像交叉注意力为Deformable DETR中的可变形交叉注意力。内容 Q u e r y Query Query为前一层的自注意力输出,位置 Q u e r y Query Query为语言指导查询选择模块输出的位置查询query_position K e y Key Key V a l u e Value Value为特征增强模块输出的图像特征memory_img,参考点为语言指导查询选择模块输出的ref_point

文本交叉注意力标准交叉注意力 Q u e r y Query Query由前一层的图像交叉注意力输出, K e y Key Key V a l u e Value Value为特征增强模块输出的文本特征memory_txt

FFN为全连接+激活+Dropout+全连接+Dropout。

跨模态解码模块每层都会输出更新后的查询,更新后的查询后跟一个 MLP \text{MLP} MLP即可获得参考点的修正量,修正量加上上一层输出的参考点即得到更新后的参考点(也可以视为该层的框预测),更新后的查询后跟一个 MLP \text{MLP} MLP即可获得该层的类别预测。

最后一层输出的更新后的查询和参考点即为最终的框和类别预测。

2.5 损失计算模块

对于框回归任务,使用L1损失GIOU损失。对于目标分类任务,使用对比损失(Contrastive loss)。对比损失就是将解码层输出查询与特征增强模块输出的所有文本特征进行点积,该相似度作为logits。这样每个文本特征的logits中都会有900个相似度值,可以计算focal损失(每一个文本特征都有一个最相似的查询),即为对比损失。

所有文本特征和所有查询两两之间都要计算上述损失构成成本矩阵,然后通过二分图匹配确定文本与查询的一一对应(每个文本都有一个查询与之对应,查询通常有空余),之后只需要对匹配好的文本-查询进行损失计算和梯度更新即可。

致谢:

本博客仅做记录使用,无任何商业用途,参考内容如下:
文本提示检测图像任意目标(Grounding DINO) 的使用以及全网最详细源码讲解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/781459.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】有效的数独

目录 一、题目二、解法 一、题目 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&…

代码随想录算法训练营第二十七天 |56. 合并区间 738.单调递增的数字 968.监控二叉树 (可跳过)

56. 合并区间 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。 示例 1: 输入:in…

赤壁之战的烽火台 - 观察者模式

“当烽火连三月,家书抵万金;设计模式得其法,千军如一心。” 在波澜壮阔的三国历史长河中,赤壁之战无疑是一场改变乾坤的重要战役。而在这场战役中,一个看似简单却至关重要的系统发挥了巨大作用——烽火台。这个古老的…

探索InitializingBean:Spring框架中的隐藏宝藏

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》《MYSQL》 💪🏻 制定明确可量化的目标,坚持默默的做事。 ✨欢迎加入探索MYSQL索引数据结构之旅✨ 👋 Spring框架的浩瀚海洋中&#x…

Javascript常见数据结构和设计模式

在JavaScript中,常见的数据结构包括两大类:原始数据类型(Primitive Types)和对象类型(Object Types)。对象类型又可以进一步细分为多种内置对象、数组、函数等。下面是一些JavaScript中常见的数据结构&…

《算法笔记》总结No.4——散列

散列的英文名是hash,即我们常说的哈希~该知识点在王道408考研的教材里面属于查找的范围。即便各位并无深入了解过,也听说过散列是一种更高效的查找方法。 一.引例 先来考虑如下一个假设:设有数组M和N分别如下: M[10][1,2,3,4,5,6…

【Spring AOP 源码解析前篇】什么是 AOP | 通知类型 | 切点表达式| AOP 如何使用

前言(关于源码航行) 在准备面试和学习的过程中,我阅读了还算多的源码,比如 JUC、Spring、MyBatis,收获了很多代码的设计思想,也对平时调用的 API 有了更深入的理解;但过多散乱的笔记给我的整理…

自动化设备上位机设计 四

目录 一 设计原型 二 后台代码 一 设计原型 二 后台代码 using SimpleTCP; using SqlSugar; using System.Text;namespace 自动化上位机设计 {public partial class Form1 : Form{SqlHelper sqlHelper new SqlHelper();SqlSugarClient dbContent null;bool IsRun false;i…

【机器学习实战】Datawhale夏令营:Baseline精读笔记2

# AI夏令营 # Datawhale # 夏令营 在原有的Baseline上除了交叉验证,还有一种关键的优化方式,即特征工程。 如何优化特征,关系着我们提高模型预测的精准度。特征工程往往是对问题的领域有深入了解的人员能够做好的部分,因为我们要…

链式二叉树oj题

1.输入k ,找第k层节点个数 int TreeKlevel(BTNode*root,int k) {if (root NULL) {return 0;}if (k 1) {return 1;}return TreeKlevel(root->left, k - 1)TreeKlevel(root->right, k - 1); } 在这里我们要确定递归子问题,第一个就是NULL时返回&…

强化学习中的Q-Learning和Sarsa算法详解及实战

强化学习(Reinforcement Learning, RL)是一种通过与环境交互来学习最优策略的机器学习方法。在强化学习中,Q-Learning和Sarsa是两种重要的基于值的算法。本文将详细讲解这两种算法,并通过实际代码示例展示其应用。 1. 强化学习基…

algorithm算法库学习之——不修改序列的操作

algorithm此头文件是算法库的一部分。本篇介绍不修改序列的操作函数。 不修改序列的操作 all_ofany_ofnone_of (C11)(C11)(C11) 检查谓词是否对范围中所有、任一或无元素为 true (函数模板) for_each 应用函数到范围中的元素 (函数模板) for_each_n (C17) 应用一个函数对象到序…

Vue88-Vuex中的mapActions、mapMutations

一、mapMutations的调用 此时结果不对,因为:若是点击事件不传值,默认传的是event!,所以,修改如下: 解决方式1: 解决方式2: 不推荐,写法麻烦! 1-…

排序算法简述(第八jiang)

目录 排序 选择排序 O(n2) 不稳定:48429 归并排序 O(n log n) 稳定 插入排序 O(n2) 堆排序 O(n log n) 希尔排序 O(n log2 n) 图书馆排序 O(n log n) 冒泡排序 O(n2) 优化: 基数排序 O(n k) 快速排序 O(n log n)【分治】 不稳定 桶排序 O(n…

【图解大数据技术】Flume、Kafka、Sqoop

【图解大数据技术】Flume、Kafka、Sqoop FlumeFlume简介Flume的应用场景 KafkaKafka简介Kafka架构Flume与Kafka集成 SqoopSqoop简介Sqoop原理sqoop搭配任务调度器实现定时数据同步 Flume Flume简介 Flume是一个数据采集工具,多用于大数据技术架构下的日志采集。 …

设计模式之模版方法

模版方法介绍 模版方法(Template Method)模式是一种行为型设计模式,它定义了一个操作(模板方法)的基本组合与控制流程,将一些步骤(抽象方法)推迟到子类中,使得子类可以在…

C语言下的文件详解

主要内容 文件概述文件指针文件的打开与关闭文件的读写 文件 把输入和输出的数据以文件的形式保存在计算机的外存储器上,可以确保数据能随时使用,避免反复输入和读取数据 文件概述 文件是指一组相关数据的有序集合 文件是存储数据的基本单位&#…

# mysql 中文乱码问题分析

mysql 中文乱码问题分析 一、问题分析: MySQL 中文乱码通常是因为字符集设置不正确导致的。MySQL 有多种字符集,如 latin1、utf8、utf8mb4 等,如果在创建数据库、数据表或者字段时没有指定正确的字符集,或者在插入数据时使用了与…

关于Java异常机制及finally关键字的详解

异常机制(Exception) 软件程序在运行过程中,非常可能遇到异常问题。常见的异常: 1、用户输入错误 2、设备错误 3、硬件问题,例如打印机关掉、服务器问题 4、物理限制:磁盘满了 Java是采用面向对象的方式来处理异常的。 处理过程…

哈希表——C语言

哈希表(Hash Table)是一种高效的数据结构,能够在平均情况下实现常数时间的查找、插入和删除操作。 哈希表的核心是哈希函数,哈希函数是一个将输入数据(通常称为“键”或“key”)转换为固定长度的整数的函数…