【深入理解DETR】DETR的原理与算法实现

1 DETR算法概述

在这里插入图片描述
在这里插入图片描述
①端到端
②Transformer-model

之前的方法都需要进行NMS操作去掉冗余的bounding box或者手工设计anchor, 这就需要了解先验知识,增加从超参数anchor的数量,

1.1 训练测试框架

一次从图像中预测n个object的类别

在这里插入图片描述

训练阶段我们将一张图像喂入DETR模型,会得到100个bounding box,并且得到这些预测框的类别信息和坐标信息
100个是超参数,因为大部分的图像中的object的数量不会超过100个
通过label我们知道图像中有2个object
然后使用匈牙利算法从预测出的100个候选框中筛选出2个预测框,与两个标注框一起计算损失,然后反向传播,优化模型参数

在这里插入图片描述

测试阶段:通过网络预测出100个预测框,把这100个预测框的置信度去和阈值进行比较,大于阈值的预测框保留。

这样在DETR里面是没有用到anchor也没有NMS操作的

算法的两个重点:一是基于集合的全局损失,通过二分类匹配得到与标注框匹配的独一无二的损失;二是引入encoder-decoder框架,

在这里插入图片描述

object queries是可学习的参数,通过他的尺寸指定输出的预测框的个数,在transforme中输出的token个数是等于输出的token个数,

没有固定的框架:只要框架能够支持这些,就能支持DETR
CNN+位置编码+encoder-decoder+MLP

2 DETR模型结构讲解

inference

在这里插入图片描述

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

在这里插入图片描述
①图像预处理,输入(batch_size,3,800,1066)
②经过CNN的backbone,得到feature map是(batch_size,2048,25,34),下采样了32倍,channel数是2048
③特征图再经过一个1x1的卷积,输入的通道数是2048,输出的通道数是256,这个卷积层的目的就是减少channel数,输出(batch_size,256,25,34)
④维度flatten,得到(batch_size,256,850)
⑤再把维度调换一下,得到(850,batch_size,256),850就是后面transformer的token的个数,256就是每个token的特征向量的长度
⑥特征图(850,batch_size,256)和位置编码都要传入encoder中,并且位置编码需要在每个多头自注意力层里都要加到key和query上,这就和标准的transformer不一样了。对比标准的transformer结构,位置编码是直接加到输入上的,但是DETR的encoder的位置编码,在每个堆叠的encoder-decoder中都要使用位置编码
⑦query的初始值是0,(100,256),object query也是(100,256),encoder的输出包含了图像提取的全局信息,通过两个检测头得到预测框的坐标和类别

在这里插入图片描述
⑧decoder的下面部分可以理解为在学习anchor特征 ,decoder的上面部分可以理解为在得到encoder输出的全局信息后,以及anchor的特征基础上,学习和预测bounding box的坐标和目标的类别

在这里插入图片描述

代码

在这里插入图片描述

输入包括了两个参数:①src:从backbone里面得到的 image features ②pos 就是位置编码

两种位置编码方法:
在这里插入图片描述
在这里插入图片描述
可以二选一

在这里插入图片描述
src做dropout和跨层连接,模拟resnet,
src2 是FFN层 再经过relu

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

decoder:
参数:①tgt:queries (100,256) ②memory:就是encoder的输出 (850,batch_size,256) ③pos:位置编码 (850,batch_size,256)

④query_pos:就是Object queries (100,256)

①首先用with_pos_embed将queries和Object queries相加得到k,q,v就是queries
②然后对q,k,v进行Self-attention操作
③dropout和残差
④linear_norm1,覆盖tgt
⑤下一个query等于tgt加上Object queries,下一个k等于encoder输出的memory加上位置编码,下一个v就等于encoder输出的memory,再进行Multi-head Self-attention,得到tgt2
⑥dropout和残差
⑦linear_norm2,覆盖tgt
⑧FFN层包括一个全连接层,一个relu激活层,一个dropout,一个全连接层,输出tgt2
⑨dropout和残差
⑩linear_norm3

最终输出 (batch_size,100,256)
训练阶段是(6,batch_size,100,256)
因为堆叠了6个encoder-decoder,一次得到了6个

在这里插入图片描述
两个检测头,分别预测类别和bounding box的坐标
检测类别的FFN只是一个全连接层,92是因为coco数据集有91个类别,再加一个背景类别
检测bounding box的坐标的FFN是一个MLP,包括3个全连接层,前两个全连接层的输入和输出尺寸都是256,第3个的输入是256,输出是4,4是bounding box的(x,y,w,h),因为是需要相对坐标,所以做一个sigmoid归一化(0,1)

在测试阶段,设置一个类别置信度阈值,对于100个bounding box取置信度最大的那个类,作为bounding box的类别,

3 DETR损失函数

在这里插入图片描述
训练阶段能从网络中得到输出:是一个字典,包括了3个部分,

pred_logits和pred_boxes是decoder输出的类别预测和坐标预测结果(batch_size,100,92)和(batch_size,100,4)
batch_size这里被设置为2,aux_outputs是decoder的5个中间层的输出结果,中间层的输出和最终的decoder的检测头是一样的

在这里插入图片描述
在这里插入图片描述
要往矩阵中填的是预测框与真实的损失,其中包括两个部分,前半部分是类别损失,后半部分是坐标损失, c i c_i ci不为空,表示不计算背景的损失

在这里插入图片描述
outputs是预测值,targets是标注值,先把outputs中的预测类别提取出来,即out_prob(2,100,92) 2是batch_size,100是100个预测框,92是类别,flatten为(200,92)
第62行把标注里面的类别取出来,可以看到第一张图中有两个类别,分别是第82和第79个类别;第二张图中有4个类别,分别是第1、1、34、1个类,

第68行:要从预测的200个bounding box中提取出对应的损失,绿色和紫色分别表示第1和2张图中的类别损失,取负号就是公式的前半部分

在这里插入图片描述

匈牙利算法损失的第二部分是用来给bounding box打分的,传统的L1损失会存在问题:对于不同尺度的box计算的损失是相似的,为了缓解这一问题,采用L1损失和GIoU损失的线性结合,

在这里插入图片描述
在这里插入图片描述
第59行:从预测结果中提出坐标部分,(2,100,4),flatten成(200,4)
第63行:从targets中提出两张图像的标注坐标

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

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

相关文章

Attention Is All Your Need论文翻译

0.摘要 这个统治序列转换模型是基于复杂循环或者卷积神经网络,它包含编码器和解码器。表现最好的模型也通过注意力机制来连接编码器和解码器。我们提出了一个新的简单网络架构——Transformer,它仅仅是是基于注意力机制,完全免去递推和卷积。在两个机器…

C语言——函数(第五讲)(上)

C语言——函数(第五讲) 前言函数的概念库函数标准库和库函数库函数的使用方法 ⾃定义函数形式形参和实参形参和实参的关系 前言 Hello,各位C语言的小伙伴们,大家过年好,我是莹莹。停更差不多一个月了,都是懒惰作怪&am…

9 个管理 Windows 硬盘的最佳免费磁盘分区软件 [2024 排名]

管理分区可能是一项具有挑战性的任务。当您想到删除、缩小、移动、磁盘分区或合并分区等方面时,您会认为它们是很难做到的事情。然而,虽然 Windows 自己的磁盘管理可以处理大部分问题,但它无法处理管理分区的所有方面。 这时候优质的磁盘管理…

python-游戏篇-初级-超级画板

文章目录 开发环境要求运行方法PyCharmVScode 代码main.pytools.py 效果 开发环境要求 本系统的软件开发及运行环境具体如下。 操作系统:Windows 7、Windows 10。Python版本:Python 3.7.1。开发工具:PyCharm 2018。Python内置模块&#xff…

秒懂百科,C++如此简单丨第十九天:动态规划

目录 动态规划的初步理解 求最短路径数 洛谷 P1002 过河卒 题目描述 输入样例 输出样例 思路 AC Code 动态规划的初步理解 什么是动态规划?最直白的理解就是动态的规划。 那高级一点的理解呢?就是每时每刻都拿着一个小本本,也就是…

「优选算法刷题」:和可被K整除的子数组

一、题目 给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续、非空) 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1: 输入:nums [4,5,0,-2,-3,1], k 5 输出:7 解释&…

C语言-----函数功能实现---strcpystrlen

1.函数功能参数介绍 该函数的功能就是把一个字符串复制到另外的一个数组,包括\0; 2.首先我们要明确字符串的复制也是包括最后的\0的; void mystrcpy(char* dest, char* src) {while (*src!\0){*dest *src;dest;src;}*dest *src;} int mai…

HGAME 2024 WEEK2 WP

文章目录 WEBWhat the cow say?Select More Coursesmyflask CryptomidRSAmidRSA revengebackpackbackpack revengebabyRSA奇怪的图片plus MISC我要成为华容道高手ek1ng_want_girlfriendezWord龙之舞 回老家了,初七晚上才回去,估计week3前几天不怎么能做…

类加载过程介绍

一、类的生命周期 类被加载到jvm虚拟机内存开始,到卸载出内存为止,他的生命周期可以分为:加载->验证->准备->解析->初始化->使用->卸载。 其中验证、准备、解析统一称为链接阶段 1、加载 将类的字节码载入方法区中&#xf…

docker (一)-简介

1.什么是docker Docker 是一个开源的应用容器引擎,由于docker影响巨大,今天也用"Docker" 指代容器化技术。 2.docker的优势 一键部署,开箱即用 容器使用基于image镜像的部署模式,image中包含了运行应用程序所需的一…

Selenium实战教程系列(二)---元素定位

Selenium webdriver能够模拟人对浏览器进行操作的前提是界面元素的定位。元素的定位可以说是Selenium自动化脚本的基础。这一小节笔者将介绍如何在selenium中进行元素的定位。 定位元素的方法 Selenium中提供了以下定位元素的方法: 首先看一个HTML文件 test_page.…

(14)Hive调优——合并小文件

目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一:insert overwrite (推荐) 3.2.2 方式二:concatenate 3.2.3 方式三&#xff…

OpenMVG(特征匹配、照片组重建点云、GPS位置信息、GMS)

目录 1 图像的特征匹配 2 图像中提取GPS位置信息 2.1 写入GPS信息到图像中 2.2 读取带有GPS的图像 3 SIFT/AKAZE/AKAZE_MLDB特征提取对比 4 GMS Filter 5 将球形全景图转换为6个透视视图 6 照片组重建点云 1 图像的特征匹配 #include "openMVG/features/feature.…

Python面向对象学习小记——面向过程VS面向对象

【面向过程就好比你是一个工人,你得亲自去做一个个任务 面向对象就好比你一个包工头,你可以差遣你下面的工人去做】

【网站项目】228高校教师电子名片系统

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

PowerShell搭建vue起始项目

Windows PowerShell搭建vue起始项目 搜索PowerShell,以管理员身份运行。 复制文件夹路径 cd 到这个文件夹位置 命令行创建项目:vue create 项目名 这里写自己的项目名就行,我写的yeb vue create yeb 创建成功后是这样的 有颜色的就是选中的&#xff…

“恶意提起知识产权诉讼行为的法律规制”主题研讨活动成功举办

随着我国社会经济的迅速发展以及创新型国家、知识产权强国建设的不断深入,知识产权在社会生活中正发挥着越来越重要的作用。特别是对于广大市场主体而言,知识产权已经不仅是一种私权利,更成为商业竞争中非常重要的一种手段,由此引发了大量的知识产权诉讼纠纷。此类纠纷中,既有权…

C++ new 和 malloc 的区别?

相关系列文章 C new 和 malloc 的区别? C内存分配策略​​​​​​​ 目录 1.引言 2.区别 2.1.申请的内存分配区域 2.2.类型安全和自动大小计算 2.3.构造函数和析构函数的调用 2.4.异常处理 2.5.配对简便性 2.6.new 的重载 2.7.关键字和操作符 3.总结 1.引…

HACKTHEBOX通关笔记——mango(退役)

信息收集 端口扫描 ┌──(root㉿kali)-[~] └─# nmap -sC -sV -A -p- --min-rate10000 10.129.229.185 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-01-31 20:44 EST Warning: 10.129.229.185 giving up on port because retransmission cap hit (10). Nmap scan …