基于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,甚至不需要传统意义上的候选框生成模块。
它的思路很新颖:
- 图像编码:输入图像首先被切分为 patch 或通过 CNN 编码成特征图
- Transformer 编码器(Encoder):对这些特征进行全局建模,提取高级语义
- 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 通常包括:
- 目标类别(class label):例如“人”、“猫”、“车”
- 边界框(bounding box):表示物体的位置 [x, y, w, h] 或 [x1, y1, x2, y2]
- (可选)分割掩码、关键点等其他信息
它是 我们希望模型最终预测出的结果,训练的目标就是让模型的输出尽量接近 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.主流程
- 初始化100个query向量:
- 每一个向量的任务就是预测一个目标框 + 一个类别
- 可以把它们想象成“探测器”,去图像中找自己感兴趣的目标
- 每个query去encoder输出中“敲门”:
- 每个 query 是一个 Q(Query)
- 它去 encoder 提供的所有 patch 特征中查找关联区域(K 和 V)
- 本质就是一个 attention 过程 —— “我该关注图像的哪一块?”
- 多个query并行执行:
- 不是像机器翻译那样,先有第一个词再预测第二个词,而是100个query 同时查图
- 所以是并行的,不是串行的
- 每个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 分两步:
- Self-Attention(自己和自己交流)
- 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,通过可学习查询向量和匈牙利匹配实现端到端检测,在复杂场景(如遮挡、密集目标)中表现优异。其核心在于全局特征建模与并行预测机制的统一。