YOLO 系列目标检测算法入门:从 YOLO v1 开始理解 One-Stage 检测器
将目标检测问题转化为一个回归问题,通过单次前向传播即可完成对图像中所有目标的定位与分类。任务是否加权权重原因定位(x, y, w, h)是λcoord5λcoord5定位不准影响大无目标置信度是λnoobj0.5λnoobj0.5负样本过多有目标置信度 & 分类否1.0正样本已稀疏这种设计体现了 YOLO v1 在样本不平衡和多任务冲突下的工程智慧。YOLO v1 虽然在精度上不如后来的版本,
文章目录
引言
在计算机视觉领域,目标检测(Object Detection) 是一项基础而关键的任务,其目标是在图像中定位并识别出多个目标物体。近年来,随着深度学习的发展,目标检测算法经历了从传统方法到端到端神经网络的飞跃。其中,YOLO(You Only Look Once)系列 以其“快、准、稳”的特点,成为工业界和学术界广泛应用的代表性算法之一。
本文将从 YOLO 系列的整体背景出发,重点解析 YOLO v1 的核心思想、网络结构与优缺点,帮助读者建立起对 One-Stage 检测器的系统认知。
一、YOLO 系列概述
YOLO 算法由 Joseph Redmon 等人于 2016 年首次提出,其最大创新在于:将目标检测问题转化为一个回归问题,通过单次前向传播即可完成对图像中所有目标的定位与分类。
1.1 One-Stage vs Two-Stage
目标检测算法通常分为两类:
-
Two-Stage 方法(如 R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN)
先生成候选区域(Region Proposal),再对每个区域进行分类和精确定位。优点是精度高,但速度慢(通常仅 5 FPS 左右),不适合实时场景。 -
One-Stage 方法(如 YOLO 系列、SSD)
直接在整张图像上进行密集预测,一步到位输出类别和边界框。优点是推理速度快,适合实时检测(如自动驾驶、视频监控),但早期版本在小目标和密集场景下精度略逊。

YOLO 正是 One-Stage 的代表,其设计理念是:“You Only Look Once”——只需看一次图像,就能完成检测。
二、YOLO v1 详解
2.1 核心思想
YOLO v1 将输入图像划分为 S × S 的网格(Grid Cell)(如 7×7)。每个网格负责预测:
- 该网格内是否存在目标(以目标中心点是否落在该网格为判断依据);
- 目标的边界框(Bounding Box):包括中心坐标 (x, y)、宽高 (w, h);
- 目标的类别概率(假设每个网格只负责一个类别)。
每个网格会预测 B 个边界框(YOLO v1 中 B=2),每个框包含 5 个值:(x, y, w, h, confidence),再加上 C 个类别概率(COCO 数据集 C=80,PASCAL VOC C=20)。
因此,最终输出张量维度为:S × S × (B×5 + C)。以 7×7 网格、2 个框、20 类为例,输出为 7×7×30。
2.2 置信度(Confidence)的含义
置信度 = Pr(Object) × IoU
- Pr(Object):该网格是否包含目标(0 或 1);
- IoU:预测框与真实框的交并比。


若网格不含目标,置信度为 0;若包含,则置信度反映预测框的准确程度。
三、YOLO v1 网络结构
YOLO v1 的网络结构虽然在今天看来略显“复古”,但其设计逻辑清晰,是理解后续 YOLO 版本演进的基础。
3.1 整体架构概览
YOLO v1 的主干网络受 GoogLeNet 启发,但做了简化,整体包含 24 个卷积层 + 2 个全连接层,输入固定为 448×448×3,输出为 7×7×30 的张量。
注意:由于最后使用了全连接层,YOLO v1 无法支持任意尺寸输入,这是它与 YOLO v2/v3 的重要区别。
3.2 卷积层设计细节
网络前 24 层全部为卷积层,采用 1×1 卷积 + 3×3 卷积 的交替堆叠方式,替代了 GoogLeNet 中复杂的 Inception 模块。这种设计既能降低计算量,又能保留足够的特征表达能力。
具体流程如下(以 PASCAL VOC 为例):
- 初始特征提取:
- 7×7 卷积(64 通道,步长 2)→ 提取大范围纹理
- 2×2 最大池化(步长 2)→ 下采样
- 中间特征增强:
- 3×3 卷积(192 通道)
- 再次池化
- 核心卷积块(重复多次):
- 1×1 卷积(降维,如 256 → 128)
- 3×3 卷积(升维,如 128 → 256)
- 这种“瓶颈”结构有效减少了参数量
- 深层语义提取:
- 经过多次下采样后,特征图尺寸变为 7×7
- 通道数达到 1024
经过 24 层卷积和 4 次池化(每次下采样 2 倍),448×448 的输入最终被压缩为 7×7×1024 的特征图。
3.3 全连接层与输出
卷积输出的 7×7×1024 特征图被展平为 50176 维向量(7×7×1024 = 50176),然后送入两个全连接层:
- 第一层 FC:50176 → 4096,使用 ReLU 激活函数
- 第二层 FC:4096 → 1470(因为 7×7×30 = 1470)
最后,1470 维输出被 reshape 为 7×7×30,每个位置对应一个网格的预测结果。
关键理解:这 30 个值中:
- 前 10 个:2 个边界框的 (x, y, w, h, confidence)
- 后 20 个:20 个类别的条件概率 P(class | object)
四、YOLO v1 损失函数设计
YOLO v1 的损失函数是其成功的关键之一。它不是一个简单的分类或回归损失,而是一个多任务加权均方误差(MSE),同时优化定位、置信度和分类三个目标。
4.1 为什么用 MSE?
YOLO v1 将检测视为回归问题,因此自然选择 均方误差(MSE) 作为基础损失。但直接对所有输出使用相同权重会导致训练不稳定,因此引入了任务加权机制。
4.2 损失函数的五大组成部分
总损失 L L L 由以下五部分组成:
(1)边界框中心坐标损失(x, y)
只对负责预测真实目标的网格和框计算:
λ coord ∑ 1 i j obj [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] \lambda_{\text{coord}} \sum \mathbb{1}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 \right] λcoord∑1ijobj[(xi−x^i)2+(yi−y^i)2]
- 1 i j obj = 1 \mathbb{1}_{ij}^{\text{obj}} = 1 1ijobj=1 表示第 i i i 个网格的第 j j j 个框“负责”某个真实目标(即目标中心在该网格,且该框与真实框 IoU 最大)
- λ coord = 5 \lambda_{\text{coord}} = 5 λcoord=5:提高定位损失权重,因为定位不准会严重影响检测效果
(2)边界框宽高损失(w, h)
同样只对负责预测的框计算,但对 w w w 和 h h h 开平方根:
λ coord ∑ 1 i j obj [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] \lambda_{\text{coord}} \sum \mathbb{1}_{ij}^{\text{obj}} \left[ (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right] λcoord∑1ijobj[(wi−w^i)2+(hi−h^i)2]
为什么要开根号?
小目标的 w , h w, h w,h 值很小(如 0.1),若直接用 MSE,其误差平方后更小(0.01),梯度极弱,模型难以学习。开根号后( 0.1 ≈ 0.316 \sqrt{0.1} \approx 0.316 0.1≈0.316),小值区域的误差被放大,使模型对小目标更敏感。
(3)含目标的置信度损失
对负责预测的框,使其 confidence 接近真实 IoU:
∑ 1 i j obj ( C i − C ^ i ) 2 \sum \mathbb{1}_{ij}^{\text{obj}} (C_i - \hat{C}_i)^2 ∑1ijobj(Ci−C^i)2
(4)不含目标的置信度损失
对不负责任何目标的框,使其 confidence 接近 0:
λ noobj ∑ 1 i j noobj ( C i − C ^ i ) 2 \lambda_{\text{noobj}} \sum \mathbb{1}_{ij}^{\text{noobj}} (C_i - \hat{C}_i)^2 λnoobj∑1ijnoobj(Ci−C^i)2
- λ noobj = 0.5 \lambda_{\text{noobj}} = 0.5 λnoobj=0.5:降低负样本权重,因为 7×7×2=98 个预测框中,绝大多数不包含目标,若不加权,模型会过度优化“无目标”区域,导致漏检。
(5)分类损失
仅对包含目标中心的网格计算类别概率的 MSE:
∑ 1 i obj ∑ c = 1 20 ( p i ( c ) − p ^ i ( c ) ) 2 \sum \mathbb{1}_{i}^{\text{obj}} \sum_{c=1}^{20} (p_i(c) - \hat{p}_i(c))^2 ∑1iobjc=1∑20(pi(c)−p^i(c))2
- 注意:这里预测的是 条件概率 P ( class ∣ object ) P(\text{class} \mid \text{object}) P(class∣object),不是联合概率
- 最终检测得分 = confidence × P ( class ∣ object ) P(\text{class} \mid \text{object}) P(class∣object)
4.3 损失函数的意义总结
| 任务 | 是否加权 | 权重 | 原因 |
|---|---|---|---|
| 定位(x, y, w, h) | 是 | λ coord = 5 \lambda_{\text{coord}} = 5 λcoord=5 | 定位不准影响大 |
| 无目标置信度 | 是 | λ noobj = 0.5 \lambda_{\text{noobj}} = 0.5 λnoobj=0.5 | 负样本过多 |
| 有目标置信度 & 分类 | 否 | 1.0 | 正样本已稀疏 |
这种设计体现了 YOLO v1 在样本不平衡和多任务冲突下的工程智慧。
五、YOLO v1 的优缺点
优点
- 速度快:可达到 45 FPS(在 Titan X 上),适合实时应用;
- 端到端训练:结构简单,易于实现和部署;
- 全局信息利用充分:不像滑动窗口或区域提议那样局部化,能更好避免背景误检。
缺点
- 每个网格只能预测一个类别:若多个目标中心落在同一网格,无法处理重叠目标;
- 小目标检测效果差:7×7 网格粒度较粗,对小物体定位不准;
- 边界框形状受限:仅使用 2 个预设框,难以适应极端长宽比的目标。
正是这些局限性,推动了 YOLO v2、v3 等后续版本的持续改进。
六、总结
YOLO v1 虽然在精度上不如后来的版本,但其开创性的“单次检测”思想彻底改变了目标检测的范式。它证明了:目标检测可以既快又准,为后续 One-Stage 算法的发展奠定了坚实基础。
理解 YOLO v1 的 7×7 网格划分机制、24+2 网络结构 以及 带权重的多任务损失函数,是掌握整个 YOLO 系列演进逻辑的关键第一步。后续的 v2 引入 Anchor Box,v3 采用多尺度预测,v4/v5 融合更多工程技巧——但万变不离其宗,核心仍是“回归 + 网格 + 端到端”。
更多推荐


所有评论(0)