YOLOv1 详解:统一目标检测的起点

April 16, 2026

YOLOv1 详解:统一目标检测的起点

YOLOv1 由 Joseph Redmon 等人于 2015 年提出,第一次系统性地把目标检测重新表述为单次前向传播完成的统一回归问题:模型不再先生成候选框、再逐个分类,而是直接从整张图像回归出边界框位置与类别概率。这篇工作并不是把当时检测精度做到极致,却彻底改变了人们设计检测器的方式,成为 one-stage detector 路线真正意义上的起点。

从今天的视角回看,YOLOv1 在小目标、密集场景和定位精度上都有明显局限,但它做对了一件更重要的事:证明目标检测可以摆脱复杂的候选区域流水线,转而用一个端到端神经网络统一建模。后来的 YOLO、SSD、RetinaNet 以及大量实时检测器,基本都沿着这条思路继续推进。理解 YOLOv1,不只是理解一个“早期版本”,更是在理解现代实时检测系统的起点。

YOLOv1 总览:它如何把目标检测从两阶段流水线改写为统一回归问题

问题背景与方法动机

在 YOLOv1 之前,主流检测器大多属于两阶段思路:先产生候选区域,再对候选区域做分类与边框回归。这类方法通常精度较高,但存在三个明显代价:

  • 流程割裂:候选框生成、特征提取、分类、回归往往分属不同阶段;
  • 推理缓慢:候选区域数目多时,计算成本很高;
  • 全局上下文利用不足:模型经常在局部区域上做判断,更容易引入背景误检。

YOLOv1 的核心判断是:检测本质上也可以被看作回归任务。如果网络能直接输出“哪里有目标、是什么类别、框的位置是多少”,那么检测就不必依赖复杂的候选区域流水线。

下面这张对比表可以帮助快速定位 YOLOv1 的历史位置:

方法核心思路优点主要瓶颈
DPMHOG + 滑动窗口 + 部件建模早期代表性方法,具备一定形变建模能力依赖手工特征,速度慢,鲁棒性有限
R-CNN候选框 + CNN 分类检测精度显著提升多阶段训练,推理极慢
Fast R-CNN共享卷积特征,统一分类与回归比 R-CNN 更高效仍依赖外部候选框
Faster R-CNN用 RPN 生成候选框速度与精度平衡更好仍非真正单阶段实时检测
YOLOv1整图直接回归边框和类别端到端、实时、全局感知小目标和密集场景表现较弱

YOLOv1 的统一预测方式

从图像到网格

YOLOv1 将输入图像划分为 S×SS \times S 个网格。若某个目标的中心点落入某个 grid cell,那么这个 cell 就负责预测该目标。

在论文设定中,S=7S = 7,因此整张图像被划分为 7×77 \times 7 个网格。

YOLOv1 的网格划分与预测示意

这个设计有两个直接含义:

  1. 责任分配规则非常简单:由目标中心点所在的 cell 负责;
  2. 每个 cell 的表达能力有限:它只能输出一组类别概率,因此天然不擅长处理同一网格内多个目标的情况。

每个 grid cell 预测什么

对于每个 grid cell,YOLOv1 会预测:

  • BB 个边界框;
  • 每个边界框包含 5 个量:x,y,w,h,cx, y, w, h, c
  • 该 cell 还会输出一组类别条件概率。

其中:

  • x,yx, y 表示预测框中心点相对于当前 grid cell 左上角的偏移;
  • w,hw, h 表示边界框宽高,相对于整张图像宽高归一化;
  • cc 是置信度分数,用于刻画该框“是否有物体”以及“框得准不准”。

边界框中心坐标的相对偏移定义

边界框宽高的归一化表示

YOLOv1 在 PASCAL VOC 上采用 B=2B = 2C=20C = 20,因此每个 grid cell 的输出维度为:

5B+C=5×2+20=305B + C = 5 \times 2 + 20 = 30

整张图像最终输出张量为:

S×S×(5B+C)=7×7×30S \times S \times (5B + C) = 7 \times 7 \times 30

这也是论文中著名的 7×7×307 \times 7 \times 30 输出结构。

类别概率与边界框预测共同组成最终输出

置信度究竟表示什么

YOLOv1 中边界框置信度定义为:

Confidence=P(Object)×IoU(pred,truth)\text{Confidence} = P(\text{Object}) \times \text{IoU}(\text{pred}, \text{truth})

这一定义很关键,因为它把两个问题合并到了同一个标量里:

  • 该位置是否真的存在目标;
  • 预测框与真实框是否重合得足够好。

因此,YOLOv1 的输出并不是“纯分类分数”,而是目标存在性与定位质量的联合刻画

网络结构与输出张量

YOLOv1 的 backbone 受 GoogLeNet 启发,由 24 个卷积层和 2 个全连接层组成。输入图像大小为 448×448448 \times 448,最终输出被 reshape 为 7×7×307 \times 7 \times 30

YOLOv1 网络结构图

理解这个网络时,最容易混淆的是:为什么 backbone 的空间输出是 7×77 \times 7,就意味着输入图像被划分为了 7×77 \times 7 个网格?

答案是:网络的总下采样率把输入空间映射成了一个粗粒度特征图。最终每个空间位置都对应原图上的一个感受野区域,因此最后的 7×77 \times 7 空间位置可以被自然解释为 7×77 \times 7 个预测单元。

7×7×30 输出结构的来源说明

这一点也解释了 YOLOv1 为什么对小目标不友好:

  • 特征图分辨率只有 7×77 \times 7
  • 一个 cell 只负责一个目标;
  • 经过多次下采样后,小目标的细粒度信息容易丢失。

下图可以更直观看到输出张量由边界框参数和类别概率共同构成:

每个 grid cell 的输出向量组成

7×7 网格与 30 维输出的关系

此外,YOLOv1 在卷积层中频繁使用 1×11 \times 1 卷积与 3×33 \times 3 卷积的组合:

  • 1×11 \times 1 卷积用于压缩通道、降低计算量;
  • 3×33 \times 3 卷积负责提取空间特征;
  • 除最后一层外,大多使用 Leaky ReLU 激活。

从工程角度看,这是一种非常“现代”的设计:在保证表达能力的同时尽量压缩计算成本,为实时检测打基础。

训练机制与损失函数

责任框分配

YOLOv1 每个 cell 会预测两个边界框,但训练时并不是两个框都去拟合同一个目标。对于某个真实目标,模型会在该 cell 的多个预测框中,选择与 ground truth 的 IoU 更高的那个预测框作为责任框,由它承担回归任务。

这不是“两个框一起预测同一个目标”,而是多个预测器竞争,最后由更匹配的那个负责学习。这个设计让不同预测框有机会学习不同的框形状与定位偏好。

总损失函数

YOLOv1 的损失函数由三部分组成:

  1. 定位损失:监督 x,y,w,hx, y, w, h
  2. 置信度损失:监督框是否有物体、框是否准确;
  3. 分类损失:监督类别条件概率。

原论文的总损失可写为:

L=  λcoordi=1S2j=1B1ijobj[(xix^i)2+(yiy^i)2]+λcoordi=1S2j=1B1ijobj[(wiw^i)2+(hih^i)2]+i=1S2j=1B1ijobj(CiC^i)2+λnoobji=1S2j=1B1ijnoobj(CiC^i)2+i=1S21iobjcclasses(pi(c)p^i(c))2\begin{aligned} \mathcal{L} = &\; \lambda_{coord} \sum_{i=1}^{S^2} \sum_{j=1}^{B} \mathbf{1}_{ij}^{obj} \left[(x_i-\hat{x}_i)^2 + (y_i-\hat{y}_i)^2\right] \\ &+ \lambda_{coord} \sum_{i=1}^{S^2} \sum_{j=1}^{B} \mathbf{1}_{ij}^{obj} \left[(\sqrt{w_i}-\sqrt{\hat{w}_i})^2 + (\sqrt{h_i}-\sqrt{\hat{h}_i})^2\right] \\ &+ \sum_{i=1}^{S^2} \sum_{j=1}^{B} \mathbf{1}_{ij}^{obj}(C_i-\hat{C}_i)^2 \\ &+ \lambda_{noobj} \sum_{i=1}^{S^2} \sum_{j=1}^{B} \mathbf{1}_{ij}^{noobj}(C_i-\hat{C}_i)^2 \\ &+ \sum_{i=1}^{S^2} \mathbf{1}_i^{obj} \sum_{c \in classes}(p_i(c)-\hat{p}_i(c))^2 \end{aligned}

YOLOv1 总损失函数分解图

为什么对宽高取平方根

YOLOv1 对 w,hw, h 使用平方根后再计算误差:

(ww^)2+(hh^)2(\sqrt{w} - \sqrt{\hat{w}})^2 + (\sqrt{h} - \sqrt{\hat{h}})^2

直觉上,这是为了缓解大框和小框在数值尺度上的不平衡。若直接在线性空间比较宽高,大框的绝对误差会主导损失;而平方根变换可以让模型对小框尺寸更敏感。

定位损失的组成示意

为什么要降低 no-object 的损失权重

7×77 \times 7 个 cell 中,真正包含目标的 cell 往往很少,大多数位置都属于背景。如果所有背景框都以同等权重进入损失,训练就会被大量“没有目标”的样本主导。

因此 YOLOv1 引入了两个权重:

  • λcoord=5\lambda_{coord} = 5:提高定位误差的权重;
  • λnoobj=0.5\lambda_{noobj} = 0.5:降低无目标框的置信度损失权重。

置信度损失的组成示意

分类损失只对包含目标的 cell 计算,这与 YOLOv1 的建模方式一致:类别概率是“在该 cell 有目标的条件下”的类别分布。

分类损失的组成示意

推理阶段与 NMS

YOLOv1 推理时会为每个边界框计算类别相关分数,常见做法是将类别条件概率与框置信度结合,再对每个类别分别做非极大值抑制(NMS)。

NMS 的目标不是“提高召回率”,而是去掉对同一目标的重复检测框。它的基本流程如下:

  1. 按某一类别的得分对所有候选框排序;
  2. 取当前得分最高的框作为保留框;
  3. 计算其与剩余候选框的 IoU;
  4. 删除 IoU 超过阈值的重复框;
  5. 对剩余候选框重复这一过程。

NMS 动态示意

这里要特别区分训练与推理:

  • 训练阶段不使用 NMS,因为所有预测都会参与损失计算;
  • 推理阶段才使用 NMS,目的是得到最终稀疏且不重复的检测结果。

YOLOv1 的优势、局限与历史意义

优势

优势说明
速度快基础版 YOLO 可实现实时检测,是其最重要的工程价值之一
端到端从输入图像直接输出检测结果,训练与推理流程统一
全局感知整张图像共同参与预测,背景误检相对更少
范式清晰为后续 one-stage detector 提供了统一建模模板

局限

局限根源
小目标检测较弱特征图分辨率低,多次下采样后细节容易丢失
密集场景表现受限每个 cell 只能输出一组类别概率,难以处理同一网格多个目标
框形状灵活性有限YOLOv1 尚未引入后续版本常见的 anchor 机制
定位精度不如两阶段方法统一回归虽然快,但早期版本的定位建模仍较粗糙

历史意义

YOLOv1 最重要的价值不在于它已经“足够强”,而在于它证明了一件事:目标检测可以被统一为单次前向传播完成的端到端预测任务。这直接影响了后续一系列实时检测器的设计路线。

从 R-CNN 系列到 YOLOv1,可以看到检测任务的重心发生了转移:

  • 早期更关注“如何精细地产生候选区域”;
  • YOLOv1 开始强调“如何统一建模并高效预测”;
  • 后续版本则在这一范式上持续补齐定位精度、小目标能力和训练稳定性。

因此,YOLOv1 不只是一个具体模型,更是现代实时检测系统的方法论起点。

总结

YOLOv1 的历史地位,更多来自它对检测问题的重新定义,而不只是某个单独的实验指标。它把原本多阶段、强依赖候选框的检测流程,压缩成一个卷积网络上的统一预测任务,并第一次让“实时目标检测”真正成为一个清晰、可实现的工程目标。

如果把它的核心贡献概括成三点,大致可以写成:

  • 统一建模:把边界框回归与类别预测放进同一个输出张量;
  • 强调实时性:让检测器第一次真正具备强工程可用性;
  • 开启 one-stage 范式:为后续 YOLO 系列与其他实时检测器奠定方法基础。

它的问题同样明显:特征图分辨率低、每个 cell 只能负责一个目标、对小目标与密集场景不友好。但也正因为这些限制足够具体,后续版本的改进路径才会如此清晰——从 anchor 机制、多尺度特征到更稳定的训练目标,很多演化几乎都可以看成是在修补 YOLOv1 暴露出的边界。

如果把 YOLO 系列的发展看成一条主线,那么 YOLOv1 就是这条主线真正开始的地方。

参考资料