基于Transformer的detr目标检测算法思路分析

1. Transformer

我们可以尝试用一个例子来理解 Transformer 的各个概念。学生在课堂上进行小组讨论写作文:一个班级里有一群学生,每个学生负责贡献一句话来完成一篇作文。他们必须交流彼此的观点(信息),形成一篇通顺的文章。这就像 Transformer 处理一个序列(比如一句话)时的过程。

1. 输入嵌入(Input Embedding)

将原始的输入(如词、图像特征等)映射到一个高维向量空间中,便于 Transformer 网络进行后续处理。

就像每个学生都先写好一句话的草稿,用于后续讨论。每句话被转成一个有意义的表达——每个词转成向量。

2.位置编码(Positional Encoding)

Transformer 的核心​自注意力机制(Self-Attention)​,它可以捕捉序列中任意两个元素之间的关系。但自注意力本身是 ​位置无关的​:无论词在序列中的位置如何,其计算方式完全相同。例如:句子 猫 坐 在 垫子 上 和 垫子 坐 在 猫 上 对自注意力来说,仅通过词嵌入无法区分两者的位置差异。因此,必须显式注入位置信息,否则模型无法理解顺序(如时间、空间顺序)。

就像学生按顺序坐在座位上,这样大家知道谁先说谁后说。否则你只看学生内容(词向量)是看不出顺序的。

3.自注意力机制(Self-Attention)

自注意力机制(Self-Attention)是 Transformer 模型的核心组件,它通过动态计算序列中每个元素与其他元素的关联权重,捕捉全局依赖关系。这样可以有效解决长距离依赖问题,替代 RNN 的串行计算和 CNN 的局部感受野限制。
核心思想:每个位置的表示可以参考序列中所有其他位置的信息。输入向量被分别线性映射为: Query(Q)Key(K)Value(V)

每位学生(Query)在发言前,都会环顾四周,看看别人写了什么(Key),判断谁的信息最值得参考(注意力分数),然后重点参考这些同学的原始观点(Value),用来丰富自己这次的发言。

4.多头注意力(Multi-Head Attention)

单一注意力头​ 只能捕捉一种语义模式(如语法结构或词义关系),而 ​多个头​ 允许模型从不同维度理解上下文。可以这么类比:人类观察物体时,通过多个感官(视觉、听觉、触觉)综合理解信息。
将 Q、K、V 划分成多个头(head),在不同子空间中并行计算注意力。让模型从不同的表示子空间中学习信息,最终结果是多个头的输出拼接后线性变换。

学生不仅从一个角度看别人说了什么,而是从多个角度来看(语法角度、情感角度、逻辑结构等),综合判断。

5.前馈神经网络(FFN)

前馈神经网络(Feed-Forward Network, FFN)​​ 是每个编码器和解码器层的核心组件之一,负责对自注意力或交叉注意力的输出进行非线性变换,增强模型的表达能力。

每位学生在吸收别人的意见后,会自己再加工一下:加些修饰、润色语句,让发言更通顺。

6.残差连接 + LayerNorm

每个子层(如多头注意力、FFN)后都有残差连接和 LayerNorm:LayerNorm(x + Sublayer(x))。
主要作用是训练深层模型,避免梯度消失,促进信息直接传递。

学生在参考别人的意见后,还保留了自己最初的观点(残差),并统一风格、语气(归一化),让整体更协调。

7.编码器(Encoder)

编码器负责将输入序列(如文本、图像块)转换为富含上下文信息的隐藏表示。其核心任务包括:

  • 捕捉全局依赖​:通过自注意力机制建立序列内任意位置的关联
  • 特征抽象​:逐层提取高层次语义信息
  • 位置感知​:显式注入位置编码,弥补无卷积/循环结构的不足

在这个类比中,就像老师帮助每个小组整理他们的想法(编码),形成一套清晰的观点集。

8.解码器(Decoder)

解码器负责将编码器生成的上下文信息转换为目标序列(如翻译结果、生成文本),核心作用有:

  • 自回归生成​:逐个生成目标序列元素(如逐词生成翻译结果)
  • 上下文融合​:通过交叉注意力关联源序列与目标序列
  • 位置感知​:防止解码时“偷看”未来信息(通过掩码机制)​

学生们根据讨论成果(Encoder 输出),开始一段一段地写作文。每写一句,就回顾前面的句子,看看是否连贯。

9.掩码机制(Masking)

掩码机制(Masking)是控制模型信息流动的核心设计,其主要作用

  • 防止信息泄漏​(解码器):确保自回归生成时,模型无法“偷看”未来信息
  • 处理填充符(Padding)​​(编码器/解码器):忽略无效位置(如填充符<PAD>)的影响
  • 动态注意力控制​:根据任务需求屏蔽特定区域(如局部注意力、稀疏注意力)

防止某些学生提前偷看别人的后一句发言,只能参考已发言内容,保证作文是一步一步写出来的。

10.最终输出

最终所有学生的发言被串联起来,组成一篇内容连贯、参考了各自观点、逻辑清晰的作文——这就是 Transformer 输出的序列。

2.DETR目标检测基本思想

DETR 证明了 Transformer 不仅可以做特征提取(Encoder),也可以直接参与下游任务的预测(Decoder),而且,它是第一个真正做到端到端目标检测的 Transformer 模型,很具有代表性。

1.传统的目标检测

说到目标检测,大家可能脑海里已经浮现出几个关键词,比如 R-CNN 系列、YOLO 系列等等。

  • Fast R-CNN:在 2015 年非常火,它是 R-CNN 系列的代表之一,使用了 Region Proposal(候选区域)的方法去做目标检测。
  • YOLO:2016 年崛起的代表,它的优势是把整个流程做得更简单、更统一。但它和 R-CNN 一样,仍然依赖一种叫做“anchor”(锚框)的机制。

不管是 Fast R-CNN 还是 YOLO,它们大多都是基于锚框(anchor-based)机制来做目标检测的,然后再用 非极大值抑制(NMS) 去过滤掉重叠的框。

NMS(Non-Maximum Suppression)是目标检测中的一种后处理算法,用于从多个重叠的预测框中选择最靠谱的一个,去掉冗余和低质量的框。

2.NMS 的弊端

比如一张图像中只有一个人,但模型可能预测出多个框(蓝色、绿色、黑色),都在那个位置附近。为了只保留一个,我们就需要 NMS。但 NMS 效率不高,处理过程也繁琐,而且并不是端到端可学习的。
所以我们想:有没有可能不依赖 anchor,也不使用 NMS,就能完成目标检测任务?

3.DETR 的思路

这时,DETR 出现了。DETR 是一个 完全基于 Transformer 架构 的目标检测方法,不依赖锚框、不用 NMS,甚至不需要传统意义上的候选框生成模块。
它的思路很新颖:

  1. 图像编码:输入图像首先被切分为 patch 或通过 CNN 编码成特征图
  2. Transformer 编码器(Encoder):对这些特征进行全局建模,提取高级语义
  3. Transformer 解码器(Decoder):引入一组 固定数量的查询向量(object queries),每个向量学习预测一个物体

4.固定数量的预测框

一个关键点是:无论图像中有几个目标,DETR 都输出固定数量(比如 100 个)框的预测结果。

  • 如果图中实际有 2 个物体,那另外的 98 个框就代表“背景”或“无物体”。
  • 最终通过和 Ground Truth(真值、真实标签)的匹配 Hungarian Algorithm(匈牙利匹配)来对齐这 100 个框中哪些是真正的目标,哪些是背景。

这个思路让 DETR 可以实现 端到端的训练和推理流程,不需要像 YOLO 那样做预定义 anchor,也不需要 Fast R-CNN 的 Region Proposal 模块。

Ground Truth(真值、真实标签) 是监督学习中用于训练的“正确答案”。
在目标检测任务中,Ground Truth 通常包括:

  1. 目标类别(class label):例如“人”、“猫”、“车”
  2. 边界框(bounding box):表示物体的位置 [x, y, w, h] 或 [x1, y1, x2, y2]
  3. (可选)分割掩码、关键点等其他信息
    它是 我们希望模型最终预测出的结果,训练的目标就是让模型的输出尽量接近 Ground Truth

Hungarian Algorithm(匈牙利匹配),一种经典的 最小代价二分图匹配算法,用来在“两组对象”之间寻找最优一对一匹配方案。
在目标检测中,一边是 N 个 模型预测的框(如 100 个);一边是 M 个 Ground Truth 真实框(如 7 个);我们要找到一组 最优的一一匹配,使得每个真实框都分配一个预测框;没被分配的预测框,视为背景;然后匹配的总代价还要最小。

3.网络架构

先回顾一下ViT(Vision Transformer),它是 Google 在 2020 年提出的视觉领域首个纯 Transformer 架构,核心思想是把图片当作「句子」,把图像块当作「单词」,用 NLP 里成功的 Transformer 模型来处理视觉任务。它主要分为两个部分:

  • Encoder:对图像进行 patch 分割 + 编码,通过Transformer结构提取全局特征
  • Decoder:在ViT中没有用 decoder,因为我们只做分类。但在DETR中,这个 decoder 就是目标检测的关键

1.DETR 的编码器(Encoder)

作用:提取图像的全局特征。

  • 输入图像先通过 CNN(如ResNet)编码,转化为 patch 特征
  • 每个 patch 会加上 位置编码(2D位置编码,用于保留空间位置信息),得到加了位置编码的图像特征
  • 通过自注意力机制建模图像内不同区域之间的全局依赖关系,输出仍是一组图像特征表示(包含上下文关系的表示)

为何需要添加位置编码(positional encoding)?
因为 Transformer 自身不具备空间结构感知能力,位置编码用于保留图像中“哪里”的信息

2.DETR 的解码器(Decoder)

与 NLP 不同,不生成词语,而是直接生成目标框(bounding boxes)和类别

  • 我们不再按 NLP 那种方式“一个词一个词”串行预测,而是一次性并行预测100个目标框
  • 这些框不是 anchor-based 的,而是来自一组 初始化的 Learnable Queries(可学习向量)

3.Prediction Heads(预测头)

每个解码器输出都送入一个小的 前馈网络(FFN)

  • 输出类别概率(包含“no object”类)
  • 输出边界框坐标(通常是中心点 + 宽高)

图中右边框显示:红色与黄色框成功预测了两只海鸥,绿色与蓝色框预测为“no object”

4.主流程

  1. 初始化100个query向量
    • 每一个向量的任务就是预测一个目标框 + 一个类别
    • 可以把它们想象成“探测器”,去图像中找自己感兴趣的目标
  2. 每个query去encoder输出中“敲门”
    • 每个 query 是一个 Q(Query)
    • 它去 encoder 提供的所有 patch 特征中查找关联区域(K 和 V)
    • 本质就是一个 attention 过程 —— “我该关注图像的哪一块?”
  3. 多个query并行执行
    • 不是像机器翻译那样,先有第一个词再预测第二个词,而是100个query 同时查图
    • 所以是并行的,不是串行的
  4. 每个query接一个全连接层
    • 输出一个预测框(4个值)+ 一个类别分布(比如80个类别的softmax)。
    • 某些query可能对应的是背景或者没有目标,训练时会自动学习到。
模块 功能 关键点
Encoder 提取图像全局特征 CNN + Pos Encoding → K/V
Decoder 预测目标框和分类 100个 learnable query 并行预测

DETR的核心创新在于通过使用 Transformer 直接检测,而不依赖 anchor、不使用NMS、直接回归框。

4.位置信息初始化

为什么不能直接用 CNN 做特征提取?

我们可以思考一个问题:如果目标检测只需要输出几个 bbox,那直接用 CNN 抽特征,然后做分类和回归就行了,为什么还要用 transformer encoder?

从论文里可以知道答案:encoder 是通过 self-attention 把图像中“重要的区域”表示出来,尤其在存在遮挡时,它能更好地“指引 decoder 去关注哪里”。
简单来说,encoder 是告诉 decoder:“嘿,这块儿有个目标,你重点看这儿。”

比如图中有两头牛,虽然有遮挡,self-attention 能把一头牛的注意力集中在图像上半部分,另一头集中在下半部分。这说明即使目标被遮挡,encoder 也能有效定位注意区域。

decoder 是怎么起作用的?

论文设置了 100 个 decoder 的查询向量(queries),这些向量的任务是从 encoder 输出中“选出目标”。就像一个选秀节目:100 个选手来选目标,选出来的几个是“最终预测的目标”,剩下的是陪跑的。
这些 decoder queries 一开始是 怎么初始化的?

  • 一开始是 全 0 向量(比如维度是 768 全为 0);
  • 然后加上 位置编码:这相当于告诉每个 query:你去“关注”一个特定的位置区域。

这种设计的用意是:一开始我先给每个 decoder query 一个不同的位置感知能力,让它们关注图像的不同区域,避免都聚焦在一块,提升模型的多样性和泛化能力。

为什么要这么做?

目标检测跟“位置”密切相关。直接用随机向量初始化 decoder queries 可能无法传递出“我要关注图像哪个区域”的这种信息。
而使用“全零 + 位置编码”的方式初始化,就相当于让 decoder queries 一开始就有“自己负责哪块区域”的暗示。这是为了:

  • 增强模型的空间感知能力
  • 避免多个 queries 都关注到相同区域,导致预测冗余
  • 提升遮挡、密集目标下的检测效果

总结:

DETR用 transformer encoder 来精准提取注意区域,即使有遮挡也不怕;再用 decoder 通过“全零 + 位置编码”初始化的查询向量,像选秀一样挑出目标,从而实现 end-to-end 的目标检测。

5.注意力机制

1.Decoder 的工作机制(以 DETR 为例)

DETR 的 decoder 本质上由多个 Transformer Decoder Block 叠加组成,每一个 Block 分两步:

  1. Self-Attention(自己和自己交流)
  2. Cross-Attention(和 encoder 的输出交互)

1.Self-Attention(自我交流)

目的:分工明确,别重复劳动
100 个初始化的向量(称作 object queries)一开始是全零 + 各自的 位置编码。自注意力让这 100 个向量“开个会”,互相说清楚:谁关注哪个区域、谁负责啥任务(比如这个管车,那个管人)。
本质上是:让这些向量的 Query 形成一定的多样性,避免后续都盯着同一块区域看。

3.Cross-Attention(关注图像特征)

目的:去图像里“找对象”
Decoder 每个向量带着自己的 Query,去 encoder 的输出(图像特征)中,查找哪些地方值得注意。Encoder 提供 Key 和 Value,Decoder 提供 Query,通过 attention 找到图像上相关区域,把信息拿回来“强化自己”。

2.核心流程

  • Decoder 的每个 Query(向量)就像一个侦察兵,它想抓一个目标(如一个物体),但它不知道目标在哪
  • 所以它通过 Cross-Attention 去 encoder 提供的图像特征里“探查”
  • 多层 decoder 的堆叠,就是不断 refine 这个 Query,让它越来越“懂得自己要找什么”

3.关于 Mask 的处理

  • 传统 NLP 的 Decoder(如 GPT)中使用 mask 是因为语言是顺序性的,预测下一个词时不能看后面的词(防止“透题”)
  • 但在 DETR 这种目标检测里,Decoder 的输入是 100 个 object queries,它们是并列的、没有顺序的
  • 所以这里 不需要 mask,大家可以并行计算、互不干扰

4.多层 Decoder Block

  • 只有第一层用 self-attention 来“分配任务”。
  • 后续层不再重复 self-attention,而是持续用 cross-attention 来强化 query 表示。
  • 每个 Block 后都有 FFN(全连接)进一步提取特征。

这个机制体现出 DETR 最大的创新之一:用 set-based 的 query + cross attention 来直接回归目标,而不是用 anchor 或 dense head。

6.训练过程

1.Decoder 的结构与流程(以 DETR 为例)

1.Self-Attention 自注意力机制

在 decoder 的第一层,每一个 query 向量自己和自己“开会”,彼此之间进行信息交互,但不涉及 encoder 的输出
像是 100 个当家聚会,各自说清楚“自己要干什么”,比如谁管吃喝,谁管武器,谁管杂务,提前定好各自负责区域。
为每一个 query 向量初始化做准备,先做一个合理的任务划分(也就是“分地盘”)

2.Cross-Attention 与 Encoder 交互

从第二步起,不再使用 self-attention,decoder 的每个 query 只用自身向量作为 q,然后从 encoder 的输出中取 k 和 v。
decoder 的 query 向量拿着自己的身份去 encoder 里“查”,看看有哪些特征对自己是重要的,然后基于 q-k-v attention 机制,重新构造 query 特征。
核心任务:

  • query 是整个生命周期的核心
  • 最终每一个 query 会输出一个检测结果(bounding box + class)

3.损失计算中的匈牙利匹配(Hungarian Matching)

decoder 输出的是一组固定数量的预测(如100个),但真实目标只有若干(如2个)。可以采用匈牙利算法将预测与真实标注进行最优匹配(最小化 loss)。
匈牙利匹配标准:

  • 可能包括多个损失项,例如分类损失、边框损失(如L1、GIoU)。
  • 找出最适合匹配的两个 query,其余当作背景处理。

4.注意力可视化

实验现象:即使目标之间存在严重遮挡或重叠,不同 query 的注意力区域仍能清晰分辨物体局部(如象腿、斑马蹄子)。
Transformer 的注意力机制对遮挡非常鲁棒,能分清复杂结构中哪些区域属于哪个目标。

5.多层监督(Intermediate Supervision)

只在 decoder 最后一层加 loss,无法监督中间层的学习质量,若中间某层“出错”,后面层也会受影响。
解决思路:每一层 decoder 都加 loss(即每层 query 都参与分类+回归的训练)。
好处:促进逐层学习质量提升,类似“每个阶段都考试”,而不是等到最后一锤定音。

7.关键对比

特性 传统方法(如YOLO、Faster R-CNN)​ DETR
依赖锚框 是,需预设锚框调整预测 否,直接回归边界框
后处理NMS 是,过滤重叠框 否,匈牙利匹配解决冗余
端到端 否,分阶段训练(候选区域+分类回归) 是,编码器-解码器联合训练
全局建模能力 有限,依赖CNN局部感受野 强,自注意力捕捉长程依赖
处理遮挡目标 易漏检或重复预测 鲁棒,注意力区分物体局部

8.总结

  • Transformer​ 通过自注意力和位置编码处理序列,解决了长距离依赖和位置感知问题。
  • DETR​ 创新性地将Transformer应用于目标检测,摒弃传统锚框和NMS,通过可学习查询向量和匈牙利匹配实现端到端检测,在复杂场景(如遮挡、密集目标)中表现优异。其核心在于全局特征建模与并行预测机制的统一。