【问题标题】:Why DETR need to set a empty class?为什么DETR需要设置一个空类?
【发布时间】:2023-02-09 23:29:22
【问题描述】:

为什么DETR需要设置一个空类? 它设置了一个“Background”类,意思是非对象,为什么?

【问题讨论】:

    标签: pytorch transformer-model


    【解决方案1】:

    长话短说

    默认情况下,DETR 总是预测 100 个边界框。空类作为过滤掉无意义边界框的条件。

    完整解释

    如果您查看 source code,转换器解码器会将每个查询从 self.query_embed.weight 转换为输出 hs

    hs = self.transformer(self.input_proj(src), mask, self.query_embed.weight, pos[-1])[0]
    

    然后线性层self.class_embedhs映射到对象类outputs_class。另一个线性层self.bbox_embed将相同的hs映射到边界框outputs_coord

    outputs_class = self.class_embed(hs)
    outputs_coord = self.bbox_embed(hs).sigmoid()
    out = {'pred_logits': outputs_class[-1], 'pred_boxes': outputs_coord[-1]}
    

    边界框的数量设置为num_queries(默认为100)。

    detr = DETR(backbone_with_pos_enc, transformer, num_classes=num_classes, num_queries=100)
    

    正如您现在看到的,如果没有空类,DETR 将始终预测 100 个边界框(DETR 将始终尝试绑定这个和那个 100 次),即使图像中只有一个对象。

    现在,让我们考虑下面的例子。只有两个有意义的对象(两只鸟)。但是 DETR 仍然预测 100 个边界框。值得庆幸的是,与“空类”相对应的 98 个框被丢弃了(下面的绿色框和蓝色框,加上下图中未显示的其余 96 个框)。只有输出类别为“bird”的红色框和黄色框才有意义,因此被视为预测。

    这就是 DETR 进行动态对象预测的方式。它可以预测小于或等于num_queries但不超过此的任意数量的对象。如果你想让DETR预测超过100个物体,比如500个。那么你可以将num_queries设置为500或以上。

    【讨论】:

      【解决方案2】:

      我认为第一个解码器层的交叉注意力将根据学习到的位置嵌入来更新查询的类嵌入。

      DETR 中使用的交叉注意力权重计算如下:

      (query + query_pos) @ (key + key_pos)^T
      

      这里 query 是查询的类嵌入,在第一层它们是无意义的(初始化为全零),但是学习了 query_pos 表示查询的粗略检测区域。第一层之后,类嵌入主要根据query_poskey_pos之间的相似性进行更新。因此,第一层之后的类嵌入主要关注查询位置周围的特征。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-06
        • 1970-01-01
        • 2010-11-17
        • 1970-01-01
        • 2011-04-02
        • 1970-01-01
        相关资源
        最近更新 更多