【目标检测 DETR】通俗理解 End-to-End Object Detection with Transformers,值得一品。

news2025/7/15 10:11:26

文章目录

  • DETR
    • 1. 亮点工作
      • 1.1 E to E
      • 1.2 self-attention
      • 1.3 引入位置嵌入向量
      • 1.4 消除了候选框生成阶段
    • 2. Set Prediction
      • 2.1 N个对象
      • 2.2 Hungarian algorithm
    • 3. 实例剖析
    • 4. 代码
      • 4.1 配置文件
        • 4.1.1 数据集的类别数
        • 4.1.2 训练集和验证集的路径
        • 4.1.3 图片的大小
        • 4.1.4 训练时的批量大小、学习率等参数
      • 4.2 模型部分
        • 4.2.1 backbone
        • 4.2.2 neck
        • 4.2.3 head
      • 4.3 train/engine.py
        • 4.3.1 train.py
        • 4.3.2 engine.py
          • train_one_epoch()
          • evaluate()

DETR

链接:https://github.com/facebookresearch/detr

论文地址:https://arxiv.org/pdf/2005.12872.pdf,

CNN生成的特征图将被送入Transformer,然后经过一系列的自注意力层和前馈神经网络层,最终得到一组对象的表示。每个对象的表示由一个类别分数和四个坐标值组成。这些类别分数和坐标值是预测得出的,它们表示对象在图像中的位置和类别信息。

解码器将这些对象解码为一组检测结果。在解码过程中,匹配函数将预测类别和预测坐标与这些对象进行匹配,从而找到与预测类别和预测坐标最匹配的对象,并将其作为最终的检测结果输出。

在这里插入图片描述
在这里插入图片描述

1. 亮点工作

1.1 E to E

DETR是第一个使用Transformer实现端到端目标检测的方法。这种方法不需要预定义的候选框或先验知识,并且可以同时执行分类和定位任务。

1.2 self-attention

DETR使用自注意力机制替代传统的卷积神经网络结构。自注意力机制能够有效地捕获全局上下文信息,从而在目标检测任务中获得更好的性能。

1.3 引入位置嵌入向量

DETR引入了一组位置嵌入向量来帮助解码器在生成目标检测结果时理解对象之间的相对位置关系

1.4 消除了候选框生成阶段

传统目标检测方法需要先生成一组候选框,然后对这些候选框进行分类和定位。DETR通过消除这个阶段,可以更好地利用计算资源和提高检测效率。

2. Set Prediction

实现了对 一组对象 的分类。

2.1 N个对象

在解码器中,每个位置都生成了一组对象,这些对象由类别分数和坐标表示。N就是指每个位置生成的对象的数量。一般情况下,N的值越大,DETR的检测性能就越好,但同时会带来更高的计算成本和内存占用。因此,需要在性能和效率之间进行权衡,并选择合适的N值。

在实际应用中,根据具体的任务和资源限制,N的值可能需要进行调整。

2.2 Hungarian algorithm

一种用于解决二分图匹配问题的经典算法,它的时间复杂度为O(n2),其中n为顶点数。

在DETR中,每个预测结果都需要与所有的实际目标进行匹配,因此可以将预测结果看作左边的顶点,实际目标看作右边的顶点,然后通过匈牙利算法计算出每个左边的顶点最匹配的右边的顶点是谁。这样可以快速地得到每个预测结果对应的实际目标,从而得到最终的检测结果。

解码器生成的一组对象 对比于 预测类别和预测坐标

在解码过程中,DETR模型会将编码器得到的一组对象表示解码为一组检测结果,其中每个对象的表示由一个类别分数和四个坐标值组成。这些类别分数和坐标值就是预测的类别和坐标。

3. 实例剖析

假设我们有一个图像,其中包含三个对象:一个狗、一个猫和一个椅子。

狗:坐标=(5, 15, 55, 65)
猫:坐标=(35, 45, 75, 85)
椅子:坐标=(95, 95, 145, 145)

设置N=3,DETR得到一组检测结果,如下所示:

对象1:类别分数=0.9,坐标=(10, 20, 50, 60)
对象2:类别分数=0.8,坐标=(30, 40, 70, 80)
对象3:类别分数=0.7,坐标=(100, 100, 150, 150)

首先,计算IoU,(145-100)×(145-100)=2025,它们之间的并集面积为(50×50)+(50×50)-2025 = 2975。
IoU得分:2025/2975 = 0.6
总得分:0.7*0.6 = 0.42 < 0.5

输出1:狗,类别分数=0.9,坐标=(10, 20, 50, 60)
输出2:猫,类别分数=0.8,坐标=(30, 40, 70, 80)
输出3:椅子,类别分数=0.0,坐标=(0, 0, 0, 0)

由于第三个输出与任何一个真实对象都没有匹配,因此其类别分数和坐标值都被设为0。

4. 代码

4.1 配置文件

d2/configs/detr_256_6_6_torchvision.yaml
d2/detr/config.py

4.1.1 数据集的类别数

需要根据自己的数据集修改模型的分类器的输出维度,使其等于数据集中的类别数。

cfg.MODEL.DETR.NUM_CLASSES = 80

4.1.2 训练集和验证集的路径

需要在训练和验证代码中设置自己数据集的路径。

DATASETS:
  TRAIN: ("coco_2017_train",)
  TEST: ("coco_2017_val",)

4.1.3 图片的大小

需要根据自己的数据集图片的大小修改模型的输入大小。

INPUT:
  MIN_SIZE_TRAIN: (480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800)
  CROP:
    ENABLED: True
    TYPE: "absolute_range"
    SIZE: (384, 600)
  FORMAT: "RGB"

4.1.4 训练时的批量大小、学习率等参数

需要根据自己的数据集和硬件环境进行调整。

SOLVER:
  IMS_PER_BATCH: 64
  BASE_LR: 0.0001

4.2 模型部分

4.2.1 backbone

DETR的backbone是Dilated ResNet,它是一种轻量级的卷积神经网络。

4.2.2 neck

DETR使用了Transformer的Encoder作为其neck部分的主要组成部分。

具体来说,DETR包含一个Encoder和一个Decoder,其中Encoder使用Transformer对输入的图像特征进行编码,将其转换为一组上下文向量,而Decoder使用Transformer对这些上下文向量和预测的对象查询向量进行解码,生成最终的目标预测结果。

4.2.3 head

主要包含Transformer Decoder、Query Embedding。

DETR中的全局嵌入(Query Embedding)是在Transformer Decoder的输出之上计算的。具体地,Transformer Decoder的输出通过多头自注意力(Multi-Head Self-Attention)进行加权求和,得到一个新的表示,即为每个对象提取了不同的上下文信息。

接着,这个表示会被传递到Feed-Forward Network(FFN)中进行进一步的处理,以产生更丰富的特征表示。

最后,Query Embedding是在FFN的输出上计算得到的,它是一个用于匹配对象嵌入向量。因此,可以说,在DETR中,FFN和Query Embedding是在Transformer Decoder之上进行的。

假设我们有一个包含4个对象的图像,并使用DETR模型对其进行目标检测。在DETR模型的输入端,我们有图像张量 X X X,其尺寸为 C × H × W C\times H\times W C×H×W,其中 C C C 是通道数, H H H W W W 是高度和宽度。

首先,我们使用DETR的backbone网络(Diamante)将图像张量 X X X 转换为特征张量 F backbone F_{\text{backbone}} Fbackbone。这个特征张量的大小是 C backbone × H backbone × W backbone C_{\text{backbone}}\times H_{\text{backbone}}\times W_{\text{backbone}} Cbackbone×Hbackbone×Wbackbone

接下来,我们将特征张量 F backbone F_{\text{backbone}} Fbackbone 送入Transformer Decoder网络,得到Transformer Decoder的输出 F decoder F_{\text{decoder}} Fdecoder。这个输出张量的大小也是 C decoder × H decoder × W decoder C_{\text{decoder}}\times H_{\text{decoder}}\times W_{\text{decoder}} Cdecoder×Hdecoder×Wdecoder

然后,我们对 F decoder F_{\text{decoder}} Fdecoder 进行FFN,得到FFN的输出张量 F ffn F_{\text{ffn}} Fffn。这个张量的大小和 F decoder F_{\text{decoder}} Fdecoder 相同。

最后,我们使用Query Embedding将 F ffn F_{\text{ffn}} Fffn 映射到特定的目标类别,得到每个对象的预测框坐标和类别。

4.3 train/engine.py

4.3.1 train.py

DETR的main.py文件是训练和测试DETR模型的主要脚本。在该脚本中,首先通过命令行参数解析器解析各种配置和超参数,然后通过build_model()函数构建DETR模型和优化器,通过build_lr_scheduler()函数构建学习率调度器,最后通过DefaultTrainer()类进行训练或测试。

4.3.2 engine.py

定义了一些训练和测试的辅助函数,包括计算loss、前向传播、后向传播、评估等。如构建匹配矩阵和计算损失。

train_one_epoch()

模型和损失切换到训练状态。

记录日志信息,主要是损失。

最后生成metric_logger的所有信息。

evaluate()

@torch.no_grad()装饰器,在评估过程中不进行梯度计算和参数更新。

设置模型和损失设置为评估状态。

使用for循环遍历数据集中的每个批次,并在MetricLogger对象上记录指标。

将输入数据和目标数据移到GPU上,然后使用模型进行前向传递。

如果数据集包含分割任务,则将分割结果与目标进行比较,以获得更准确的结果。

对所有结果进行聚合,以获得数据集上的总体评估指标。输出评估指标,包括平均指标和COCO指标。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea 2022.2.4 导入依赖警告的问题

在我导入依赖的时候&#xff0c;pom文件提示警告如下信息 Provides transitive vulnerable dependency commons-collections:commons-collections:3.2.2 Cx78f40514-81ff 7.5 Uncontrolled Recursion vulnerability pending CVSS allocation Results powered by Checkmarx(c) …

第十二章:网络编程

第十二章&#xff1a;网络编程 12.1&#xff1a;网络编程概述 ​ Java是Internet上的语言&#xff0c;它从语言级上提供了对网络应用程序的支持&#xff0c;程序员能够很容易开发常见的网络应用程序。 ​ Java提供的网络类库&#xff0c;可以实现无痛的网络连接&#xff0c;…

【项目精选】基于struts+hibernate的采购管理系统

点击下载 javaEE采购管理系统 本系统是一个独立的系统&#xff0c;用来解决企业采购信息的管理问题。采用JSP技术构建了一个有效而且实用的企业采购信息管理平台&#xff0c;目的是为高效地完成对企业采购信息的管理。经过 对课题的深入分析&#xff0c;采购系统需实现以下功能…

秒懂算法 | DP概述和常见DP面试题

动态(DP)是一种算法技术,它将大问题分解为更简单的子问题,对整体问题的最优解决方案取决于子问题的最优解决方案。本篇内容介绍了DP的概念和基本操作;DP的设计、方程推导、记忆化编码、递推编码、滚动数组以及常见的DP面试题。 01、DP概述 1. DP问题的特征 下面以斐波那…

在找docker命令和部署?看这一篇文章就够了。

一、docker 常用命令 docker ps -a #查看所有容器 docker images #查看所有images docker search rabbitmq #搜索rabbitmq docker pull rabbitmq #拉去rabbitmq docker run -id --namemy_rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq # 创建一个容器并启动 docker exec -it…

数据结构算法学习记录——线性表之单链表(上)-初始单链表及其头插函数(顺序表缺陷、单链表优点、链表打印)

单链表的概念单链表是一种链式存取的数据结构&#xff0c;链表中的数据是以结点来表示的。每个结点的构成&#xff1a;元素(数据元素的映象) 指针(指示后继元素存储位置)。元素就是存储数据的存储单元&#xff0c;指针就是连接每个结点的地址数据。以“结点的序列”表示的线性…

Ubuntu安装Docker

一、安装条件1.操作系统要求需要以下 Ubuntu 版本之一的 64 位版本&#xff1a;Ubuntu Kinetic 22.10Ubuntu Jammy 22.04 (LTS)Ubuntu Focal 20.04 (LTS)Ubuntu Bionic 18.04 (LTS)二、安装1.要是之前安装过&#xff0c;可以进行卸载然后再安装&#xff0c;旧版本的 Docker 的名…

_Linux (传输层一版本)

文章目录0. 传输层作用1. 再谈端口号1-1 端口号范围划分1-2 认识知名端口号(Well-Know Port Number)1-3 两个问题1-4 netstat1-5 pidof2. UDP协议2-1 UDP协议端格式1. UDP协议如何分离&#xff08;封装&#xff09;&#xff1f;2. UDP协议如何交付&#xff08;应用层- - 客户&a…

什么蓝牙耳机佩戴舒适?2023长时间佩戴最舒适的蓝牙耳机

现如今&#xff0c;很多蓝牙耳机的产品都在不断地更新&#xff0c;市面上的耳机也是越来越普及&#xff0c;可以说是成为我们日常生活中不可或缺的一类电子设备&#xff0c;下面介绍一些佩戴舒适性好的蓝牙耳机。 一、南卡小音舱蓝牙耳机 音质推荐指数&#xff1a;★★★★★…

[ 网络 ] 应用层协议——HTTPS协议原理

目录 1.HTTPS是什么 2.加密技术 2.1什么是加密 2.2为什么要加密 2.3加密处理防止被窃听 3.常见的加密方式 对称加密 非对称加密 4.数据摘要&&数据指纹 5.数字签名 6.HTTPS的工作过程探究 方案1——只是用对称加密 方案2——只进行非对称加密 方案3——双方…

JavaEE——简单介绍Thread类以及线程的基本操作

文章目录一、Thread 类中的常见构造方法二、Thread 的一些常见属性三、线程的启动——start()isAlive() 方法的解释四、线程中断五、线程等待-join()了解六、简单解释线程休眠一、Thread 类中的常见构造方法 我们已知&#xff0c;Thread 类是Java中多线程中的一个关键类&#…

MATLAB的快速入门

第一部分&#xff1a;基础知识常用命令&#xff1a;clc %清除命令行窗口 clear %清空工作区数据 cd %显示或改变工作目录 clf %清除图形窗口 help %打开帮助文档 save %保存内存变量到指定文件 hold %保持图形 close %关闭当前图窗 quit %退出变量&#x…

sentry权限控制

sentry权限控制 文章目录sentry权限控制前言1. 安装2. hive内得配置4. hdfs配置5. Hue 授权6. 连接hive配置权限7. 验证前言 Apache Sentry是一个可以对Hadoop集群中的数据及元数据进行细粒度管理的权限管理系统。Sentry目前可以与ApacheHive&#xff0c;HiveMetastore / HCat…

前端基础(十四)_Math对象

Math对象 1.Math对象 对象.方法名 (1)Math.floor() 向下取整 去掉小数部分 等同于parseInt Math.floor(1.222) //1(2)Math.ceil() 向上取整 去掉小数部分 向上进一 Math.ceil(1.222) //2(3)Math.round() 四舍五入 4.5 5 针对小数点后面第一位数字 Math.round(1.272) //1 Ma…

嵌入式安防监控项目——exynos4412主框架搭建

目录 一、模块化编程思维 二、安防监控项目主框架搭建 一、模块化编程思维 其实我们以前学习32使用keil的时候就是再用模块化的思维。每个硬件都单独有一个实现功能的C文件和声明函数&#xff0c;进行宏定义以及引用需要使用头文件的h文件。 比如简单的加减乘除取余操作我们…

Spark Standalone 部署

Spark Standalone 部署解压缩文件修改配置文件启动集群Web UI 界面提交应用提交参数说明配置历史服务配置日志存储路径添加日志配置重启重新执行任务查看历史服务配置高可用&#xff08;HA&#xff09;集群规划停止集群启动 Zookeeper启动集群关闭集群关闭历史服务解压缩文件 …

Go语言使用Playwright自动化测试、录屏、执行js

Go版本的Playwright支持Chromium、Firefox和WebKit的Web自动化测试&#xff0c;兼容Windows、Linux和MacOS&#xff0c;默认支持headless无头模式&#xff0c;安装方便、绿色高效、兼容性强、运行速度快。 支持的主要功能有&#xff1a; 跨多个页面、域名和iframe的场景&#x…

什么led灯性价比高?家用led灯选哪种最好

人造灯具经过多年的发展&#xff0c;现在最为成熟的工艺就是led灯了&#xff0c;不仅有荧光灯高效节能、省电高亮的特点&#xff0c;而且光线可控性非常高&#xff0c;对于调光、提高光线柔和度等方面非常方便&#xff0c;保护眼睛更有效。 那么什么led灯性价比高呢&#xff0c…

JavaScript 高级5 :ES6

JavaScript 高级5 &#xff1a;ES6 Date: January 19, 2023 Sum&#xff1a;ES6新增语法、ES6内置对象扩展&#xff08;Array、String扩展方法、set数据结构&#xff09; 目标 能够说出使用let关键字声明变量的特点 能够使用解构赋值从数组中提取值 能够说出箭头函数拥有的…

基于SpringBoot的学生会管理系统 源码

StudentUnionManagementSystem 基于SpringBoot的学生会管理系统 源码 链接 目录StudentUnionManagementSystem介绍软件架构使用说明1.页面登录2.首页3.成员信息管理4.角色信息管理5.权限管理6.活动管理7.文件管理8.活动展示介绍 学生会管理系统 SpringBoot Mybatis-plus shir…