Task: Object Detection
Method: Transformer, Set Prediction, Bipartite Matching
Venue: ECCV
Year: 2020
Paper: https://arxiv.org/abs/2005.12872
Code: https://github.com/facebookresearch/detr
摘要
本文提出了一种全新的目标检测方法,将检测任务视为直接的集合预测问题。该方法简化了检测流程,有效地移除了许多手工设计的组件——如非极大值抑制(NMS)和 anchor 生成等需要显式编码先验知识的模块。新框架称为 DEtection TRansformer(DETR),其核心包含两个关键要素:一是基于二分图匹配的集合预测损失函数,强制预测结果具有唯一性;二是 Transformer 编码器-解码器架构。给定固定数量的可学习 object queries,DETR 通过推理物体之间的关系和全局图像上下文,以并行方式直接输出最终的预测集合。该模型概念简洁,不需要专门的库支持。在 COCO 数据集上,DETR 达到了与经过大量优化的 Faster R-CNN 基线相当的精度和推理速度。此外,DETR 可以简单地扩展到全景分割任务,并在该任务上显著超越竞争基线。
核心论点:目标检测本质上是集合预测问题,用 Transformer 的全局注意力机制 + 二分图匹配损失替代 anchor/proposal/NMS 等手工组件,实现真正端到端的检测。这一范式转变将检测从”基于先验的局部匹配”推向”基于全局推理的集合预测”。
问题与动机
目标检测的目标是预测一组边界框和类别标签。现有方法通过 间接方式 处理这个集合预测任务:
| 方法类型 | 代表作 | 核心问题 | AP(COCO) |
|---|---|---|---|
| 两阶段 | Faster R-CNN | 需要 proposal + NMS,流程复杂 | 42.0 |
| 单阶段-anchor | RetinaNet | anchor 设计复杂,正负样本不平衡 | 40.1 |
| Anchor-free | FCOS / CenterNet | 仍需 NMS 后处理 | 41.0 / 42.1 |
| 集合预测(RNN) | Stewart et al. | 自回归解码,速度慢,难优化 | — |
三个无法调和的矛盾:
- 端到端训练 vs NMS 不可微分(所有主流方法都依赖 NMS)
- 无先验假设 vs anchor/proposal 设计(需要人工编码尺度、比例等先验)
- 全局推理 vs 局部特征匹配(CNN 感受野有限,难以建模物体间关系)
核心痛点:现有检测器的性能严重依赖后处理步骤(NMS)、anchor 集合设计和目标框与 anchor 的匹配启发式规则,无法实现真正的端到端检测。
核心洞察
DETR 基于三个关键观察重新设计检测流程:
洞察 1:集合预测替代分类回归
传统方法将检测分解为”在大量候选位置上做分类 + 回归”,而 DETR 直接预测一个固定大小的集合。
传统做法:生成数千个 anchor/proposal → 逐个分类 + 回归 → NMS 去重
DETR 做法:固定 $N=100$ 个预测槽位 → 通过二分图匹配与 GT 建立一对一对应 → 无需去重
匈牙利匹配的核心公式:
$$\hat{\sigma} = \arg\min_{\sigma \in \mathfrak{S}_N} \sum_{i}^{N} \mathcal{L}_{\text{match}}(y_i, \hat{y}_{\sigma(i)})$$其中匹配代价包含分类概率和边界框距离:
$$\mathcal{L}_{\text{match}}(y_i, \hat{y}_{\sigma(i)}) = -\mathbb{1}_{\{c_i \neq \varnothing\}} \hat{p}_{\sigma(i)}(c_i) + \mathbb{1}_{\{c_i \neq \varnothing\}} \mathcal{L}_{\text{box}}(b_i, \hat{b}_{\sigma(i)})$$为什么更优:一对一匹配从根本上消除了重复预测,使 NMS 完全不再需要。
洞察 2:Transformer 全局建模分离实例
CNN 的局部感受野难以建模物体间的全局关系,导致重叠/遮挡场景下容易产生重复检测。
传统做法:CNN 提取局部特征 → 后处理阶段通过 NMS 消除重复
DETR 做法:Transformer 编码器的自注意力在特征提取阶段就建模全局关系 → 编码器输出已初步分离实例
论文可视化表明,经过 Transformer 编码器后,每个物体的注意力已经能很好地聚焦在对应区域,即编码器在特征层面就完成了实例分离。解码器的交叉注意力则关注物体的极值点(头、腿、边界),精确提取类别和边界信息。
关键优势:编码器的全局自注意力使 DETR 在大物体检测上远超 Faster R-CNN($AP_L$ 高出 7.8 个点),因为大物体更依赖全局上下文。
洞察 3:Object Queries 作为可学习的检测槽位
传统检测器用手工设计的 anchor 或 proposal 来定义”在哪里找目标”,DETR 用 100 个可学习的 object queries 替代。
传统做法:预定义 anchor 尺度和比例 → 通过启发式规则分配正负样本
DETR 做法:100 个可学习嵌入向量 → 通过注意力机制自动学习关注图像中不同区域和尺度
论文 object query 可视化显示,每个 query 学会了特化为检测特定区域和尺度的目标。例如,有的 query 专注于左下角的小目标,有的 query 专注于图像中央的大竖向目标。这种特化是自动学习得到的,无需人工设计。
要记住的 3 个数字:
- 42.0 AP:DETR(ResNet-50)在 COCO 上与优化过的 Faster R-CNN-FPN+ 完全持平
- +7.8 AP$_L$:大物体检测精度远超 Faster R-CNN(61.1 vs 53.4)
- 500 epochs:DETR 需要极长的训练周期(传统检测器通常 12-36 epochs)
方法设计
整体架构
$$\text{Object Detection} = \text{CNN Backbone} + \text{Transformer Encoder-Decoder} + \text{Set Prediction Loss}$$
论文 Figure 2 — DETR 整体架构(图源论文)
输入图像
↓
[3, H₀, W₀]
↓
┌───────────────────────┐
│ CNN Backbone │
│ ResNet-50 (stride=32)│
└───────────────────────┘
↓
[2048, H₀/32, W₀/32]
↓
┌───────────────────────┐
│ 1×1 Conv(降维) │
└───────────────────────┘
↓
[256, H, W]
↓
┌───────────────────────┐
│ + 固定正弦位置编码 │
│ 展平为序列 [HW, 256] │
└───────────────────────┘
↓
┌───────────────────────┐
│ Transformer Encoder │
│ 6 层 × (Self-Attn + │
│ FFN) │
│ d=256, heads=8 │
│ FFN dim=2048 │
└───────────────────────┘
↓
编码器记忆 [HW, 256]
↓
Object Queries ──→ ┌───────────────────────┐
[100, 256] │ Transformer Decoder │
(可学习嵌入) │ 6 层 × (Self-Attn + │
│ Cross-Attn + FFN) │
└───────────────────────┘
↓
[100, 256] 解码器输出
↓
┌─────────────────────┼─────────────────────┐
│ │
↓ ↓
┌─────────────┐ ┌─────────────┐
│ Class Head │ │ BBox Head │
│ Linear │ │ 3-layer MLP │
│ 256→92 │ │ 256→256→4 │
│ (91类+∅) │ │ + sigmoid │
└─────────────┘ └─────────────┘
↓ ↓
[100, 92] logits [100, 4] boxes
└─────────────────────┼─────────────────────┘
↓
┌────────────────────────────┐
│ 二分图匹配(匈牙利算法) │
│ 预测 ↔ GT 一对一匹配 │
│ 无需 NMS │
└────────────────────────────┘
↓
输出检测框
[N × (class, cx, cy, w, h)]
关键组件
预测头设计:
| 预测头 | 结构 | 输出尺寸 | 功能 | 损失 |
|---|---|---|---|---|
| 分类头 | Linear(256, 92) | $100 \times 92$ | 预测 91 个 COCO 类别 + 1 个”无物体”类 | 交叉熵($\varnothing$ 类降权 10 倍) |
| 边界框头 | 3 层 MLP + Sigmoid | $100 \times 4$ | 预测归一化的 $(c_x, c_y, w, h)$ | $\ell_1$ + GIoU |
损失函数:
匈牙利损失由分类损失和边界框损失组成:
$$\mathcal{L}_{\text{Hungarian}}(y, \hat{y}) = \sum_{i=1}^{N} \left[ -\log \hat{p}_{\hat{\sigma}(i)}(c_i) + \mathbb{1}_{\{c_i \neq \varnothing\}} \mathcal{L}_{\text{box}}(b_i, \hat{b}_{\hat{\sigma}(i)}) \right]$$边界框损失结合 $\ell_1$ 和 GIoU:
$$\mathcal{L}_{\text{box}}(b_i, \hat{b}_{\sigma(i)}) = \lambda_{\text{iou}} \mathcal{L}_{\text{iou}}(b_i, \hat{b}_{\sigma(i)}) + \lambda_{L1} \| b_i - \hat{b}_{\sigma(i)} \|_1$$其中 $\lambda_{L1} = 5$,$\lambda_{\text{iou}} = 2$。
辅助解码损失:在每个解码器层后添加共享的预测 FFN 和匈牙利损失,帮助模型学习正确的物体数量。
关键代码
核心代码来自官方 GitHub 仓库,以下是关键模块及对应文件:
| 函数/类 | 文件 | 功能 |
|---|---|---|
DETR |
models/detr.py | 主模型:backbone + transformer + 预测头 |
SetCriterion |
models/detr.py | 匈牙利匹配 + 损失计算 |
HungarianMatcher |
models/matcher.py | 二分图匹配(scipy.linear_sum_assignment) |
Transformer |
models/transformer.py | 编码器-解码器 Transformer |
(来源:models/detr.py)
📄 点击展开 DETR forward 代码
class DETR(nn.Module): |
(来源:models/matcher.py)
📄 点击展开 HungarianMatcher 代码
class HungarianMatcher(nn.Module): |
📄 点击展开 Transformer forward 代码
class Transformer(nn.Module): |
实验与分析
主要结果(COCO 数据集)
| 方法 | Backbone | AP | AP$_S$ | AP$_M$ | AP$_L$ | GFLOPS | FPS | 参数量 | 后处理 |
|---|---|---|---|---|---|---|---|---|---|
| Faster RCNN-FPN | R50 | 40.2 | 24.2 | 43.5 | 52.0 | 180 | 26 | 42M | NMS |
| Faster RCNN-FPN+ | R50 | 42.0 | 26.6 | 45.4 | 53.4 | 180 | 26 | 42M | NMS |
| Faster RCNN-R101-FPN+ | R101 | 44.0 | 27.2 | 48.1 | 56.0 | 246 | 20 | 60M | NMS |
| DETR | R50 | 42.0 | 20.5 | 45.8 | 61.1 | 86 | 28 | 41M | 无需 |
| DETR-DC5 | R50 | 43.3 | 22.5 | 47.3 | 61.1 | 187 | 12 | 41M | 无需 |
| DETR | R101 | 43.5 | 21.9 | 48.0 | 61.8 | 152 | 20 | 60M | 无需 |
| DETR-DC5 | R101 | 44.9 | 23.7 | 49.5 | 62.3 | 253 | 10 | 60M | 无需 |
关键发现:
- DETR(R50)以 42.0 AP 与增强版 Faster R-CNN-FPN+(同样 42.0 AP)完全持平,GFLOPS 仅为其一半(86 vs 180)
- 大物体检测显著领先:DETR 的 $AP_L$ 达到 61.1,比 Faster R-CNN-FPN+ 的 53.4 高出 7.7 个点
- 小物体检测是短板:$AP_S$ 仅 20.5,低于 Faster R-CNN-FPN+ 的 26.6(差 6.1 个点)
消融实验:验证三个洞察
编码器层数的影响(验证洞察 2):
| 编码器层数 | AP | AP$_S$ | AP$_M$ | AP$_L$ | 验证洞察 |
|---|---|---|---|---|---|
| 0 | 36.7 | 16.8 | 39.6 | 54.2 | 洞察 #2 |
| 3 | 40.1 | 18.5 | 43.8 | 58.6 | 洞察 #2 |
| 6(基线) | 40.6 | 19.9 | 44.3 | 60.2 | 洞察 #2 |
| 12 | 41.6 | 19.8 | 44.9 | 61.9 | 洞察 #2 |
去除编码器(0 层)导致 AP 下降 3.9,$AP_L$ 下降 6.0,证实全局自注意力对大物体检测至关重要。
损失组件消融(验证洞察 1):
| 分类损失 | $\ell_1$ | GIoU | AP | $\Delta$AP | 验证洞察 |
|---|---|---|---|---|---|
| ✓ | ✓ | ✗ | 35.8 | -4.8 | 洞察 #1 |
| ✓ | ✗ | ✓ | 39.9 | -0.7 | 洞察 #1 |
| ✓ | ✓ | ✓ | 40.6 | — | 洞察 #1 |
GIoU 损失贡献了绝大部分性能(仅缺少 GIoU 时下降 4.8 AP),$\ell_1$ 的补充作用较小但对 $AP_M$ 和 $AP_L$ 有提升。
位置编码消融(验证洞察 3):
| 编码器位置编码 | 解码器位置编码 | Object Queries | AP | $\Delta$AP | 验证洞察 |
|---|---|---|---|---|---|
| 无 | 无 | 学习(输入) | 32.8 | -7.8 | 洞察 #3 |
| 正弦(输入) | 正弦(输入) | 学习(输入) | 39.2 | -1.4 | 洞察 #3 |
| 无 | 正弦(注意力) | 学习(注意力) | 39.3 | -1.3 | 洞察 #3 |
| 正弦(注意力) | 正弦(注意力) | 学习(注意力) | 40.6 | — | 洞察 #3 |
完全移除位置编码后 AP 骤降 7.8,证实 object queries 和位置编码对模型至关重要。
解码器层数的影响(验证洞察 1 + 2):论文 Figure 4 记录了每一层解码器输出的检测性能,以及在各层输出上加 NMS 的效果变化:
| 解码器层 | AP 趋势 | 加 NMS 后效果 | 说明 | 验证洞察 |
|---|---|---|---|---|
| 第 1 层 | 最低(≈33.8) | AP 上升 | 无跨 query 通信,存在大量重复预测,NMS 有效去重 | 洞察 #2 |
| 中间层 | 逐层递增 | AP 提升幅度递减 | 自注意力开始协调各 query,重复预测减少 | 洞察 #2 |
| 第 6 层 | 最高(42.0) | AP 反而下降 | 重复已消除,NMS 误杀正确预测 | 洞察 #1 |
注:第 1 层 AP 为从 Figure 4 折线图读取的近似值,论文未给出逐层精确数值表。
AP 从第 1 层到第 6 层累计提升 +8.2 AP / +9.5 AP$_{50}$。这同时验证了两个洞察:
(1) NMS 从”有益”变为”有害”的渐变过程证明一对一匹配使 NMS 天然多余(洞察 #1);
(2) 这一渐变的根本原因是多层解码器的自注意力逐步抑制重复预测,是全局建模在解码侧的延续(洞察 #2)。
FFN 的重要性(架构通用验证):移除 FFN 导致 AP 下降 2.3(参数量从 41.3M 降到 28.7M)。FFN 可视为 $1 \times 1$ 卷积,为注意力层输出提供逐位置的非线性变换能力,是 Transformer 各组件中不可或缺的一环。该实验与上述编码器、解码器、位置编码消融共同支撑论文的整体结论:全局自注意力、FFN、多层解码器、位置编码四者缺一不可。
性能瓶颈分析
DETR 的主要性能差距体现在小物体上:
| 指标 | DETR(R50) | Faster RCNN-FPN+(R50) | 差距 |
|---|---|---|---|
| AP$_S$ | 20.5 | 26.6 | -6.1 |
| AP$_M$ | 45.8 | 45.4 | +0.4 |
| AP$_L$ | 61.1 | 53.4 | +7.7 |
小物体性能差的根本原因:
- 低分辨率特征图:ResNet-50 stride=32 后特征图尺寸很小(如 800×1066 输入仅得 25×34),小物体信息严重丢失
- 自注意力计算代价与分辨率平方成正比:提高分辨率(DC5 方案)可部分缓解($AP_S$ 从 20.5 提升至 22.5),但计算量翻倍
- 作者预期类似 FPN 的多尺度方案可解决此问题(后续 Deformable DETR 证实了这一点)
另一瓶颈是训练收敛极慢:DETR 需要 500 epochs(约 5-7 天,16 块 V100),远超传统检测器。
失效场景分析
- 密集小物体:当图像中含有大量小目标时(如远处人群),低分辨率特征图无法有效编码,$AP_S$ 显著落后于 Faster R-CNN
- 极端物体数量:当单张图像中同类物体数量接近 100(query 数量上限)时,模型开始饱和,遗漏率上升。论文实验显示,50 个以内物体几乎可全部检测,但 100 个物体时仅检测到约 30 个
- 遮挡重叠场景:虽然全局注意力在一定程度上缓解了遮挡问题(解码器可视化显示能区分重叠的大象和斑马的各个部位),但多个高度重叠的同类物体仍可能混淆
工程实践
训练配置
Backbone: ResNet-50 / ResNet-101(ImageNet 预训练,冻结 BN) |
复现要点
学习率分离:backbone 学习率必须比 transformer 低一个数量级(1e-5 vs 1e-4),否则训练初期不稳定。这是因为 backbone 已有 ImageNet 预训练权重,只需微调。
长训练周期:300 epochs 为最低要求,500 epochs 可额外获得 +1.5 AP。训练初期收敛非常缓慢,不要过早终止。学习率在 200/400 epoch 处衰减 10 倍。
“无物体”类降权:$\varnothing$ 类在损失中降权 10 倍(
eos_coef=0.1),类似 Faster R-CNN 中正负样本平衡的子采样策略。不降权会导致模型过度预测”无物体”。匈牙利匹配的代价函数:匹配阶段使用概率值 $\hat{p}_{\sigma(i)}(c_i)$(而非对数概率),这使分类代价与边界框代价在数量级上一致,论文发现这带来更好的经验性能。
推理优化技巧(∅ 槽位替换)要理解这一技巧,需先明确 AP 的计算方式:AP 并非在某个固定阈值下评估,而是在所有可能的置信度阈值上扫描,对每个阈值计算一组 (precision, recall),最终取曲线下面积。
• DETR 的 100 个槽位大部分预测为 ∅(通常只有几个到几十个物体),替换后变成低置信度的真实类别预测
• 高阈值区间不受影响:这些替补预测置信度很低,会被过滤掉,不会引入误检、不拉低 precision
• 低阈值区间增加 recall:当阈值扫描到足够低时,恰好正确的替补预测额外召回了物体,recall 增大
• 曲线面积增大:PR 曲线尾部向右延伸,积分面积增大,AP 提升约 2 个点
• 此技巧仅在评估时使用,实际部署直接用置信度阈值(如 >0.7)过滤即可:将预测为 $\varnothing$ 的检测槽位替换为其置信度第二高的真实类别,可提升约 2 AP。辅助解码损失:每个解码器层都添加预测头和匈牙利损失,共享 FFN 参数 + 额外共享 LayerNorm,对学习正确物体数量帮助显著。
性能优化方向
精度提升:
- 多尺度特征融合(如 FPN):解决小物体检测短板,后续 Deformable DETR 通过多尺度可变形注意力将 $AP_S$ 提升至与 Faster R-CNN 可比的水平
- 更好的位置编码策略:如 DAB-DETR 使用 anchor 坐标作为动态 query,加速收敛并提升精度
- 去噪训练:DN-DETR 在训练时引入加噪 GT 作为额外 query 输入,显著加速收敛
速度优化:
- 稀疏注意力:将编码器的全局自注意力替换为可变形注意力,计算量从 $O((HW)^2)$ 降至 $O(HW \cdot K)$($K$ 为采样点数),推理速度大幅提升
- 减少 query 数量:在物体稀疏的场景下,可减少 $N$ 以降低解码器计算量
- 减少训练 epochs:通过更好的匹配策略(如 DN-DETR 的去噪训练)加速收敛,将训练周期从 500 缩短至 50 epochs
研究启示
可迁移的思想
用集合预测替代后处理
DETR 证明了通过二分图匹配建立一对一对应,可以完全消除 NMS 等不可微分的后处理。这一思想可迁移至目标跟踪(TrackFormer)、实例分割(Mask2Former)等需要处理重复预测的任务。Transformer 的全局建模能力适合物体关系推理
编码器的自注意力使模型在特征提取阶段就能分离实例,这在处理遮挡、拥挤场景时尤为关键。类似思路已被用于 3D 检测(DETR3D)、点云处理等任务。可学习 query 替代手工先验
Object queries 证明了”让模型自己学习在哪里找目标”优于人工设计 anchor。这启发了后续工作用类似的可学习 query 处理语义分割(MaskFormer)、视频理解(VisTR)等任务。简洁性本身就是优势
DETR 的推理代码仅 50 行 PyTorch,不依赖任何专用的检测库。模型的简洁性降低了复现门槛、减少了工程 bug,这一理念影响了后续检测框架的设计哲学。
方法局限
- 小物体检测性能不足:$AP_S$ 低于 Faster R-CNN 约 6 个点,根本原因是 Transformer 自注意力在高分辨率特征图上计算代价过高
- 训练收敛极慢:需要 500 epochs(约 5 天),是传统检测器训练时间的 10-50 倍
- query 数量限制了最大检测数:固定 $N=100$ 个 query 在极端密集场景下成为瓶颈
技术影响
- 范式转变:开启了 Transformer 在目标检测中的应用浪潮,后续 Deformable DETR、DAB-DETR、DN-DETR、DINO 等工作逐步解决了训练慢和小物体检测差的问题
- 统一框架:首次用同一个框架同时处理目标检测和全景分割,在全景分割上达到 SOTA(45.1 PQ),启发了 Mask2Former 等统一分割框架
- 代码开源:GitHub 获 15.1k stars,成为 Transformer 检测领域最广泛引用的代码库之一
- 工业影响:DETR 系列方法已被 Hugging Face Transformers、MMDetection 等主流框架集成,推动了端到端检测在工业界的落地