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