【DETR系列目标检测算法代码精讲】01 DETR算法01 DETR算法框架和网络结构介绍

为什么要有DETR

总所周知,传统的目标检测算法非常依赖于anchor和nms等手工设计操作,非常费时费力,自然而然的就产生了取消这些操作的想法。但是我们首先需要思考的是,为什么我们需要anchor和nms?

因为我们是没有指定anchor去具体预测哪一个目标的,而且nms操作是建立在纯粹的边界框的距离上的,它完全没有利用到图像的信息,只是根据两个边界框的IoU去做判断,这样造成了两个问题。

一是非常费事,我之前写过一篇介绍NMS算法的博客,具体内容大家可以去看看,这里仅做简要的介绍,NMS的操作首先需要根据置信度的阈值过滤掉一批边界框,形成一个边界框集合B,然后从中挑选出置信度最高的边界框b,然后B集合剩下的边界框挨个去和它做IoU的计算,这个IoU值一旦大于某个阈值,我们就把这个边界框从B集合中删除,这样计算的复杂度至少就是o(n)。

二是对于密度预测,nms的这种操作就很容易把目标给漏掉。我举个例子,

在这里插入图片描述
这是斯坦福团队ICCV2015的一篇论文,这篇论文也直接启发了DETR的工作,
在这里插入图片描述
可见在B图中,挨得很近的人被忽略了,这是为什么呢?正是因为我们运用了NMS操作,它基于Iou把相近的边界框给过滤掉了。使用NMS就一定会有正样本被过滤。

说完了NMS操作的问题,我们再来说anchor的问题,关于为什么要使用anchor,我计划用一个博客专门来讲这个问题,这里也只是简要讲一下anchor的问题。
逻辑是这样的:为什么需要nms操作?——因为对同一个目标有冗余的检测框。——为什么会有冗余的检测块?——因为我们运用了anchor 那问题来了,为什么使用anchor就会产生冗余的检测框呢?
原因很简单,因为anchor之间是没有信息交互的。A anchor去预测了一个目标,其他的anchor是不知道的,他们也会去预测这个目标,只要这个目标落在anchor所在的区域内,这就是产生这个问题的根源。

那么要想解决anchor和nms的问题,解决方案就呼之欲出了,我们需要让anchor之间有信息交互,如果一个anchor预测到了目标,就必须让其他的anchor知道,那么什么方法什么机制能够实现信息交互呢?那就是循环神经网络了。这也是这篇论文的方法 CNN + LSTM

Transformer在2017年被提出来后,其全局注意力机制在NLP领域得到了广泛的应用与成功,自然而然地就会被想到运用于CV领域。

DETR就是第一个把Transformer应用于目标检测领域的工作。

在这里插入图片描述

论文的链接:
DETR论文

官方代码的链接
官方DETR代码

我讲解的DETR代码链接:
我讲解的DETR代码

DETR的算法思想、网络结构与具体实现

1.算法思想

目标是做在之前介绍的那篇CNN+LSTM的基础上实现并行的预测。
核心思想,把目标检测问题转换为集合的预测问题。把预测框集合与真实目标集合之间做完全的二分类匹配,也就是左右两边要一对一。
在这里插入图片描述
现在假设有两个集合,左边的集合是模型预测到的N个元素,N是指定的超参数,一般指定为100,因为一般的数据集比如COCO都不会有超过100种目标。如果我们预测出现的标签数量不到N怎么办?没关系,就补充ϕ,表现没有检测到目标。集合中每个元素里面包括边界框的坐标和目标的类别信息,右边的集合就是ground truth,同样,不够N怎么办,就补充ϕ,表示是背景。这样把左右两个集合做一对一的匹配,按照哦我们设定的损失函数最小的匹配方法,就实现了把预测框与真实目标的一对一匹配,这就完全避免了冗余的检测框的问题。

根据上面的算法核心思想,
那么接下来有几个问题:
①如何得到检测框,从哪里来
②如何避免检测框之间的重复
③如何在预测的检测框集合与ground truth集合之间实现最佳的一对一匹配

DETR的解决方案是这样的

对于第一个问题和第二个问题,实际上是一个问题。

答案就是利用transformer的Encoder-decoder,首先还是利用一个CNN的backbone去提取特征图,这里要插一点,为什么还是要使用CNN的主干网络提取特征图,因为在这篇论文发表的时候(2020年),当时还没有Swin Transformer这样的可以针对不同分辨率图像输入的transformer backbone,这里还要补充一点,我们输入transformer的都是一个个token,在NLP任务里面,这一个个token可以是单词、字母,那迁移到CV领域,这些token是什么呢?可以是像素、也可以是patch(图像块),但是问题就来了,如果大家对transformer的self-attention计算过程了解的话就可以知道,一般的计算量是token的平方,也就是每个query需要和包括它自己在内的所有Key相乘,因此,如果我们把一个像素作为token,对于一个100*100的原图,我们就有10000个token,那就需要计算10000的平方次,这个计算量是吃不消的,因此用CNN的主干网络的主要目的除了提取特征以外,很重要的一点就是缩减图像的尺寸,变成一个个patch。

提取完特征图后,把特征图展开,成为一个token序列,每一个token都是一个个特征图的patch,这样输入到encoder中使用self-attention进行全局推理。这样的token之间就进行了信息交互

然后,初始化object query,这个object query的数量也是人为设定的,我们要预测多少个目标就设置多少个object query,object query的初始化就是0+positional encoder

初始化的object query输入到transformer的decoder,与encoder feature 输出的key进行cross-attention,找到带有全局信息的与物体相关的区域,同时Self-attention 则在不同的 query 之间进行交互,实现类似 NMS 的效果。

最后的 prediction heads 基于每个 query 在 decoder 中提取到的特征,预测出物体的 bounding box 的位置和类别。

至于第三个问题,作者用了匈牙利算法做最优二部图匹配,这一点会在损失函数这一部分进行深入介绍
在这里插入图片描述
在这里插入图片描述

DETR把目标检测视为一个直接的集合预测问题,简化了检测管道,有效地消除了对anchor和nms这样手工设计组件需求。

2.网络结构

DETR的网络结构如上图所示:基本可以分为四个部分
①CNN Backbone
②encoder
③decoder
④FFN head

CNN Backbone

Backbone 的输出通道为 2048,图像高和宽都变为了 1/32
在这里插入图片描述

Transformer Encoder

在得到Feature Map之后,DETR首先通过一个 卷积将其通道数调整为更小的d,得到一个大小为 dHW
的新的Feature Map。DETR的下一步则是将其转换为序列数据,这一步是通过reshape操作完成的,转换之后的数据维度是 d*(HW)
。因为Transformer是与输入数据的顺序无关的,因此它需要加上位置编码加入位置信息。这一部分会作为编码器的输入。DETR的编码器的Transformer使用的是多头自注意力模型加上一个MLP。

经过 Backbone 后,将输出特征图 reshape 为 C × H W 因为 C = 2048 是每个 token 的维度,还是比较大,所以先经过一个 1 × 1 的卷积进行降维,然后再输入 Transformer Encoder 会更好。此时自注意力机制在特征图上进行全局分析,因为最后一个特征图对于大物体比较友好,那么在上面进行 Self-Attention 会便于网络更好的提取不同位置不同大物体之间的相互关系的联系,比如有桌子的地方可能有杯子,有草坪的地方有树,有一个鸟的地方可能还有一个鸟等等。所以 DETR 在大目标上效果比 Faster RCNN 好就比较容易理解到了。然后位置编码是被每一个 Multi-Head Self-Attention 前都加入了的,这个就比较狠了。为了体现图像在 x 和 y 维度上的信息,作者的代码里分别计算了两个维度的 Positional Encoding,然后 Cat 到一起。整个 Transformer Encoder 和之前的没什么不同。

Transformer Decoder

Transformer Decoder 也有几个地方需要着重强调。首先就是如何考虑同时进行一个集合预测?之前讲分类的时候都是给一个 class token,因为只进行一类预测。那么现在同时进行不知道多少类怎么办呢?因为目标预测框和输入 token 是一一对应的,所以最简单的做法就是给超多的查询 token,超过图像中会出现的目标的个数(在过去也是先生成 2000 个框再说)。所以在 DETR 中,作者选择了固定的 N = 100 个 token 作为输入,只能最多同时检测 100 个物体。据闻,这种操作可能跟 COCO 评测的时候取 top 100 的框有关。输入 100 个 decoder query slots (Object Query),并行解码N个object,对应的 Transformer decoder 也就会输出 100 个经过注意力和映射之后的 token,然后将它们同时喂给一个 FFN 就能得到 100 个框的位置和类别分数(因为是多分类,所以类别个数是 K + 1,1 指的是背景类别)。

固定预测个数更为简单,定长的输出有利于显存对齐,但是 N = 100 会不会冗杂呢?作者的实验表明,当图像内目标个数在 50 左右的时候,网络就已经区域饱和了,之后就会出现目标丢失。当图像内目标在一百个左右时,其实网络只能检测出来三四十个,这比图像中只有 50 个实例被检测到的情况还要少。作者认为出现这样反常的原因还是因为检测结果与训练分布相差甚远,是训练集中没有那么多多目标图片所造成的。

FFN

最后的 FFN 是由具有 ReLU 激活函数且具有隐藏层的 3 层线性层计算的,或者说就是 1 × 1 1 \times 11×1 卷积。FFN 预测框标准化中心坐标,高度和宽度,然后使用 softmax 函数激活获得预测类标签。

3.损失函数

通过上面对DETR的模型的分析我们知道对于一张图片DETR会输出 N个不同的bounding box,那么我们如何评估这 N个bounding box的效果的好坏呢?在DETR中的策略是对这 N个bounding box以及 N个ground truth进行最优二部图匹配,并根据匹配的结果计算loss来对模型进行优化。

上面提到了计算loss需要生成 N个ground truth,但是一张图片的待检测目标的个数往往是不足 N个的。为了解决这个问题,DETR构造了一个新的类ϕ ,它表示没有目标物体的背景类。通过调整 ϕ中的样本的大小我们可以将ground truth的样本数可控制在 N个,这样我们便得到了两个等容量的集合。

有了这 N 个ground truth,那么我们只要定义好ground truth和bounding box的匹配代价,便可以使用匈牙利匹配算法来得到ground truth和bounding box的最优二部图匹配方案了。

y y y来表示对象的真实集,而用 y ^ = { y ^ i } i = 1 N \hat{y} = \{\hat{y}_i\}^N_{i=1} y^={y^i}i=1N来表示N个预测集。假设N大于图像中对象的数量,将y也视为一组大小为N的集合,填充有∅(无对象)。找到这两个集合之间的二分匹配,

在这里插入图片描述

其中 L m a t c h ( y i , y ^ σ ( i ) ) \mathcal{L}_{match}(y_i, \hat{y}_{σ(i)}) Lmatch(yi,y^σ(i))是ground truth y i y_i yi和具有指示函数 σ ( i ) σ(i) σ(i)的预测之间的成对匹配代价

在这里插入图片描述

将类 c i c_i ci的概率定义为 p ^ σ ( i ) ( c i ) \hat{p}_{σ(i)}(ci) p^σ(i)(ci),预测框定义为 b ^ σ ( i ) \hat{b}_{σ(i)} b^σ(i)。根据这些符号,将 L m a t c h ( y i , y ^ σ ( i ) ) \mathcal{L}_{match}(y_i, \hat{y}_{σ(i)}) Lmatch(yi,y^σ(i))定义为 − 1 c i ≠ ∅ p ^ σ ( i ) ( c i ) + 1 c i ≠ ∅ L b o x ( b i , ˆ b ^ σ ( i ) ) −\mathbb{1}_{{c_i\neq∅}} \hat{p}_{σ(i)}(ci) + \mathbb{1}_{{c_i\neq∅}}\mathcal{L}_{box}(bi, ˆ\hat{b}_{σ(i)}) 1ci=p^σ(i)(ci)+1ci=Lbox(bi,ˆb^σ(i))

匈牙利算法的损失函数分为类别损失和坐标回归损失两部分

− 1 c i ≠ ∅ p ^ σ ( i ) ( c i ) −\mathbb{1}_{{c_i\neq∅}} \hat{p}_{σ(i)}(ci) 1ci=p^σ(i)(ci)这是类别的损失,前面的是一个布尔函数,也就是当类别不为背景的时候为1,否则为0
损失函数肯定是希望越小越好,只有预测是目标而不是背景才有 p ^ σ ( i ) ( c i ) \hat{p}_{σ(i)}(ci) p^σ(i)(ci),否则为0,因此在千米加上负号,后面是边界框的回归损失,肯定是希望预测的框与真实目标的越接近越好。

在这里插入图片描述
其中 λ i o u , λ L 1 ∈ R λ_{iou}, λ_{L1} ∈ \mathbb{R} λiou,λL1R是超参数。使用了L1损失和广义IoU损失 L i o u ( ⋅ , ⋅ ) L_{iou}(·, ·) Liou(⋅,⋅)的线性组合
当我们通过上面的策略得到ground truth和预测bounding box的最优二部图匹配后,便可以根据匹配的结果计算损失函数了。DETR的损失函数和匹配代价非常类似,不同的是它的类别预测使用的是对数似然,

在这里插入图片描述

它们另外一个不同是bool函数作用的位置不同,在 前者中背景目标不参与匹配代价的计算,
后 则也要计算背景目标的分类损失。

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

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

相关文章

安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 从0开始 工具操作解析【三】

同类博文; 安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 工具操作解析 安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 工具操作解析【二】-CSDN博客 回顾以往 在以前的博文简单介绍了这款工具的rom制作全程。今天针对这款工具的…

【Java多线程】8——CompletableFuture

8 CompletableFuture ⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记仓库👉https://github.com/A-BigTree/tree-learning-notes 个人主页👉https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个s…

【UI框架】——保姆式使用教程

👨‍💻个人主页:开发者-曼亿点 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 曼亿点 原创 👨‍💻 收录于专栏&#xff1a…

win11 环境配置 之 Jmeter(JDK17版本)

一、安装 JDK 1. 安装 jdk 截至当前最新时间: 2024.3.27 jdk最新的版本 是 官网下载地址: https://www.oracle.com/java/technologies/downloads/ 建议下载 jdk17 另存为到该电脑的 D 盘下,新建jdk文件夹 开始安装到 jdk 文件夹下 2. 配…

Java23种常见设计模式汇总

七大原则网站地址:设计模式7大原则+类图关系-CSDN博客 创建型设计模式:创建型设计模式合集-CSDN博客 七大结构型设计模式:7大结构型设计模式-CSDN博客 11种行为型设计模式: 11种行为型模式(上&#xff0…

Oracle 19c 高可用部署实战系列之Data Guard理论与实战

课程介绍 Oracle Data Guard确保企业数据的高可用性、数据保护和灾难恢复。 Oracle Data Guard提供了一组全面的服务,用于创建、维护、管理和监视一个或多个备用数据库,使生产Oracle数据库能够在灾难和数据损坏中幸存下来。Oracle Data Guard将这些备用…

我于窗中窥月光,恰如仰头见“链表”(Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

java项目通用Dockerfile

创建Dockerfile文件,放到项目根目录下和pom.xml同级别 仅需修改为自己项目端口号即可,其他的无需改动 FROM openjdk:11.0.11-jre-slimCOPY target/*.jar .EXPOSE 8080ENTRYPOINT java -jar *.jar构建语句(注意末尾的点 . ) docker build -t container…

Android Studio Iguana | 2023.2.1 补丁 1

Android Studio Iguana | 2023.2.1 Canary 3 已修复的问题Android Gradle 插件 问题 295205663 将 AGP 从 8.0.2 更新到 8.1.0 后,任务“:app:mergeReleaseClasses”执行失败 问题 298008231 [Gradle 8.4][升级] 由于使用 kotlin gradle 插件中已废弃的功能&#…

C语言例1-3:设 int a; ,语句 for(a=0;a==0;a++); 和语句 for(a=0;a=0;a++); 执行的循环次数分别是

答案&#xff1a;1,0 代码如下&#xff1a; #include<stdio.h> int main(void) {int a;for(a0;a0;a){printf("1\n");} return 0; } 结果如下&#xff1a; 代码如下&#xff1a; #include<stdio.h> int main(void) {int a;for(a0;a0;a){printf("…

京东云8核16G服务器配置租用优惠价格1198元1年、4688元三年

京东云轻量云主机8核16G服务器租用优惠价格1198元1年、4688元三年&#xff0c;配置为8C16G-270G SSD系统盘-5M带宽-500G月流量&#xff0c;华北-北京地域。京东云8核16G服务器活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云8核16G服务器优惠价格 京东云…

杰理芯片AC79——物联网远程点亮/关闭LED灯

杰理芯片的封装简直太香了&#xff08;比STM32香多了&#xff09;&#xff0c;SDK也封装得很好&#xff0c;对于我这种手残党简直不要太友好。赶紧学起来&#xff0c;快速实现你想要的功能吧&#xff01; 芯片选型 杰理AC79 资料文档 环境搭建以及点亮第一盏灯请访问&#x…

【一】DDR3基础知识与IMG IP

【一】DDR3基础知识与IMG IP 一、DDR3的基本知识 1、DDR3全称为第三代双倍速率同步动态随机存储器 特点&#xff1a;掉电无法保存数据&#xff0c;需要周期性的刷新&#xff1b;时钟上升沿和下降沿都在传输数据&#xff1b;突发传输&#xff0c;突发长度burtst length一般为…

Error: Cannot find module ‘@rollup/rollup-win32-x64-msvc‘

1.背景 新项目需要使用vite搭建一个v3项目,之前也弄过,但项目创建后却一直无法跑起来,大聪明的我一直没有注意到这个问题 2.解决步骤 方案1:删除node_modules和package-lock.json文件重新npm install下包,部分码农通过这个步骤可解决 方案2:node版本或者npm版本不对,或者没…

Vue3:快速上手路由器

本人在B站上关于vue3的尚硅谷的课程&#xff0c;以下是整理一些笔记。 一.路由器和路由的概念 在 Vue 3 中&#xff0c;路由&#xff08;Router&#xff09;和路由器&#xff08;Router&#xff09;是两个相关但不同的概念。 1. 路由&#xff08;Router&#xff09;&#xff…

LeetCode.2908. 元素和最小的山形三元组 I

题目 2908. 元素和最小的山形三元组 I 分析 首先&#xff0c;看到这道题&#xff0c;第一反应就是暴力方法&#xff0c;三层for循环&#xff0c;枚举每一种情况&#xff0c;代码如下 class Solution {public int minimumSum(int[] nums) {int min Integer.MAX_VALUE;for(i…

基于Springboot的学生选课系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的学生选课系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

线程池详解、核心参数、拒绝策略

什么是线程池 线程池是一种池化技术&#xff0c;它预先创建一组线程&#xff0c;用于执行异步任务。当有新任务到来时&#xff0c;线程池可以立即分配一个线程来处理&#xff0c;而不需要临时创建。这样可以减少因为频繁创建和销毁线程而导致的开销。 线程池的应用场景 高并…

2024年腾讯云4核8G12M轻量应用服务器测评_CPU内存带宽系统盘

腾讯云4核8G服务器价格&#xff1a;轻量4核8G12M优惠价格646元15个月、CVM S5服务器4核8G配置1437元买1年送3个月。腾讯云4核8G服务器支持多少人同时在线&#xff1f;支持30个并发数&#xff0c;可容纳日均1万IP人数访问。腾讯云百科txybk.com整理4核8G服务器支持多少人同时在线…

什么是技术分析和EA技术?澳福一个提醒丰厚收益

技术分析是指根据炒外汇市场汇率走势的过去表现&#xff0c;借助技术分析工具预测汇率的未来趋势并确定入市、出市策略的预测分析方法。 它是以预测市场价格变化的未来趋势为目的&#xff0c;以市场行为(外汇市场的价格和交易量)的图形、图表、形态、指标为手段&#xff0c;使用…