YOLOv2 技术详解:目标检测的又一次飞跃
🧠 YOLOv2 技术详解:目标检测的又一次飞跃
一、前言
在 YOLOv1 提出后,虽然实现了“实时性 + 单阶段”的突破,但其在精度和小物体检测方面仍有明显不足。为了弥补这些缺陷,Joseph Redmon 等人在 2017 年提出了 YOLOv2(又名 YOLO9000),并在论文中宣称:
“It’s more accurate than other detection systems and can run at real-time speeds.”
本文将深入解析 YOLOv2 的核心技术亮点,包括:
- 引入 Anchor Boxes
- 多尺度预测
- 更好的主干网络 Darknet-19
- 联合训练 COCO 和 ImageNet
二、YOLOv2 的主要改进点
改进点 | 描述 |
---|---|
✅ 引入 Anchor Boxes | 借鉴 Faster R-CNN 思想,使用预设宽高比例的边界框提升召回率 |
✅ 多尺度预测(Multi-Scale Training) | 输入图像尺寸可变,增强模型对不同大小目标的适应能力 |
✅ 更强的主干网络 | 使用 Darknet-19,比 VGG 更轻量、更快 |
✅ 联合训练 COCO + ImageNet | 同时学习检测与分类任务,实现跨数据集泛化能力 |
三、YOLOv2 的网络结构详解
🔍 整体架构图(简化版)
Input (416x416x3)
│
├─ Conv Layer (3x3, 32 filters, stride=1) → BatchNorm → LeakyReLU
├─ MaxPool (2x2, stride=2)
├─ Conv Layer (3x3, 64 filters, stride=1) → BatchNorm → LeakyReLU
├─ MaxPool (2x2, stride=2)
├─ Conv Layers ... (共19层)
│
└─ Output: 13x13x(5×B + C) → Bounding Box 预测 + 类别概率
📌 特点说明:
- 输入图像统一为 416 × 416;
- 输出为 13 × 13 的网格单元;
- 每个单元格输出多个 bounding box(默认为 5 个);
- 每个 bounding box 包含:
(tx, ty)
:中心坐标偏移;(tw, th)
:宽高相对于 anchor 的缩放;confidence
:是否包含物体;class probabilities
:类别置信度;
四、YOLOv2 的关键创新点详解
✨ 1. Anchor Boxes 的引入
🔍 什么是 Anchor Boxes?
Anchor Boxes 是一组预设的宽高比(如 1:1、2:1、1:2 等),用于作为边界框回归的参考模板。
💡 YOLOv1 的问题:
- 每个 grid cell 只能预测两个固定格式的边界框;
- 缺乏先验知识,导致对形状变化大的目标(如长条形物体)表现不佳;
✅ YOLOv2 的改进:
- 每个 grid cell 预测多个 bounding box(默认 5 个);
- 每个 bounding box 的宽高是基于 K-Means 聚类真实框得到的 anchors;
- 公式如下:
b w = a w ⋅ e t w , b h = a h ⋅ e t h b_w = a_w \cdot e^{t_w},\quad b_h = a_h \cdot e^{t_h} bw=aw⋅etw,bh=ah⋅eth
其中 a w , a h a_w, a_h aw,ah 是 anchor 的宽高, t w , t h t_w, t_h tw,th 是网络输出的偏移值。
📌 Anchor Boxes 的优势:
- 提升了小物体检测效果;
- 增加了模型对不同形状目标的适应能力;
- 提高了整体召回率。
✨ 2. 多尺度预测(Multi-Scale Training)
🔍 什么是 Multi-Scale Training?
YOLOv2 在训练过程中随机选择输入图像的尺寸,使模型能够适应不同尺度的目标。
💡 实现方式:
- 输入图像尺寸在 [320, 352, …, 608] 中随机选取(均为 32 的倍数);
- 模型在推理时也可适配任意尺寸的图像;
- 通过这种方式增强了模型的尺度鲁棒性。
📌 优势:
- 对小目标更敏感;
- 不依赖固定输入尺寸;
- 推理速度基本不变的情况下提升了精度。
✨ 3. Darknet-19 主干网络
YOLOv2 使用了一个轻量级的卷积神经网络 Darknet-19,它相比 VGG 更快、更轻量。
🧱 Darknet-19 结构简述:
层类型 | 参数说明 |
---|---|
Conv + BatchNorm + LeakyReLU | 19 层卷积网络 |
MaxPooling | 下采样操作 |
Global Average Pooling | 最终分类输出 |
📌 优势:
- 比 VGG 快很多;
- 准确率接近 VGG;
- 更适合嵌入式设备部署。
✨ 4. 联合训练 COCO + ImageNet(YOLO9000)
YOLOv2 的最大亮点之一是 YOLO9000 —— 一个可以检测 9000+ 类别的检测器。
🧩 实现思路:
- 使用 WordTree 构建类别层级结构;
- 图像来源包括 COCO(带位置标签)和 ImageNet(仅分类);
- 在 COCO 上训练检测头,在 ImageNet 上训练分类头;
- 利用层次 softmax 进行联合优化。
🎯 应用价值:
- 实现跨数据集迁移学习;
- 扩展性强,可用于罕见类别检测;
- 开启了“开放词汇”检测的新方向。
五、YOLOv2 的损失函数详解
YOLOv2 的损失函数与 YOLOv1 类似,但加入了对 anchor boxes 的支持。
⚙️ 损失函数公式:
L = λ coord ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 + ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] \mathcal{L} = \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 + (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right] L=λcoordi=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2+(wi−w^i)2+(hi−h^i)2]
− ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj log ( C i ) − ∑ i = 0 S 2 ( 1 − 1 i obj ) log ( 1 − C i ) -\sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \log(C_i) -\sum_{i=0}^{S^2} (1 - \mathbb{1}_{i}^{\text{obj}}) \log(1 - C_i) −i=0∑S2j=0∑B1ijobjlog(Ci)−i=0∑S2(1−1iobj)log(1−Ci)
+ λ cls ∑ i = 0 S 2 1 i obj ∑ c ∈ classes ( p i ( c ) − p ^ i ( c ) ) 2 +\lambda_{\text{cls}} \sum_{i=0}^{S^2} \mathbb{1}_{i}^{\text{obj}} \sum_{c \in \text{classes}} (p_i(c) - \hat{p}_i(c))^2 +λclsi=0∑S21iobjc∈classes∑(pi(c)−p^i(c))2
YOLO 将图像划分为 S × S S \times S S×S 的网格,每个网格负责预测 B B B 个边界框(bounding boxes),每个框包括:
• 位置( x , y x, y x,y)
• 宽高( w , h w, h w,h)
• 置信度( C C C)
• 类别概率向量( p 1 , p 2 , … p_1, p_2, \dots p1,p2,…)
💡 总体公式
L = 位置误差 + 置信度误差 + 分类误差 \mathcal{L} = \text{位置误差} + \text{置信度误差} + \text{分类误差} L=位置误差+置信度误差+分类误差
⸻
🧩 各部分含义
- 位置损失(bounding box regression)
由左上角位置 ( x i , y i ) (x_i, y_i) (xi,yi) 和宽高 ( w i , h i ) (w_i, h_i) (wi,hi) 构成,使用的是平方差损失,但对 w , h w, h w,h 使用了开方来减小大框对损失的影响:
λ coord ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 + ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 + (\sqrt{w_i} - \sqrt{\hat{w}_i})^2 + (\sqrt{h_i} - \sqrt{\hat{h}_i})^2 \right] λcoordi=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2+(wi−w^i)2+(hi−h^i)2]
其中 1 i j obj \mathbb{1}_{ij}^{\text{obj}} 1ijobj 是一个指示变量,表示第 i i i 个网格的第 j j j 个预测框是否负责某个目标。
⸻
- 置信度损失(object confidence prediction)
用于衡量模型对目标存在与否的预测能力,分为两部分:
• 对有目标的框预测 C i C_i Ci,希望接近 1
• 对无目标的框预测 C i C_i Ci,希望接近 0
• ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj log ( C i ) • ∑ i = 0 S 2 ( 1 − 1 i obj ) log ( 1 − C i ) • \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \log(C_i) • \sum_{i=0}^{S^2} (1 - \mathbb{1}_{i}^{\text{obj}}) \log(1 - C_i) •i=0∑S2j=0∑B1ijobjlog(Ci)•i=0∑S2(1−1iobj)log(1−Ci)
⸻
- 分类损失(classification loss)
用于衡量正确类别的概率预测,使用的是每一类的平方差损失(可替换为交叉熵):
λ cls ∑ i = 0 S 2 1 i obj ∑ c ∈ classes ( p i ( c ) − p ^ i ( c ) ) 2 \lambda_{\text{cls}} \sum_{i=0}^{S^2} \mathbb{1}i^{\text{obj}} \sum{c \in \text{classes}} (p_i(c) - \hat{p}_i(c))^2 λclsi=0∑S21iobj∑c∈classes(pi(c)−p^i(c))2
📌 关键区别:
- 引入了 anchor boxes 的宽高参数 a w , a h a_w, a_h aw,ah;
- 边界框预测不再直接回归绝对值,而是基于 anchor 的偏移;
- 分类部分使用层次 softmax,支持多数据集联合训练。
六、YOLOv2 的 NMS 优化
YOLOv2 中也使用了 NMS(Non-Maximum Suppression) 来去除重复预测框。
✅ 优化点:
- 支持 Soft-NMS(软抑制),避免误删相邻目标;
- 使用 DIoU-NMS 替代传统 IoU;
- 支持按类别执行 NMS。
七、YOLOv2 的性能对比
模型 | mAP@COCO | FPS |
---|---|---|
YOLOv1 | ~63.4 | 45 fps |
YOLOv2 | ~76.8 | 67 fps |
SSD512 | ~79.8 | 22 fps |
Faster R-CNN (VGG) | ~73.2 | 7 fps |
✅ YOLOv2 在保持高速的同时,显著提升了精度,成为当时最具性价比的目标检测方案之一。
八、YOLOv2 的局限性
尽管 YOLOv2 表现优异,但仍存在一些不足:
局限性 | 说明 |
---|---|
小物体检测仍不理想 | 虽有改进,但在密集场景下依然不如两阶段方法 |
Anchor 设计依赖聚类结果 | 需要重新聚类 anchor 尺寸以适配新任务 |
无特征融合机制 | 缺少类似 FPN 的多尺度融合模块 |
九、总结
模块 | 内容 |
---|---|
YOLOv2 的贡献 | 引入 Anchor Boxes、支持多尺度训练、使用 Darknet-19、提出 YOLO9000 |
Anchor Boxes 的作用 | 提升召回率、提高定位精度 |
多尺度训练的优势 | 增强模型对不同尺寸目标的适应能力 |
Darknet-19 的特点 | 比 VGG 更快、更适合部署 |
YOLO9000 的意义 | 开启了大规模检测的新时代 |
📌 欢迎点赞 + 收藏 + 关注我,我会持续更新更多关于计算机视觉、目标检测、深度学习、YOLO系列等内容!