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

Grounding DINO

论文标题: 

Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection

代码地址:

GitHub - IDEA-Research/GroundingDINO: [ECCV 2024] Official implementation of the paper "Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection"

0. 摘要

图1。 (a) 封闭集物体检测需要模型检测预定义类别的对象。 (b) 以前的工作将模型零样本传输到新类别以实现模型泛化。我们建议将指称表达式理解(REC)作为对具有属性的新对象的模型泛化的另一种评估。 (c) 我们通过组合Grounding DINO和Stable Diffusion[42]呈现图像编辑应用程序。以彩色查看效果最佳。

本文提出了一种开放集物体检测器,称为基于定位的DINO,通过将基于Transformer的检测器DINO与定位预训练相结合,可以检测任意物体,如人工输入的类别名称或指称表达等。开放集物体检测的关键解决方案是将语言引入封闭集检测器以实现开放集概念推广。为了有效地融合语言和视觉模态,我们从概念上将封闭集检测器分为三个阶段,并提出了紧密融合解决方案,包括特征增强器、语言指导的查询选择和跨模态解码器进行跨模态融合。尽管以前的工作主要在新类别上评估开放集物体检测,但我们提出也对用属性指定的对象进行指称表达理解评估。基于定位的DINO在所有三个设置上表现出色,包括在COCO、LVIS、ODinW和RefCOCO/+/g的基准测试。在不使用任何COCO训练数据的情况下,基于定位的DINO在COCO物体检测零样本转换基准测试上达到了52.5的平均精度(AP)。在使用COCO数据微调后,基于定位的DINO达到了63.0的AP。它以26.1的平均AP在ODinW零样本基准测试上刷新了记录。

图2。将封闭集检测器扩展到开放集场景的现有方法。请注意,某些封闭集检测器可能只有图中的部分阶段。

1. 引言

理解新概念是视觉智能的基本能力。在这项工作中,我们旨在开发一个强大的系统来检测人类语言输入指定的任意对象,我们将其称为开放集物体检测。由于其作为通用物体检测器的巨大潜力,这项任务具有广泛的应用前景。例如,我们可以将其与生成模型相结合进行图像编辑(如图1(b)所示)。

开放集检测的关键是利用语言实现未见对象的泛化[1,7,26]。例如,GLIP[26]通过将物体检测改造为短语定位任务并引入对象区域和语言短语之间的对比训练。它展示了这种表述形式在异构数据集上的巨大灵活性和在封闭集和开放集检测方面的显着性能。尽管GLIP取得了令人印象深刻的结果,但其性能可能受到限制,因为它是在基于传统的单阶段检测器Dynamic Head[5]上设计的。由于开放集和封闭集检测息息相关,我们认为一个更强大的封闭集物体检测器可以产生一个更好的开放集检测器。

表1。以前开放集物体检测器的比较。我们的总结基于他们论文中的实验,而不是扩展他们的模型到其他任务的能力。值得注意的是,一些相关工作可能不(仅)最初为开放集物体检测而设计,如MDETR [18]和GLIPv2 [59],但我们在这里全部列出,与现有工作进行全面的比较。对于模型在部分数据(例如基本类别)上训练
图3。Grounding DINO的框架。我们分别在块1、块2和块3中呈现了整体框架、特征增强层和解码器层。

受Transformer基础的检测器的进展鼓舞[24, 25, 31, 58],在本文中,我们提出在DINO[58]的基础上构建一个强大的开放集检测器,DINO不仅提供了目前最先进的物体检测性能,而且允许我们通过定位预训练将多级文本信息集成到其算法中。我们将该模型称为基于定位的DINO。与GLIP相比,基于定位的DINO具有几个优势。首先,其基于Transformer的架构与语言模型类似,从而更容易处理图像和语言数据。例如,由于图像和语言分支都是用Transformer构建的,我们可以轻松地在整个流程中融合跨模态特征。其次,基于Transformer的检测器已证明具有利用大规模数据集的卓越能力。最后,作为类似DETR的模型,DINO可以端到端优化,而不需要使用任何手工设计的模块,如NMS,这大大简化了整个定位模型的设计。

大多数现有的开放集检测器都是通过从封闭集检测器扩展到开放集场景并引入语言信息来开发的。如图2所示,一个封闭集检测器通常有三个重要模块,一个主干网络用于特征提取,一个颈部用于特征增强,以及一个头部用于区域调整(或框预测)。可以通过学习语义意识的区域嵌入来将封闭集检测器推广到检测新对象,以便每个区域可以在语义意识的语义空间中分类为新类别。实现这一目标的关键是在颈部和/或头部输出处使用区域输出和语言特征之间的对比损失。为了帮助模型对齐跨模态信息,一些工作尝试在最终损失阶段之前融合特征。图2显示,特征融合可以在三个阶段进行:颈部(阶段A)、查询初始化(阶段B)和头部(阶段C)。例如,GLIP[26]在颈部模块(阶段A)中执行了早期融合,OV-DETR[56]将语言感知查询用作头部输入(阶段B)。

我们认为管道中的更多特征融合使模型表现得更好。值得注意的是,检索任务更喜欢类似CLIP的两塔架构,该架构仅在末端执行多模态特征比较以提高效率。然而,对于开放集检测,模型通常同时给定图像和指定目标对象类别或特定对象的文本输入。在这种情况下,由于图像和文本一开始就可用,更喜欢紧密(和早期)融合模型以获得更好的性能[1, 26]。尽管概念上简单,但以前的工作难以在所有三个阶段进行特征融合。 类似Faster RCNN等经典检测器的设计使其难以在大多数模块中与语言信息交互。 与经典检测器不同,基于Transformer的检测器DINO与语言块具有一致的结构。分层设计使其可以轻松地与语言信息进行交互。在此原则下,我们在颈部、查询初始化和头部阶段设计了三种特征融合方法。更具体地,我们通过堆叠自注意力、文本到图像交叉注意力和图像到文本交叉注意力来设计特征增强器作为颈部模块。然后,我们开发了一种语言指导的查询选择方法来初始化头部的查询。我们还为头部阶段设计了一个具有图像和文本交叉注意力层的跨模态解码器,以提升查询表示。这三个融合阶段有效地帮助模型在现有基准测试上获得更好的性能,这将在第4.4节中显示。

尽管在多模态学习中取得了显着改进,但大多数现有的开放集检测工作仅在新类别的对象上评估其模型,如图1(b)左列所示。 我们认为另一个重要的场景也应考虑,其中对象用属性描述。在文献中,该任务被称为指称表达理解(REC)[30, 34]。我们在图1(b)右列中给出了一些REC的示例。 这是一个密切相关的领域,但在以前的开放集检测工作中往往被忽视。在本文中,我们将开放集检测扩展到支持REC,并对其在REC数据集上的性能进行评估。

我们在所有三种设置下进行实验,包括封闭集检测、开放集检测和指称对象检测,以全面评估开放集检测性能。Grounding DINO明显优于竞争对手。例如,Grounding DINO在不使用任何COCO训练数据的情况下在COCO minival上达到了52.5 AP。它还以26.1的平均AP在ODinW [23]零样本基准测试上确立了新的最先进水平。

本文的贡献总结如下:

  • 我们提出了Grounding DINO,它通过在多个阶段执行视觉语言模态融合来扩展封闭集检测器DINO,包括特征增强器、语言指导的查询选择模块和跨模态解码器。 这种深度融合策略有效改进了开放集物体检测。
  • 我们提出将开放集物体检测的评估扩展到REC数据集。 它有助于评估模型对自由文本输入的性能。
  • 在COCO、LVIS、ODinW和RefCOCO/+/g数据集上的实验表明,Grounding DINO在开放集物体检测任务上的有效性。

2. 相关工作

检测Transformer。基于定位的DINO建立在类似DETR的模型DINO [58]之上,DINO是一个端到端的基于Transformer的检测器。DETR首先在[2]中提出,然后在过去几年中从许多方面得到改进[4,5,12,17,33,50,64]。DAB-DETR [31]引入了锚框作为DETR查询,以进行更准确的框预测。DN-DETR [24]提出了查询去噪以稳定匹配。DINO [58]进一步开发了几种技术,在COCO物体检测基准测试中刷新了记录。然而,这些检测器主要侧重于封闭集检测,很难推广到新类别,因为预定义类别有限。

开放集物体检测。开放集物体检测使用现有的边界框注释进行训练,目的是检测任意类别的对象,语言泛化提供帮助。OV-DETR [57]使用由CLIP模型编码的图像和文本嵌入作为查询,以在DETR框架中解码类别指定的框。ViLD [13]从CLIP老师模型中蒸馏知识到类似R-CNN的检测器,以便学习到的区域嵌入包含语言的语义。GLIP [11]将物体检测形式化为定位问题,利用额外的定位数据帮助学习短语和区域层面上的语义对齐。它显示这样的表述甚至可以在完全监督的检测基准测试上取得更强的性能。DetCLIP [53]涉及大规模图像字幕数据集,并使用生成的伪标签来扩展知识数据库。生成的伪标签有效帮助扩展检测器的泛化能力。

然而,以前的工作只在部分阶段融合多模态信息,这可能会导致次优的语言泛化能力。例如,GLIP仅考虑在特征增强(阶段A)中进行融合,而OV-DETR仅在解码器输入(阶段B)处注入语言信息。此外,REC任务在评估中通常被忽视,这是开放集检测的一个重要场景。我们在表1中比较了我们的模型与其他开放集方法。

3. 基于定位的DINO

对于给定的(图像,文本)对,基于定位的DINO输出多个对象框和名词短语对。例如,如图3所示,模型从输入图像中定位一只猫和一张桌子,并从输入文本中提取词语cat和table作为对应的标签。物体检测和REC任务都可以与该流程对齐。遵循GLIP [26],我们将所有类别名称连接为物体检测任务的输入文本。REC需要每个文本输入一个边界框。我们使用得分最高的输出对象作为REC任务的输出。

基于定位的DINO是双编码器单解码器体系结构。它包含一个图像主干网络用于图像特征提取,一个文本主干网络用于文本特征提取,一个特征增强器用于图像和文本特征融合(第3.1节),一个语言指导的查询选择模块用于查询初始化(第3.2节),以及一个跨模态解码器进行框调整(第3.3节)。总体框架如图3所示。

对于每个(图像,文本)对,我们首先分别使用图像主干网络和文本主干网络提取原始图像特征和文本特征。这两种原始特征被输入到特征增强器模块中进行跨模态特征融合。在获得跨模态文本和图像特征之后,我们使用语言指导的查询选择模块从图像特征中选择跨模态查询。与大多数基于DETR的模型中的对象查询一样,这些跨模态查询将被馈送到跨模态解码器中,以从两个模态特征中探测所需特征并更新自身。最后一层解码器的输出查询将用于预测对象框并提取对应的短语。

3.1. 特征提取和增强器

给定一个(图像,文本)对,我们使用类似Swin Transformer [32]的图像主干网络提取多尺度图像特征,使用类似BERT [8]的文本主干网络提取文本特征。遵循以前的基于DETR的检测器[58,64],从不同模块的输出中提取多尺度特征。在提取原始图像和文本特征后,我们将它们输入到特征增强器中进行跨模态特征融合。特征增强器包含多个特征增强层。我们在图3块2中说明了一个特征增强层。我们利用可变形自注意力来增强图像特征,利用普通自注意力增强文本特征。受GLIP [26]的启发,我们添加了图像到文本的交叉注意力和文本到图像的交叉注意力进行特征融合。这些模块帮助调整不同模态之间的特征。

3.2. 语言指导的查询选择

基于定位的DINO旨在检测输入文本指定的图像中的对象。为了有效利用输入文本指导物体检测,我们设计了一个语言指导的查询选择模块,用于选择与输入文本更相关的特征作为解码器查询。我们以PyTorch风格在算法1中呈现查询选择过程。变量image_features和text_features分别用于图像和文本特征。num_query是解码器中的查询数,在我们的实现中设置为900。我们在伪代码中使用bs和ndim表示批量大小和特征维度。num_img_tokens和num_text_tokens分别用于图像和文本标记的数量。

语言指导的查询选择模块输出num_query个索引。我们可以根据所选索引提取特征来初始化查询。遵循DINO [58],我们使用混合查询选择来初始化解码器查询。每个解码器查询包含两部分:内容部分和位置部分[33]。我们将位置部分形式化为动态锚框[31],它们使用编码器输出进行初始化。另一部分内容查询在训练期间被设置为可学习的。

3.3. 跨模态解码器

我们开发了一个跨模态解码器来组合图像和文本模态特征,如图3块3所示。每个跨模态查询被馈送到自注意力层、图像交叉注意力层以组合图像特征、文本交叉注意力层以组合文本特征和每个跨模态解码器层中的FFN层。与DINO解码器层相比,每个解码器层都有一个额外的文本交叉注意力层,因为我们需要向查询中注入文本信息以实现更好的模态对齐。

图4。文本表示的比较

3.4. 子句级文本特征

先前的工作探索了两种文本提示,我们将其分别命名为句子级表示和单词级表示,如图4所示。句子级表示[35,53]将整个句子编码为一个特征。如果短语定位数据中的某些句子有多个短语,则它会提取这些短语并丢弃其他单词。通过这种方式,它在损失句子中的细粒度信息的同时消除了单词之间的影响。

单词级表示[11,18]可以在一次前向传播中编码多个类别名称,但在输入文本是多个类别名称的任意顺序连接时,它会引入类别之间不必要的依赖关系。如图4(b)所示,一些不相关的词在注意力机制中进行交互。为了避免不必要的词交互,我们引入注意力屏蔽来屏蔽不相关类别名称之间的注意力,称为“子句”级表示。它在保持词级特征以进行细粒度理解的同时消除了不同类别名称之间的影响。

3.5. 损失函数

遵循之前的DETR类工作[2,24,31,33,58,64],我们使用L1损失和GIOU [41]损失进行边界框回归。我们遵循GLIP [26] 在预测对象和语言标记之间使用对比损失进行分类。具体来说,我们将每个查询与文本特征进行点积以预测每个文本标记的逻辑,然后为每个逻辑计算focal损失[28]。边界框回归和分类成本首先用于在预测和真值之间进行双分匹配。然后我们在相同的损失组件下计算真值和匹配预测之间的最终损失。遵循DETR类模型,我们在每个解码器层之后和编码器输出之后添加辅助损失。

4. 实验

4.1. 设置

我们在三个设置下进行广泛的实验:封闭集设置下的COCO检测基准测试(第C.1节),零样本COCO、LVIS和ODinW的开放集设置(第4.2节),以及RefCOCO/+/g上的指称检测设置(第4.3节)。然后进行了消融实验以显示我们的模型设计的有效性(第4.4节)。我们还探索了一种通过训练几个插件模块将训练良好的DINO转移到开放集场景的方法,见第4.5节。我们的模型效率测试呈现在第I节。

实现细节 我们训练了两个模型变体,分别具有Swin-T [32]和Swin-L [32]作为图像主干网络的Grounding-DINO-T和Grounding-DINO-L。我们从Hugging Face [51]利用BERT-base [8]作为文本主干网络。由于我们更关注模型在新类别上的性能,我们在主文本中列出了零样本转换和指称检测结果。更多实现细节请见附录第A节。

4.2. Grounding DINO的零样本转换

在此设置中,我们在大规模数据集上预训练模型,并直接在新数据集上评估模型。我们还列出了一些微调结果,以便我们的模型与先前的工作进行更全面的比较。

COCO基准测试我们在表2中将Grounding DINO与GLIP和DINO进行了比较。我们在大规模数据集上预训练模型,并直接在COCO基准测试上评估我们的模型。由于O365数据集[44]已经覆盖了COCO中的所有类别,我们将O365预训练的DINO评估为COCO上的零样本基准线。结果表明,DINO的COCO零样本转换优于DyHead。在相同设置下,Grounding DINO优于所有以前的模型,与DINO和GLIP相比,分别提高了+0.5AP和+1.8AP。定位数据对于Grounding DINO仍然有帮助,在零样本转换设置上带来了1AP以上的改进(48.1对46.7)。随着更强大的主干网络和更大的数据量,Grounding DINO在COCO物体检测基准测试上刷新了记录,在不看任何COCO图像的训练下达到了52.5的AP。在COCO物体检测基准测试上,在训练期间没有看任何COCO图像的情况下达到了52.5的AP。Grounding DINO在COCO minival上获得了62.6的AP,优于DINO的62.5 AP。当将输入图像放大1.5倍时,收益减少。我们怀疑文本分支增大了具有不同输入图像的模型之间的差距。尽管如此,Grounding DINO在使用COCO数据集微调后,在COCO test-dev上获得了63.0的AP(见表2括号中的数字)。

LVIS基准测试 LVIS[14]是一个长尾对象的数据集。它包含超过1000个类别进行评估。我们将LVIS用作下游任务来测试我们模型的零样本能力。我们使用GLIP作为我们模型的基准线。结果如表3所示。在相同设置下,Grounding DINO优于GLIP。我们在结果中发现了两个有趣的现象。首先,Grounding DINO在常见对象上比GLIP效果更好,但在稀有类别上效果较差。我们怀疑900个查询的设计限制了长尾对象的能力。相比之下,单阶段检测器使用特征图中的所有提议进行比较。另一个现象是,Grounding DINO随着更多数据的增加比GLIP获得更大的收益。例如,Grounding DINO随着字幕数据Cap4M引入了+1.8 AP的收益,而GLIP只有+1.1 AP。我们认为Grounding DINO具有比GLIP更好的可扩展性。我们将扩大规模训练留作未来工作。

ODinW基准测试 ODinW(野外物体检测)[23]是一个在真实场景下测试模型性能的更具挑战性的基准测试。它收集了超过35个数据集进行评估。我们报告零样本、少样本和全样本三个设置的结果,见表4。Grounding DINO在该基准测试上表现良好。仅用O365和GoldG进行预训练,Grounding-DINO-T在少样本和全样本设置上优于DINO。令人印象深刻的是,具有Swin-T主干网络的Grounding DINO在全样本设置上优于具有Swin-L的DINO。在零样本设置下,Grounding DINO在相同主干网络下优于GLIP,与GLIPv2[59]相当,后者没有使用像遮蔽训练这样的新技术。结果显示了我们提出的模型的优越性。Grounding-DINO-L在ODinW零样本上刷新记录,达到26.1 AP,甚至优于巨型Florence模型[55]。结果表明Grounding DINO的泛化能力和可扩展性。

4.3. 指称对象检测设置

我们进一步探索了我们的模型在REC任务上的性能。我们利用GLIP [26]作为我们的基准线。我们直接在RefCOCO/+/g上评估模型性能。结果如表5所示。在相同设置下,Grounding DINO优于GLIP。尽管如此,如果没有REC数据,GLIP和Grounding DINO的表现都不佳。更多的训练数据(如字幕数据)或更大的模型有助于最终性能,但改进很小。将RefCOCO/+/g数据注入训练后,Grounding DINO获得了显著提升。结果表明,现今大多数开放集物体检测器需要更关注细粒度检测。

表2. 在COCO上的零样本域转换和微调。*括号中的结果是用1.5×图像大小训练的,即最大图像大小为2000。†模型将O365的一个子集类别映射到COCO进行零样本评估
表3. 到LVIS的零样本域转换。*模型在评估之前在LVIS数据集上进行了微调。

4.4. 消融实验

我们在本节进行了消融实验。我们为开放集物体检测提出了一个紧密融合的定位模型和子句级文本提示。为验证模型设计的有效性,我们为不同的变体移除了一些融合模块。结果如表6所示。所有模型都在带Swin-T主干网络的O365上进行了预训练。结果表明,每个融合都有助于最终性能。编码器融合是最重要的设计。单词级文本提示的影响最小,但也有帮助。语言指导的查询选择和文本交叉注意力分别对LVIS和COCO有较大影响。

4.5. 从DINO向Grounding DINO的迁移

最近的工作呈现了许多使用DINO架构的大规模图像检测模型。从头开始训练一个Grounding DINO模型的计算成本非常高。但是,如果我们利用预训练的DINO权重,成本可以大大降低。因此,我们进行了一些实验,将预训练的DINO迁移到Grounding DINO模型。我们冻结DINO和Grounding DINO中共存的模块,仅微调其他参数。(我们在第E节比较了DINO和Grounding DINO)结果如表7所示。

结果表明,我们可以只使用预训练DINO的文本和融合模块,实现与从头训练Grounding-DINO-T类似的性能。有趣的是,在相同设置下,DINO预训练的Grounding DINO优于标准Grounding DINO在LVIS上的性能。结果表明模型训练还有很大的改进空间,这将是我们未来要探索的方向。与从零开始训练相比,具有预训练DINO初始化的模型收敛速度更快,如图5所示。值得注意的是,我们在图5的曲线中使用了无指数移动平均 (EMA) 的结果,这导致与表7中的最终性能不同。由于从零开始训练的模型需要更多训练时间,我们仅显示早期时期的结果。

表4. 在ODinW基准测试上的结果
表5. 指称表达理解任务上的Top-1准确率比较。我们用粗体标出最佳结果。所有模型都用ResNet-101主干网络进行了训练。我们分别使用“CC”、“SBU”、“VG”、“OI”、“O365”和“YFCC”表示Conceptual Captions [45]、SBU Captions [36]、Visual Genome [20]、OpenImage [22]、Objects365 [63]、YFCC100M [49]。“RefC”表示RefCOCO、RefCOCO+和RefCOCOg三个数据集。*由于COCO包括RefC中的验证图像,因此可能存在数据泄漏。但是两个数据集的注释不同。
表6. 我们的模型的消融实验。所有模型都在带Swin Transformer Tiny主干网络的O365数据集上进行了训练。
表7. 将预训练的DINO转移到Grounding DINO。在定位微调期间,我们冻结DINO和Grounding DINO之间共享的模块。所有模型都用Swin Transformer Tiny主干网络进行了训练
图5. 两种Grounding DINO变体的训练曲线比较:从零开始训练和从DINO预训练模型转移。模型在O365上训练,直接在COCO上评估。

5. 结论

本文提出了基于定位的DINO模型。Grounding DINO将DINO扩展到开放集物体检测,使其能够检测给定文本作为查询的任意对象。我们回顾了开放集检测器的设计,并提出了一种紧密融合方法在跨模态信息中进行更好的融合。我们提出了子句级表示法,以更合理的方式使用检测数据作为文本提示。结果表明我们的模型设计和融合方法是有效的。此外,我们将开放集物体检测扩展到REC任务并进行相应的评估。我们发现现有的开放集检测器在没有微调的情况下在REC数据上表现不佳。因此,我们呼吁在未来研究中对REC的零样本性能给予额外关注。

局限性:尽管在开放集物体检测设置上表现出色,但Grounding DINO无法用于像GLIPv2这样的分割任务。此外,我们的训练数据少于最大的GLIP模型,这可能限制了我们的最终性能。

6. 致谢

我们感谢GLIP[26]的作者:Liunian Harold Li、Pengchuan Zhang和Haotian Zhang的帮助讨论和指导。我们还要感谢OmDet [61]的作者Tiancheng Zhao和DetCLIP [53]的作者Jianhua Han对他们模型细节的回应。我们感谢香港科技大学的He Cao对扩散模型的帮助。

7. 基于GroundingDINO的检测框自动标注的脚本

    from time import time
    import os
    import cv2
    import numpy as np
    from PIL import Image
    from typing import Tuple, Any
    from GroundingDINO.groundingdino.util.inference import load_model, load_image, predict, annotate
    import GroundingDINO.groundingdino.datasets.transforms as T
    from database.read_database import ReadImagesclass AutoLabellingObjectDetect:def __init__(self):self.data = ReadImages()self.cont: int = 0self.num_images: int = 0self.class_id: int = 0self.box_threshold: float = 0.25self.text_threshold: float = 0.25self.out_image_path: str = 'datasets/images/val'self.out_txt_path: str = 'datasets/labels/val'self.prompt: str = 'eye'self.home: str = os.getcwd()self.save: bool = Trueself.draw: bool = Falseself.images: list = []self.names: list = []self.bbox_info: list = []def save_data(self, image_copy: np.ndarray, list_info: list):timeNow = time()timeNow = str(timeNow)timeNow = timeNow.split('.')timeNow = timeNow[0] + timeNow[1]cv2.imwrite(f"{self.out_image_path}/{timeNow}.jpg", image_copy)for info in list_info:f = open(f"{self.out_txt_path}/{timeNow}.txt", 'a')f.write(info)f.close()def config_grounding_model(self) -> Any:config_path = os.path.join(self.home, "GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py")check_point_path = 'GroundingDINO/weights/groundingdino_swint_ogc.pth'model =load_model(config_path, check_point_path, device="cuda")return modeldef main(self):self.images, self.names = self.data.read_images('C:\\Utils\\Real_time_drowsy_driving_detection\\database\\open_eyes\\val')self.num_images = len(self.images)grounding_model = self.config_grounding_model()# Crear los directorios si no existenif not os.path.exists(self.out_image_path):os.makedirs(self.out_image_path)if not os.path.exists(self.out_txt_path):os.makedirs(self.out_txt_path)while self.cont < self.num_images:self.bbox_info = []print('------------------------------------')print(f'name_image: {self.names[self.cont]}')process_image = self.images[self.cont]copy_image = process_image.copy()draw_image = process_image.copy()transform = T.Compose([T.RandomResize([800], max_size=1333),T.ToTensor(),T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])img_source = Image.fromarray(process_image).convert("RGB")img_transform, _ = transform(img_source, None)boxes, logits, phrases = predict(model = grounding_model,image = img_transform,caption = self.prompt,box_threshold = self.box_threshold,text_threshold = self.text_threshold,device = "cuda")if len(boxes) != 0:h, w, _ = process_image.shapexc, yc, an, al = boxes[0][0], boxes[0][1], boxes[0][2], boxes[0][3]# Error < 0if xc < 0: xc = 0if yc < 0: yc = 0if an < 0: an = 0if al < 0: al = 0# Error > 1if xc > 1: xc = 1if yc > 1: yc = 1if an > 1: an = 1if al > 1: al = 1self.bbox_info.append(f"{self.class_id} {xc} {yc} {an} {al}")x1, y1, x2, y2 = int(xc * w), int(yc * h), int(an * w), int(al * h)print(f"boxes: {boxes}\nxc: {x1} yc:{y1} w:{x2} h:{y2}")if self.save:self.save_data(copy_image, self.bbox_info)if self.draw:annotated_img = annotate(image_source=draw_image, boxes=boxes, logits=logits, phrases=phrases)out_frame = cv2.cvtColor(annotated_img, cv2.COLOR_BGR2RGB)cv2.imshow('Grounding DINO detect', out_frame)cv2.waitKey(0)self.cont += 1auto_labeling = AutoLabellingObjectDetect()
    auto_labeling.main()

    参考文献

    https://zhuanlan.zhihu.com/p/650588388

     基于GroundingDINO的检测框自动标注的脚本

    相关文章:

    Grounding DINO

    论文标题&#xff1a; Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection 代码地址&#xff1a; GitHub - IDEA-Research/GroundingDINO: [ECCV 2024] Official implementation of the paper "Grounding DINO: Marrying DINO …...

    MCP协议:自然语言与结构化数据的双向桥梁 ——基于JSON-RPC 2.0的标准化实践

    MCP协议&#xff1a;自然语言与结构化数据的双向桥梁 ——基于JSON-RPC 2.0的标准化实践 一、MCP的本质&#xff1a;标准化共识的协议框架 MCP&#xff08;Model Context Protocol&#xff09;是Anthropic于2024年提出的开放通信协议&#xff0c;其核心价值在于建立自然语言…...

    区块链+医疗:破解数据共享困局,筑牢隐私安全防线

    在医疗健康领域&#xff0c;数据共享与隐私保护一直是一对难以调和的矛盾。一方面&#xff0c;分散在不同机构的医疗数据&#xff08;如电子病历、检查报告、用药记录&#xff09;阻碍了诊疗效率和科研进展&#xff1b;另一方面&#xff0c;患者隐私泄露事件频发&#xff0c;加…...

    Arduino IDE中更新esp32 3.2.0版本的办法

    在Arduino IDE中更新esp32-3.2.0版本是个不可能的任务&#xff0c;下载文件速度极慢。网上提供了离线的办法&#xff0c;提供了安装文件&#xff0c;但是没有3.2.0的版本。 下面提供了一种离线安装方法 一、腾讯元宝查询解决办法 通过打开开发板管理地址&#xff1a;通过在腾…...

    关于 live555延迟优化之缓存区优化“StreamParser::afterGettingBytes() warning: read”” 的解决方法

    若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/146354088 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…...

    毫米波通信的技术挑战与解决方案

    毫米波通信的技术挑战与解决方案 随着5G技术的迅速发展&#xff0c;毫米波通信&#xff08;Millimeter Wave, mmWave&#xff09;作为一种具有巨大潜力的通信技术&#xff0c;正在成为实现超高速数据传输、低延迟和大规模连接的关键。然而&#xff0c;毫米波通信虽然在理论上具…...

    软考中级-软件设计师 数据库(手写笔记)

    基本概念 数据库分析设计过程 E-R模型 关系模式 关系模式相关名词和完整性约束和关系的三种类型 七种基本算法 并交查和笛卡尔积 投影选择和连接 题 规范化-函数依赖 求候选码 非规范化可能处于的问题 问题 题 关系-模型分解 事务管理 备份和恢复 数据仓库和数据挖掘...

    Compose笔记(二十一)--AnimationVisibility

    这一节主要了解一下Compose的AnimationVisibility,AnimatedVisibility 是 Jetpack Compose 里用于实现组件可见性动画效果的组件&#xff0c;借助它能让组件在显示和隐藏时带有平滑的过渡动画&#xff0c;从而提升用户体验。现总结如下: API 1. visible 含义&#xff1a;这是一…...

    生物化学笔记:神经生物学概论05 感受野 视觉中枢 高级视皮层中的信息走向

    信息传递中的“击鼓传花” 新特性的突现 功能柱&#xff1a;简化节点 高级视皮层中的信息走向...

    记录idea可以运行但是maven install打包却找不到问题

    解决idea使⽤maven多模块install报依赖模块的包找不到的问题 如果被依赖项⽬是springboot项⽬&#xff0c;那么可以把相关的springboot的东西移除掉&#xff0c;改造成普通项⽬。如果不想改造项⽬&#xff0c;那就添加部分的配置&#xff0c;因为springboot项⽬打包的时候会⽣…...

    牛客:AB5 点击消除

    链接&#xff1a;点击消除_牛客题霸_牛客网 题解&#xff1a; 利用栈&#xff0c;遍历输入的字符串&#xff0c;栈为空则入栈&#xff0c;栈不为空则去除栈顶字符和当前遍历到的字符比较&#xff0c;相等则栈顶字符出栈&#xff0c;当前遍历的字符也不入栈&#xff0c;不相等…...

    vue3 动态修改系统title

    vue3 动态修改系统title 修改前 修改后 1、封装 useTitle 工具函数 创建组合式 API&#xff0c;通过 watchEffect 监听标题变化&#xff1a; // composables/useTitle.js import { ref, watchEffect } from vue;export function useTitle(initialTitle) {const title r…...

    产品经理.产品设计.产品设计工具

    一、 产品经理常用工具 1. 业务流程图---系统流程图 业务流程图&#xff0c;面向用户调研&#xff0c;描述业务的流转和数据的处理要求&#xff0c;跟用户和业务方确认&#xff1b;---业务角色的泳道流程图。 系统流程图&#xff0c;面向产品需求设计&#xff0c; prd系描述各…...

    kibana重建es索引

    kibana如何重命名es索引名 背景 在初期设计es索引文档的时候考虑不是很周全&#xff0c;会多出很多无效字段。如果不删除或禁用对后续数据增量以及文档维护会有不良影响。 技术实现 使用 _reindex 1.执行Reindex # 复制旧索引数据到新索引 POST _reindex {"source&qu…...

    windows系统常用快捷键(CMD常用命令,DOS常用命令)

    Windows系统常用快捷键 Win E: 打开“文件资源管理器”&#xff08;我的电脑&#xff09;。Win S: 打开“搜索”功能&#xff0c;可以搜索文件、应用、设置等。Win I: 打开“设置”菜单&#xff0c;用于调整系统设置。Win X: 打开“快速链接”菜单&#xff0c;包含电源选项…...

    使用 ossutil 上传文件到阿里云 OSS

    在处理文件存储和传输时&#xff0c;阿里云的对象存储服务&#xff08;OSS&#xff09;是一个非常方便的选择。特别是在需要批量上传文件或通过命令行工具进行文件管理时&#xff0c;ossutil提供了强大的功能。本文将详细说明如何使用 ossutil 上传文件到阿里云 OSS&#xff0c…...

    专家访谈:从文本到视频,GEO多模态优化的实战法则

    提问者&#xff1a;什么是生成引擎优化&#xff08;GEO&#xff09;&#xff1f;它与传统SEO的核心差异是什么&#xff1f; 源易GEO专家&#xff1a;生成引擎优化&#xff08;GEO&#xff09;是一种新兴策略&#xff0c;旨在提升内容在生成式AI引擎&#xff08;如DeepSeek、…...

    7.计算机网络相关术语

    7. 计算机网络相关术语 ACK (Acknowledgement) 确认 ADSL (Asymmetric Digital Subscriber Line) 非对称数字用户线 AP (Access Point) 接入点 AP (Application) 应用程序 API (Application Programming Interface) 应用编程接口 APNIC (Asia Pacific Network Informatio…...

    openEuler 22.03 安装 Redis 6.2.9,支持离线安装

    目录 一、环境检查1.1 必要环境检查1.2 在线安装&#xff08;有网络&#xff09;1.3 离线安装&#xff08;无网络&#xff09; 二、下载Redis2.1 在线下载2.2 离线下载 三、安装Redis四、配置Redis服务五、开机自启服务六、开放防火墙端口七、常用命令 一、环境检查 1.1 必要环…...

    Java架构师深度技术面试:从核心基础到分布式架构全解析

    一场关于互联网大厂Java求职者的深度技术面试 在当今竞争激烈的互联网行业中&#xff0c;作为一名Java程序员&#xff0c;如何在众多候选人中脱颖而出显得尤为重要。本文通过一个完整的面试故事场景&#xff0c;以严肃的面试官和经验丰富的Java架构师马架构之间的问答形式&…...

    你的项目有‘哇‘点吗?

    你的项目有哇点吗&#xff1f; 刷了一下午招聘软件&#xff0c;发现没&#xff1f;大厂JD里总爱写有创新力者优先——可你们的简历&#xff0c;创新力还不如食堂菜单&#xff01; 程序员写项目最大的误区&#xff1a;把创新当彩蛋藏最后&#xff01;什么参与需求评审负责模块…...

    RPG3.角色输入

    流程&#xff1a; 需要创建原生的标签。 需要创建输入配置数据资产&#xff0c;通过这个资产&#xff0c;将标签映射到角色的唯一动作&#xff0c;通过输入的文本来识别应该做哪一个动作。需要创建自定义的输入组件。 需要绑定输入&#xff0c;创建不同的输入回调。 需要在…...

    【python】-基础语法3

    &#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …...

    毕业论文 | 传统特征点提取算法与匹配算法对比分析

    传统特征点提取算法与匹配算法对比分析 一、特征点提取算法对比二、特征匹配算法对比三、核心算法原理与公式1. **Harris角点检测**2. **SIFT描述子生成**3. **ORB描述子**四、完整Matlab代码示例1. **Harris角点检测与匹配**2. **SIFT特征匹配(需VLFeat库)**3. **ORB特征匹配…...

    TM1668芯片学习心得三

    一、键扫数据储存地址如下所示&#xff0c;先发读键命令后&#xff0c;开始读取按键数据BYTE1-BYTE5字节&#xff0c;读数据从低位开始输出&#xff0c;其中B6和B7位为无效位&#xff0c;此时芯片输出为0。芯片K和KS引脚对应的按键按下时&#xff0c;相对应的字节内的 BIT位为1…...

    精益数据分析(34/126):深挖电商运营关键要点与指标

    精益数据分析&#xff08;34/126&#xff09;&#xff1a;深挖电商运营关键要点与指标 在创业和数据分析的学习之旅中&#xff0c;我们都在不断探寻如何让业务更上一层楼。今天&#xff0c;我依旧带着和大家共同进步的想法&#xff0c;深入解读《精益数据分析》中电商运营的关…...

    Dify 获取天气数据并以echarts图表显示

    Dify 获取天气数据并以echarts图表显示 1. 创建一个 Chatflow2. 创建一个 HTTP 请求节点3. 创建一个代码执行节点4. 创建一个直接回复节点5. 发布并预览 1. 创建一个 Chatflow 2. 创建一个 HTTP 请求节点 请求地址&#xff1a;https://weather.cma.cn/api/climate?stationid5…...

    vtk 读取ply或者stl点云进行ICP配准(不可直接使用vtkPolyData)

    在vtk中&#xff0c;读取ply或stl文件使用ICP进行点云配准时&#xff0c;需要注意不要直接使用vtkPolyData进行配准&#xff0c;这种方式会报错。 vtkPLYReader读取的文件可能仅包含点数据&#xff0c;而没有显式的顶点定义。例如&#xff0c;PLY文件可能只列出点的坐标&#x…...

    ArrayList的特点及应用场景

    ArrayList的特点及应用场景 一、ArrayList核心特点 基于动态数组实现 底层使用Object[]数组存储元素 默认初始容量为10 扩容机制&#xff1a;每次扩容为原来的1.5倍&#xff08;int newCapacity oldCapacity (oldCapacity >> 1)&#xff09; 快速随机访问 实现了R…...

    【QT】编写第一个 QT 程序 对象树 Qt 编程事项 内存泄露问题

    目录 1. 编写第一个 QT 程序 1.1 使用 标签 实现 1.2 纯代码形式实现 1.3 使用 按钮 实现 1.3.1 图形化界面实现 1.3.2 纯代码形式实现 1.4 使用 编辑框 实现 1.4.1 图形化界面实现 1.4.2 纯代码形式实现 1.4.3 内存泄露 2. 认识对象模型&#xff08;对象树&…...

    92.一个简单的输入与显示示例 Maui例子 C#例子

    一、关于项目命名的注意事项 在开发.NET MAUI项目时&#xff0c;项目命名是一个不可忽视的细节。如果你习惯了在C#控制台或WPF项目中使用中文项目名称&#xff0c;那么在.NET MAUI中&#xff0c;你可能会遇到一些问题。我之前就因为使用中文项目名称而导致项目无法直接运行&am…...

    SpringAI实现AI应用-搭建知识库

    SpringAI实战链接 1.SpringAl实现AI应用-快速搭建-CSDN博客 2.SpringAI实现AI应用-搭建知识库-CSDN博客 概述 想要使用SpringAI搭建知识库&#xff0c;就要使用SpringAI中的TikaDocumentReader&#xff0c;它属于ETL&#xff08;提取、转换、加载&#xff09;框架中的提取&…...

    大连理工大学选修课——机器学习笔记(4):NBM的原理及应用

    NBM的原理及应用 贝叶斯决策及相关 贝叶斯决策 对于给定数据集 X [ X 1 , X 2 , ⋯ , X d ] T X[X_1,X_2,\cdots,X_d]^T X[X1​,X2​,⋯,Xd​]TK个类 C i , i 1 , ⋯ , K C_i,i1,\cdots,K Ci​,i1,⋯,K, 满足 P ( C i ) > 0 a n d ∑ P ( C i ) 1 P(C_i)>0\ and\ …...

    SQL Server 数据库重命名

    通过将 SQL Server 数据库置于单用户模式&#xff0c;对其重命名 使用下列步骤在 SSMS 中使用 T-SQL 重命名 SQL Server 数据库。 1.为实例连接到 master 数据库。 2.打开一个查询窗口。 3.将以下示例复制并粘贴到查询窗口中&#xff0c;然后选择“执行”。 此示例将 MyTes…...

    5W1H分析法——AI与思维模型【86】

    一、定义 5W1H分析法思维模型是一种通过对问题或事件从原因&#xff08;Why&#xff09;、对象&#xff08;What&#xff09;、地点&#xff08;Where&#xff09;、时间&#xff08;When&#xff09;、人员&#xff08;Who&#xff09;和方法&#xff08;How&#xff09;六个…...

    【closerAI ComfyUI】开源社区炸锅!comfyUI原生支持Step1X-Edit 图像编辑!离简单免费高效又进一步

    添加图片注释,不超过 140 字(可选) 更多AI前沿科技资讯,请关注我们: closerAI-一个深入探索前沿人工智能与AIGC领域的资讯平台 【closerAI ComfyUI】开源社区炸锅!comfyUI原生支持Step1X-Edit 图像编辑!离简单免费高效又进一步! 大家好,我是Jimmy。前面有介绍了阶跃…...

    spring中关键字Assert和jdk的assert关键字

    你提出的问题非常关键&#xff0c;涉及到 Java 中两种不同的 assert 用法&#xff1a; ✅ 一、你提到的两种 assert 类型 示例 来源 特点 JDK 自带的 assert 关键字 assert str ! null; Java 原生语言特性&#xff08;JDK 1.4&#xff09; 可开关控制&#…...

    git分支分叉强制更改为线性

    git分支分叉更改为线性 远端分支情况 本地分支情况 在执行 git pull origin main 时遇到了一个提示&#xff0c;说明本地分支和远程分支发生了分歧&#xff08;divergent branches&#xff09;。 这通常是因为远程分支上有新的提交&#xff0c;而本地分支也有未推送的提交&a…...

    从实列中学习linux shell6: 写一个 shell 脚本 过滤 恶意ip 攻击

    下面是检测和过滤恶意IP攻击的Shell脚本&#xff0c;包含自动分析日志、封锁IP、白名单管理等功能&#xff1a; 第一步&#xff1a;过滤脚本 #!/bin/bash# 配置区域&#xff08;根据需求修改&#xff09; LOG_FILES(/var/log/auth.log /var/log/nginx/access.log) # 监控的日…...

    代码随想录打卡|Day31动态规划(最后一块石头的重量2、目标和、一和零)

    动态规划Part 04 最后一块石头的重量 II 力扣题目链接 代码随想录链接 视频讲解链接 题目描述&#xff1a; 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉…...

    一区思路!挑战5天一篇NHANES预测模型 DAY1-5

    挑战5天一篇预测模型NHANES Day1! 近期美国关闭seer数据库的信息在互联网上广泛传播&#xff0c;大家都在担心数据库挖掘是否还能做。这个问题其实是有答案的&#xff0c;数据库挖掘肯定能做&#xff0c;做没被关的数据库即可&#xff0c;同时留意一些国产数据库&#xff5e;…...

    Stack--Queue 栈和队列

    一、Stack--栈 1.1 什么是栈&#xff1f; 堆栈是一种容器适配器&#xff0c;专门设计用于在 LIFO 上下文&#xff08;后进先出&#xff09;中运行&#xff0c;其中元素仅从容器的一端插入和提取。 第一个模版参数T&#xff1a;元素的类型&#xff1b;第二个模版参数Container…...

    Redis热key大key详解

    不要阻挡我走向成功&#xff0c;勇者配享所有&#xff0c;感想敢干 hotkey热key 大量请求可能会使redis节点流量不均匀&#xff0c;进而导致宕机&#xff0c;继而打到数据库崩溃&#xff1b;因此需要对热key优化 引发问题&#xff1a; 分片服务瘫痪可能打到数据库&#xff0…...

    软件架构选型之“如何选”

    本文提出的多维度评估框架旨在建立客观、全面的架构选型方法论&#xff0c;帮助团队做出更科学的架构决策&#xff0c;通过业务需求、技术约束、组织能力和演进策略四个核心维度建立量化评估模型。该框架旨在解决移动应用架构决策中的主观性和片面性问题&#xff0c;提供系统化…...

    C语言写文件模式错误

    “w” 和“wb”区别 出错实例 图像.raw文件输出时&#xff0c;采用“w”模式打开写文件&#xff0c;会将值为0A (即\n的ASCII值)&#xff0c;前自动添加0D(即\r的ASCII值)&#xff0c;如下图所示...

    2025最新福昕PDF编辑器,PDF万能处理工具

    软件介绍 Foxit PDF Editor Pro 2025 中文特别版&#xff08;以前称为 Foxit PhantomPDF Business&#xff09;是一款专为满足各种办公需求而设计的业务就绪的PDF工具包。 软件特点 1. 强大的PDF编辑能力 创建新文档&#xff1a;用户可以从无到有地构建PDF文档&#xff0c;添…...

    Android 动态权限申请

    ContextCompat.checkSelfPermission 检查应用是否具有某个危险权限。如果应用具有此权限&#xff0c;方法将返回PackageManager.PERMISSION_GRANTED&#xff0c;并且应用可以继续操作。如果应用不具有此权限&#xff0c;方法将返回PackageManager.PERMISSION_DENIED&#xff0c…...

    【模型量化】量化基础

    目录 一、认识量化 二、量化基础原理 2.1 对称量化和非对称量化 2.1.1 对称量化 2.1.2 非对称量化 2.1.3 量化后的矩阵乘 2.2 神经网络量化 2.2.1 动态量化 2.2.2 静态量化 2.3 量化感知训练 一、认识量化 量化的主要目的是节约显存、提高计算效率以及加快通信 dee…...

    智能 + 安全:婴幼儿托育管理实训基地标准化建设方案

    婴幼儿托育服务与管理实训基地智能安全的开发&#xff0c;需以“岗位能力-职业标准-行业需求”为核心逻辑&#xff0c;构建“需求分析-课程设计-教学实施-效果评估”全闭环体系。结合托育行业难点、技术赋能手段及职业能力要求&#xff0c;呈现课程开发全流程&#xff0c;重点突…...

    AI重构家居营销新范式:DeepSeek如何破解行业流量与转化困局?

    1. 流量下滑、成本攀升、内容同质化&#xff1a;家居行业亟需一场“效率革命” 中国家居行业正经历一场深刻的转型阵痛。线下门店客流量持续萎缩&#xff0c;线上获客成本攀升至临界点&#xff0c;传统营销模式陷入“高投入、低转化”的泥潭&#xff1b;智能家居产品快速迭代&…...