搞懂 YOLO 网格预测:Grid 分工、置信度与训练/测试逻辑

很多人学习 YOLO 时,都会被几个问题反复困扰:

  • YOLO 的 Grid 网格明明很小,为什么能框出超大的物体?
  • 训练时靠真实框分配网格,那测试时没有标注框怎么办?
  • 置信度到底是什么?为什么模型会自动输出高低分?
  • YOLO 网格和 Faster R-CNN 的 Anchor 锚框有什么本质区别?

这些问题如果想不通,后面学习 YOLOv5、YOLOv8、RT-DETR、DINO 等现代检测器都会非常痛苦。

本文从零开始,用最直观的大白话彻底讲透 YOLOv1 的核心思想。


一、先纠正 3 个致命误区

误区1:Grid 网格是用来框物体的

这是最常见的错误理解。

很多人看到 YOLO 把图片划分成很多小网格,就会认为:

网格有多大,预测框就只能有多大。

实际上完全不是这样。

Grid 的作用从来不是画框。

Grid 本质上只是一个:

任务分工系统(Task Assignment System)

它只负责回答一个问题:

这个物体应该由谁负责预测?

而不是:

这个物体应该框多大?

因此:

  • Grid ≠ 检测框
  • Grid ≠ Anchor
  • Grid ≠ Bounding Box

Grid 只是一个逻辑工位。


误区2:网格很小,所以只能检测小物体

这也是初学者非常容易产生的误解。

例如:

YOLOv1 输入:

448×448

划分:

7×7 Grid

则每个 Grid 大约:

64×64

很多人会想:

Grid只有64×64

那它最多检测64×64的目标?

错。

原因在于:

CNN 的感受野(Receptive Field)远大于 Grid。

例如:

Grid:
只负责预测

CNN:
看的是整张图

可以理解成:

一个工位坐在办公室角落

但监控屏幕能看到整个公司

因此:

一个 Grid 完全可以预测:

  • 横跨多个 Grid 的目标
  • 覆盖整张图片的目标
  • 比自己大几十倍的目标

Grid 小,不代表视野小。


误区3:测试时模型靠真实框分配网格

很多人以为:

训练:
中心点属于哪个Grid

测试:
也要先找到中心点

这其实是不可能的。

因为测试时:

没有GT框
没有中心点
没有标签

模型根本拿不到任何真实信息。

因此:

测试阶段不存在:

人为分配

而是:

模型自主预测

这一点非常重要。


二、YOLO Grid 的唯一核心作用

一句话概括:

Grid 存在的意义就是分工与去重。


如果没有 Grid 会怎样?

假设整张图所有位置都能自由预测。

例如:

图片里有一只狗

那么:

位置A预测狗

位置B预测狗

位置C预测狗

位置D预测狗

最终可能产生:

几十个重复框

例如:

Dog 0.91

Dog 0.89

Dog 0.88

Dog 0.87

Dog 0.85

全部框住同一只狗。

模型会变得非常混乱。


YOLO 的解决方案

YOLO规定:

哪个Grid包含目标中心点

哪个Grid负责预测

例如:

        狗

+----+----+----+
|    |    |    |
+----+----+----+
|    | ●  |    |
+----+----+----+
|    |    |    |
+----+----+----+

中心点落在中间 Grid。

那么:

中间Grid:
负责预测

其他Grid:
不允许预测

这样:

一个目标

一个负责人

避免重复预测。


三、训练阶段到底发生了什么?

很多人以为:

模型先找到物体

再决定谁负责

实际上完全相反。

训练阶段:

先人为决定谁负责

再训练模型学习

Step1:计算中心点

假设标注框:

xmin=100
ymin=120

xmax=300
ymax=320

计算中心点:

cx=(100+300)/2=200

cy=(120+320)/2=220

Step2:计算属于哪个 Grid

图片:

448×448

划分:

7×7

单个 Grid:

64×64

则:

row = 220 / 64

col = 200 / 64

得到:

第3行第4列

于是:

负责Grid = (3,4)

注意:

这里完全是数学计算。

不是模型判断出来的。


Step3:给 Grid 打标签

负责 Grid:

Confidence=1

其他 Grid:

Confidence=0

例如:

0 0 0 0 0

0 0 1 0 0

0 0 0 0 0

只有一个正样本。


Step4:回归框坐标

负责 Grid 学习:

x
y
w
h

其中:

x,y
表示中心点偏移

w,h
表示目标尺寸

同时学习:

类别

例如:

Dog

Step5:损失函数反向传播

损失函数会持续惩罚:

负责 Grid

如果:

置信度低
框不准
类别错

就会产生较大损失。


背景 Grid

如果:

乱输出高置信度

同样会被惩罚。

经过大量训练后:

模型逐渐学会:

看到狗的特征

输出高置信度
看到背景

输出低置信度

四、YOLOv1 的置信度到底是什么?

这是很多教程讲错的地方。


很多人以为

Confidence=P(Object)

实际上不准确。

YOLOv1原论文定义:

Confidence=P(Object)×IoU

即:

目标存在概率×预测框质量

例如:

情况1

有目标:

P(Object)=1

IoU=0.9

则:

Confidence=0.9

情况2

有目标但框很差:

P(Object)=1

IoU=0.3

则:

Confidence=0.3

情况3

没有目标:

P(Object)=0

则:

Confidence=0

因此:

YOLOv1 的置信度实际上同时考虑:

  • 有没有目标
  • 框得准不准

五、测试阶段没有GT怎么办?

这是 YOLO 最反直觉的地方。

训练时:

知道GT

测试时:

什么都不知道

怎么办?

答案:

全预测
再筛选

第一步

所有 Grid 同时预测。

例如:

7×7

共49个Grid

全部输出:

Bounding Box

Confidence

Class

第二步

模型自动产生高低分

训练好的模型会形成规律:

目标中心附近Grid

高置信度
背景Grid

低置信度

例如:

0.01

0.02

0.95

0.03

0.01

第三步

置信度过滤

例如:

Threshold=0.5

保留:

Confidence > 0.5

删除:

Confidence < 0.5

第四步

NMS

多个重叠框:

0.95

0.91

0.88

保留最高:

0.95

其余删除。

最终得到唯一结果。


六、为什么小 Grid 能框超大目标?

关键原因:

Grid负责预测

Bounding Box负责描述目标

两者不是一回事。


YOLO预测:

(x,y,w,h)

其中:

x,y

中心点位置
w,h

目标宽高

例如:

Grid大小

64×64

但预测:

w=400

h=350

完全允许。

因此:

小Grid

可以预测大目标

没有任何冲突。


七、YOLOv1 与 Faster R-CNN 本质区别

特性Faster R-CNNYOLOv1
预测单元AnchorGrid
框来源Anchor微调直接回归
标签分配IoU匹配中心点分配
检测方式Two-StageOne-Stage
推理速度较慢极快
重复预测较多较少
结构复杂度高低

八、现代 YOLO 其实已经不一样了

这一点特别重要。

很多人学完 YOLOv1 去看 YOLOv8:

直接懵掉

因为现代 YOLO 已经发生巨大变化。


YOLOv2~YOLOv7

采用:

Anchor-Based

即:

预设Anchor

预测偏移量

更接近 Faster R-CNN。


YOLOv8 / YOLO11 / YOLO12

采用:

Anchor-Free

即:

不再使用传统Anchor

预测方式已经和 YOLOv1 完全不同。

但核心思想仍然保留:

密集预测

端到端训练

一次前向完成检测

九、全文终极总结(面试背诵版)

Grid 的作用

仅负责分工与去重

不负责画框

训练阶段

GT框

↓

计算中心点

↓

分配负责Grid

↓

打标签

↓

损失函数训练

测试阶段

所有Grid预测

↓

置信度筛选

↓

NMS去重

↓

最终结果

为什么小Grid能预测大目标

Grid决定谁负责

Bounding Box决定框多大

二者互不限制。


置信度本质

YOLOv1:

Confidence

=

P(Object)

×

IoU

不是简单的:

P(Object)

一句话彻底理解 YOLO

Grid 不是用来框物体的,而是用来给物体分配“负责人”的;真正决定目标位置和大小的是网络回归出来的 Bounding Box,而不是网格本身。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐