DETR目标检测算法学习记录

news2024/11/15 5:13:44

引言

无论是One Stage中的YOLO还是Two-Stage中的Faster-RCNN,其虽然都在目标检测领域有着一席之地,但无一例外都是基于Anchor的模型算法,这就导致其在输出结果时不可避免的进行一些如非极大值抑制等操作来进一步选择最优解,这会带来额外的工作量。而随着ViT的出现,伴随着无数研究者前仆后继夜以继日的研究,Transformer敲开了CV领域的大门,作为NLP领域的中流砥柱,依旧能够在CV领域取得如此瞩目的成果属实令人惊叹,随后DETR模型横空出世,在目标检测领域掀起一阵狂潮。今天我们就来进行该算法的学习,探究其能够在众多的目标检测算法中脱颖而出的奥秘。

模型结构

主要思想

DETR的基本思想是首先使用CNN得到各个patch作为输入,在套用Transformer做编码与解码操作。

其中编码方式基本与VIT一致,重点在于解码器的变化,DETR做出了先验假设,认为一张图片中可能存在几个乃至几十个目标,因此,其设置解码器直接预测100个坐标框。

这个值可以根据我们的实际任务做出调整。此外与先前Transformer在NLP中的预测不同,解码器中后一个向量需要依赖于前一个向量的输出结果,是一种串行结构,而在这里则为并行结构,一次性直接预测100个框。

执行流程

下图为DETR模型的结构图

首先通过backbone来提取特征,随后将特征信息加上位置编码送入encoder,这里的encoder进行特征构造。
在decoder中会首先初始化100个向量(object queries),这些向量会利用encoder构造的特征来进行重构,(即要学习的便是这100个向量,当这100个向量学好后,每个向量便能够较好的输出一个分类值cls与回归值bounding box)

要想理解Transformer,最重要的便是要理解Attention,其核心即为 K,Q,V。

Attention的本质就是加权,以找女朋友为例,Q代表我想要的女生类型,即一些条件,K与V则是一种键值对的表示,K为属性,如女生的相貌,身材等,而V则是对应属性的相应值,即女生的真实特征,那么一个女生越符合标准的我们预设的条件,就会被赋予更高的权重,特征占比也就越大。

那么按照Tranfomer的思想来解释,在encoder中提供的是 K 与 V ,decoder中的每个Q并行去询问encoder中的K与V,如果确定是自己需要负责的部分,那么便会根据这块的特征进行学习,最后连接一个全连接层,输出4个坐标值与一个分类值。至此也就完成了目标检测过程。

在这里插入图片描述

可以看到,Encoder的作用是进行特征的提取,那么我么是否可以不要这个Encoder而直接使用一个CNN网络来直接连接Decoder呢?其实理论上也是可行的,但为何仍采用这种方式呢,论文中作者给出解释:
作者认为这种注意力的效果很好,通过self-attention获取到这些特征并加以突出,随后来供Decoder进行挑选。
在这里插入图片描述

位置信息初始化Query向量

输出层的结果就是100个object queries的预测结果。这100个向量其实都是想要去学习来做预测的。
那么这100个object queries是如何得到的呢?这里论文中给出的答案是全部初始化为0
同时还要加上位置编码。即初始化的queries为0+位置编码,其相当于用位置编码来做初始化。

为何要使用这种位置编码作为初始化呢?论文中并未给出对应的解释,但按照一位大神的解释:在encoder构造的向量中,其实有用的特征可能就那么几块,其余的都是背景,而在encoder中,这100个向量都是想去学习这些特征的,那么如果是这样的话,基本上这100个向量都会被那几块特征较好的吸引过去,这就造成其多样性变差。而加入了位置编码后,就相当于告诉每一个向量,你不要太离谱,只负责你这一区域的特征学习即可。

注意力机制的作用方法

需要注意的是,在decoder的第一层其实做的是自注意力机制,即每个向量都有自己的Q,K,V,其先进行一下内部分配,最终我们需要的是得到的Q,而K,V值只是一些中间数据,无用也就被丢弃了。

随后便是使用encoder中的K,V来与decoder的Q送入多头注意力机制来重构Q,最终通过连接两个全连接层,分别输出class与bounding box。

即Q首先是随机初始化的(0+位置编码),然后内部进行自注意力机制进行分配,最后与encoder中的K,V作用来完成重构。

按照图中模型可以看到:Encoder共有N层,Decoder有M层,而在模型的训练过程中,使用M层的每层损失,这样做的好处是防止只用最后一层损失而造成一些意外情况。
在这里插入图片描述

需要注意的是,在Transformer的传统模型做文本预测时,设计了一个mask机制,即后面的都是需要被掩藏不可见的。而在这里,其是并行的,也就不需要设置mask机制了。

训练过程的策略

GT只有两个,但预测恒为100个,该如何匹配呢?
这里使用的是匈牙利匹配算法,按照loss最小的方法,剩余的98个全部为背景。该算法在目标追踪领域较为火爆。即在训练时计算损失最小即可。

启示

在论文中,作者提到,注意力机制的引入能够很好的解决物体被遮挡问题。如下图:即使面对很严重的遮挡问题,注意力机制都可以很好的解决。

在这里插入图片描述

DETR模型的环境配置与调试

DETR模型的调试运行是相对简单的,数据集使用的是COCO2017数据集。具体配置可以参考博主这篇博客:

DETR调试记录

需要注意的是该模型在8xV100 GPU上训练 300 epochs的时间大概为6天,可以说是非常的吃配置了,而且模型在训练时所占用的显存较大,具体大家可以自行实验。

当然在我们实验时,DETR的效果与当前的一些主流目标检测算法相比还是稍逊一筹的,但这并不影响我们学习他们,因为这些基于CNN的模型在CV领域经过长期的耕耘,其已经非常成熟了。可以说基本没有什么再去改进的空间了。而Transformer作为后起之秀,在初涉该领域便取得如此效果已实属不易,而且博主也相信,随着Transformer模型在CV领域继续深耕,其一定最终能取得较好的效果。

代码解析

数据处理与dataloader

在DETR模型中,其使用的标注数据集格式为COCO,我们在运行自己的数据集时只需要将其转换为COCO格式即可。

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

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

相关文章

uniCloud基础使用

获取openID云函数use strict; exports.main async (event, context) > {//event为客户端上传的参数console.log(event : , event)// jscode2session 微信小程序登录接口,获取openidconst {code} event;// 云函数中如需要请求其他http服务,则使用uni…

Day912.多环境配置隔离 -SpringBoot与K8s云原生微服务实践

多环境配置隔离 Hi,我是阿昌,今天学习记录的是关于多环境配置隔离的内容。 多环境支持,是现在互联网开发研发和交付的主流基本需求。通过规范多环境配置可以规范开发流程,并同时提示项目的开发质量和效率等。 一个公司应该规范…

网络使用情况监控

您的网络是否经常成为网络紧张或带宽瓶颈的牺牲品?瓶颈并不一定意味着带宽不足;它们可能是由占用带宽到严重网络威胁等任何因素造成的。密切监控您的网络并分析带宽使用情况和网络流量对于找到问题的根源非常重要。NetFlow Analyzer是最先进的网络使用情…

Simulink自动化-Matlab脚本自动创建Runnable及mapping

文章目录前言设计Excel模板编写matlab脚本自动添加Function到Simulink模型自动mapping Function与Runnable总结前言 在之前的一篇文章中,介绍了Autosar S/R接口的自动创建及mapping,传送门:Simulink自动化-Matlab脚本自动生成Autosar RTE S/R接口及mapp…

mujoco安装及urdf转xml方法记录

参考 mujoco210及mujoco-py安装 下载适用于Linux或 OSX的 MuJoCo 2.1 版二进制文件 。 将mujoco210的下载的目录解压到~/.mujoco/mujoco210路径下. 注意:如果要为包指定非标准位置,请使用环境变量MUJOCO_PY_MUJOCO_PATH。 验证是否安装成功&#xff08…

springcloud3 fegin服务超时的配置和日志级别的配置2

一 fegin的概述 1.1 fegin的默认超时时间 默认fegin客户端只等待1秒钟,超过1秒钟,直接会返回错误。 1.2 架构图 1.2.1 说明 1.2.2 启动操作 1.先启动9001,9002 eureka 2.启动9003 服务提供者 3.启动9006消费者 1.3 情况验证 1.3.1 正常默认情…

云端IDE:TitanIDE v2.6.0 正式发布

原文作者:行云创新技术总监 邓冰寒 引言 云原生集成开发环境 TitanIDE v2.6.0 正式发布了,一起来看看都有那些全新的体验吧! TitanIDE 是一款云IDE, 也称 CloudIDE,作为数字化时代研发体系不可或缺的一环,和企业建设…

C++网络编程(一)本地socket通信

C网络编程(一) socket通信 前言 本次内容简单描述C网络通信中,采用socket连接客户端与服务器端的方法,以及过程中所涉及的函数概要与部分函数使用细节。记录本人C网络学习的过程。 网络通信的Socket socket,即“插座”,在网络中译作中文“套接字”,应…

项目管理必备:如何绘制一份优秀的甘特图?

本文一共分为两部分—— 分享60Excel甘特图模板,简单省事儿分享两种甘特图制作教程,高效快捷 第一部分——60甘特图模板 分享一些项目管理甘特图的模板,省事儿!高效!简单! Excel甘特图表模板自取&#xf…

Laya小游戏开发,laya3D美术篇——1——关于laya自带的几个shader的基础运用讲解。

最近三年,基本上做的都是laya小游戏项目。也就是微信小程序,很多业内同行都觉得laya做小游戏不好用,去用了其他平台,甚至还有些做app游戏的,都不来趟laya这个坑。原因有那么以下几点。laya对于unity的辅助开发&#xf…

STM32的USART发送数据时如何使用TXE和TC标志

8人从A出发去D旅游的故事 STM32的USART发送数据时如何使用TXE和TC标志 TXE为1: TDR里的数据全部移到了移位寄存器,且没有新的数据TDR。 TXE为0: TDR里有数据,未空,则TXE0。 TC为1: 从TDR过来的数据全部被移…

一文上手图数据备份恢复工具 NebulaGraph BR

作者:NebulaGraph 工程师 Kenshin NebulaGraph BR 开源已经有一段时间了,为了给社区用户提供一个更稳、更快、更易用的备份恢复工具,去年对其进行了比较大的重构。NebulaGraph BR(以下简称 BR)分为社区版和企业版两个版…

Git学习笔记(五)——分支

一、创建与合并分支创建分支:Git创建一个分支很快,因为除了增加一个指针,改改HEAD的指向,工作区的文件都没有任何变化。合并分支:就是直接把master(其中一条分支)指向dev(另一条分支…

python基础条件循环语句

1、编写代码完成一个名片显示,要求使用取消换行和格式化操作符 # 编写代码完成一个名片显示,要求使用取消换行和格式化操作符name 张三 qq 1234567 phone_num 1234567 com_address 北京print(\n 姓名:%s\n qq:%d\n 手机号:%d\n 公司地址:%s\n %(name ,qq ,phone_num, com_…

忆享科技优化入职培训加强人效管理全面迎接新挑战

-优化入职培训-忆享科技加强人效管理入职培训课程 ✦ KPI系统上线 ✦ 砥砺前行前言许多企业随着自身的不断发展,对于各类人才引进需求也越来越迫切,一批批新员工的加入,公司规模逐渐扩大,给公司带来了全新的血液。但在大量新员工加…

jsPlumb Components Crack

jsPlumb Components Crack 为支持Vue 2,所有组件都添加了包装器。 已为所有组件添加了包装器以支持Svelte。 改进了在流程图生成器中编辑多个选定节点。 jsPlumb组件是一组可嵌入的组件,可将可视连接快速集成到网页中。jsPlumb组件基于jsPlumb Toolkit库…

lesson8-Linux多线程

Linux线程概念 线程在进程内部执行,是OS调度的基本单位OS是可以做到让进程进行资源的细粒度划分的物理内存是以4kb为单位的我们的.exe可执行程序本来就是按照地址空间的方式进行编译的页表映射 - 详细图 理解线程 线程在进程的地址空间内运行, 进程内部具有多个执行流的,而线程…

【java基础】集合基础说明

文章目录基本介绍Collection接口Iterator和Iterable接口Map接口关于Iterator接口的一些说明框架中的接口具体集合总结基本介绍 集合就是存储用来存储一系列数据的一种数据结构。在这篇文章中会介绍集合的一些基本概念。 Collection接口 集合的基本接口是Collection接口&…

Metabase和Superset 对比分析

Metabse中文社区Metabase和Superset都是排名靠前的开源的数据可视化软件,在技术上有许多相似之处。他们的比较可以帮助用户选择更好的开源平台进行数据可视化。关于Superset 编辑切换为居中添加图片注释,不超过 140 字(可选)Super…