DETR论文

现代检测器必须要通过一大组提议、锚框或窗口中心实现回归和分类问题,他们的性能显著受到后处理步骤,为了简化这些流程,我们提出了一种直接端到端的集合预测方法,即2020年5月发表的DETR(End-to-End Detection with Transformers)。论文我将从结构剖析、创新点分析、论文收获以及根据pytorch进行代码复现

一、模型剖析

DETR模型训练的流程简述为以下四步:

  • 用CNN做特征提取为集合
  • 将图片特征集合输入给transformer-encoder去学习全局的特征帮助后面做检测
  • transformer-decoder生成一系列预测框集合
  • 是将预测框的集合与真实框中去做匹配,在匹配上的框中再去算这个目标检测的loss去更新模型

c0a090cd9d94381a55f45a5ec1ad2ad9

1 目标检测集合预测损失

1.1 二分匹配

设计一个基于匈牙利算法的损失函数,以找到ground-truth和预测之间的二分匹配。这强制执行了排列不变性,并保证每个目标元素都有一个唯一的匹配项。但与之前的大多数工作相比,不再使用自回归模型,而是使用具有并行解码的transformers。

基于注意力机制的transformer模型的主要优点之一是其全局计算和完美的记忆。

最低成本计算公式是:8e9cc2a6b1fb57d3b88ad453fc2fbdcd

1.2 损失计算

计算损失函数,上一步中所有匹配对的匈牙利损失

463dea07c2827f2240411945b5d453d9

在论文中$c_i = \emptyset$时,将对数概率项的权重降低十倍,以保证类别平衡。

1.3 边界框计算

最常用的ℓ1损失对于小框和大框也会有不同的尺度。为了缓解这个问题,我们使用ℓ1损失和广义IoU损失结合:

d760164a671eb62e2d0bd4780f16832f

2 模型架构

一个用于提取紧凑特征表示的CNN骨干网络一个编码器-解码器Transformer,以及一个进行最终检测预测的简单前馈网络(FFN)

DETR 使用传统的 CNN 主干来学习输入图像的 2D 表示

DETR Transformer 的架构

2.1 主干backbone

将输入图片$X_{img} \in \mathbb{R}^{H_{0} \times W_{0} \times C_{0}}$ 通过卷积神经网络CNN转换成$f \in \mathbb{R}^{H \times W \times C}$

注意:$C_{0}$=3;C=2048, $H = \frac{H_{0}}{32}$,$W = \frac{W_{0}}{32}$

2.2 Transformer架构

2.2.1 encoder

作用:

将C降低到d(因为encoder想要的是一个序列),维度为1,序列长度则为$d \times HW$

组成:

多头注意力机制(Multi-Attention)——>信息收集与混合——>全序列交互(即综合考虑)

前馈神经网络(Feed Forward Network )——>信息加工与提炼——>位置独立处理(即针对处理)

2.2.2 decoder

输入:解码器一开始就准备好 N个可学习的“空位”(称为“对象查询”),每个“空位”就是一个 d维的向量。

处理:解码器接收来自图像编码器的视觉特征,并通过注意力机制,让这 N个“空位”去“观察”和“理解”整张图片,并互相之间进行“沟通”(自注意力),最终把这 N个初始向量“转换”成 N个包含丰富物体信息的 d维向量(输出嵌入)。

输出:最后,每个输出嵌入(一个 d维向量)会分别通过一个简单的前馈网络,独立地预测出它对应的那个物体的类别边界框坐标

2.3 前馈神经网络

组成:

ReLU、隐藏维度d和线性投影层

作用:

FFN预测归一化的中心坐标、框的高度和宽度(相对于输入图像),线性层使用softmax函数预测类别标签

2.4 辅助解码损失

位置:

每个解码器层之后添加预测FFN和匈牙利损失

使用一个额外的共享层归一化来归一化来自不同解码器层的预测FFN的输入。

核心思想

“一路监督,多路受益“

辅助解码损失通过在主输出之外,额外在模型的中间层(例如解码器的某一中间层) 添加辅助的输出层,并计算损失。这个辅助损失会和主损失结合,共同指导模型参数的更新,从而让中间层也能得到更直接的训练反馈。

DETR启用辅助损失(aux_loss=True)时,模型会返回每个解码器层的输出字典列表,而不仅仅是最终层的输出。这些中间层的输出会参与到整体损失的计算中。

💡 核心作用

辅助解码损失通过其独特的工作机制,主要在以下几个方面发挥作用:

  • 缓解梯度消失,改善训练动态:通过将损失信号“注射”到网络中间层,辅助损失提供了更短的梯度传播路径,有助于梯度更有效地反向传播,缓解深层网络中的梯度消失问题,使训练过程更稳定、收敛更快。

  • 提供中间监督,增强表征学习:辅助损失相当于为中间层的特征学习提供了明确的监督目标,引导网络在中间层就学习到更有意义的特征表示,防止其“跑偏”,往往能使最终学到的特征更具判别力。

  • 实现隐式模型集成:不同深度的解码层其“专业领域”可能略有不同。较低层可能捕捉更细节的局部信息,较高层则整合更全局的上下文。辅助损失鼓励这些不同层的输出都做出正确预测,其效果类似于将不同深度模型的优势进行了集成,从而可能提升最终模型的鲁棒性和泛化能力。

二、创新点

  • 在detr模型中移除基于一些初始猜测进行预测这种手工设计的流程,并通过直接预测检测集合(相对于输入图像的绝对框预测,而不是锚框)来简化检测过程。两阶段检测器预测框相对于候选区域,而单阶段方法预测框相对于锚框或可能的对象中心网格。这些系统的最终性能在很大程度上取决于这些初始猜测的设置方式。
  • 直接集合预测的二分匹配损失的目标检测系统的新设计。
  • DETR易于实现,并且具有灵活的架构,可以轻松扩展到全景分割,并获得具有竞争力的结果。

三、论文收获

之前的似然函数和负对数似然函数学的不好,所以这次在这篇论文中重新看看

1 似然函数

1️⃣ 概念理解

似然函数:在“参数固定未知、数据已观测”的前提下,衡量“这组参数生成当前数据的合理程度”。相当于就是在调整权重参数。它和概率有很大的区别:

概念 自变量 含义
概率 数据是自变量,参数固定 给定参数,数据出现的可能性
似然 参数是自变量,数据固定 给定数据,参数有多合理

2️⃣ 数学定义

假设:

  • 数据:$x_1,x_2,…,x_n$
  • 模型参数:$\theta$
  • 数据服从分布:$p(x \mid \theta)$

那么似然函数定义为:$\boxed{ L(\theta \mid x_1,\dots,x_n) = \prod_{i=1}^{n} p(x_i \mid \theta) }$

⚠️ 注意:

  • 这是 $\theta$ 的函数
  • $x_i$ 已经观测到,是常数

3️⃣ 例子(抛硬币)

  • 正面概率:$\theta$
  • 抛 10 次,出现 7 次正面

似然函数为:$L(\theta) = \theta^7 (1-\theta)^3$

问题变成:

哪个 $\theta$ 最可能产生“7 次正面、3 次反面”?

答案是:

$\hat{\theta} = 0.7$

这就是 最大似然估计(MLE)

2 负对数似然函数

1️⃣ 为什么要“取对数”?

似然函数是连乘:$\prod_{i} p(x_i \mid \theta)$

问题:

  • 数值容易下溢(非常小)
  • 计算不方便

👉 解决方案:取对数

$\log L(\theta) = \sum_{i=1}^n \log p(x_i \mid \theta)$


2️⃣ 为什么是“负”的?

在优化里:

  • 我们通常 最小化损失函数
  • 但 MLE 是 最大化似然

所以定义:$\boxed{ \mathcal{L}{\text{NLL}}(\theta) = - \sum{i=1}^{n} \log p(x_i \mid \theta) }$

👉 最小化负对数似然 ≡ 最大化似然函数

3 似然函数 vs 负对数似然函数(对比)

项目 似然函数 负对数似然
形式 乘积 求和
优化目标 最大化 最小化
数值稳定性
工程中使用 非常多

4 负对数似然 = 常见机器学习损失函数

这是重点,很多“损失函数”本质上就是 NLL 👇

1️⃣ 高斯分布 → 均方误差(MSE)

假设:$y \sim \mathcal{N}(\mu, \sigma^2$

NLL:$\mathcal{L} = \frac{1}{2\sigma^2}(y-\mu)^2 + \text{常数}$

👉 等价于最小化 MSE

2️⃣ 伯努利分布 → 交叉熵损失(Binary Cross-Entropy)

$p(y=1)=\hat y$

NLL:$-\big[y\log \hat y + (1-y)\log(1-\hat y)\big]$

👉 这就是二分类交叉熵

3️⃣ 多项分布 → Softmax + Cross Entropy

👉 深度学习分类模型的标准配置

四、代码复现


DETR论文
http://example.com/2025/12/29/DETR论文/
作者
Alaskaboo
发布于
2025年12月29日
更新于
2025年12月29日
许可协议