【深入理解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中提出两张图像的标注坐标

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【PyQt】12-滑块、计数控件

文章目录 前言一、滑块控件 QSlider运行结果 二、计数器控件 QSpinBox运行结果 总结 前言 1、滑块控件 2、计数控件 一、滑块控件 QSlider #Author :susocool #Creattime:2024/2/15 #FileName:28-滑块控件 #Description: 通过滑块选择字体大小 import sys from PyQ…

基于 Python 深度学习的电影评论情感分析系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

Linux实用指令

Linux实用指令 1.指定运行级别 运行级别说明: 0 :关机 1 :单用户【找回丢失密码】 2:多用户状态没有网络服务 3:多用户状态有网络服务 4:系统未使用保留给用户 5:图形界面 6:系统重…

海量数据处理商用短链接生成器平台 - 3

第三章 商用短链平台实战-账号微服务流量包设计 第1集 账号微服务和流量包数据库表索引规范讲解 简介:账号微服务和流量包数据库表索引规范讲解 索引规范 主键索引名为 pk_字段名; pk即 primary key;唯一索引名为 uk_字段名;uk 即 unique key普通索引…

【C++航海王:追寻罗杰的编程之路】关于模板,你知道哪些?

目录 1 -> 泛型编程 2 -> 函数模板 2.1 -> 函数模板概念 2.2 -> 函数模板格式 2.3 -> 函数模板的原理 2.4 -> 函数模板的实例化 2.5 -> 函数参数的匹配原则 3 -> 类模板 3.1 -> 类模板的定义格式 3.2 -> 类模板的实例化 1 -> 泛型编…

C++:继承与派生基础

引入: 由自然界的动物繁衍的规律(eg: 动物继承父类的一切属性,由父类派生并增加自己的新特征)我们引入C语言在类的使用中描述此类问题。 为解决代码重复使用、提升效率,引入继承机制:允许保留原有类的特性…

Git快速掌握,通俗易懂

Git分布式版本控制工具 介绍 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是由Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。Git可以帮助开发者们管理代码的版本,避免代码冲突&#…

ESP32学习(2)——点亮LED灯

1.前期准备 开发板原理图如下: 可见LED灯接在了GPIO2口 那么要如何编写代码控制GPIO口的电平高低呢? 我们可以参考micropython的官方文档Quick reference for the ESP32 — MicroPython latest documentation 可见,需要导入machine包 若要…

【教程】C++语言基础学习笔记(九)——指针

写在前面: 如果文章对你有帮助,记得点赞关注加收藏一波,利于以后需要的时候复习,多谢支持! 【C语言基础学习】系列文章 第一章 《项目与程序结构》 第二章 《数据类型》 第三章 《运算符》 第四章 《流程控制》 第五章…

面向智算服务,构建可观测体系最佳实践

作者:蓟北 构建面向 AI、大数据、容器的可观测体系 (一)智算服务可观测概况 对于越来越火爆的人工智能领域来说,MLOps 是解决这一领域的系统工程,它结合了所有与机器学习相关的任务和流程,从数据管理、建…

【C语言】内存函数memcpy和memmove的功能与模拟实现

1.memcpy 功能:把source指向的前num个字节内容拷贝到destination指向的位置去,可以拷贝任意类型的数据。 注:1.memcpy并不关心\0,毕竟传的也不一定是字符串,因此拷贝过程中遇到\0也不会停下来。 2.num的单位是字节&a…

基于Echarts的可视化项目

整体的效果 概览区域 <!-- 概览区域模块制作 --><div class"panel overview"><div class"inner"><ul><li><h4>2190</h4><span><i class"icon-dot"></i>设备总数</span></…

Java 基于springboot+vue在线外卖点餐系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

深度学习的新进展:探索人工智能的未来

文章目录 &#x1f4d1;引言深度学习技术概述计算机视觉领域的深度应用自然语言处理的深度革命跨领域应用的深度拓展深度学习的挑战与未来展望结语 &#x1f4d1;引言 在科技日新月异的今天&#xff0c;深度学习作为人工智能领域的一颗璀璨明珠&#xff0c;正在引领着技术创新…

ElasticSearch分词器和相关性详解

目录 ES分词器详解 基本概念 分词发生时期 分词器的组成 切词器&#xff1a;Tokenizer 词项过滤器&#xff1a;Token Filter 停用词 同义词 字符过滤器&#xff1a;Character Filter HTML 标签过滤器&#xff1a;HTML Strip Character Filter 字符映射过滤器&#x…

linux系统zabbix监控配置电话告警

电话报警 睿象云官网操作zabbix-server主机操作睿象云操作zabbix-server的web页面操作 睿象云官网&#xff1a;https://www.aiops.com/ 睿象云官网操作 登录睿象云平台后点击智能告警平台 在集成栏选择监控工具选择zabbix 填写应用名称保存并获取key zabbix-server主机操…

php基础学习之文件包含

描述 在一个php脚本中&#xff0c;将另一个php文件包含进来&#xff0c;合作实现某种功能 这个描述看起来似乎和C/Java等语言的头文件/包有点类似&#xff0c;但本质是不一样的 打个比方&#xff1a; C/Java的头文件/包更像是一个工具箱&#xff0c;存放各种很完善的工具&#…

找不到目标和方向,怎么办?

现代社会里&#xff0c;许多人常见的症状&#xff0c;就是「空心病」。 什么是空心病呢&#xff1f;类似这样&#xff1a; 我知道要有目标&#xff0c;但我就是不知道想做什么&#xff0c;感觉对一切事物都提不起兴趣&#xff0c;没有动力&#xff0c;怎么办&#xff1f; 这个…

骑士遍历初级版

时间限制&#xff1a;1秒 内存限制&#xff1a;128M 题目描述 如图&#xff0c;从左下角A点出发&#xff0c;马只能向右走&#xff0c;根据马走日字的规则&#xff0c;究竟如何走才能到达右上角B点 输入描述 两个整数x、y&#xff0c;代表右上角B点的坐标&#xff0c…

AcWing 112. 雷达设备(区间贪心)

[题目概述] 假设海岸是一条无限长的直线&#xff0c;陆地位于海岸的一侧&#xff0c;海洋位于另外一侧。 每个小岛都位于海洋一侧的某个点上。 雷达装置均位于海岸线上&#xff0c;且雷达的监测范围为 d&#xff0c;当小岛与某雷达的距离不超过 d 时&#xff0c;该小岛可以被雷…