DETR模型简介:端到端目标检测的革命性方案
DETR,全称为DEtection TRansformer,中文常译为“检测变换器”,是专为目标检测任务设计的Transformer模型。
从构成来看:DET代表目标检测,R则指向著名的Transformer架构。两者融合,形成了一个专注于目标检测领域的端到端Transformer模型。
与需要手动预设锚框、依赖非极大值抑制(NMS)算法筛选冗余预测框的传统YOLO系列算法不同,DETR模型的设计初衷,正是为了从根源上解决这些繁琐的人工操作与复杂的后处理流程。
我们来逐步拆解DETR的整体工作流程:
首先,一张图像被送入卷积骨干网络,用于提取图像的深层特征信息。接着,DETR将提取到的特征图展平,并送入一个完整的Transformer模型——该模型同时包含编码器与解码器结构。
Transformer最终会固定输出100组预测结果,对应100个目标“查询”。每组结果均包含两类关键信息:目标的类别以及预测框的坐标。
由于一张图中通常不会恰好包含100个物体,对于未匹配到真实目标的预测框,DETR会统一将其标记为“无目标”类别;而有效目标的预测框,则被映射回原图,与数据集中的真实标注框进行比对。
在训练阶段,DETR采用“二分图匹配”方式,对预测框与真实框进行一对一匹配,并计算专属的匹配损失。通过反向传播持续优化模型参数,不断缩小预测框与真实框之间的坐标误差与分类误差,从而逐步提升检测精度。
到了推理阶段,流程更为简洁:模型无需锚框,也无需非极大值抑制(NMS)这类后处理步骤,直接输出有效目标的边界框坐标与对应类别,一步到位,实现端到端的目标检测。

二分图匹配损失详解:如何实现最优配对
设想一个场景:现有3名司机与3名乘客,需要完成一个合理的匹配调度。目标是让整体出行的总成本最低。此时,可以构建一个成本矩阵,直观展示每一位司机分别接送每一位乘客所产生的单独成本,以此作为最优调度的计算依据。

实际上,DETR中预测框与真实框的匹配逻辑,与上述司机和乘客的调度原理完全一致。
我们可以构建一个损失矩阵,矩阵中的每个数值,都代表单个预测框与单个真实框之间的匹配损失。随后,通过二分图匹配算法,自动计算出哪个预测框与哪个真实框契合度最高、整体损失最小,直接完成一对一的最优配对。正是依靠这种全局最优的匹配方式,DETR才能免除非极大值抑制(NMS)来筛选重复框,从而省去了后续处理步骤。
DETR默认设置固定数量N=100,即固定生成100个预测框。模型默认一张图中的目标物体数量不会超过100个,这足以覆盖绝大多数检测场景。
二分图匹配的核心作用,就是确定:第i个真实目标,应该对应匹配哪一个预测框。
整体损失函数主要由分类损失与回归损失两部分组成:
第一部分是分类损失。假设真实物体是猫,模型就要让猫这个类别的预测概率无限接近1;损失计算时会对概率取负值,概率越高、预测越准,分类损失就越小。同时还会加入一个指示函数:只有当真实目标不是背景、是有效物体时,才会计算分类损失,背景类不参与损耗计算。
第二部分是边界框回归损失,用于约束预测框的位置与大小。
回归损失又细分为两项:
- 一是绝对值误差,主要用于衡量预测框中心点的偏移距离,以修正框的位置偏差;
- 二是交并比误差,用于约束两个框的重合程度,确保预测框与真实框的面积、范围尽量贴合。
DETR正是依靠二分图匹配完成框的一对一分配,再将分类损失与回归损失联合优化,既保证了物体类别的预测准确度,又能让检测框的位置、尺寸精准地贴合真实目标。

模型架构解析:从特征提取到目标检测
先看骨干网络部分:我们让一张图像经过卷积神经网络(CNN),目的就是提取图像的特征。提取完特征后,需要与位置编码进行加法运算,这样模型才能感知图像中各像素的位置关系,然后再将加法后的结果传送给Transformer模型。
这里的位置编码有两种方式,与大家熟悉的操作一致:第一种是正弦余弦编码,与原始Transformer所用方法完全相同,简单说就是用正弦标记图像像素的横坐标位置,用余弦标记纵坐标位置,固定不变;第二种是可学习的位置编码,无需复杂操作,只需初始化一个位置编码矩阵,模型训练时自身就能逐步优化调整。
接下来看Transformer模型,它分为编码器与解码器两部分。先说编码器:它用到的是刚才卷积神经网络提取的特征,核心作用是在这些特征之间进行注意力计算,让不同位置的特征建立关联。举例来说,图像中有一头牛,编码器能让“牛头”和“牛尾”的特征产生联系,这样模型才能辨识出这是一头完整的牛,而非零散的部位。
编码器处理完毕后,将结果传递给解码器。解码器的核心作用,是利用编码器学到的特征相关性,将图像中的物体组合识别出来,并绘制出对应的预测框。这里要提到“目标查询”(Object Query,简称OQ)——它相当于一个向解码器“提问”的角色。例如,它会问解码器:“这张图像中有人形物体吗?”“图像右下角有没有圆形物体?”OQ初始是一个全零的张量,待解码器训练完成后,其输出会传给前馈神经网络(即检测头),每个前馈神经网络专门负责预测一个物体,最终模型会将预测出的边界框绘制在原始图像上。
为便于理解,我们结合具体的张量尺寸来梳理整个流程(无需记忆过于复杂的细节,理解过程即可):
假设输入的图像是一个(3, 800, 1066)大小的张量(3是图像通道数,800和1066是图像的高和宽)。经过卷积神经网络处理后,图像的长和宽均缩小至原来的1/32,变成(2048, 25, 34)大小的张量(2048是特征通道数,25和34是缩小后的高和宽)。
随后,这个张量会经过一个2D卷积层,将特征通道数从2048压缩至256,变成(256, 25, 34)的张量;接着与同样为(256, 25, 34)大小的位置编码进行加法运算,融合特征与位置信息。
之后,这个融合后的张量会被变形为(850, 256)大小的张量,传递给Transformer编码器——这里的850由25×34得来(缩小后的高×宽),可理解为“编码长度”,256则是每个特征token的嵌入维度。编码器处理完成后,张量形状保持不变,仍为(850, 256),直接传递给解码器的交叉注意力层。
解码器的输入是一个(100, 256)大小的张量,100对应之前提到的100个预测框(模型默认一张图最多100个物体),256依然是token的嵌入维度。解码器处理完成后,输出形状仍为(100, 256),再传递给前馈神经网络(检测头)。
最后,检测头会输出两个结果:一个是1×91的类别预测值(91代表所有可能的物体类别,包含背景),另一个是1×4的预测框坐标(对应预测框的位置与大小)。
这里补充一个与之前“司机-乘客调度”一致的逻辑:我们可以构建一个矩阵,行对应100个预测框,列对应图像中的真实物体,矩阵中的每个数值,代表“第i个预测框匹配第j个真实物体”的总损失(包含分类损失与回归损失)。通过二分图匹配算法,找到让整体损失最小的一对一匹配方式,直接确定每个真实物体对应的最优预测框,这样就无需再做NMS处理。

检测头部分包含两个并行的子网络:一个负责预测物体的类别,另一个负责预测边界框的坐标,两者独立输出,最终合并形成完整的检测结果。
同时,目标查询(Object Query)是一组可学习的张量,它是解码器的输入,而非编码器的输出。你可以将其理解为解码器提前准备好的一批“问题”——例如“图像中是否有物体?它在哪?它是什么?”——解码器带着这些问题去查询编码器提炼出的图像特征。OQ初始值为零,但附带一个可学习的位置编码,用于区分不同的查询槽位。
在位置编码方面:编码器中,每一层的自注意力计算里,位置编码都会加到K和Q上;在解码器中,每一层交叉注意力的K(来自编码器的输出)也会加上对应的位置编码,而OQ本身扮演了解码器Q的位置编码角色。而且这种加法在编码器和解码器的每一层都会重复进行,各执行6次。
解码器的每一层并非从零开始,它会把上一层输出的预测结果(物体的类别与位置)以残差连接的形式传入下一层,相当于“带着上一轮的结论继续优化”。这样做的好处是,预测结果可以在每一层被逐步精细化。
举个例子:第一层解码器可能只能模糊地感知到“图像中有个人”;到了第二层,结合更多上下文信息,发现“这个人站在画面右侧”;到了第三层,进一步细化,识别出“这个人正举着双手”。每一层都在前一层的基础上推进,最终得到更准确的检测结果。

