这一篇我们主要总结一下deformable detr中值得注意的几个地方。
-
DeformableTransformer中在不使用two_stage的条件下提供的reference_points是由nn.Embedding经过线性变化得到的,值得注意的是这个·reference_points·直接参与了loss的计算,也就是说这个分支上对self.reference_points层进行了训练。 -
DeformableTransformer中使用two_stage的条件下在每个位置上都生成了proposal,然后选择topk个proposal作为query的reference_point,但是可以发现这里的topk 进行了detach,并不会传递从decoder传来的梯度误差。 -
DeformableTransformer中使用two_stage的条件会在encoder的输出层的每个位置提供一个anchor,对于多尺度而言,提供了不同尺度的anchor。这里有个注意的是此时的query数量非常大,这会导致两个问题:第一,正负样本会很不均衡;第二,使用matcher分配gt给proposal会导致分配较慢,且密集proposal上进行一一配对会导致训练不稳定,较难收敛。 - 正如@若空虚無
指出,DeformableTransformerDecoder在 不用return_intermediate时的输出需要进行unsqueeze,否则在detector中调用时会有维度问题。 - 在
deformable_detr中DeformableDETR的定义中, 在使用refine技术时,class_embed、bbox_embed是不共享参数的, 而不使用refine技术时,每层的class_embed, bbox_embed是参数共享的,使用nn.ModuleList主要是为了forward中推理代码的统一。
