跳过正文
  1. 日常记录、技术札记与转载收藏。/

DETR

目录

问题引出
#

在做DETR之前,目标检测都是下面两种任务方式:

1.1 Two-stage(Faster R-CNN 系)
#

  • RPN 产生候选框

  • RoI Pooling + 分类 / 回归

  • 大量人工设计:Anchor、NMS、RoI 对齐规则

1.2 One-stage(YOLO / SSD / RetinaNet)
#

  • 密集预测(Dense Prediction)

  • Anchor-based

  • 同样高度依赖:

    • Anchor 尺寸与比例设计

    • 后处理 NMS

他们都存在同一个问题:都需要大量的人工后处理,非端到端。

DETR是怎么做的
#

将目标检测建模为一个“集合预测(Set Prediction)问题”,

使用 Transformer 的 Query–Key–Value 机制,

通过一组固定数量的 Object Queries,直接预测一组不重复的目标实例。

模型架构
#

Image

具体的工作流程是这样做的,先用一个预训练的cnn模型去抽取特征,将抽取到的特征用transformer的encode去做自注意力,这个过程就是为了做全局信息的交互,然后下一个就是做decoder的,query是一组可学习的向量,kv还是来原于之前的encode。每一个query去找一个目标,论文里面设置的是100个。也就是说最后会输出100个box。Set Prediction & 匈牙利匹配在预测集合与 GT 集合之间做 一对一最优匹配未匹配的预测 → no-object。

代码定位
#

Image

Backone
#

Image
  • 原始 DETR 使用 ResNet-50 / ResNet-101

  • 输出特征:

    • 通常是 stride=32 的特征图

    • 通道数 C=2048 → 1×1 Conv 降到 d_model=256

注意: DETR 并不做 FPN,也没有多尺度(这是早期性能瓶颈的来源之一)。

Transformer-encoder
#

  • 多层 self-attention

  • 每个位置可以“看到”全图

  • 建立长程依赖

这一阶段不关心“目标是什么”, 只是在构建全局一致的视觉语义表示

Image

Transformer-decoder
#

在 Decoder 中,每一层包含:

\(1\) Self-Attention(Query–Query)
#

  • Query 之间交互

  • 作用:

    • 避免多个 Query 预测同一个目标

    • 学习“互斥关系”

\(2\) Cross-Attention(Query–Image)
#

  • Query 作为 Q

  • Encoder 输出作为 K / V

  • 作用:

    • Query 从全图中“聚焦”到一个目标区域

Aux Loss(训练技巧)
#

if self.aux_loss:

out

\['aux_outputs'\]

= …

对每一层 Decoder 都加监督

缓解收敛慢问题

本质是 Deep Supervision 深度监控

#

训练
#

ETR 模型代码在 forward() 阶段输出的,并不是“已经确定对应 GT 的检测结果”, 而是一个「无序的、固定大小的候选预测集合(set of predictions)」; 真正的“谁对应哪个 GT”,只在训练时由 SetCriterion + Hungarian Matching 在损失中临时决定。

固定 100 个 Query 的预测集合 + 匈牙利匹配 + 集合级监督

SetCriterion

Image
Image

推理
#

Input Image

Backbone

Transformer Encoder

Transformer Decoder(100 Queries)

pred_logits, pred_boxes

softmax + threshold

最终检测结果

过滤背景 Query
#

  • score 低的自然是 no-object

  • 可以加阈值(如 0.5)

📌 没有 NMS

相关文章