DAB-DETR源码最全讲解

文章目录

  • 一: 创新点
  • 二:源码讲解

一: 创新点

在我看来,是在Conditional-DETR的基础上的延伸,这一“流派”主要针对content_q和pos_q做了许多tricks。DAB在Conditional的基础上,加上了w,h回归框的思想,reference_points由(x, y)变为了(x, y, w, h),并且在decoderLay中一次次修正。

对于Conditional-DETR还不太了解的小伙伴,可以移步到Contional-DETR源码浅析这篇文章。下面对DAB-DETR的源码进行讲解,不久后还会发布2022-CVPR中的DN-DETR论文讲解。

二:源码讲解

  • DABDETR模块

对于主模块,只有一个核心重点:self.refpoint_embed = nn.Embedding(num_queries, query_dim),比如是[batchsize, 10, 4],直接对num_queries个box预测框进行offest预测。传统的一些DETR网络都是设置的self.query_pos:[batchsize, 10, hidden_dim],这是最大的亮点

因为它,outputs_coords的生成和以往有一点点不同,DAB-DETR是将输出结果和(x,y,w,h)进行的相加,而以往的都是对(x, y)进行的相加,原因就是该网络一直预测的是对整个回归框的修正offset,以前只是修正固定不变的reference_points,也就是x,y。

并且需要注意的是!!在decoder中,self.bbox_embed也是需要进行的,而不是只在DABDETR模块最后进行。因为经过每一层decoderLayer后,都要更新reference_points,然后用新生成的reference_points来生成query_sine_embedquery_pos!!这也是第二大亮点每一层decoder都要更新reference_points

下面展示DABDETR模块源码:

DAB-DETR源码最全讲解_第1张图片

  • decoder模块
    transformer模块中的encoder模块比较普通,就是最基本的self-attention,输出memory。重点就是decoder模块,先看源码:

DAB-DETR源码最全讲解_第2张图片DAB-DETR源码最全讲解_第3张图片这里的decoder和conditional-DETR中的decoder最大区别:由代表offset的self.references_embed向量,来推出query_pos和query_sine_embed,并且还能随着Layer层不断更新,十分灵活!是第一个天秀细节

以往是通过query_pos推出reference_points,然后再由reference_points推出query_sine_embed,同时利用每层output推出的transformation_matrix微调query_sine_embed,最后输入进decoderlayer。

第二个天秀细节,是利用output生成(batchsize, num_queries, 2),其中的2表示w和h的相对坐标,和reference_points中3、4索引(也就是w,h)作比较,得到变换系数后,调节query_sine_embed中的h, w(默认前一半是负责h的特征,后一半是负责w的特征)。算上由output生成的,且也用来微调query_sine_embedpos_transformation系数矩阵,decoder中利用output对query_sine_embed进行了两次微调操作!!

第三个天秀细节,就是每层decoderLayer的输出output,都会进行self.bbox_embed(output)操作,得到相对于当前reference_points的offset,然后更新reference_points。下一次的decoderLayer就会以这次更新后的reference_points来重新生成query_sine_embed和query_pos等,真正做到了灵活多变!!!!

最后展示一下decoderLayer模块源码,中规中矩,和conditional-DETR一模一样。

  • decoderLayer模块

DAB-DETR源码最全讲解_第4张图片DAB-DETR源码最全讲解_第5张图片DAB-DETR源码最全讲解_第6张图片

你可能感兴趣的:(Transformer检测系列,深度学习,计算机视觉,人工智能,神经网络)