问题引出#
在做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,直接预测一组不重复的目标实例。
模型架构#

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

Backone#

原始 DETR 使用 ResNet-50 / ResNet-101
输出特征:
通常是 stride=32 的特征图
通道数 C=2048 → 1×1 Conv 降到 d_model=256
注意: DETR 并不做 FPN,也没有多尺度(这是早期性能瓶颈的来源之一)。
Transformer-encoder#
多层 self-attention
每个位置可以“看到”全图
建立长程依赖
这一阶段不关心“目标是什么”, 只是在构建全局一致的视觉语义表示。

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


推理#
Input Image
↓
Backbone
↓
Transformer Encoder
↓
Transformer Decoder(100 Queries)
↓
pred_logits, pred_boxes
↓
softmax + threshold
↓
最终检测结果
过滤背景 Query#
score 低的自然是 no-object
可以加阈值(如 0.5)
📌 没有 NMS
