深度学习目标检测:YOLOv1 与 YOLOv2 原理详解
系列说明:本系列共四篇,本篇为第一篇,聚焦 YOLO 系列的奠基之作 YOLOv1 和改进版 YOLOv2,深入讲解其核心思想、网络架构与损失函数设计。
一、目标检测背景:One-Stage vs Two-Stage
目标检测任务的目标是让模型同时完成"找到目标在哪(定位)"和"目标是什么(分类)"两件事。根据检测流程的不同,检测算法分为两大流派:
1.1 Two-Stage 检测器
以 R-CNN 系列(R-CNN → Fast R-CNN → Faster R-CNN)为代表,检测分两个阶段进行:
- 第一阶段:通过选择性搜索(Selective Search)或 RPN 网络生成候选区域(Region Proposal);
- 第二阶段:对候选区域做精细分类与回归。
| 特性 | Two-Stage |
|---|---|
| 精度 | 高 |
| 速度 | 慢(通常 ~5 FPS) |
| 代表算法 | Faster R-CNN、Mask R-CNN |
1.2 One-Stage 检测器
以 YOLO 系列为代表,将检测问题转换为回归问题,用单个 CNN 直接输出类别与位置,无需候选框生成阶段。
| 特性 | One-Stage |
|---|---|
| 精度 | 相对较低 |
| 速度 | 极快,适合实时检测 |
| 代表算法 | YOLO 系列、SSD |
关键指标
- FPS(Frames Per Second):每秒处理的图像帧数,衡量检测速度;
- FLOPs(Floating Point Operations):前向传播所需浮点运算次数,衡量计算量。
二、检测评估指标:mAP 详解
在进入 YOLO 原理之前,先明确检测任务中最重要的评估指标——mAP(Mean Average Precision,平均精度均值)。
2.1 精确率(Precision)与召回率(Recall)
Precision=TPTP+FP\text{Precision} = \frac{TP}{TP + FP}Precision=TP+FPTP
Recall=TPTP+FN\text{Recall} = \frac{TP}{TP + FN}Recall=TP+FNTP
- TP(True Positive):预测为正,且预测正确;
- FP(False Positive):预测为正,但预测错误;
- FN(False Negative):图中有目标,但未检测到。
示例:设阈值为 0.9,图像中有 3 个人,模型检测到 1 个正确、1 个错误:
- TP=1,FP=1,FN=2
- Precision = 1/2 = 0.5,Recall = 1/3 ≈ 0.33
2.2 AP 与 mAP
以不同置信度阈值绘制 P-R 曲线,曲线下面积即为该类别的 AP(Average Precision)。对所有类别取平均,得到 mAP。

| 指标 | 含义 |
|---|---|
| mAP@50 | IoU 阈值为 0.5 时的平均精度 |
| mAP@50:95 | IoU 从 0.5 到 0.95 每步 0.05 的平均精度,更严格 |
2.3 IOU(Intersection over Union)

IOU=预测框∩真实框预测框∪真实框\text{IOU} = \frac{\text{预测框} \cap \text{真实框}}{\text{预测框} \cup \text{真实框}}IOU=预测框∪真实框预测框∩真实框
IOU 越高,预测框与真实框重叠度越高,检测越准确。
三、YOLOv1:开创性的单阶段检测
论文:《You Only Look Once: Unified, Real-Time Object Detection》(2016,CVPR)
作者:Joseph Redmon 等
3.1 核心思想:网格预测
YOLOv1 的革命性想法是把图像划分成 S×S 个网格(Grid Cell),每个网格负责预测落在该格内的目标。

图1:将图像划分为 S×S 网格,每个格子负责预测对应目标
检测流程只需一次前向传播,无需多阶段处理,因此速度极快。
3.2 网络输出格式
对于 PASCAL VOC 数据集,YOLO 将图像划分为 7×7 个网格,每个格子预测 2 个边界框,每个边界框包含 5 个值:
[x,y,w,h,c][x, y, w, h, c][x,y,w,h,c]
- (x,y)(x, y)(x,y):边界框中心相对网格的归一化坐标(0~1);
- (w,h)(w, h)(w,h):边界框宽高相对整幅图像的归一化值(0~1);
- ccc(置信度):=P(Object)×IoU= P(\text{Object}) \times \text{IoU}=P(Object)×IoU,表示该框中存在目标的可能性。
每个格子还预测 20 个类别概率(PASCAL VOC 共 20 类)。
因此,网络最终输出张量为:
7×7×30(2×5+20=30)7 \times 7 \times 30 \quad (2 \times 5 + 20 = 30)7×7×30(2×5+20=30)
3.3 网络架构
YOLOv1 的骨干网络借鉴了 GoogLeNet,共包含 24 个卷积层 + 2 个全连接层,用 1×1 降维卷积接 3×3 卷积替换 Inception 模块。

图2:YOLOv1 网络架构,输出 7×7×30 的预测张量
Input(448×448×3) → [Conv × 24] → [FC × 2] → Output(7×7×30)
3.4 损失函数设计
YOLOv1 的损失函数由三部分组成,对坐标、置信度、分类误差分别进行约束:
L=Lcoord+Lconf+Lclass\mathcal{L} = \mathcal{L}_{\text{coord}} + \mathcal{L}_{\text{conf}} + \mathcal{L}_{\text{class}}L=Lcoord+Lconf+Lclass
关键设计点:
- 坐标损失:对 w,hw, hw,h 取平方根再计算误差,使小目标的偏差更敏感(大目标对小偏差不敏感);
- 权重系数:λcoord=5\lambda_{\text{coord}} = 5λcoord=5(放大坐标误差权重),λnoobj=0.5\lambda_{\text{noobj}} = 0.5λnoobj=0.5(降低无目标格子的置信度权重);
- 全连接层输出:将 7×7×30 展平后通过全连接层预测。

图3:YOLOv1 损失函数,包含坐标、置信度、分类三部分
3.5 YOLOv1 的局限性
| 问题 | 描述 |
|---|---|
| 每格只预测 1 个类别 | 若两目标重叠在同一格,无法区分 |
| 长宽比单一 | 每格仅 2 个先验框,形状可选空间有限 |
| 小目标检测效果差 | 特征图分辨率低(7×7),小物体难以定位 |
448448的图片分成77的网格,则一个一个网格代表原来64像素。特征压缩导致信息丢失,为了解决这个问题后面地方v2v3模型进行的改进
四、YOLOv2(YOLO9000):Better, Faster, Stronger
论文:《YOLO9000: Better, Faster, Stronger》(2017,CVPR)
YOLOv2 在 v1 基础上针对性地解决了上述问题,引入了多项关键改进。
4.1 引入 Batch Normalization
YOLOv2 在每个卷积层后加入 Batch Normalization(BN),带来以下好处:
- 加速收敛,使训练更稳定;
- 起到正则化作用,去掉 Dropout 层;
- mAP 提升约 2%。

图4:加入 BN 层后,YOLOv2 各项指标的对比提升
4.2 高分辨率分类器预训练
YOLOv1 在 ImageNet 上以 224×224 预训练分类网络,但检测时用 448×448 输入,存在分辨率不匹配问题。
YOLOv2 改进策略:
- 先用 224×224 预训练 160 个 epoch;
- 再改用 448×448 微调 10 个 epoch;
- 最后用于检测训练。
这使得网络对高分辨率输入更加适应,mAP 提升约 4%。
4.3 Anchor Box:引入先验框
YOLOv1 直接预测绝对坐标,YOLOv2 借鉴 Faster R-CNN 引入 Anchor(先验框) 机制,将检测转为预测相对先验框的偏移量,大幅降低学习难度。
K-Means 聚类生成先验框
YOLOv2 不手工设计先验框,而是对训练集中所有标注框进行 K-Means 聚类,自动学出 5 种最适合数据集分布的先验框尺寸:
流程:
1. 提取训练集所有标注框的 (w, h)
2. 随机初始化 5 个聚类中心
3. 用 IOU 距离(而非欧氏距离)迭代聚类
4. 输出 5 种先验框作为 Anchor

图5:通过 K-Means 聚类生成 5 种先验框
YOLOv3 进一步扩展为 9 种先验框(按检测尺度分 3 类,每类 3 种)。
4.4 位置预测改进:Direct Location Prediction
Faster R-CNN 中先验框的位置偏移预测公式为:
x=(tx⋅wa)+xa,y=(ty⋅ha)+yax = (t_x \cdot w_a) + x_a, \quad y = (t_y \cdot h_a) + y_ax=(tx⋅wa)+xa,y=(ty⋅ha)+ya
该公式在训练初期 txt_xtx 取值没有约束,可能导致框预测位置偏移到图像任意位置,训练不稳定。
YOLOv2 用 Sigmoid 函数约束预测的偏移量,保证预测中心始终在当前网格内:
bx=σ(tx)+cx,by=σ(ty)+cyb_x = \sigma(t_x) + c_x, \quad b_y = \sigma(t_y) + c_ybx=σ(tx)+cx,by=σ(ty)+cy
bw=pw⋅etw,bh=ph⋅ethb_w = p_w \cdot e^{t_w}, \quad b_h = p_h \cdot e^{t_h}bw=pw⋅etw,bh=ph⋅eth
- (cx,cy)(c_x, c_y)(cx,cy):当前网格左上角坐标;
- (pw,ph)(p_w, p_h)(pw,ph):先验框宽高;
- σ\sigmaσ 为 Sigmoid 函数,将输出约束到 (0, 1)。

图6:YOLOv2 位置预测公式,通过 Sigmoid 约束偏移量
4.5 细粒度特征融合(Fine-Grained Features)
YOLOv2 将浅层高分辨率特征图(26×26×512)通过 passthrough 层 重组为低分辨率特征图(13×13×2048),再与深层特征拼接,解决小目标漏检问题。
26×26×512 → [passthrough] → 13×13×2048
↓ concat
13×13×1024 ──────┘
↓
最终预测输出

图7:passthrough 层将 26×26 特征重组后与 13×13 特征拼接
4.6 多尺度训练
由于 YOLOv2 去掉了全连接层,网络可以接受任意尺寸输入。训练时每隔 10 个 batch,随机从以下尺寸中选择一个输入大小:
{320,352,384,416,448,480,512,544,576,608} (均为32的倍数)\{320, 352, 384, 416, 448, 480, 512, 544, 576, 608\} \text{ (均为32的倍数)}{320,352,384,416,448,480,512,544,576,608} (均为32的倍数)
这使得 YOLOv2 对不同输入尺寸都有较好的鲁棒性,小尺寸输入速度快,大尺寸输入精度高。
五、YOLOv1 vs YOLOv2 对比总结
| 特性 | YOLOv1 | YOLOv2 |
|---|---|---|
| 主干网络 | GoogLeNet-like | Darknet-19 |
| 先验框 | 无,直接预测 | K-Means 聚类 5 个 Anchor |
| Batch Normalization | 无 | 所有卷积层后均有 |
| 输入分辨率 | 448×448(固定) | 多尺度(320~608) |
| 特征图输出 | 7×7×30 | 13×13×(5×(5+C)) |
| 位置预测 | 直接预测绝对坐标 | 相对先验框的偏移量 |
| 小目标检测 | 弱 | 改进(passthrough 层融合细粒度特征) |
| mAP(VOC 2007) | 63.4 | 78.6 |
| 速度(FPS) | 45 | 40(416×416 输入) |
六、小结
YOLOv1 开创了单阶段目标检测的先河,以极快的速度换取可接受的精度;YOLOv2 通过引入 BN、Anchor、多尺度训练等多项改进,在保持速度的同时大幅提升了精度。二者共同奠定了 YOLO 系列的核心设计哲学:用最简洁的回归方式解决检测问题。
下一篇将介绍 YOLOv3 的多尺度检测机制,以及如何使用 LabelMe 工具为自定义数据集打标签并完成训练。
参考文献
- Redmon, J., et al. “You only look once: Unified, real-time object detection.” CVPR 2016.
- Redmon, J., & Farhadi, A. “YOLO9000: better, faster, stronger.” CVPR 2017。
更多推荐
所有评论(0)