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

相关推荐
刘什么洋啊Zz3 小时前
MacOS下使用Ollama本地构建DeepSeek并使用本地Dify构建AI应用
人工智能·macos·ai·ollama·deepseek
东方芷兰3 小时前
伯克利 CS61A 课堂笔记 11 —— Mutability
笔记·python
奔跑草-4 小时前
【拥抱AI】GPT Researcher 源码试跑成功的心得与总结
人工智能·gpt·ai搜索·deep research·深度检索
禁默4 小时前
【第四届网络安全、人工智能与数字经济国际学术会议(CSAIDE 2025】网络安全,人工智能,数字经济的研究
人工智能·安全·web安全·数字经济·学术论文
boooo_hhh6 小时前
深度学习笔记16-VGG-16算法-Pytorch实现人脸识别
pytorch·深度学习·机器学习
AnnyYoung6 小时前
华为云deepseek大模型平台:deepseek满血版
人工智能·ai·华为云
INDEMIND7 小时前
INDEMIND:AI视觉赋能服务机器人,“零”碰撞避障技术实现全天候安全
人工智能·视觉导航·服务机器人·商用机器人
慕容木木7 小时前
【全网最全教程】使用最强DeepSeekR1+联网的火山引擎,没有生成长度限制,DeepSeek本体的替代品,可本地部署+知识库,注册即可有750w的token使用
人工智能·火山引擎·deepseek·deepseek r1
南 阳7 小时前
百度搜索全面接入DeepSeek-R1满血版:AI与搜索的全新融合
人工智能·chatgpt
企鹅侠客7 小时前
开源免费文档翻译工具 可支持pdf、word、excel、ppt
人工智能·pdf·word·excel·自动翻译