当前位置: 首页 > news >正文

RT-DETR学习笔记(2)

七、IOU-aware query selection

下图是原始DETR。content query 是初始化为0的label embedding, position query 是通过nn.Embedding初始化的一个嵌入矩阵,这两部分没有任何的先验信息,导致DETR的收敛慢。

 RT-DETR则提出要给这两部分(content query & position query)都加上先验信息;

从memory中取一部分表现好的(类别预测准确 & 预测框定位准确)query作为decoder的输入


存在问题

Efficient DETR,Deformable DETR,DINO这几个方法都是使用类别置信分数从编码器中选择前K个特征,作为目标查询(或位置查询)的初始化。然而,由于检测器需要同时建模目标的类别和位置,这两者共同决定了特征的质量。当前的查询选择方法在所选特征中引入了较高的不确定性,导致解码器的初始化次优。


 解决方法

提出了最小不确定性查询选择(Uncertainty-Minimal Query Selection)方案,该方案通过显式构建和优化编码器特征的模型不确定性(epistemic uncertainty)

目的是让低IOU 的预测框有低的置信度,高IOU的预测框有高的置信度;

memory左边通过位置检测头计算出坐标的相对位置,加上在feature map平铺的anchor得到绝对位置坐标;

右边通过类别检测头得到类别信息,提取top-300(对于每一个query挑选出置信度最高的类别作为query的预测类别,然后再对所有query的预测类别置信度最高的300个query);

让左右两边预测出的坐标与类别计算损失;(损失部分详细解读)


有效性分析

  • 蓝色点---vanilla query selection ,普通的(top-k类别置信度)query选择方案;
  • 红色点---IOU-aware uery selection

越靠近右上角质量越高


代码解读

通过_get_decoder_input()函数生成decoder输入

 通过_get_decoder_input()函数,从memory中挑选出top-300的query;将挑选出来的300个query与denoising部分加噪生成的200个queryconcat在一起从而生成decoder的输入


_get_decoder_input()函数输入

  • memory:hybrid encoder的输出,如下图;

memory,spatial_shape: _get_encoder_input()返回值:


生成anchor

grid_size: 在72*72的feature map上生成的anchor高和宽的默认值是0.05(在归一化特征图尺度下锚框的宽高,剋理解为一个锚框占整个特征图的5%大小);在36*36的feature map上默认是0.05 *2 ; 18*18上默认是0.05*2*2;

通过for循环一次迭代出每一个feature map的尺寸;

 通过meshgrid生成二维网格坐标,组合成(x,y)格式;

将网格坐标加上0.5表示网格的中心位置;

除以宽高对网格坐标进行归一化;

计算每个特征层上的锚框的宽高:低层特征图(72*72)锚框更小,适用于小目标,例如lvl=0时,\wh=0.05;高层特征图(18*18)锚框更大,适用于检测大目标,例如lvl=2,wh=0.05*2*2=0.2;

然后concat  wy和wh,reshape成序列形式,注意这里的xywh都是归一化的形式

注意这部分anchor大小的理解:

S3是72*72,属于低层特征图,归一化后的wh大小是0.05,8是感受野大小,3.6是在72的特征图上anchor大小,相乘得到的28.8是一个anchor投射到原图像上的尺寸大小;

在这三个不同尺度的特征图上,anchor归一化的尺寸不同,但映射回各自的特征图上的实际wh都是一样的;

低层特征图的anchor小,用于检测小目标;

高层特征图的anchor大,用于检测大目标;


 concat 三个特征图归一化后的anchor尺寸;

valid_mask:布尔张量,anchor都在(0.01,0.99)范围内,置为1;超出这个范围被认为是无效anchor,置为0;


使用sigmoid的反函数将anchor映射回实数空间 ,避免模型的梯度会变得非常小(饱和问题),影响训练效果;

将无效anchor的位置置为无穷大;


类别检测头和预测框检测头

topk_ind:通过类别置信度排序选取的top-300在enc_outputs_class 6804 中对应的索引;‘

根据topk_ind索引在enc_outputs_coord_unact提取出对应的300个bbox坐标;

 注意target,有梯度分离操作,保证在反向传播过程中不会影响这部分梯度;

最后的返回值:

target:是denoising部分和IOU-aware部分concat的内容;

reference_points_unact:是denoising部分和IOU-aware部分concat的内容;

target和reference_points_unact是decoder的输入;

enc_topk_bboxes和enc_topk_logitstargettarget需要用来做损失计算;


 八、Decoder

bbox_head:坐标检测头,ModuleList:6,不同的layer使用不同的检测头

score_head:类别检测头,同bbox



 query_pos_head:MLP,用来将坐标位置的xywh编码为256的向量;因为要和内容部分相加,所以尺寸需要保持一致;


 每一层的输出都是下一层的输入:


创建两个列表保存每层decoder的类别输出和坐标输出


Multi-Scale Deformable Attention


DecoderLayer输出

 将decoder的输出经过一个bbox检测头,得到的结果是一个相对与ref_points_detach的偏移量;

ref_points_detach通过sigmoid反函数将值映射回原始值 再加上 bbox检测头得到的偏移量;

相加结果再经过sigmoid得到预测出的绝对位置归一化后的值

得到的这个结果会赋给下一层decoder的输入部分;即下一个decoder会将上一层decoder调整过偏移量后的坐标作为基准坐标;


 完整decoder输出

最后6层Decoder结束后,返回的是每一层的bbox和score 预测结果:


http://www.mrgr.cn/news/81321.html

相关文章:

  • Redis 介绍和安装
  • scala借阅图书保存记录(三)
  • ArKTS基础组件3
  • 自动屏蔽频繁访问IP,提升服务器安全:实战脚本解析
  • 数据结构---------二叉树前序遍历中序遍历后序遍历
  • Unity 圆形循环复用滚动列表
  • CTFHub disable_functions通关
  • 华为路由器AR101W-S
  • go语言并发文件备份,自动比对自动重命名(逐行注释)
  • Require:离线部署 Sourcegraph
  • Linux驱动开发--字符设备驱动开发
  • STM32 高级 谈一下IPV4/默认网关/子网掩码/DNS服务器/MAC
  • c++类型判断和获取原始类型
  • Flutter 实现全局悬浮按钮学习
  • Linux自动挂载与卸载USB设备
  • 菜鸟带新鸟——基于EPlan2022的部件库制作
  • 免费 IP 归属地接口
  • C++程序启动报错和启动失败的常见原因分析与排查经验总结
  • Linux -- 从抢票逻辑理解线程互斥
  • 开发场景中Java 集合的最佳选择
  • 深入理解批量归一化(BN):原理、缺陷与跨小批量归一化(CmBN)
  • 数据库安全-redisCouchdb
  • 鸿蒙-expandSafeArea使用
  • QT程序发布后,mysql在其它电脑设备无法连接数据库
  • Marscode AI辅助编程
  • Python超能力:高级技巧让你的代码飞起来