在我看来,是在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论文讲解。
对于主模块,只有一个核心重点: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_embed
和query_pos
!!这也是第二大亮点,每一层decoder都要更新reference_points。
下面展示DABDETR模块源码:
这里的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一模一样。