人工智能|大白话DETR 模型
🌞欢迎来到人工智能的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
📆首发时间:🌹2026年4月27日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
简单的介绍
二分图匹配损失
模型架构
简单的介绍
DETR = DEtection TRansformer,中文可以叫「检测变换器」
DET= Detection(目标检测)
R= Transformer(变换器,就是大名鼎鼎的那个 Transformer)
合起来就是:专门做目标检测的 Transformer 模型。
传统 YOLO 系列算法存在不少依赖人工设计的环节,最典型的就是需要手动预先设定锚框。同
时,模型推理后会产出大量冗余的预测框,必须依靠非极大值抑制(NMS) 算法筛选、剔除重复
框,才能保留最优检测框。而 DETR 模型的诞生,正是为了从根本上解决这些繁琐的人工操作与
后处理步骤。
接下来简单说明 DETR 的整体工作流程:
首先将整张图片送入卷积骨干网络,提取图片的深层特征信息。随后,DETR 会把提取到的特
征图展平处理,再送入完整的Transformer 模型,该模型同时包含编码器与解码器结构。
Transformer 最终会固定输出100 组预测结果,对应 100 个目标查询,每组结果都包含两部分
关键信息:目标类别、预测框坐标。
由于一张图片里不会刚好有 100 个物体,对于没有匹配到真实目标的预测框,DETR 会统一标记
为无目标(no object)类别;对于有效目标的预测框,则映射回原图,和数据集中的真实标注框
进行比对。
训练阶段,DETR 采用二分图匹配的方式,一对一匹配预测框与真实框,计算专属的匹配损失。通
过反向传播不断优化模型参数,持续缩小预测框与真实框的坐标误差、分类误差,让检测结果越来
越精准。
等到推理阶段就更加简洁,模型不需要锚框、不需要非极大值抑制等后处理,直接输出有效目标的
边界框坐标和对应类别,一步完成端到端目标检测。
二分图匹配损失
假设现在有 3 名司机、3 名乘客,需要完成合理的匹配调度。我们的优化目标是:实现整体出行总
成本最低。可以通过成本矩阵,直观展示每位司机分别接送每一位乘客所对应的单独成本,以此作
为最优调度的计算依据。
DETR 里预测框和真实框的匹配逻辑,和刚刚司机与乘客的调度匹配原理完全一样。
我们可以构建一个损失矩阵,矩阵里的每一个数值,都代表单个预测框与单个真实框之间的匹配损
失。通过二分图匹配算法,自动算出哪一个预测框和哪一个真实框契合度最高、整体损失最小,直
接完成一对一最优配对。正是依靠这种全局最优匹配的方式,DETR 不需要再做非极大值抑制
(NMS)筛选重复框,直接省去了这一步后处理操作。
DETR 默认设置固定数量:(N=100),也就是固定生成 100 个预测框。模型默认一张图片里的目标
物体数量,不会超过 100 个,足够覆盖绝大多数检测场景。
二分图匹配的核心作用,就是确定:第 i 个真实目标,应该对应匹配哪一个预测框。
整体损失函数主要由分类损失和回归损失两部分组成:
第一部分为分类损失:(C_i) 代表真实目标的类别。举个例子,如果真实物体是猫,模型就要让猫
类别的预测概率无限接近 1;损失计算时会对概率取负值,概率越高、预测越准,分类损失就越
小。同时加入指示函数,只有当真实目标不是背景、是有效物体时,才会计算分类损失,背景类不
参与损耗计算。
第二部分是边界框回归损失,用来约束预测框的位置和大小。
回归损失又分为两项:
一是绝对值误差,主要衡量预测框中心点的偏移距离,修正框的位置偏差;
二是交并比误差,用来约束两个框的重合程度,保证预测框和真实框的面积、范围尽量贴合。
DETR 依靠二分图匹配完成框的一对一分配,搭配分类损失 + 回归损失联合优化,既保证物体类
别预测准确,又能让检测框的位置、尺寸精准贴合真实目标。
模型架构
首先说骨干网络部分:我们先让一张图片经过卷积神经网络(CNN),目的就是提取图片的特
征。提取完特征之后,要和位置编码做一个加法,这样才能让模型知道图片里各个像素的位置关
系,再把加完之后的结果传给Transformer模型。
这里的位置编码有两种方式,和大家熟悉的操作一致:第一种是正弦余弦编码,和原始
Transformer用的完全一样,简单说就是用正弦标记图片像素的横坐标位置,用余弦标记纵坐标位
置,固定不变;第二种是可学习的位置编码,不用复杂操作,只要初始化一个位置编码矩阵,模型
训练的时候自己就能慢慢优化调整。
接下来看Transformer模型,它分为编码器和解码器两部分。先看编码器:它用的就是刚才卷积神
经网络提取到的特征,核心作用就是在这些特征之间做注意力计算,让不同位置的特征建立起关
联。比如图片里有一头牛,编码器能让“牛头”和“牛尾”的特征产生联系,这样模型才能认出这是一
个完整的牛,而不是零散的部位。
编码器处理完之后,就把结果传给解码器了。解码器的核心作用,就是利用编码器学到的特征相关
性,把图片里的物体组合识别出来,还能画出对应的预测框。这里要提一下OQ(目标查询),它
就相当于一个给解码器“提问”的角色——比如问解码器“这张图片里有人形物体吗?”“图片右下角有
没有圆形物体?”。OQ一开始是一个全0的张量,等解码器训练完成后,它的输出会传给前馈神经
网络(也就是检测头),每个前馈神经网络专门负责预测一个物体,最后模型就会把预测出的边界
框画在原始图片上。
结合具体的张量尺寸,给大家一步步说清楚(不用记太复杂,理解流程就行):
假设我们输入的图像是一个(3,800,1066)大小的张量(3是图片通道数,800和1066是图片的
高和宽)。经过卷积神经网络处理后,图片的长和宽都会缩小到原来的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)是一组可学习的张量,它是解码器的输入,而不是编码器的输出。 你可以把
它理解成解码器提前准备好的一批"问题"——比如"图里有没有物体?在哪?是什么?"——解码器
带着这些问题去查询编码器提炼出的图像特征。 oq 的初始值是零,但它附带一个可学习的位置编
码,用来区分不同的查询槽位。
位置编码方面,在编码器里,每一层的自注意力计算中,位置编码都会加到 K 和 Q 上;在解码器
里,每一层交叉注意力的 K(来自编码器的输出)也会加上对应的位置编码,而 oq 本身就扮演了
解码器 Q 的位置编码角色。 并且这个加法在编码器和解码器的每一层都会重复做,一共各做 6
次。
解码器的每一层并不是从零开始的,它会把上一层输出的预测结果(物体的类别和位置)以残差连
接的形式传入下一层,相当于"带着上一轮的结论继续优化"。 这样做的好处是,预测结果可以在每
一层被逐步精细化。
举个例子:第一层解码器可能只能模糊地感知到"图里有个人";到了第二层,结合了更多上下文信
息,发现"这个人站在画面右侧";到了第三层,进一步细化,识别出"这个人正在举着双手"。 每一
层都在前一层的基础上往前推进一步,最终得到更准确的检测结果。
