文章目录
一、YOLOv2 基本简介
YOLOv2(You Only Look Once version 2)是 YOLO 系列目标检测算法的第二代版本,由 Joseph Redmon 等人在 2016 年提出。它在 YOLOv1 的基础上引入了多项改进,显著提升了检测速度和精度:
- 核心思想:将目标检测问题转化为单次回归任务,通过一个卷积神经网络直接预测边界框和类别概率。
- 主要改进:
- 引入锚框(Anchor Boxes):替代 YOLOv1 的全连接层,提升小目标检测能力。
- 多尺度训练:增强模型对不同输入尺寸的鲁棒性。
- 维度聚类:通过 K-Means 聚类选择更优的先验框(Anchor)。
- 细粒度特征融合(Passthrough Layer):利用高分辨率特征图提升小目标检测效果。
YOLOv2 主要是在 COCO 和 ImageNet 数据集上进行训练,由于 YOLOv2 能够检测 9000 个类别,所以 YOLOv2 也被称之为 YOLO9000:Better、Faster、Stronger
- YOLOv2 论文地址:【https://arxiv.org/pdf/1612.08242#page=4.24】
- YOLOv2 论文中文对照地址:【https://blog.csdn.net/qq_42755230/article/details/125820723】
二、整体网络框架
YOLOv2 的网络结构由 主干网络(Backbone) 和 检测头(Detection Head) 组成:
1. 主干网络:Darknet-19
- 轻量高效:共 19 个卷积层 + 5 个最大池化层,无全连接层。
- Batch Normalization(BN):每个卷积层后添加 BN 层,加速收敛并减少过拟合。
- 全局平均池化(GAP):替代全连接层,降低参数量。
2. 检测头
- 功能:基于主干网络提取的特征图,预测边界框、置信度和类别概率。
- 输出维度:
- 每个网格单元(13×13)预测 5 个边界框(Anchor Boxes)。
- 每个边界框包含 5 个坐标值(tx, ty, tw, th, to)和类别概率(COCO 80 类)。
- 总输出维度:13×13×(5×(5+80)) = 13×13×425。
三、输入端优化
1. 多尺度训练
我们希望增强模型对不同输入尺寸的适应性,所以我们将多尺度训练应用到模型中,我们不需要修改输入图像的大小,而是每隔几个迭代就改变网络。
- 实现方式:
- 每隔 10 个训练周期(epoch),随机调整输入图像尺寸为 32 的倍数(如 320×320 到 608×608)。
- 动态调整网络结构(如调整卷积层步长),无需固定输入尺寸。
2. 高分辨率分类器
我们首先在 ImageNet 上以 448×448 的完整分辨率对分类网络进行微调,并进行 10 个 epochs 的预训练。这让网络有时间调整其滤波器,以便在更高的分辨率输入下更好地工作。
- 实现方式:
- 先在 ImageNet 上以 224×224 分辨率预训练 Darknet-19。
- 高分辨率微调(High-Resolution Finetuning):再以 448×448 分辨率微调 10 个 epoch,使网络适应更高分辨率。
- 效果:mAP 提升约 4%。
四、主干网络优化
YOLOv2 用 DarkNet-19 作为骨干网络架构:包含 19 个 conv 层、5 个 max pooling 层,每个 conv 层后接入 BN 层,没有 FC 层,用了一个全局平均池化层来替换全连接层
五、检测头优化
YOLOv2 的检测头相比 v1 有本质变化:
- 从 “直接预测坐标” 到 “Anchor Box 回归”:YOLOv1 直接预测目标边界框的坐标(x, y, w, h),而 YOLOv2 借鉴 Faster R-CNN 的 Anchor 机制,预设 5 种尺度的 Anchor Box,检测头的核心任务变为预测 Anchor 与真实目标的偏移量(而非绝对坐标),并分类目标类别。
- 输出特征图与 Anchor 的绑定:Darknet-19 输出 13×13 的特征图,每个网格负责预测 5 个 Anchor Box,每个 Anchor 对应 3 个输出:边界框偏移量(tx, ty, tw, th)、置信度(confidence)、类别概率(class probability)。
训练的核心目标因此调整为:让模型学习 “如何将 Anchor Box 调整为真实目标框”,并准确预测类别和置信度。
1. 检测训练
为了融合浅层高分辨率、低语义信息和深层低分辨率、高语义信息,提升对小目标的检测能力,YOLOv2 采用了以下步骤:
- 1×1 卷积降维:从 Darknet-19 中取出
26 x 26 x 512
的中间特征图,先通过一个1×1
卷积(Filters=64
),将通道数从512
降为64
,得到26 x 26 x 64
的特征图,减少后续计算量。 - PassThrough Layer:对
26 x 26 x 64
的特征图进行 “维度重排” 操作。它将特征图的空间维度和通道维度进行转换,把26 x 26 x 64
的特征图变为13 x 13 x 256
(相当于将每个2x2
的区域 “展开” 到通道维度),这样就得到了与深层13 x 13 x 1024
特征图相同空间分辨率的特征图,便于后续融合。 - Concatenate(拼接):将经过 PassThrough 处理后的
13 x 13 x 256
特征图与 Darknet-19 输出的13 x 13 x 1024
特征图在通道维度上进行拼接,得到13 x 13 x 1280
的特征图。这样既保留了深层的高语义信息,又融入了浅层的高分辨率细节信息,有助于检测不同尺度的目标,尤其是小目标。
2. 锚框机制(Anchor Boxes)
YOLOv2 摒弃了传统 “手动设定锚框” 的方式,改用K-Means 聚类算法从训练集的真实边界框(ground truth)中自动学习锚框尺寸,以适配数据分布。
传统 K-Means 用欧氏距离衡量样本间的相似度,但这种方式对 “大尺寸边界框” 的误差更敏感(大框的坐标数值变化对距离影响更大)。为解决这一问题,YOLOv2 提出用IoU(交并比) 定义距离:
d ( box , centroid ) = 1 − IOU ( box , centroid ) d(\text{box}, \text{centroid}) = 1 - \text{IOU}(\text{box}, \text{centroid}) d(box,centroid)=1−IOU(box,centroid)
- 当两个框的 IoU 越大(重叠度越高),距离d越小,表明它们越 “相似”;
- 这种方式消除了边界框尺寸对距离的影响,使聚类结果更贴合目标检测的需求。
2.1 锚框
- 在目标检测任务中,边界框回归的任务是从图像中预测出目标的位置。这通常涉及到预测边界框的中心坐标、宽度和高度。YOLOv2通过引入 Anchor Boxes(锚框)来辅助这一过程
- 在 YOLO2 中引入了 Anchor Boxes(先验框、锚框、候选框)的思想来替代 YOLOv1 中的直接预测 bounnding box 的方式
- 上图中,每个格子会预设多个 Anchor Boxes(YOLOV2 论文中设置 5 个), 他们分别具有不同的尺寸,作为预测边界框的参考模板,YOLOv2 基于 Anchor Boxes 预测相对偏移量并对宽高做调整,使得预测更加灵活,它被用来帮助模型更好地预测不同大小和长宽比的目标
2.2 维度聚类(Dimension Clusters)
在标准的 K-means 聚类算法中,通常使用欧几里得距离作为距离度量。然而,对于边界框的聚类,YOLOv2 采用了一种不同的距离度量方法——IoU距离,IoU度量了两个边界框之间的重叠程度。
K-Means 聚类算法形成锚框的具体过程:
K-Means 聚类生成锚框的过程是针对整个训练集的所有真实边界框(而非单张图片或单个框)进行的。
收集 “全局真实框”:遍历训练集的每一张图像,提取其中所有目标的真实边界框(ground truth box),记录每个框的宽(w)和高(h),形成一个包含 “所有训练样本中目标尺寸” 的大集合。
初始化聚类中心:从上述 “全局真实框集合” 中,随机选取 5 个真实框的((w, h)),作为 K-Means 的初始聚类中心(即 5 个初始锚框的候选)。
迭代聚类(分配→更新):对集合中每一个真实框,执行以下步骤,直到聚类稳定:
分配阶段:计算当前真实框与 “5 个聚类中心” 的IoU 距离d = 1 - IoU,将该真实框分配到 “距离最近的聚类” 中。
更新阶段:对每个聚类(包含多个真实框),计算聚类内所有真实框的宽和高的平均值,得到新的 “聚类中心”(即更新后的锚框尺寸)。
输出锚框:当聚类中心的变化小于阈值(或达到最大迭代次数)时,停止迭代。最终得到的5 个聚类中心,就是适配整个训练集目标尺寸分布的锚框尺寸(5 组(w, h))。
2.3 位置预测(Direct Location Prediction)
在 YOLOv1 中,边界框的中心坐标 (x,y)(x,y) 是直接预测的,且没有限制范围。这导致:
- 预测不稳定:模型可能预测出超出当前网格单元的坐标,导致边界框中心点漂移到其他网格区域。
- 收敛困难:训练初期,模型需要较长时间学习如何生成合理的偏移量
因此YOLOv2 引入了 锚框(Anchor Boxes) 和 Sigmoid 约束,通过以下公式约束预测值:
b x = σ ( t x ) + c x b y = σ ( t y ) + c y b w = p w ⋅ e t w b h = p h ⋅ e t h \begin{align*} b_x &= \sigma(t_x) + c_x \\ b_y &= \sigma(t_y) + c_y \\ b_w &= p_w \cdot e^{t_w} \\ b_h &= p_h \cdot e^{t_h} \end{align*} bxbybwbh=σ(tx)+cx=σ(ty)+cy=pw⋅etw=ph⋅eth
其中:
- ( b x , b y ) (b_x, b_y) (bx,by):预测框的中心坐标。
- ( c x , c y ) (c_x, c_y) (cx,cy):当前网格单元的左上角坐标(归一化到 [0,1])。
- p w , p h p_w, p_h pw,ph:锚框的宽度和高度(由 K-Means 聚类得到)。
- t x , t y , t w , t h t_x, t_y, t_w, t_h tx,ty,tw,th:模型预测的偏移量。
- σ ( ⋅ ) \sigma(\cdot) σ(⋅):Sigmoid 函数,将输出限制在 [0,1] 范围内。
(1)Sigmoid 函数约束中心坐标
- 作用:将 t x t_x tx 和 t y t_y ty 的预测值压缩到 [0,1] 范围内,确保边界框的中心点始终位于当前网格单元内。
- 意义:
- 避免预测值过大导致中心点漂移至其他网格。
- 提升模型稳定性,减少训练初期的发散风险。
- 使每个网格单元仅负责其局部区域的目标检测。
(2)指数函数处理宽高
- 公式: b w = p w ⋅ e t w b_w = p_w \cdot e^{t_w} bw=pw⋅etw, b h = p h ⋅ e t h b_h = p_h \cdot e^{t_h} bh=ph⋅eth
- 作用:
- 保持宽度和高度为正数( e t e^{t} et 始终 > 0)。
- 利用锚框的先验尺寸 p w , p h p_w, p_h pw,ph 作为基准,通过 t w , t h t_w, t_h tw,th 微调。
- 意义:
- 结合聚类分析(Dimension Clusters)得到的锚框尺寸,提升预测的准确性。
- 避免直接预测绝对值(如 YOLOv1),转而预测相对偏移量,简化学习过程。
实际应用中的表现:
- mAP 提升:结合 Direct Location Prediction 和 Dimension Clusters,YOLOv2 在 COCO 数据集上的 mAP 达到 57.9%,显著优于 YOLOv1(63.4% 的 VOC mAP)。
- 实时性:保持 45 FPS 的推理速度,平衡速度与精度。
六、Passthrough Layer 细粒度特征融合
在卷积神经网络中:
- 浅层特征(如 conv4)分辨率高,包含丰富的空间细节(如边缘、纹理),适合检测小目标。
- 深层特征(如 conv5)分辨率低,语义信息强,但丢失了部分空间细节。
YOLOv2 的主干网络 Darknet-19 经过 5 次降采样后,输出特征图尺寸为 13×13。对于小目标而言,13×13 的感受野过大,难以精确定位。
Passthrough Layer 的作用:
将高分辨率的浅层特征(如 26×26)传递到深层,并与主干输出的特征图拼接,形成更丰富的多尺度特征表示。
过程如下:可以把前面的特征图拆分成和后面特征图大小相同然后和后面的特征相加,这个相加指的是沿通道维度进行拼接(concatenation),形成一个 H 2 × W 2 × ( 4 C + N ) \frac{H}{2}×\frac{W}{2}×(4C+N) 2H×2W×(4C+N)的特征图
26x26x512 的特征图分别按行和列隔点采样,可以得到 4 个 13x13x512 的特征,把这 4 张特征按 channel 串联起来,就是最后的 13x13x2048 的特征图
七、输出特征维度
在YOLOv1里面没有用 anchor,而是直接划分成7 × 7个网格,每个网格输出两个边界框,每个边界框有 4 个位置参数和 1 个置信度,以及每个网格还预测出了 20 个类别的条件类别概率 ---- 7x7x(2x5+20)
在 YOLOv2 中,类别变成由 anchor 负责了,每个网格产生 5 个 anchor,每个 anchor 除了产生 4 个定位参数和 1 个置信度参数之外还有 20个类别的条件类别概率,所以在 YOLOv2 里面每个 anchor 都会产生 25 个数,总共输出 5 × 25 = 125 个数。即 YOLOv2 总共输出 13 × 13 × 125 = 21125 个数。最终的目标检测结果就是从这 21125个数里面提取出来的,每个 anchor box 都有位置信息 + 置信度信息 + 类别概率信息
输出的维度: S × S × B × ( 4 + 1 + C ) S \times S \times B \times (4 + 1 + C) S×S×B×(4+1+C)
- S 表示图像分成什么样的像素,比如 13 x 13
- VOC 数据集 20 类、COCO 数据集 80 类