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

端到端目标检测 |从DETR 到 GroundingDINO

在这里插入图片描述

文章目录

  • 一,DETR
    • 1. 简介
    • 2. 亮点
    • 3. 细节
    • 4. 总结一下
  • 二,GroundingDINO
    • Grounding DINO的整体流程
    • Grounding DINO的目标函数

一,DETR

之前的目标检测框架,需要很多的人工干预,很多的先验知识,而且可能还需要很复杂的普通的库不支持的一些算子。

DETR 既不需要proposal, 也不需要anchor,用transformer这种能全局建模的能力,从而把目标检测看成一个集合预测的问题。

因为有了这种全局建模的能力,DETR不会输出那么多冗余的框,而不需要nms,做后处理,让训练和部署都简单了不少。

1. 简介

  • 把目标检测 看成 集合预测 的问题。
    • 给定一堆图片,预测这些框的坐标和类别
    • 这个框就是一个集合
    • 任务就是给定一个图片,我要去把这个集合预测出来
  • 把目标检测 做成了 端到端 的框架
    • 把之前目标检测特别依赖人的部分 (设定anchor, nms) 去掉了,就没有那么多的超惨需要去调,整个网络就变得非常简单了

2. 亮点

  1. DETR提出了一个目标函数
  2. 使用了transformer encoder-decoder架构
  3. 还有一个learned object queries
  • 而且是并行计算的,一起出框,而不是串行的

  • 新的模型很简答,不需要特殊的库,支持cnn和transformer库就可以做

  • 在coco表现四十多,比当时最多的低了十个点。

  • DETR也可以去做前景分割,效果很好。

  • 建议去读一下代码

3. 细节

  • 之前的目标检测器都是间接的去解决问题,用了anchor, proposal, 预测中心点,nms等等。
  • DETR 采用了端到端的方式,直接解决问题,简化了目标检测的流程。
  1. 用卷积神经网络抽取一个图像特征,拉直,送给一个transfomer
    • transfomer encoder学习一个全局的信息,为接下来的 decoder(出预测框)来做铺垫
    • 使用transformer encoder, 就意味着每一个特征,都会与全局每一个特征有交互了,这样她大概就知道哪块是哪个物体,哪块又是另外一个物体,对同一个物体来说,只需要出一个框,而不是好多个框。 这种全局的特征,特别有利于去除这种冗余的框。
  2. 用transfomer decoder 做框的输出。当有了图像的特征之后,还有一个object quirer, 它限定了你要出多少个框,通过queire和特征去做交互,在decoder里做自注意力操作,得到了最后输出的框。
  3. 作者设定出100个框,100个框如何与ground truth做匹配,计算损失呢?他把这个问题看成一个集合预测的问题,用 二分图匹配的方法计算这个loss。
    • 比如,ground truth有两个框,通过这输出的100个框计算与2个框的matching loss,而决定出,在这一百个预测中,哪两个框是独一无二的对应到这个红色和黄色的ground truth框的。一旦匹配好之后,就计算bbox, cls的loss, 对于没有匹配到的框就会被标记为背景类。
      在这里插入图片描述
      在这里插入图片描述

4. 总结一下

  • 四步:
  1. 用神经网络抽特征
  2. 用transformer encoder学全局特征, 帮助后面做检测
  3. 用transformer decoder 生成很多的预测框
  4. 把预测框与ground truth的框做匹配,在匹配上的这些框里面去算目标检测的损失
  • 推理的时候:
    前三步都是一致的,直接用阈值,卡一下box preditions的置信度 > 0.7是前景物体, <0.7 就被当作背景物体了。

  • 在coco与faster rcnn AP结果差不多,对大物体表现非常好,对小物体小物体效果一般。半年之后有一篇论文解决了这个问题,也解决了DETR训练太慢的问题。

损失函数:

  1. 匈牙利损失:基于匈牙利算法进行预测框和真实框之间的匹配,并计算匹配后的分类损失和框回归损失。
  2. 分类损失:采用交叉熵损失,用于预测每个框的类别。
  3. 框回归损失:采用GIoU损失和L1损失的组合,用于预测框的坐标。GIoU损失是IoU损失的一种改进,考虑了框的大小。
  4. DICE/F1损失:用于分割分支,用于预测每个框的分割掩码。
  5. 辅助解码损失:在解码器每层之后添加预测头,并计算匈牙利损失,有助于模型输出正确数量的每个类别的对象。
    通过匈牙利匹配强制预测唯一对应真实框,同时利用分类、框回归和分割损失来训练模型,实现了端到端的检测和分割。

二,GroundingDINO

GroundingDINO 论文总结

GroundingDINO 论文的总结,请点击上方的 跳转链接
  • 其实和DETR的结构一模一样,各位reader从以下几个方面可以自己对比一下。
  1. encoder-decoder
  2. object query
  3. 二分图匹配

Grounding 与 DETR 的不同:就是引入了文本信息,把文本图像相互融合了三次。做到文本指导图片的这么一个能力。
在这里插入图片描述

Language-guide Query Selection 给定图像特征和文本特征,Language-guide Query Selection模块首先计算两者的相关性得分,然后根据得分选择最相关的图像特征作为queries。这些queries包含了图像和文本的信息,随后会被送入解码器进行进一步处理。

Grounding DINO的整体流程

1. 特征提取: 首先,通过图像backbone和文本backbone分别提取输入图像和文本的特征。
2. 特征增强: 接着,将提取的图像特征和文本特征输入特征增强模块,通过自注意力、图像到文本的交叉注意力和文本到图像的交叉注意力实现跨模态特征融合。
3. 查询选择: 然后,利用语言指导的查询选择模块,从增强后的图像特征中选出与输入文本更相关的特征作为解码器的查询。
4. 解码器: 接着,将选择的查询输入跨模态解码器,解码器包含自注意力层、图像交叉注意力层、文本交叉注意力层和FFN层,用于进一步融合图像和文本特征,并更新查询表示。
5. 预测输出: 最后,利用解码器最后一层的输出查询进行目标框预测和对应短语提取。
6. 损失函数: 在整个流程中,使用对比损失、框回归损失和GIOU损失进行多任务学习。
总体来说,Grounding DINO通过在特征增强、查询选择和解码器等多个阶段进行跨模态特征融合,实现了对任意文本指定的目标检测。

Grounding DINO的目标函数

  1. 对比损失(Contrastive Loss):用于预测对象和语言标记之间的分类。使用点积计算每个查询与文本特征之间的预测logits,然后计算每个logit的Focal loss。
  2. 框回归损失(Box L1 Loss):用于预测对象的边界框坐标。用于计算预测框和真实框坐标之间的绝对误差。
  3. GIOU损失(GIOU Loss):用于预测对象边界框的准确度。用于衡量预测框和真实框的形状和位置重叠情况,考虑到重叠区域和整体框的面积。

这些损失首先用于进行预测与真值之间的匈牙利匹配,然后计算最终损失。 此外,在模型的每个解码器层和解码器输出之后,还添加了辅助损失。对比损失、框回归损失和GIOU损失在匹配和最终损失计算中的权重分别为2.0、5.0和2.0。

相关文章:

  • Linux 用户与用户组
  • 《Docker实际应用场景:开发、测试、CI/CD、微服务和容器编排》
  • 基于FIDO2和USBKEY硬件的SSH认证
  • 58. UE5 RPG AI行为树的装饰器
  • 【ai】livekit:Agents 2 :会话式AI 快速开始
  • 扒出秦L三个槽点,我不考虑买它了
  • Khoj:开源个人AI助手能连接你的在线和本地文档充当你的第二大脑
  • 如何使用Python和大模型进行数据分析和文本生成
  • go语言学习之旅之Go结构体
  • C#数值类型介绍及示例
  • 测试基础07:测试工作流程规范、进度同步与把控
  • PowerPivot-跨表取值
  • Python开发 —— 文件读写操作open与with open
  • C从零开始实现贪吃蛇大作战
  • aop整理
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • js中的正则表达式入门
  • Linux链接文件
  • nodejs调试方法
  • orm2 中文文档 3.1 模型属性
  • PAT A1092
  • React中的“虫洞”——Context
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • 观察者模式实现非直接耦合
  • 简单数学运算程序(不定期更新)
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 两列自适应布局方案整理
  • 前端面试之闭包
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 收藏好这篇,别再只说“数据劫持”了
  • 微信小程序设置上一页数据
  • 小程序测试方案初探
  • 阿里云重庆大学大数据训练营落地分享
  • ​DB-Engines 12月数据库排名: PostgreSQL有望获得「2020年度数据库」荣誉?
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (二)PySpark3:SparkSQL编程
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (算法)N皇后问题
  • (转)ABI是什么
  • (转)平衡树
  • ****Linux下Mysql的安装和配置
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .Net各种迷惑命名解释
  • .NET简谈设计模式之(单件模式)
  • @selector(..)警告提示
  • @Valid和@NotNull字段校验使用
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [.NET]桃源网络硬盘 v7.4