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 预测结果:

相关推荐
车载诊断技术2 小时前
电子电气架构 --- 什么是EPS?
网络·人工智能·安全·架构·汽车·需求分析
KevinRay_2 小时前
Python超能力:高级技巧让你的代码飞起来
网络·人工智能·python·lambda表达式·列表推导式·python高级技巧
跃跃欲试-迪之2 小时前
animatediff 模型网盘分享
人工智能·stable diffusion
Captain823Jack2 小时前
nlp新词发现——浅析 TF·IDF
人工智能·python·深度学习·神经网络·算法·自然语言处理
被制作时长两年半的个人练习生2 小时前
【AscendC】ReduceSum中指定workLocal大小时如何计算
人工智能·算子开发·ascendc
Captain823Jack3 小时前
w04_nlp大模型训练·中文分词
人工智能·python·深度学习·神经网络·算法·自然语言处理·中文分词
Black_mario3 小时前
链原生 Web3 AI 网络 Chainbase 推出 AVS 主网, 拓展 EigenLayer AVS 应用场景
网络·人工智能·web3
eybk3 小时前
Pytorch+Mumu模拟器+萤石摄像头实现对小孩学习的监控
学习
6.943 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
Aileen_0v03 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper