目标检测的 Anchor-Free 和 NMS 到底是什么?

目标检测这几年有两个非常容易混淆的概念:

  • Anchor-Free

  • ​无需 ​NMS​**(End-to-End)**

很多人会误以为:

既然 Anchor-Free 直接回归框,那是不是就不需要 NMS 了?

答案是:不一定。

本文将系统讲清楚:

  1. Anchor-Free 到底解决了什么问题
  2. 为什么 YOLOv8 还是需要 NMS
  3. YOLOv10 为什么可以去掉 NMS
  4. DETR 和 YOLOv10 的本质区别
  5. 三种范式的核心思想差异

一、Anchor-Based vs Anchor-Free

1.Anchor-Based(以 YOLOv5 为例)

在 Anchor-Based 方法中:

  • 每个特征点对应多个预定义宽高比的 anchor
  • 模型学习的是:在某个 anchor 基础上做偏移回归

本质是:

先给一个"初始框模板",再在这个模板上微调。

2.Anchor-Free(以 YOLOv8 为例)

在 YOLOv8 中:

  • 不再使用预定义 anchor
  • 每个特征点直接回归 bbox(如 l, t, r, b)
  • 不依赖 anchor 的形状

看起来像是:

直接预测框 → 应该不会重复 → 不需要 NMS?

但事实并非如此。

二、为什么 Anchor-Free 仍然需要 NMS?

关键在于一个概念:

Dense Prediction(密集预测)

YOLO 系列本质是:

  • 每个特征点都会预测一个候选框
  • 多尺度特征图(P3 / P4 / P5)都会输出

假设一个目标覆盖 3×3 个特征点:

  • 这 9 个位置都可能成为正样本
  • 都会回归出一个高质量框

结果:

  • 同一个目标 → 多个高分框
  • 推理阶段必须用 NMS 去重

核心结论

Anchor-Free 解决的是:

框的定义方式

NMS 解决的是:

多个预测指向同一个目标的问题

两者不是同一个问题。

三、YOLOv8:One-to-Many 训练机制

YOLOv8 采用:

One-to-Many Label Assignment

意思是:

  • 一个 GT 可以匹配多个预测
  • 多个位置都会学习这个目标
  • 推理阶段会产生多个高分框
  • 必须使用 NMS

总结:

YOLOv8 = Anchor-Free + Dense Prediction + One-to-Many + NMS

四、YOLOv10:为什么可以去掉 NMS?

YOLOv10 的核心创新是:

引入 One-to-One 分配机制

但它不是简单替换,而是采用 ​**Dual Assignment Strategy(双分配机制)**​。

训练阶段

  • 一个分支使用 One-to-Many(保证精度与收敛稳定)
  • 一个分支使用 One-to-One(学习唯一匹配)

两个分支同时训练。

推理阶段

  • 只保留 One-to-One 分支
  • 每个目标只输出一个框
  • 自然不需要 NMS

总结:

YOLOv10 = Dense 结构 + One-to-One 输出 + 无 NMS

五、DETR

DETR 不是密集网格预测。

DETR 的核心机制

  • 固定数量 object queries(例如 100 个)
  • 每个 query 输出一个 bbox
  • 使用 Hungarian Matching 做全局一对一匹配

训练时:

每个 GT 只匹配一个 query

未匹配的 query 被监督为背景。

因此:

  • 一个目标只会有一个预测
  • 不需要 NMS

六、DETR vs YOLOv10 本质区别

虽然两者都不需要 NMS,但实现方式完全不同。

核心区别:

  • DETR 是 结构上避免重复
  • YOLOv10 是 训练策略上避免重复

七、三种范式演进总结

第一阶段:Anchor-Based

  • Anchor-Based
  • One-to-Many
  • 需要 NMS

第二阶段:Anchor-Free(YOLOv8)

  • Anchor-Free
  • 仍然 One-to-Many
  • 仍然需要 NMS

第三阶段:End-to-End(YOLOv10 / DETR)

  • One-to-One
  • 不需要 NMS

区别在于:

  • YOLOv10:密集检测 + One-to-One 分配
  • DETR:Query-Based 集合预测

八、最终理解框架

判断是否需要 NMS 的核心问题是:

训练阶段是否允许多个预测同时学习同一个 GT?

  • 允许 → 必须 NMS
  • 不允许 → 不需要 NMS

Anchor-Free 与是否需要 NMS 没有直接因果关系。

九、总结

Anchor-Free 解决的是"框怎么定义",One-to-One 解决的是"是否重复预测",DETR 重构的是"检测问题本身"。

相关推荐
Code_Solitude5 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司5 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP8 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
思麟呀8 小时前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落9 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
Pniubi10 小时前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表
꧁细听勿语情꧂11 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法
俊俊几年的11 小时前
动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100
linux·c++·算法·leetcode·嵌入式·动态规划·c
小雉系统20 小时前
BcoreOS安全通信架构:FsSession 抗算法后门安全设计
算法·安全·架构