【目标检测】DINO

一、引言

论文: DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection
作者: IDEA
代码: DINO
注意: 该算法是在Deformable DETR、DAB-DETR、DN-DETR基础上的改进,在学习该算法前,建议先掌握相关知识。
特点: 提出对比去噪训练方法,相比原DN-DETR中的去噪训练方法引入了负查询来避免重复的和不期望的预测;提出混合查询选择方法,相比原Deformable DETR中的查询选择方法移除了由编码器输出初始化解码器内容查询的部分;提出向前看两层的锚框更新方法,相比原Deformable DETR中向前看一层的锚框更新方法将梯度更新扩展到了前一层。

二、详情

DINO与其他DETR系列方法一样,包括backbone、编码器、解码器、预测头。DINO融合了Deformable DETR、DAB-DETR、DN-DETR的各种策略,例如多尺度特征图输入、可变形注意力、解码器位置查询由4D锚框表达、使用编码器输出初始化解码器输入、去噪训练、逐层更新预测框等等。

针对后三个策略,DINO又做了简单的改进。

2.1 对比去噪训练(Contrastive DeNoising Training)

DN-DETR提出去噪训练来提升模型收敛速度。但是该方法有两个问题:
(1)可能产生重复的预测。 对于同一个目标可能产生多个十分接近的预测,由于DETR系列方法都不需要执行NMS,这些不必要的预测无法被滤除,最终会对性能会有一定的影响。
(2)无法拒绝距离真实目标较远的预测。 即使预测框内无任何目标,如果它的置信分数较大也可能被选中并留到最后,这种无效预测也会影响模型性能。

对比去噪训练引入了显式的难分负样本,在训练时将其分为“no object”,从而使模型具有拒绝无用锚框的能力来解决这两个问题。与难分负样本对应的带噪正样本。事实上,正负都是通过在真实锚框和标签上增加噪声产生的,只是正负样本的噪声等级不同。下图是一个二维数据的正负样本区别示意图:

可见,作者增加了两个超参数, λ 1 < λ 2 \lambda_1<\lambda_2 λ1<λ2所有噪声等级小于 λ 1 \lambda_1 λ1的都视作正样本,所有等级大于 λ 1 \lambda_1 λ1但小于 λ 2 \lambda_2 λ2的都视作负样本。 λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2差别不大时,负样本就可以视为难分负样本,因为它与正样本的区别不大,作者表示这样能提升性能。

以真实目标框归一化后的宽 w = 0.26 w=0.26 w=0.26为例, λ 1 = 1 , λ 2 = 2 \lambda_1=1, \lambda_2=2 λ1=1,λ2=2,那么在 [ ( 1 − λ 1 ) w , ( 1 + λ 1 ) w ] = [ 0 , 0.52 ] [(1-\lambda_1)w,(1+\lambda_1)w]=[0,0.52] [(1λ1)w,(1+λ1)w]=[0,0.52]范围内随机取一个值就形成了正样本的宽,在 [ ( 1 − λ 2 ) w , ( 1 − λ 1 ) w ] = [ − 0.26 , 0 ] [(1-\lambda_2)w,(1-\lambda_1)w]=[-0.26,0] [(1λ2)w,(1λ1)w]=[0.26,0] [ ( 1 + λ 1 ) w , ( 1 + λ 2 ) w ] = [ 0.52 , 0.78 ] [(1+\lambda_1)w,(1+\lambda_2)w]=[0.52,0.78] [(1+λ1)w,(1+λ2)w]=[0.52,0.78]范围内取一个值就形成了负样本的宽。

有了正负样本之后,训练时,正样本仍然使用重构损失,即锚框回归使用 l 1 l_1 l1和GIOU损失,标签分类使用focal损失。负样本因为原本就远离真实目标框了,所以框不必优化,而是希望将负样本分类为“no object”,使用focal损失。

除正负样本的生成与损失外,DINO与DN-DETR的区别还有以下几点:
(1)DN-DETR将匹配部分的内容查询(解码器嵌入)改为了类别标签嵌入,所以设置了一个指示项来区分匹配部分和去噪部分,但是DINO没有改变匹配部分的解码器嵌入所以不需要指示项。DN-DETR使用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)的矩阵, − 1 -1 1留给指示项;DINO中初始化一个尺寸为 ( n u m _ c l a s s e s + 1 , h i d d e n _ d i m ) (num\_classes+1,hidden\_dim) (num_classes+1,hidden_dim)的矩阵。
(2)上面DN-DETR初始化的矩阵 + 1 +1 +1留给了匹配部分的内容查询,DINO的 + 1 +1 +1则是留给负样本。
(3)与DN-DETR一样,DINO会施加不同版本的噪声到真实目标的框和标签上。每组中每个真实目标的框和标签都会产生一个正样本和一个负样本。不同的是,DN-DETR固定每次都分5组,DINO则采取了动态组数的策略,当前批次数据中目标多时就组数就少一些,反之就多一些。

2.2 混合查询选择(Mixed Query Selection)

该操作仅针对匹配部分,不影响去噪部分。

DETR、Deformable DETR、DINO的解码器查询初始化间的差异如下图所示:

DETR的内容查询是初始化为0,位置查询是用nn.Embedding随机初始化成可学习的参数。

Deformable DETR的内容查询和位置查询均由编码器输出导出。 首先编码器输出memory经过一次不变维度的全连接映射,再经过预测头预测类别和框,取类别分数topk的框(k和解码查询数量300一致),之后将topk的框的4个值进行位置编码再经过一次不变维度的全连接映射,最后分割为两部分分别作为解码器的初始化内容和位置查询。

可以看出将框的值经过位置编码再做全连接和分割感觉并不是很合理,毕竟内容查询用位置编码的映射做初始化没什么道理。所以DINO直接把topk的4个值作为位置查询的初始化,而内容查询的初始化是用nn.Embedding随机初始化成可学习的参数。

2.3 向前看两层的锚框更新(Look Forward Twice)

每层解码器输出都参与损失计算时才有用。

Deformable DETR、DINO的锚框更新间的差异如下图所示:

Deformable DETR的解码器层会预测锚框的偏移量从而逐层更新锚框。 例如上图(a)中 b i − 1 b_{i-1} bi1是上一层的锚框预测,经 L a y e r i Layer_i Layeri后得出偏移量 Δ b i \Delta b_i Δbi,综合得出该层锚框预测 b i ′ b_i^{\prime} bi

但是每层的预测结果在进行损失计算时只会影响当前层的参数更新,例如 b i ′ b_i^{\prime} bi作为第 i i i层的预测传入第 i + 1 i+1 i+1层前会被detach,即上图(a)中的虚线。detach后 b i ′ b_i^{\prime} bi b i b_i bi值相同但与该项相关的损失梯度就无法从第 i + 1 i+1 i+1层传到第 i i i层。

作者认为后一层的信息可能有助于修正前一层的锚框偏移量,所以把预测 b i p r e d b_i^{pred} bipred b i − 1 + Δ b i b_{i-1}+\Delta b_i bi1+Δbi改为了 b i − 1 ′ + Δ b i b^{\prime}_{i-1}+\Delta b_i bi1+Δbi 这样第 i + 1 i+1 i+1层的梯度可以传递到第 i + 1 i+1 i+1层和第 i i i层,同时指导 L a y e r i Layer_i Layeri L a y e r i + 1 Layer_{i+1} Layeri+1的更新,再往前就不行了,如下图所示:

致谢:

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

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

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

相关文章

《IT 领域准新生暑期预习指南:开启未来科技之旅》

IT专业入门&#xff0c;高考假期预习指南 高考的落幕&#xff0c;只是人生长途中的一个逗号&#xff0c;对于心怀 IT 梦想的少年们&#xff0c;新的征程已然在脚下铺展。这个七月&#xff0c;当分数尘埃落定&#xff0c;你们即将迈向新的知识殿堂&#xff0c;而这个假期&#…

Git使用[推送大于100M的文件后解救办法]

推送大于100M的文件后解救办法 本文摘录于&#xff1a;https://blog.csdn.net/u012150602/article/details/122687435只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 当有文件大于100M的时候在提交的时候没有问题,但是在push的似乎就不行…

番外篇 | 手把手教你如何去更换YOLOv5的检测头为ASFF_Detect

前言:Hello大家好,我是小哥谈。自适应空间特征融合(ASFF)的主要原理旨在解决单次检测器中不同尺度特征的不一致性问题。具体来说,ASFF通过动态调整来自不同尺度特征金字塔层的特征贡献,确保每个检测对象的特征表示是一致且最优的。本文所做出的改进是将YOLOv5的检测头更换…

程序算法设计分析

动态规划和分治、贪心相比有什么区别&#xff1f;各自的优缺点&#xff1f; 分治算法特征&#xff1a; 1&#xff09;规模如果很小&#xff0c;则很容易解决。//一般问题都能满足 2&#xff09;大问题可以分为若干规模小的相同问题。//前提 3&#xff09;利用子问题的解&#x…

O2OA(翱途)开发平台 V9.1 即将发布,更安全、更高效、更开放

尊敬的O2OA(翱途)平台合作伙伴、用户以及亲爱的开发小伙伴们&#xff0c;O2OA(翱途)平台 V9.1将于7月3日正式发布&#xff0c;届时欢迎大家到O2OA官网部署下载及体验最新版本。新版本我们在如下方面做了更大的努力&#xff1a; 1.扩展数据库兼容性和功能范围&#xff1a;在O2OA…

基于Web技术的教育辅助系统设计与实现(SpringBoot MySQL)+文档

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

汽车电子工程师入门系列——CAN 规范系列通读

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

使用ps给gif动图抠图

目录 导入gif图片 打开时间轴 选择图片 魔棒抠图-初步抠图 套索抠图-精准抠图 导入gif图片 打开时间轴 因为gif动图实际上多张图片实现的效果&#xff0c;所以如果要给gif抠图&#xff0c;就得挨个给每个时间线的图片抠图 点击窗口->时间轴 选择图片 在时间轴上选择要…

以 Vue 3 项目为例,多个请求下如何全局封装 Loading 的展示与关闭?其中大有学问!

大家好,我是CodeQi! 项目开发中,Loading 的展示与关闭是非常关键的用户体验设计。 当我们的应用需要发起多个异步请求时,如何有效地管理全局 Loading 状态,保证用户在等待数据加载时能有明确的反馈,这是一个值得深入探讨的问题。 本文将以 Vue 3 项目为例,详细讲解如…

eventloop 事件循环机制 (猜答案)

// eventloop 事件循环机制// console.log(555);setTimeout(() > {console.log(666);})let p new Promise((resolve,reject)>{// 同步执行console.log(111);resolve();});// promise 的回调函数是异步的微任务p.then(v > {console.log(222);}, r > {console.log(r…

STMF4学习笔记(天空星)

前言&#xff1a;本篇笔记参考嘉立创文档&#xff0c;连接放在最后 #RTC相关概念定义 Real-Time Clock 缩写 RTC 翻译 实时时钟&#xff0c;是单片机片内外设的一种&#xff0c;作用于提供准确的时间还有日期&#xff0c;这个外设有独立的电源&#xff0c;当单片机停止供电…

Java同步包装器

通过 Collections.synchronizedList() 方法将一个普通的 ArrayList 包装成了线程安全的 List&#xff1a; import java.util.*;public class SynchronizedWrapperExample {public static void main(String[] args) {// 创建一个非线程安全的 ArrayListList<String> list…

AzureDataFactory Dataverse connector自动处理了分页问题(单次查询上限5000条的限制)

众所周知&#xff0c;在用fetch执行D365的查询时&#xff0c;单次的查询是5000条&#xff0c;如果超过5000条则需要自己处理分页&#xff0c;添加额外的处理逻辑&#xff0c;但在ADF中&#xff0c;Dataverse connector已经自动处理了分页&#xff0c;我们可以很简单的做个POC. …

计算机网络——数据链路层(点对点协议PPP)

点对点协议PPP的概述 对于点对点的链路&#xff0c;目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。 它主要应用于两个场景&#xff1a; 用户计算机与ISP之间的链路层协议就是点对点协议 PPP&#xff0c;1999年公布了回以在以太网上运行的PPP协…

【教程】lighttpd配置端口反向代理

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 1、修改配置文件&#xff1a; sudo vim /etc/lighttpd/lighttpd.conf2、先添加mod_proxy&#xff1a; 3、然后添加端口映射&#xff1a; 4、保存&…

耗材分类功能解析:智慧校园的必备利器

在智慧校园的资产管理架构中&#xff0c;耗材分类功能是确保日常运营物资有效管理的关键组成部分&#xff0c;它致力于提高耗材使用的效率和经济性。此功能通过智能化、精细化的管理手段&#xff0c;对校园内各种易耗品进行科学分类与跟踪。 耗材分类功能首先建立在对校园日常运…

C++ 实现QT信号槽

https://github.com/libsigcplusplus/libsigcplusplus #include <iostream>/* 在sigslot.h的420,将&#xff1a; //typedef sender_set::const_iterator const_iterator; 改为&#xff1a; //typedef typename sender_set::const_iterator const_iterator;#include <…

Softing助力工业4.0 | 通过OPC UA和MQTT访问SINUMERIK 840D CNC控制器数据

Softing uaGate 840D是用于采集西门子SINUMERIK 840D SL/PL CNC控制器数据的物联网网关&#xff0c;支持OPC UA服务器和MQTT发布功能。该网关提供对SINUMERIK 840D CNC控制器机床数据的访问&#xff0c;支持读取、处理重要的主轴和从轴数据&#xff0c;例如扭矩和功耗&#xff…

C++——stack和queue类用法指南

一、stack的介绍和使用 1.1 stack的介绍 1、stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行插入与提取操作 2、stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&am…

Halcon OCR字符识别(极坐标转换,字符识别)

Halcon OCR字符识别&#xff08;极坐标转换&#xff0c;字符识别&#xff09; 代码 * 1.加载图片 *************************************************** dev_close_window () read_image (Image, ./img) get_image_size (Image, Width, Height) dev_get_window (WindowHandle…