DETR:用 Transformer 革新目标检测
DETR:用 Transformer 革新目标检测
目标检测是计算机视觉的基石任务,但多年来一直依赖复杂的手工设计组件。DETR(DEtection TRansformer)的出现,首次将 Transformer 架构完整引入目标检测,用一套简洁的集合预测思想,替代了锚框、非极大抑制等传统部件,开启了一个全新的端到端范式。
1. 传统检测方法的困境
在 DETR 之前,主流目标检测器大多遵循“提议 + 分类”的路子:
- 两阶段方法(如 Faster R-CNN):先生成候选区域,再对每个区域分类和回归,流程精细但速度慢。
- 一阶段方法(如 YOLO、RetinaNet):直接在特征图上预测类别和偏移,但需要锚框(Anchor)作为先验,并依赖复杂的标签分配策略。
- 后处理繁琐:几乎所有制都依赖非极大抑制(NMS)来去除重复检测框,这引入了额外的超参数,且难以端到端训练。
这些手工先验(锚框尺寸、宽高比、NMS 阈值)让检测系统变得脆弱且不平滑。DETR 的使命正是将目标检测简化为一个纯粹的集合预测问题,让模型自己学会“什么是对象”和“在哪里”。
2. 核心思想:将检测看作集合预测
DETR 把目标检测重新定义:给定一张图像,直接预测一个包含所有目标的无序集合,每个目标用一个表示类别和边界框的元组来描述。这个思想摒弃了显式的区域提议、锚框和 NMS,完全依赖 Transformer 的自注意力机制来建模目标之间的关系。
为了在训练时让预测集合与真实标注集合之间可以优化,DETR 引入二分图匹配(匈牙利算法),为每个真实框分配一个独一无二的预测框,保证一一对应。只有匹配上的预测才计算损失,未被匹配的预测会被引导为“无物体”类别,从而自然抑制重复输出。
3. 模型架构:CNN + Transformer 的优雅组合
DETR 的整体结构出奇地扁平,主要由骨干网络、Transformer 编解码器和三个简单的预测头组成。
3.1 整体流程
- 输入图像经过 CNN(如 ResNet-50)提取高维特征图,尺寸为 (C, H, W)。
- 将特征图展平为序列,并加上固定的位置编码,送入标准 Transformer 编码器。
- 编码器输出增强后的特征序列,与一组**可学习的目标查询(Object Queries)**一起送入解码器。
- 解码器输出 N 个向量(N 通常设为 100,远大于图中物体数),每个向量通过一个共享的前馈网络(FFN)同时预测类别和边界框坐标。
3.2 位置编码与输入序列化
由于 Transformer 天生不具备空间感知能力,DETR 对特征图的每个像素点添加可学习的空间位置编码(Sinusoidal 或 Learned),以使模型知道每个特征来自图像中的 (x, y) 位置。
3.3 编码器:全局上下文建模
编码器使用多层自注意力机制,让图像中的每个特征点都能与其他所有点交互。这使得 DETR 能够轻松捕捉大尺度物体或遮挡物体的完整语义,并且天生摆脱了局部感受野的限制。
3.4 解码器与目标查询:并行输出预测
解码器的输入包含 N 个目标查询(Object Queries)。这些查询是随机初始化的可学习向量,数量 N 固定,每个查询负责学习一种“探测模式”——即如何从编码器特征中询问一个对象的存在。
- 自注意力层:让查询之间互相通信,抑制重复模式(相当于让不同查询寻找不同物体)。
- 交叉注意力层:查询根据图像特征更新自己,最终每个查询会收敛到一个“物体描述”。
- 解码器输出 N 个最终嵌入,每个嵌入独立分类和回归,彻底消除了 NMS 的需求(因为匹配过程已保证唯一性)。
4. 训练魔法:匈牙利匹配与损失函数
DETR 的训练难点在于如何把无序的 N 个预测与无序的真值集合(通常只有几个物体)配对。解决方案就是二分图匹配。
4.1 匈牙利算法寻找最优匹配
对每张图像,计算所有预测和所有真值之间的配对代价。代价综合考虑:
- 预测类别不是真值类别的惩罚(分类损失)。
- 预测框与真值框之间的空间差异(框损失)。
匈牙利算法在多项式时间内找到使总代价最小的一对一匹配。匹配完成后,每个真值框获得唯一对应的预测框,剩下的预测框自动成为“无物体”样本。
4.2 损失函数设计
基于匹配结果,损失函数为:
[ \mathcal{L} = \sum_{i=1}^{N} \left[ -\lambda_{\text{cls}} \log \hat{p}{\hat{\sigma}(i)}(c_i) + \mathcal{L}{\text{box}}(b_i, \hat{b}_{\hat{\sigma}(i)}) \right] ]
其中 (\hat{\sigma}) 是最优匹配。框损失由两部分组成:
- L1 损失:直接约束坐标。
- GIoU 损失(通用交并比损失):对尺度不敏感且能处理无重叠的情况,使训练更稳定。
由于“无物体”查询的数量远多于有物体查询,分类损失中会对“无物体”类进行降权,以避免不平衡。
5. 为什么说 DETR 是一个“新范式”?
- 完全端到端:从像素到最终检测框,无需任何定制化后处理。
- 无手工先验:没有锚框、没有 RPN、没有 NMS,所有知识都通过数据和匹配规则学习。
- 统一的 Transformer 架构:使检测任务与其他序列预测任务(如机器翻译)共享模型设计,利于多模态融合。
- 天然可扩展:只需简单修改对象查询和输出头,同一框架即可处理全景分割(加一个掩码头)等更复杂的任务。
DETR 证明了 Transformer 不仅能理解语言序列,也能作为一种强大的通用视觉骨干,打破卷积结构的长期统治。
6. 优点与挑战
优点
- 简洁优雅:代码量远少于传统检测器。
- 无 NMS,无重复框烦恼。
- 擅长处理大物体和需全局上下文理解的关系(如遮挡、共现)。
- 易于并行解码,推理时所有目标一次生成。
挑战
- 训练收敛极慢:原始 DETR 需训练 500 epochs 以上才能达到类似 Faster R-CNN 的性能,尤其对小目标学习困难。
- 计算复杂度高:Transformer 编码器处理高分辨率特征图时,自注意力的内存和计算量与序列长度平方成正比。
- 小目标检测性能偏弱:全局注意力细粒度不足,且位置编码难以精确定位小物体。
这些挑战催生了后续一系列改进工作。
7. 重要变体与改进
7.1 Deformable DETR
引入可变形注意力(Deformable Attention),仅对每个查询涉及的少量关键点采样计算注意力,大幅降低计算量并加速训练收敛。将小目标和大物体都纳入同一框架,效果显著优于原版 DETR。
7.2 DETR with denoising(DN-DETR, DINO 等)
在训练时向解码器输入添加噪声,并要求模型去噪输出,有效稳定二分匹配过程,使收敛速度成倍提升,并刷新了检测性能记录。
7.3 高效解码架构(Sparse DETR、Efficient DETR 等)
通过动态检测需要关注的特征区域,或只使用少量编码器层,进一步降低计算开销,保持端到端优势的同时接近实时速度。
这些变体在保持 DETR 范式简洁性的同时,逐步解决了原始模型的痛点。
8. 快速上手实践
你可以通过以下资源立刻体验 DETR:
- 官方实现:Facebook Research 的 detr 仓库,提供预训练模型和 Colab 演示。
- Hugging Face 集成:
transformers库中的DetrForObjectDetection,一行代码加载模型:
配合from transformers import DetrImageProcessor, DetrForObjectDetection import torch processor = DetrImageProcessor.from_pretrained("facebook/detr-resnet-50") model = DetrForObjectDetection.from_pretrained("facebook/detr-resnet-50")processor对图像预处理,即可获得检测结果。 - 自定义训练:参考官方教程或 Hugging Face 示例 notebook,可轻松在自己的数据上微调。
DETR 不仅是目标检测的技术更迭,更代表了 “问题重定义 + 通用架构” 的强大力量。它让检测任务告别了堆积工程技巧的时代,迈入了一个更简洁、更统一的全新范式。理解 DETR,就是握住了未来检测技术进步的一把钥匙。