【目标检测】DN-DETR

一、引言

论文: DN-DETR: Accelerate DETR Training by Introducing Query DeNoising
作者: IDEA
代码: DN-DETR
注意: 该算法是在DAB-DETR基础上的改进,在学习该算法前,建议掌握DETR、DAB-DETR等相关知识。
特点: 指出DETR收敛慢的另一个主要原因为二分图匹配的不稳定性,提出对真实目标的锚框信息和标签信息施加噪声并将其喂入解码器中,使解码器进行去噪操作的训练方式。去噪部分引入了真实目标信息且不需要二分图匹配,所以有利于原始匹配部分的稳定从而加速收敛。

二、为什么降噪能加速DETR的训练

2.1 使匈牙利匹配更加稳定

前期的优化过程通常是随机的,导致每次的预测结果可能有比较大的波动。例如,对于同一个查询,第一次预测该查询与图片中的狗🐶匹配,第二次预测该查询可能就与图片中的汽车🚗匹配了。匈牙利匹配结果的巨大变化,进一步导致优化目标的不一致,模型需要反反复复进行学习修正才能逐渐稳定,所以收敛速度自然就慢了。

所以作者引入施加了噪声的真实目标信息,包括目标的中心坐标、宽高、类别。因为它们有明确的对应目标,将它们也添加到解码器中获得的预测是不需要进行二分图匹配的,也就缓解了匈牙利匹配的不稳定性。

为描述训练前期匈牙利匹配的不稳定性,作者提出了一种指标:

其中, I ( ⋅ ) \mathbb{I}(\cdot) I()为指示函数,括号中内容成立为1,否则为0; V n i V_n^i Vni表示第 i i i个epoch的第n个查询经解码器后得到的预测目标的匹配情况,定义如下:

其中, O i = { O 0 i , O 1 i , ⋯ , O N − 1 i } \mathbf{O}^i=\{O_0^i,O_1^i,\cdots,O_{N-1}^i\} Oi={O0i,O1i,,ON1i}表示N个预测目标, T = { T 0 , T 1 , ⋯ , T M − 1 } \mathbf{T}=\{T_0,T_1,\cdots,T_{M-1}\} T={T0,T1,,TM1}表示M个真实目标。

可以看出, I S i IS^i ISi越高表明本次迭代时匈牙利匹配结果与上次的匹配结果相差越大,即不稳定性越大。

上图为DETR、DAB-DETR、DN-DETR前12个epoch的 I S IS IS变化情况,可以看出,DN-DETR的稳定性要好于另外两个方法,也就说明了降噪操作能够使匈牙利匹配更加稳定。

2.2 使搜索范围更加局部化

因为降噪训练所引入的锚框虽然施加了噪声,但是其所处位置仍然在真实目标附近,所以模型在调整预测位置时不必进行全局搜索,而是只进行局部搜索就可以了。锚框和目标框之间距离的缩短使得训练过程更加简单,收敛也就更快。

上图为DETR和DAB-DETR训练过程中锚框与目标框之间的距离,可以看出,DN-DETR的锚框与目标框之间的距离更小,所以训练难度更低,收敛速度也就更快。

三、框架

3.1 施加噪声

DN-DETR施加的噪声是在真实目标上的,包括三个部分:中心坐标 ( x , y ) (x,y) (x,y)、宽高 ( w , h ) (w,h) (w,h)、标签 l l l

对于中心坐标 ( x , y ) (x,y) (x,y),会施加随机偏移。 偏移量要满足 ∣ Δ x ∣ < λ 1 w 2 |\Delta x|<\frac{\lambda_1 w}{2} ∣Δx<2λ1w ∣ Δ y ∣ < λ 1 h 2 |\Delta y|<\frac{\lambda_1 h}{2} ∣Δy<2λ1h的限制,其中 λ 1 ∈ ( 0 , 1 ) \lambda_1\in(0,1) λ1(0,1) λ 1 \lambda_1 λ1的取值范围能够保证中心坐标的偏移不会过大,无论如何偏移,新的中心坐标仍然位于旧框之中。

对于宽高 ( w , h ) (w,h) (w,h),会施加随机缩放。 缩放后的范围在 [ ( 1 − λ 2 ) w , ( 1 + λ 2 ) w ] [(1-\lambda_2)w,(1+\lambda_2)w] [(1λ2)w,(1+λ2)w] [ ( 1 − λ 2 ) h , ( 1 + λ 2 ) h ] [(1-\lambda_2)h,(1+\lambda_2)h] [(1λ2)h,(1+λ2)h]之间,其中 λ 2 ∈ ( 0 , 1 ) \lambda_2\in(0,1) λ2(0,1)。并没有固定的缩放程度,而是在上述范围内随机取宽、高。

对于标签 l l l,会施加随机翻转。 翻转是以 γ \gamma γ的概率将标签改为另一个随机标签。

3.2 注意力掩吗

DN-DETR引入了 P P P个版本的噪声,这些噪声有差别但都满足3.1中的条件。假设一张训练图片中有 M M M个目标,施加 P P P个版本的噪声后,就会得到 P P P组带噪目标,共 M × P M\times P M×P个新的带噪目标。假设原始一张图片有N个查询,新的带噪目标会作为额外的查询与原始查询拼接到一起,于是形成 M × P + N M\times P+N M×P+N个查询。原始查询就是DAB-DETR中的300个查询。

⚠️ DN-DETR将与带噪目标相关的部分称为去噪部分,将与原始查询相关的部分称为匹配部分

虽然新的查询中被施加了噪声,但其仍然包含真实目标的信息,如果不同组之间的查询能够相互访问,那学习过程可能会异常简单。此外,如果新的查询与原始查询之间能够相互访问,那么与噪声相关的部分就无法与原始查询解耦,当进入无法获取真实目标信息的推理阶段时,整个方法就瘫痪了。所以DN-DETR引入了注意力掩码来避免这两个问题,注意力掩码矩阵如下:

图中, P = 2 , M = 3 , N = 5 P=2,M=3,N=5 P=2,M=3,N=5;匹配部分表示 N N N个原始查询;灰色部分表示对应查询不可访问,彩色部分表示可以访问。访问是单向的。

从图中可以看出,组0可以与自身、匹配部分通信。与自身不必多说,可以访问匹配部分是因为匹配部分中不包含任何与真实目标相关的信息,所以开放给组0访问也没关系。组1与组0类似,但组0与组1相互均不可访问。匹配部分要与去噪部分解耦,所以只能访问自身。

3.3 与DAB-DETR的差别

⚠️ DN-DETR只是提供了一个训练策略,在推理的时候与去噪部分相关的内容和操作都会被移除,变得与DAB-DETR完全一样。

所以,DN-DETR和DAB-DETR在结构上的差别很小。下图为DAB-DETR和DN-DETR的解码器中交叉注意力部分的结构图:

如上图所示,二者的主要差别在于查询部分Q的解码器嵌入(初始化全0)替换为了类别标签嵌入+指示项。这种替换是为了同时进行标签和锚框的去噪,否则原始输入中只有可学习锚框与中心坐标 ( x , y ) (x,y) (x,y)、宽高 ( w , h ) (w,h) (w,h)相关,没有与标签 l l l相关的部分。

对于类别标签嵌入,要先由nn.Embedding初始化一个尺寸为 ( n u m _ c l a s s e s + 1 , h i d d e n _ d i m − 1 ) (num\_classes+1,hidden\_dim-1) (num_classes+1,hidden_dim1)的矩阵。 n u m _ c l a s s e s + 1 num\_classes+1 num_classes+1 n u m _ c l a s s e s num\_classes num_classes指数据集的类别总数, + 1 +1 +1表示额外增加的未知类。 h i d d e n _ d i m hidden\_dim hidden_dim是原始查询的维度, − 1 -1 1表示减去一个维度留给指示项。对于去噪部分的 M × P M\times P M×P个查询,它们有明确的类别(施加噪声后的),所以可以直接从矩阵中索引对应的特征。对于匹配部分的 N N N个查询,它们不知道与什么类别匹配,均被假设为未知类,用矩阵的最后一个特征表达。剩下的那个维度用指示项填补,指示项用于表示当前查询属于原始的匹配部分(0)还是新增的去噪部分(1)。

对于可学习锚框,匹配部分按照DAB-DETR进行均匀分布的初始化,去噪部分直接使用施加噪声后的中心坐标和宽高。

下图为DN-DETR的结构图:

总结下来,DAB-DETR和DN-DETR仅训练时有差别,差别是:
(1) 解码器嵌入被换成了类别标签嵌入+指示项。嵌入部分由nn.Embedding初始化,匹配部分按未知类取最后一个特征,去噪部分按噪声类别取对应索引的特征。指示项为0表示匹配部分,为1表示去噪部分。
(2) 输入查询的数量从 N N N变成了 M × P + N M\times P+N M×P+N M × P M\times P M×P是该图片中 M M M个真实目标被施加了 P P P个版本的噪声后得到的锚框和标签。
(3) 为了避免通信带来的问题,引入了注意力掩码。
(4) 与原始查询拼接在一起的去噪查询也会经解码器输出框和标签预测。为实现去噪,对于框使用l1 loss和GIOU loss,对于标签使用Focal loss,三个loss合并称为重构损失(reconstruction loss)。

致谢:

本博客仅做记录使用,无任何商业用途,参考内容如下:
DN-DETR 论文简介
DN-DETR 源码解析

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

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

相关文章

VMamba: Visual State Space Model论文笔记

文章目录 VMamba: Visual State Space Model摘要引言相关工作Preliminaries方法网络结构2D-Selective-Scan for Vision Data(SS2D) VMamba: Visual State Space Model 论文地址: https://arxiv.org/abs/2401.10166 代码地址: https://github.com/MzeroMiko/VMamba 摘要 卷积神…

axios的基本使用和vue脚手架自带的跨域问题解决

axios的基本使用和vue脚手架自带的跨域问题解决 1. axios 1.1 导入axios npm i axios1.2 创建serve1.js serve1.js const express require(express) const app express()app.use((request,response,next)>{console.log(有人请求服务器1了);console.log(请求来自于,re…

go Channel 原理 (一)

Channel 设计原理 不要通过共享内存的方式进行通信&#xff0c;而是应该通过通信的方式共享内存。 在主流编程语言中&#xff0c;多个线程传递数据的方式一般都是共享内存。 Go 可以使用共享内存加互斥锁进行通信&#xff0c;同时也提供了一种不同的并发模型&#xff0c;即通…

AI奏响未来乐章:音乐界的革命性变革

AI在创造还是毁掉音乐 引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;正在逐渐渗透到我们生活的每一个角落&#xff0c;音乐领域也不例外。AI技术的引入&#xff0c;不仅为音乐创作、教育、体验带来了革命性的变革&#xff0c;更为整个音乐产业注入了…

顺序表应用——通讯录

在本篇之前的顺序表专题我们已经学习的顺序表的实现&#xff0c;了解了如何实现顺序表的插入和删除等功能&#xff0c;那么在本篇当中就要学习基于顺序表来实现通讯录&#xff0c;在通讯录当中能实现联系人的增、删、查改等功能&#xff0c;接下来就让我们一起来实现通讯录吧&a…

grpc学习golang版( 五、多proto文件示例 )

系列文章目录 第一章 grpc基本概念与安装 第二章 grpc入门示例 第三章 proto文件数据类型 第四章 多服务示例 第五章 多proto文件示例 第六章 服务器流式传输 第七章 客户端流式传输 第八章 双向流示例 文章目录 一、前言二、定义proto文件2.1 公共proto文件2.2 语音唤醒proto文…

基于局域网下的服务器连接、文件传输以及内网穿透教程 | 服务器连接ssh | 服务器文件传输scp | 内网穿透frp | 研究生入学必备 | 深度学习必备

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 &#x1f4cc;本篇博客分享的是基于局域网下的服务器连接&#x1f517;、文件传输以及内网穿透教程&#xff0c;内容非常完备✨&#xff0c;涵盖了在服务器上做深度学…

树莓派3B读写EEPROM芯片AT24C256

AT24C256是一个Atmel公司的EEPROM存储芯片&#xff0c;容量是256K个bit&#xff08;也就是32K字节&#xff09;&#xff0c;I2C接口&#xff0c;而树莓派正好有I2C接口&#xff0c;如下图蓝框中的4个IO口&#xff0c; 把AT24C256和这4个口接在一起&#xff0c;这样硬件就准备好…

Django 页面展示模型创建表的数据

1&#xff0c;添加视图函数 Test/app8/urls.py from django.shortcuts import render from .models import Userdef create_user(request):if request.method POST:username request.POST.get(username)email request.POST.get(email)# ... 获取其他字段的值# 创建用户实例…

【Python学习篇】Python实验小练习——异常处理(十三)

个人名片&#xff1a; &#x1f393;作者简介&#xff1a;嵌入式领域优质创作者&#x1f310;个人主页&#xff1a;妄北y &#x1f4de;个人QQ&#xff1a;2061314755 &#x1f48c;个人邮箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;个人微信&#xff1a;Vir2025WB…

【教程】5分钟直接了解随机森林模型

本文来自《老饼讲解-BP神经网络》https://www.bbbdata.com/ 目录 一、什么是随机森林模型1.1.随机森林模型介绍1.2.为什么随机森林要用多棵决策树 二、怎么训练一个随机森林模型2.1.训练一个随机森林模型 随机森林模型是机器学习中常用的模型之一&#xff0c;它是决策树模型的一…

Node.js全栈指南:静态资源服务器

上一章【认识 MIME 和 HTTP】。 我们认识和了解了 MIME 的概念和作用&#xff0c;也简单地学习了通过浏览器控制台查看请求和返回的用法。 通过对不同的 HTML、CSS、JS 文件进行判断&#xff0c;设置不同的 MIME 值&#xff0c;得以让我们的浏览器正正确地接收和显示不同的文…

八爪鱼现金流-031,宽带到期记一笔负债

到期了&#xff0c;新弄的网络&#xff0c;记录一下负债包。 八爪鱼现金流 八爪鱼

英英词典(汇编实验)

功能要求&#xff1a; 1.单词及其英文解释的录入、修改和删除 (1 ) 录入新单词&#xff0c;把它插入到相应的位置(按词典顺序)&#xff0c;其后跟英文解释、同义词、反义词&#xff1b;&#xff08;此功能要求在文件中完成&#xff0c;其它功能可以将单词放在数据段中&#xf…

数据库原理之数据库基本概念

目录 前言 基本概念 数据库完整性 前言 今天我们来看看数据库的基本概念&#xff0c;帮助大家对数据库有一点点最基本的了解 基本概念 4个基本概念 数据data&#xff1a;描述事物的符号&#xff0c;数据库中存储的基本对象。 数据库Database&#xff1a;长期存储在计算机…

山东大学多核并行2024年回忆版

2024.6.13回忆版 矩阵向量乘不可整除代码 集合通信与点对点通信的区别 块划分、循环划分、循环块划分&#xff08;14个向量&#xff0c;4个进程&#xff09; 按行访问还是按列访问快 SISD系统问题 循环依赖问题 问题&#xff1a;为什么不能对这个循环并行化&#xff0…

Python逻辑控制语句 之 综合案例

需求&#xff1a; 1. 提示⽤户输⼊登录系统的⽤户名和密码 2. 校验⽤户名和密码是否正确(正确的⽤户名:admin、密码:123456) 3. 如果⽤户名和密码都正确&#xff0c;打印“登录成功!”&#xff0c;并结束程序 4. 如果⽤户名或密码错误&#xff0c;打印“⽤户名或密码错误!”…

Django 对模型创建的两表插入数据

1&#xff0c;添加模型 Test/app8/models.py from django.db import modelsclass User(models.Model):username models.CharField(max_length50, uniqueTrue)email models.EmailField(uniqueTrue)password models.CharField(max_length128) # 使用哈希存储密码first_name …

DM 的断点续传测试

作者&#xff1a; 大鱼海棠 原文来源&#xff1a; https://tidb.net/blog/4540ae34 一、概述 DM有all、full、incremental三种数据迁移同步方式&#xff08;task-mode&#xff09;&#xff0c;在all同步模式下&#xff0c;因一些特殊情况&#xff0c;需要变更上游MySQL的数…