☰
端到端目标检测解析:从锚框与NMS到集合预测
2026/10/28 4:00:35 网站建设 项目流程

简介:围绕 DETR 论文的文献汇报 PPT,面向计算机视觉方向的学习者、课程汇报者与论文分享者,帮助其快速梳理 End-to-End Object Detection with Transformers 的核心思想与汇报脉络。内容从传统目标检测依赖 Anchor、NMS 等手工模块的局限切入,说明 DETR 如何将检测视为直接集预测,并以 CNN 特征提取、Transformer 编码解码器、object queries 与前馈网络构建端到端流程,同时涉及二分图匹配损失、COCO 实验结果及全景分割推广。压缩包内含 1 个 pptx 文件,约 3.44MB,按研究背景、研究目的、研究过程、结论组织,配有模型结构图和关键模块讲解,可直接用于课堂展示、组会汇报或论文精读参考。已有 1094 人学习,适合用来把握 DETR 整体框架、整理汇报提纲并补充关键知识点;对汇报者而言,可借鉴其四段式目录与图示表达,对自学者则便于定位与 Faster R-CNN 的性能对比、训练匹配和预测输出等要点,减少逐段提炼原文的时间。

1. 一句话说清「端到端目标检测」:它到底把哪一步省掉了

有位做视觉的朋友吐槽,他调了两天模型,最后卡住的不是网络结构,而是“框和框之间谁该留”这种收尾活儿。这种憋屈感,正好是端到端目标检测想解决的问题。

通俗地说,端到端目标检测就是图片进去、结果出来,中间不再靠人去设计“铺框—筛框”的规则。传统做法要先在图上撒满各种大小的参照框,再按一套人工定的阈值把重复的剔掉;端到端做法希望模型自己学会“这张图里有几个东西、分别在哪、是什么”,一次给全。

值得搞懂它,是因为它换的不只是模块,而是思路:检测不再是“先猜再修”,而被当成一次集合预测。下面从它要治什么病讲起,再看它怎么治,最后说清哪些场景适合、哪些不适合。

2. 为什么非要做端到端:锚框与 NMS 到底累在哪

2.1 一条完整的旧流水线:铺框、打分、筛框

要理解新方法的价值,得先看清旧方法的力气花在哪。经典的目标检测流水线大体是三步:第一步,在图像(或特征图)的每个位置上,预先摆好若干个不同大小、不同长宽比的参照框;第二步,让网络判断每个参照框里“有没有东西、是什么东西”,并回归出一个相对参照框的偏移量,把框“修正”到物体的真实位置上;第三步,因为同一个人可能被几十个框同时覆盖,需要用一套规则把多余的框删掉。

这套流程能跑,而且跑了很多年,效果也不差。它的核心思路是“代理任务”——不直接回答“这张图里有几个物体”,而是回答一堆更容易的小问题:这个位置偏一点有没有东西?这个框要不要往右挪两个像素?这种做法在工程上非常成熟,但它有一个绕不开的代价:整条链路里,有大量环节是人手工设计、靠经验调出来的。

打个小比方,这就像让人在一张地图上先密密地铺一层透明格子,再逐格判断“这里是不是藏了东西”,最后把连成一片的格子合并成一个圈。能找着,但费力,而且格子的疏密、大小都得你事先想好。

2.2 锚框是什么:一张图上预先撒好的「渔网」

锚框就是在图像上预设好的不同大小、不同长宽比的参照框。它会铺在特征图的每一个空间位置上,一个位置铺几种尺度、几种比例,通常是组合出一个不小的数量,整张图摊下来就是成千上万个候选。

为什么非要用“预设”而不是让网络直接吐坐标?因为直接回归绝对坐标太难了,网络很难凭空学出“这个物体的中心在 (317, 208)”这种精确数值。但如果改成回归相对某个参照框的小偏移,任务就轻得多——只要判断“往左一点、再高一点、宽一点”,这属于典型的“把难题拆成小问题”。

代价也在这里。锚框的超参数是一整套互相牵制的旋钮:每个位置铺几个框、用哪几种尺度和长宽比、和真值框重叠多少算正样本、多少算负样本、负样本怎么采样。下面这张表能看出旋钮有多少:

旋钮典型取值思路换场景后的问题
每位置锚框数量3 种尺度 × 3 种比例数量翻倍,计算量跟着翻
尺度范围按数据集目标大小统计定换到小目标场景要先重估
正样本 IOU 阈值常取 0.5 上下太松引入噪声,太严正样本不够
负样本采样比例正负按固定比例抽极端不平衡时要重调

麻烦在于,这套旋钮跟数据集强相关。在一种数据上好不容易调顺的参数,换到显微图像、航拍图、货架商品这类目标尺度分布完全不同的场景,往往要重新来一遍。这种“明明代码没改,效果就是崩了”的体验,很多做过迁移的人都懂,说它有点玄学并不夸张。

2.3 NMS 是什么:重叠框里只能留一个

NMS 即非极大值抑制。它的做法很直白:分类器给出成千上万个候选框以及每个框属于各类别的概率,先按概率排序,保留分数最高的那个,然后把和它重叠度超过阈值的框全部删掉,再从剩下的里挑分数最高的,重复这一过程。

它的逻辑可以用十几行代码写清楚:

# 简化版 NMS:串行地“留一个、删一批” def nms(boxes, scores, iou_thres=0.5): order = scores.argsort()[::-1] # 按置信度从高到低排序 keep = [] while order.size > 0: # 每轮只处理剩下的框,必须串行 i = order[0] keep.append(i) # 当前最高分的框直接保留 ious = iou(boxes[i], boxes[order[1:]]) order = order[1:][ious <= iou_thres] # 与它重叠超阈值的框被丢弃 return keep

这里的iou_thres是重叠度阈值,取得越小越严格,删得越狠;keep是最终保留下来的框索引。看上去不复杂,问题出在两点:一是它必须串行,后一个框删不删,取决于前一个框留没留,没法并行;二是它不可微,阈值判断是个硬台阶,梯度传不过去,所以它天然站在训练流程之外,只能当收尾的“事后处理”。

阈值本身就很难定。密集场景里,两个挨得很近的人、并排停的车,阈值一严就容易把真目标当重复框删掉,出现漏检;阈值一松,同一个物体又会被留下好几个重叠框。这个两难在拥挤场景里几乎是常态,调来调去就是在漏检和重框之间找一个勉强能接受的点。

2.4 手工组件的真实代价:不是跑不动,是难迁移

把这些环节串起来看,会发现真正的负担不是算力,而是耦合。锚框的尺度要匹配输入分辨率和特征图的步长;正负样本的判定阈值又决定了每个真值能分到多少个正样本;正样本数量反过来影响分类头的收敛;最后 NMS 的阈值还要跟前面这些参数一起调到能看。

改一个,牵一片。这类系统的排查成本很高,因为出错时你很难判断是锚框没铺好、阈值没定好,还是收尾删多了——整条链路像个黑匣子,中间环节的因果关系被一堆阈值挡着。对做研究的人来说,更在意的还有一层:这些手工模块让“检测”这件事本身变得不纯粹,模型学到的东西里混了太多人为先验,想改进结构时,很难说清涨点到底来自网络还是来自调参。

于是就有一个很自然的追问:能不能不让模型去修一堆预设的框,而是让它直接回答“这张图里有哪几个物体”?这正是这篇论文提出的方法想做的事——把检测当成一次集合预测,从输入到输出一步到位,把锚框和 NMS 这两块手工设计从流程里拿掉。

3. 它到底怎么检测:把目标检测当成一次「集合预测」

3.1 三件套结构:提特征、建关系、出结果

整个模型的结构可以拆成三部分:一个 CNN 主干网络负责提取规整的特征图;一个 Transformer 负责在编码和解码之间建立元素之间的依赖关系;一个简单的前馈网络做最后的预测,直接给出检测框和类别。

主干的选择是常规思路——检测图像通常比较大,先用 CNN 把尺寸压下来,同时把通道数提上去,让每个通道负责捕捉不同的视觉特征。论文里的设置是输出特征图有 2048 个通道,长宽相对原图缩小 32 倍。这个“缩小 32 倍”很关键,它意味着后面所有计算都在一张小得多的图上进行,成本可控。

真正换思路的是中间这段。传统检测器在特征图上滑窗、铺框,本质是在做局部判断;而 Transformer 的自注意力机制让每个位置都能看到整张图的其他位置,从而拿到序列之间的依赖关系,确定整幅图里各个实例之间的关系,让模型有选择地聚焦于输入的某些部分。举个直观的例子:一只被遮挡的大象只露出一小部分,局部看很难判断,但如果模型能参照整张图的上下文,就有机会把这块碎片和“象”这个概念对上。

3.2 从特征图到序列:位置编码为什么不能省

CNN 输出的是一张C×H×W的三维特征图,而 Transformer 要的是一串序列,中间需要一次“翻译”,论文里分三步走。

第一步是维度压缩:用 1×1 卷积把通道数从 C 压到 d,得到d×H×W的新特征图。1×1 卷积在这里的作用不是提特征,而是做通道层面的线性组合,把维度对齐到 Transformer 好处理的宽度。

第二步是序列化:Transformer 要求输入是一个序列,所以把高和宽这两个空间维度压平成一个维度,把d×H×W重排成d×HW。到这里,图就变成了HW个长度为 d 的向量,每个向量对应原图上一小块区域。

第三步是加上位置编码。这一步最容易被初学者忽略,但它不能省——自注意力本身是顺序无关的,你把序列打乱,算出来的结果一模一样。可HW这个维度显然和原图的空间位置强相关,不加位置信息,模型就等于拿到一把被打乱的拼图。论文的消融实验也印证了这一点:不使用空间位置编码和输出位置编码,精度会明显下降。

提示:位置编码不是“额外加点信息”这么轻描淡写,它是让一堆无序向量重新获得空间意义的唯一手段。看这类模型时,先找位置编码加在哪,基本就能判断它有没有认真处理空间关系。

3.3 Object Query:N 个可学习的「提问者」

编码器输出的每个输入都会变成一个 d 维的特征向量,接下来交给解码器。解码器的结构和标准 Transformer 类似,区别在于它会并行解码 N 个目标,而不是像翻译任务那样一个词一个词往外吐。

它的另一路输入叫 object query,也就是目标查询,一共 N 个向量。这 N 个向量是随机初始化、然后靠训练学出来的。它们不是从图像里算出来的,而是模型自己积累的一套“提问方式”。

论文里把不同 query 的注意力可视化出来,效果很直观:有的 query 专门问“左下角有什么物体”,有的问“中间靠下的位置有什么”,有的则对某类形状更敏感。可以这么理解:模型在训练中慢慢学会了派出 N 个各带偏好的侦察员,每人负责一片区域或一类模式,最后把各自的发现汇总。

这 N 个向量进入解码器后,会经过自注意力和编码器-解码器注意力,模型利用它们之间的成对关系对所有目标做全局推理,同时把整张图作为上下文信息用上。输出的 N 个 embedding 再各自独立地送进前馈网络,得到 N 个最终预测。

这里有个容易被忽略的设计取舍:N 是一个固定的数字,通常设得远大于图中实际可能出现的物体数量。这意味着模型永远输出固定条数的结果,多出来的那些,交给下一节要讲的特殊类别去处理。

3.4 输出与 ∅:允许模型说「这里没东西」

最终预测由三层组成:一个 ReLU 激活层、一个 d 维的隐藏层、一个线性投影层。前馈网络预测的是归一化的中心坐标和边界框宽高,线性层用 softmax 预测类别标签。

因为模型固定输出 N 个框,而 N 通常远大于图中真实物体的数量,所以必须引入一个额外的特殊类标签 ∅,表示这个位置没有检测到对象。它的作用和标准检测方法里的“背景”类相似,但用法有本质差别:背景是在“每个位置都要分类”的框架下用的,而 ∅ 是在“固定槽位”的框架下用的——它允许某个槽位大方承认“我这个位置是空的”。

这一步看着不起眼,其实是整个设计能成立的前提。如果没有 ∅,N 个槽位每一个都被迫认领一个物体,模型就会被迫在空白处硬编出一个框,产生大量错误的正样本,训练根本没法收敛。给了 ∅ 这条退路之后,模型才有机会学会“哪里该沉默”。

4. 预测和真值怎么对上号:二分图匹配与损失函数在做什么

4.1 一对一匹配:为什么不用「多对多」的贴标签方式

传统检测器训练时,一个真值框往往会匹配上几千个锚框作为正样本,这叫“多对多”的标签分配。这种做法能让正样本足够多、训练更稳,但副作用就是推理时同一个物体会被重复预测很多次,必须靠 NMS 去重。

新方法走的是另一条路:一对一。模型输出 N 个预测,训练时给这 N 个预测和图中的真值做一次匹配,每个真值只配一个预测,每个预测最多认领一个真值。这样一来,“一个物体只被预测一次”成了训练目标本身,而不是靠推理阶段的事后补救。

这也解释了它为什么在设计上不需要 NMS:重复框不是被删掉的,而是压根没有被鼓励产生。这一点最容易理解错,第 5 章会专门拆开讲。

4.2 匈牙利算法在做什么:找一组总代价最小的配对

要把预测和真值配上对,需要先定义“配得好不好”。论文的做法是算一个匹配代价,它同时考虑分类是否正确和框是否吻合,然后在所有可能的配对方案里,找总代价最小的那一种。求解这个最优配对用的就是匈牙利算法。

实际写起来并不复杂:

import torch from scipy.optimize import linear_sum_assignment # cost: [N, M] 的二维代价矩阵 # N = 模型输出的预测数量(固定值,通常远大于图中物体数) # M = 真值数量(同样补齐到与 N 一致,空位用 ∅ 占位) # cost[i][j] = 第 i 个预测去认领第 j 个真值的代价(分类代价 + 框代价) row, col = linear_sum_assignment(cost.cpu().numpy()) # row 与 col 一一对应:每个预测最多认领一个真值,每个真值也只被认领一次

linear_sum_assignment返回的是行列索引的配对结果,它的约束是“每行只选一列、每列只被选一次”,正好对应一对一的匹配要求。代价矩阵的构造方式决定了匹配质量:分类项看预测的类别概率对不对,框项看位置尺寸差多少。因为真值数量往往少于 N,需要把真值集合也补齐到 N,多出来的位置用 ∅ 填充,这样两边数量一致,才能构成标准的方阵匹配问题。

注意:这里的匹配是在“每次前向”时现算的,不是预先固定的标签。同一张图在不同训练阶段,配对结果可能变化,这也是它和固定标签分配思路的重要差别。

4.3 损失函数:分类项加框项,L1 与 IOU 为什么要合起来

匹配确定之后,损失就好算了。整体形式是常见检测器损失的线性组合:类别预测的负对数似然,加上框回归损失。真值集合里的每个元素记作(c, b),其中 c 是类别标签,b 是一个 4 维归一化向量,代表物体中心点相对整幅图的位置,以及高宽相对整幅图的大小。

分类项有个细节值得说:∅ 类的损失要降权处理,并且要按非 ∅ 的预测数量做归一化。原因很实在——N 远大于真实物体数,如果 ∅ 的损失和其他类一样重,模型只要把所有槽位都预测成 ∅ 就能拿到很低的损失,等于学会了偷懒。

框回归项的坑更典型。如果只用 L1 损失,对小目标就不公平:同样是偏了 10 个像素,落在一个大框上几乎无所谓,落在一个小框上可能已经偏出物体了,但 L1 给出的惩罚是一样的。所以论文把 L1 损失和 IOU 类损失组合起来用,后者衡量的是两个包围框的重合程度,对目标的绝对大小不敏感,主要看“重合得好不好”。

消融实验把这个取舍讲得很清楚:只用 L1 损失时结果很差;和 IOU 类损失结合使用后,中大目标的精度得到改善。这也提醒一件事——看检测模型的损失设计,别只盯着公式好不好看,要看它对不同尺度目标是不是一视同仁。

5. 最容易搞混的五个概念:端到端、无锚框、免 NMS 区别在哪

5.1 误区一:端到端就等于更快、更强

易混在哪:很多人一听“去掉手工模块”,第一反应是流程短了,速度自然快、效果自然好。

为什么会混:省掉锚框生成和 NMS,确实少了一批计算和一堆超参数,听起来是纯赚。

怎么区分:省的是设计成本和调参成本,不是白拿的收益。这类模型在精度和速度上与经典两阶段检测器大致相当,并非全面碾压;而且它的训练收敛明显更慢,需要更长的训练轮次才能追平。它真正的收益在于流程更干净、更本质,想改进结构时因果关系清楚,而不是“一键变快”。

5.2 误区二:不用锚框,就等于无锚框检测器

易混在哪:两者都号称“不需要锚框”,名字一撞,很容易当成同一件事。

为什么会混:“无锚框”这个名字太容易被理解成“没有预设框”,而这类方法确实也是不铺锚框的。

怎么区分:看它靠什么解决重复预测。典型的无锚框方法仍然是“每个位置出一个预测”,推理时照样要后处理去重,只是把参照物从预设框换成了关键点或中心点。而这里讲的方法走的是集合预测路线,一对一监督让重复框从训练阶段就不被鼓励,后处理从设计上就不需要。前者是换了参照物,后者是换了问题形式。

5.3 误区三:集合预测和多标签分类是一回事

易混在哪:都是“一次输出多个结果”,看起来只是叫法不同。

为什么会混:多标签分类同样允许一张图对应多个类别标签,形式上很像。

怎么区分:多标签分类里各个标签是彼此独立的,输出两个“人”也没人管;集合预测要求输出构成一个集合,元素之间不能重复,损失也不能逐元素算,必须先用匹配把预测和真值对上。这个差别直接决定了训练代码的写法——匹配那一步是不能跳的。

5.4 误区四:Transformer 来了,CNN 就可以扔了

易混在哪:看到“用 Transformer 做检测”,会以为特征提取也交给注意力了。

为什么会混:Transformer 在别的任务里确实能端到端替代卷积结构。

怎么区分:这里的结构里,CNN 主干依然在,而且位置很重要——它负责把大图压成规整的小特征图,把通道数提上去。Transformer 处理的是被压平、加了位置编码的序列,不是原始像素。主干换成别的网络也得满足同样的要求:输出规整特征图、可接受的步长、足够的通道数。

5.5 误区五:N 个查询就对应 N 个物体

易混在哪:看到模型输出固定 N 个框,就以为它认为图里有 N 个物体。

为什么会混:输出确实是 N 条,格式整齐,容易误读成“N 就是检测到的数量”。

怎么区分:N 是槽位容量,是上限而不是计数。真实物体数远小于 N,绝大多数槽位应该输出 ∅。判断一个模型训得好不好,一个很实用的观察点就是看 ∅ 的占比:如果 ∅ 少得反常,说明模型在硬编框;如果几乎全是 ∅,说明它什么都没学到。

6. 什么时候该用它、什么时候别碰:边界判断与材料用法

把上面的东西收拢成一句可操作的判断:如果你要的是一个结构干净、因果关系清楚、不需要为不同数据集反复重调锚框参数的检测方案,它值得作为首选试试;如果你要的是极致的推理速度、或者场景里全是密集小目标,它未必是最优解。

落到具体场景,可以按这张表过一遍:

场景特征适配程度原因
目标尺度差异大、大小目标混杂谨慎对大目标友好,小目标精度相对吃亏
密集遮挡、目标挨得很近较适配全局注意力对遮挡和上下文利用得好
需要跨领域迁移、不想重调锚框较适配少了与数据集强绑定的那套旋钮
边端设备、强实时要求谨慎结构较重,训练收敛也慢
需要扩展到全景分割等任务较适配在检测头上加个小扩展即可复用主体结构
数据量很小、标注有限谨慎一对一监督下每个真值只有一个正样本,收敛更依赖数据量

如果是为了做汇报或者给别人讲清楚这套方法,一份把“背景—目的—过程—结论”串起来的材料会省很多口舌:先讲老流程卡在哪,再讲新思路怎么绕开,最后用结构图、匹配示意图和消融结果把“为什么这样设计”兜住。这也是这类文献汇报材料的价值所在——它把散在论文各处的动机和实验串成一条能顺着讲的线。

我自己第一次给别人讲这套结构时就翻过车:当时兴致冲冲地讲了半天的注意力机制,结果有人举手问“那它到底还需不需要 NMS”,我才发现最该先讲的那句话被埋在了最后。从那以后我每次准备这类材料,都强制走一遍“先一句话结论、再动机、再结构、最后边界”的顺序,哪怕时间紧也先把这个骨架搭出来,细节再往里填。

希望这份梳理能帮到你,让你下次再遇到“端到端”这三个字的时候,不用先愣三秒。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询