目标检测的技术演进:从 YOLO 到 DINO——检测器越来越强,架构越来越统一

如果你在 2016 年让我推荐一个实时目标检测方案,我会毫不犹豫地说 YOLO。它把检测变成了一个回归问题,快到让人发疯。但如果你在 2023 年问我要一个高精度检测方案,我会给你 DINO——一个基于 Transformer 的端到端检测器,它甚至不需要非极大值抑制。

AI technology illustration

这两个答案之间,隔的不只是七年论文堆叠,而是一场关于“检测器到底应该长什么样”的思考方式革命:从手工设计到端到端学习,从空间暴力枚举到特征空间智能查询。

YOLO 的暴力美学:先把目标塞进一张网格

YOLO 的核心思想,一句话说完就是:把图片切成 SxS 个格子,每个格子负责预测中心点落在它这里的目标。模型不再做区域提名,也不再对每个区域分类,而是一张图片进去,最后吐出一个张量。

这个张量里,每个网格要预测 B 个边界框,每个框有 5 个数:中心坐标、宽、高、置信度;另外还要预测 C 个类别概率。最终输出就是 7x7x30 这种形状的 tensor。模型要学的,就是从图片到张量的映射。

听起来很简单,但它有一个很笨的前提:目标必须只有一个中心点,而且中心点最好别落在网格边界附近。如果两只鸟站得很近,中心点落在同一格怎么办?YOLO 的早期版本只能让这个格子多预测几个框,但终究是有限的。YOLO 论文自己也承认,它在小目标、密集场景上表现不好。

后续 YOLO 版本引入锚框来缓解这个问题。锚框是预先定义的一组不同尺寸、不同长宽比的框,比如 3 个面积、3 个比例,组合出 9 个模板。模型不再直接预测位置,而是预测每个 anchor 的位置偏移。这些 anchor 是怎么来的?用 K-means 在训练集标注框上聚类出来的。

锚框(anchor)
从训练数据里统计出来的“先验形状”。每个网格放上几个固定的框,模型只需要调整它们的位置和大小。
非极大值抑制(NMS)
用来处理重复预测的后处理算法:按置信度排序,选中高分框,删掉所有跟它重叠度太大的框。NMS 阈值是一个手工调的超参数,调不好就会漏检或重复。

所以 YOLO 的反直觉之处就在这里:它快,不是因为它聪明,而是因为它暴力。用网格铺满图片,用锚框覆盖所有可能形状,再用 NMS 把多余预测清理掉。真正决定精度上限的,反而是那些手工设计的“先验”合理不合理。

DETR 的激进革命:把检测当成一个集合预测问题

2020 年,Facebook AI 发布了 DETR。它的做法,一句话:让检测器直接把图片映射成一个固定大小的预测集合。没有锚框,没有 NMS,甚至没有传统检测器的“滑窗”概念。

"We present a new method that views object detection as a direct set prediction problem. Our approach streamlines the detection pipeline, effectively removing the need for many hand-designed components like a non-maximum suppression procedure or anchor generation that explicitly encode our prior knowledge about the task."DETR 论文

DETR 是怎么做到去掉这些组件的?它在所有位置之间建立了注意力关系。图片经过 CNN 骨干提取特征后,拉直成一串特征序列。然后 Transformer encoder 让每个位置能“看到”所有位置。接着,decoder 端输入一组可学习的查询向量(object queries)。每个查询向量会通过注意力机制,从特征序列里“读出”它自己感兴趣的那个目标。

最终模型输出 100 个预测(超参数),每个预测由“类别概率+边界框”组成。训练时,用匈牙利算法把这 100 个预测跟真实目标做一一匹配,算损失。

这里最精妙的设计是:匹配过程天然惩罚重复预测。如果两个查询向量都盯上了同一个目标,二分匹配只会让其中一个成功配对,另一个会被当作背景。模型为了降低整体损失,会逐渐学会让不同的查询各自负责不同的目标。于是,NMS 自然就被扬弃了。

这也是我第一次被 DETR 震撼到的地方:检测不是“找出很多框再删掉”,而是“一次性数出所有目标”。这改变了整个问题的数学结构。

DINO:给 DETR 装上“降噪”和“提示”两个外挂

DETR 思路很好,但训练收敛太慢。早期 DETR 在 COCO 上要跑几百个 epoch,才能碰到传统检测器的门槛。后面的改进型如 Deformable DETR 提速了,但 DINO 这个 2022 年的工作,真正让 Transformer 检测器在精度上全面碾压传统路线。

DINO 做了两个关键改动。第一个是去噪训练。训练时,它把训练样本里的真实边界框复制几份,往坐标和类别标签里加噪声,然后把加噪的框当成额外的 decoder 输入,要求模型输出原始框。这等于让模型先做一道更简单的题:把一个大致的框修正好。

为什么“修正框”能让训练更快?因为模型先掌握了“目标的边界长什么样”这种局部知识,再去做“从零预测框”这个全局任务时,就有了一个很好的起点。就像一个背过大量句型的人再去写作,比直接让他写一篇作文更容易上手。

第二个改动是查询选择。传统 DETR 的 object queries 是一组随机初始化的向量;DINO 则从 encoder 的输出特征里挑出那些可能是前景的位置作为初始查询。通俗地说,模型不是闭着眼睛在整张图上乱找,而是先瞄一眼图,锁定可疑区域,再去精确定位。这既提高了收敛速度,也提升了精度。

最终,DINO 在 COCO 榜单上刷新了记录,后面还出现了 DINO-X 等更大规模的模型,这个“把去噪任务作为辅助训练”的思路,后来也被其他视觉任务广泛借鉴。

一张表说清 YOLO 和 DINO 的差距在哪里

维度 YOLO(CNN 时代) DINO(Transformer 时代)
输入表示 网格 + 锚框 特征序列 + 查询向量
目标建模 围绕先验框做回归 查询向量直接解码
去重机制 NMS 后处理 二分匹配隐式去重
人工超参数 网格数、锚框尺寸、NMS 阈值 查询数量、去噪比例
收敛速度 快,几十 epoch 慢,数百 epoch
部署成本 轻量,适合移动端 重,GPU 友好

看到这个表格,你可能会觉得 DINO 又慢又重,那它凭什么成为新趋势?因为精度。在 COCO 检测基准上,DINO 在当年刷新了所有公开模型的最高纪录——而且是在没有 NMS、没有锚框的前提下。这就说明,传统检测器依赖的那些手工先验,并不是不可替代的。

所谓架构统一,其实是把手工设计从规则层搬到了表示层

从 YOLO 到 DINO,表面上是模型结构的变化,背后是一条方法论的主线:不断的“去手工化”。

  1. 特征提取:从 VGG、ResNet 到 ViT 和 Swin,骨干网络从“卷积堆叠”走向“注意力混合”。
  2. 目标表示:从网格、锚框、区域提议,统一为“一组可学习的查询向量”,由模型自己定义什么是目标。
  3. 匹配方式:从 IoU 与 NMS 的启发式规则,变成训练时的匈牙利匹配,直接优化集合损失。
  4. 输出后处理:从复杂的规则过滤,变成只需一个阈值,甚至直接输出。

这个统一过程的本质,是把“怎么找目标”这个任务的一部分,从工程师手里移交给了模型。YOLO 时代,我们需要靠锚框聚类来告诉模型“目标大致长什么样”;DINO 时代,查询向量在训练中自己学会了“远看什么样、近看什么样、看不到时该怎么猜”。

但要注意,统一并不意味着零设计。DINO 里仍然需要你设定查询数量 N、噪声比例等超参数。N 太小会漏检,N 太大会浪费计算。这不是魔法,只是把“手工设计”从规则层挪到了表示层——你不再调 NMS 阈值,但你调 N。

我一度以为 DETR 只是学术游戏,直到我亲手跑了一次

说点我自己的偏见。我是学 CNN 检测出身,最早练手用的就是 YOLO,训练快、部署简单、代码结构一眼能看完。所以我第一次读 DETR 论文时,内心是抗拒的:没有锚框怎么学?没有 NMS 怎么去重?这不就是学术圈为了把 Transformer 塞进更多任务里而做的“花活”吗?

直到我在 COCO 上用官方代码训练了一个最小的 DETR,看到它在验证集上画出的预测框——没有 NMS,没有乱七八糟的重复框,每个目标上方都干净地站着一个框——我才发现自己错得离谱。我过去的信念“检测器必须依靠先验区域”,其实只是一种惯性,来自于我熟悉 YOLO 的思考方式。

后来我理解到,人擅长设计的是“规则和步骤”,但模型真正擅长的是“用端到端的方式逼近目标”。DETR 把检测从“一堆手工规则的拼接”变成了“一个函数的两端”。这也是为什么我说架构统一是必然的:你给模型越多的自由度,它就能越接近任务本质。

为什么 YOLO 还没有被 DINO 淘汰?

因为落地场景极端看重速度和延迟。DINO 类模型的推理速度很难在边缘设备上达到实时,而 YOLO 的轻量化设计在嵌入式平台已经打磨了很多年。精度领先不等于全面胜利。

DETR 系列必须用二分匹配吗?

二分匹配只是训练时的损失计算方式。推理时,每个查询向量已经学好了自己的“职责”,直接输出结果,不需要再做一次匹配。所以它不会增加推理开销。

“查询向量”和“锚框”真的有本质区别吗?

有。锚框是静态的、按聚类结果的固定模板;查询向量是学习的、动态的。前者在训练好之后永远不变,后者在训练过程中会自适应地调整自己“关注什么”。换句话说,锚框是一把把预先造好的钥匙,查询向量是模型自己长出来的触手。

现在的目标检测格局,像是一场双线战争:学术派在 Transformer 端到端路线上不断刷新精度极限,工程派在 YOLO 路线上不断压低计算成本。两条线正在互相渗透——YOLO 的演进中也开始加入注意力模块,DINO 也开始做蒸馏和轻量化。

但架构统一的方向很难逆转:因为检测器最终要面对的,是无穷的物体类别和变幻不定的场景。手工规则永远只能覆盖已知的角落,而可学习的表示,才可能跟上真实世界的开放度。DINO 已经走通了这条路,剩下的问题是:它能不能跑得跟 YOLO 一样快,让每个人都用上?这个问题的答案,也许就是下一代目标检测架构的胜负手。

原创文章,作者:guanweilu,如若转载,请注明出处:https://guanweilu.cn/article/2296.html

赞 (0)
上一篇 23小时前
下一篇 23小时前

相关推荐