YOLO系列目标检测算法学习
1 YOLO v1
1.1 YOLO v1 概述
YOLO v1 是第一个提出的 YOLO(You Only Look Once)系列目标检测模型,由 Joseph Redmon(约瑟夫·雷德蒙)等人在 2015 年发布。YOLO v1 的核心思想是将目标检测任务视为一个回归问题,直接预测图像中的边界框和类别。相比之前的 R-CNN 系列方法,YOLO v1 能够在单次前向传播中完成检测,因此具有极高的速度优势。
目标检测算法主要分为两阶段方法和单阶段方法:
- 两阶段方法(如 R-CNN):先生成候选区域,再对每个区域进行分类和边界框回归。这类方法精度较高,但速度较慢,难以满足实时检测的要求。
- 单阶段方法(如 YOLO 系列):直接在图像上进行分类和边界框回归。单阶段方法速度快,适用于实时任务,但精度相对略低。
相关论文:《You Only Look Once: Unified, Real-Time Object Detection》
1.2 YOLO v1 的网络结构
YOLO v1 网络结构的总结如下:
- 网络结构采用了一系列卷积层和池化层,除了最后一层使用线性激活函数外,其余层均采用 LeakyReLU 激活函数。
- 为防止过拟合,训练中引入了 Dropout 和数据增强技术。
- 最后一个卷积层输出形状为
(7, 7, 1024)
的张量,经过两个全连接层进行线性回归输出 1470 个参数,最终这些参数被 reshape 为(7, 7, 30)
的张量。
1.3 YOLO v1 的输出结果解析
YOLO v1 网络最终输出 (7, 7, 30)
的张量,其中包含了每个网格的边界框信息和类别概率。相当于 YOLO v1 将输入图像分成 7x7
的网格(Grid Cell),每个网格负责预测两个边界框及其对应的置信度,并同时预测类别概率。
对于每个网格,其输出的数据维度为 30 的向量,其具体分解如下:
- 边界框(Bounding Box)信息:每个网格预测 2 个边界框,每个边界框包含 5 个元素:中心坐标(x,y)、宽度(w),高度(h),以及对应的置信度(c)。
- 类别概率:每个网格还预测每个类别的概率值(使用 Softmax 函数输出),YOLO v1 论文中是 20 个类别。
注意:在 YOLO v1 中,每个网格对应的 2 个边界框共用一组类别概率,所以 YOLO v1 最多检测到 49 个目标。
1.3.1 边界框位置
-
大红色框表示一个网格单元(Grid Cell),蓝色点是该网格的左上角坐标,为
(0, 0)
; -
深红色和绿色框代表该网格单元包含的两个边界框(Bounding Box),深红点和绿色点分别表示这两个边界框的中心坐标,且一定位于该网格单元内部;
-
\(x\)、\(y\) 坐标值为归一化坐标,范围在
0~1
之间,以左上角(0, 0)
为参考,绿色边界框的坐标为(0.5, 0.5)
,深红色边界框的坐标为(0.35, 0.85)
; -
\(w\)、\(h\) 表示该边界框的宽和高,同样归一化到
0~1
之间,表示相对于原始图像宽高(448 像素)。例如,图中边界框的预测宽度为 \(w=0.43\),高度为 \(h=0.4\)。注意:在经过卷积操作后,每个网格不仅包含其对应区域的信息,还融合了整张图像的特征,这也是为什么网格预测的宽度(w)和高度(h)可以超出网格范围的原因。
1.3.2 置信度
-
交并比(IOU)
IOU(交并比,Intersection Over Union)是目标检测中的关键指标,用于评估预测边框与真实边框之间的重叠程度。IOU 计算的是“预测的边框”和“真实的边框”的交集与并集的比值。
在目标检测任务中,IOU 不仅用来判断预测是否正确地检测到了目标,还在非极大值抑制中起到重要作用,帮助过滤重复的检测结果,确保保留最优的预测。
-
置信度
置信度 \(c\) 是目标检测中用来衡量边界框是否包含对象的概率及其预测准确性的指标。其计算公式如下所示:
\[C=\operatorname{Pr}(\text { Object }) * \mathrm{IOU}_{\text {pred }}^{\text {truth }} \]其中:
-
\(\operatorname{Pr}(\text { Object })\) 是边界框内存在对象的概率,并且这里的对象是泛指,而非特定类别。
-
\(\mathrm{IOU}_{\text {pred }}^{\text {truth }}\) 是预测框与真实框之间的交并比,在实际推理中真实边界框并不存在,但该值表明的是预测框与期望的真实位置之间的重叠程度。
-
1.3.3 类别概率
-
类别概率
在上图的目标检测任务中,每个小方格还输出对应于 20 个类别的概率,这些概率通过 Softmax 函数处理,以确保所有类别的概率值加起来为 1。类别概率表示在某个边界框内存在目标的前提下,该目标属于某个特定类别的概率。
-
类别置信度
类别置信度是在 YOLO 中用来判断物体属于特定类别的置信度,它是边界框置信度与类别概率的乘积。主要用于在非极大值抑制中去除重叠边界框,最终决定检测结果。其计算公式如下:
\[C_i=\operatorname{Pr}(\text { Class }_i)*\mathrm{IOU}_{\text {pred }}^{\text {truth }}=\operatorname{Pr}(\text { Class }_i|\text { Object })*\operatorname{Pr}(\text { Object }) * \mathrm{IOU}_{\text {pred }}^{\text {truth }}=p_i*C \]其中:
- \(\operatorname{Pr}(\text{Class}_i)\):类别概率,表示在某个边界框内目标属于特定类别的概率。
- $\mathrm{IOU}_{\text{pred}}^{\text{truth}} $:预测边界框与真实边界框之间的重叠程度(Intersection Over Union)。
- $\operatorname{Pr}(\text{Class}_i \mid \text{Object}) $:类别概率,即 \(p_i\)。
- \(\operatorname{Pr}(\text{Object})\):对象概率,表示模型对某个边界框内确实存在目标的概率。即 \(C=\operatorname{Pr}(\text { Object }) * \mathrm{IOU}_{\text {pred }}^{\text {truth }}\)。
- \(C\):边界框置信度,表示模型对某个边界框内确实存在目标的信心。
1.4 YOLO v1 的后处理
YOLO v1 输出了总共98个预测框(49个网格,每个网格预测2个边界框),但并不是所有的预测框都会被用作最终的检测结果。为了得到高质量的检测结果,需要经过以下两个主要的后处理步骤:
-
置信度阈值过滤
置信度阈值过滤是为了排除那些模型认为不太可能是目标的预测框。每个预测框都有一个置信度分数,表示模型对框内存在目标的信心。如果该分数低于预设的阈值,该框将被丢弃,不参与后续处理。
通常,置信度阈值设定在 0.25 到 0.5 之间,具体数值依据应用场景对精度和召回率的权衡而定。若更关注检测准确性,可以选择较高的阈值;反之,若希望尽可能多地检测出目标,则可选择较低的阈值。
-
NMS(非极大值抑制)过滤
NMS 过滤是为了解决同一目标被多次检测的问题,保留每个目标的最佳检测框。具体步骤如下:
- 按类别置信度排序:对于每个类别,根据类别置信度对所有预测框进行降序排序。
- 选择最高类别置信度的框:选择类别置信度最高的框作为当前的最佳框。
- 计算 IOU:计算该最佳框与其他所有框的 IOU。
- 移除高 IOU 的框:设定一个 IOU 阈值(例如 0.5),移除所有与当前最佳框的 IOU 高于该阈值的框。
- 重复步骤:从剩余的框中继续选择类别置信度最高的框,重复上述过程,直到没有更多框可以处理。
NMS 的 IOU 阈值通常设置在 0.4 到 0.6 之间,较高的 IOU 阈值,可能会保留更多相似的框;而较低的 IOU 阈值,有助于进一步减少冗余检测。
1.5 YOLO v1 的损失函数
YOLO v1 的损失函数综合考虑了多个方面的误差,包括边界框的位置、大小、对象置信度和类别概率。具体包含如下几个部分:
-
边界框坐标损失:用于衡量预测边界框的中心坐标和宽度、高度与真实值之间的差异。
-
置信度损失:
① 对象置信度损失:用于衡量预测的对象置信度与真实值之间的差异。
② 无对象置信度损失:用于衡量预测的无对象置信度与真实值之间的差异。 -
类别概率损失:用于衡量预测的类别概率与真实值之间的差异。
YOLO v1 的损失函数可以表示为:
其中:
- \(S\):图像被划分为 \(S×S\) 的网格。
- \(B\):每个网格单元预测的边界框数量。
- \(\sum_{i=0}^{s^2}\):代表遍历所有网格单元进行累加。
- \(\sum_{j=0}^B\):代表遍历所有边界框进行累加。
- \(\sum_{c \in \text { classes }}\):代表遍历所有类别进行累加。
- \(\mathbb{1}_{i j}^{\text {obj }}\):第 \(i\) 个网格单元的第 \(j\) 个边界框负责预测一个目标时为 1,否则为 0。
确定边界框是否负责预测目标:根据真实框的中心点位置,确定该目标由对应的网格单元负责预测。再计算网格单元内每个边界框与真实框的 IOU,选择 IOU 最大的边界框负责预测目标。
- \(\mathbb{1}_{i j}^{\text {noobj }}\):第 \(i\) 个网格单元的第 \(j\) 个边界框负责预测一个目标时为 0,否则为 1。
确定网格单元是否负责预测目标:根据真实框的中心点位置,确定该目标由对应的网格单元负责预测。
- \(\mathbb{1}_{i }^{\text {obj }}\):第 \(i\) 个网格单元负责预测一个目标时为 1,否则为 0。
- \(λ_{coord}\):是一个权重参数,用于平衡边界框坐标损失和其他损失项。
- \(λ_{noobj}\):是一个权重参数,用于平衡无对象置信度损失和其他损失项。
坐标损失中包含了两个损失值,一个是中心点坐标损失,一个是边界框损失。中心点坐标损失采用的是平方差。边界框损失采用的是对 \(w,h\) 开根号后再计算平方差,使用平方根是为了使损失函数更加稳定(主要是为了限制大目标 \(w,h\) 贡献的损失),并且更好地处理不同尺度的边界框。
在 YOLO v1 中,\(λcoord\) 和 \(λnoobj\) 的值分别为 5 和 0.5,数值相差较大的主要原因是为了平衡不同部分的损失,避免模型过度关注没有目标的区域。
在计算置信度损失时,当有对象时,\(C\)(标签值)为预测框和标注框之间的 IOU。当无对象时,\(C\)(标签值)为 0 。
1.6 YOLO v1 的训练过程
YOLO v1 训练分为两个阶段:
-
第一阶段
在 ImageNet 分类数据集上预训练分类模型。首先将 YOLO v1的模型转化为分类模型,利用前20卷积作为模型的特征提取网络。随后利用全局平均池化层进行池化操作,随后利用全连接层进行 1000 分类。 此时模型的输入为
224x224
,对该网络进行了大约一周的训练,并在 ImageNet2012 验证集上实现了单个作物前 5 名的准确率达到 88%,与传统的图像识别方法相当。 -
第二阶段
将网络的输入调整为
448x448
。并将模型调整为检测模型,那么此时检测模型的参数如下图所示,并且去除全局平均池化加入 4 个卷积层和两个全连接层,最后将模型的输出 调整为7×7×30
这样的向量大小。 在分类模型参数上继续 fine tune 网络(135轮)。
1.7 YOLO v1 的总结
YOLO v1 具体以下优点:
- YOLO v1非常快,因为将物体检测定义为回归问题,所以检测也不需要复杂的组件。
- YOLO v1基于全图进行检测,所以不像滑动窗口和预选区技术,YOLO v1中隐含着隐式编码的上下文信息。
YOLO v1 具体以下缺点:
- YOLO v1准确率不够高,这是由于 YOLO v1 网络结构相对简单,特征提取能力不高。
- YOLO v1可以检测到的目标物体较少,这是由于 YOLO v1 每个网格单元只能预测两个边界框并且共用一个类别概率,即最多预测 49 个目标。
- YOLO v1在定位物体,尤其是小物体上表现差,这是由于可能多个小物体集中在同一个网格单元内,导致模型无法检测这些小物体。
2 YOLO v2
2.1 YOLO v2 的概述
YOLO v2 是 YOLO 的第二个版本,其目标是显著提高准确性,同时保持甚至提升检测速度。YOLO v2 在 YOLO v1 的基础上进行了多项改进,特别是在 PASCAL VOC 2007 数据集上的 mAP 从 63.4% 提升到了 78.6%,并且保持了实时检测的速度。YOLO v2 的改进主要集中在三个方面:预测更准确(Better)、速度更快(Faster)、识别物体更多(Stronger)。此外,YOLO v2 还扩展到能够检测 9000 种不同物体,称为 YOLO9000。
相关论文:《YOLO9000: Better, Faster, Stronger》
2.2 YOLO v2 的改进点
以下是 YOLO v2 的一些主要改进点:
-
Batch Normalization
YOLOv2 在每个卷积层后加入了批归一化(Batch Normalization),加速了训练过程,并提供了正则化效果,从而减少了对 Dropout 的需求。这提高了模型的稳定性和检测精度。
-
High-Resolution Classifier
YOLOv1 使用
224x224
的图像进行分类预训练,而 YOLOv2 则在448x448
的高分辨率图像上进行分类器的预训练,随后进行目标检测微调。高分辨率输入有助于提高对小物体的检测能力。 -
Convolutional
YOLO v2 采用全卷积网络(FCN)设计,完全由卷积层构成,无全连接层。这种设计不仅加速了训练和推理过程,还允许模型处理任意大小的输入图像,增强了灵活性和适应性。 -
Anchor Boxes
YOLOv2 引入了 Anchor Boxes 概念,从 Faster R-CNN 借鉴而来。通过使用一组预定义的不同尺寸和比例的 Anchor Boxes,模型可以处理多尺度目标检测问题,显著提升了边界框预测的准确性。 -
New Network Design
YOLOv2 设计了一个新的基础网络 Darknet-19,该网络有 19 个卷积层和 5 个最大池化层。Darknet-19 比 VGG-16 更轻量级,同时在 ImageNet 上的表现相当,这使得 YOLOv2 既快速又准确。
-
Dimension Priors
为了优化 Anchor Boxes 的选择,YOLOv2 通过对训练集中的边界框进行 k-means 聚类来确定最佳的 Anchor 尺寸。这种方法能够更好地匹配数据集中的目标尺寸分布,提高了检测性能。
-
Location Prediction
YOLOv2 改进了位置预测机制,网络不再直接预测边界框坐标,而是预测 Anchor Boxes 的中心点偏移量和宽高缩放因子。这种方式更容易优化,显著提高了模型的定位精度和对小目标的检测能力。
-
Passthrough Layer
为了更好地检测小目标,YOLOv2 引入了 Passthrough 层,该层将早期特征图中的高分辨率信息传递到后面的层。通过这种方式,网络可以利用早期的细粒度特征,从而提升小物体检测效果。
-
Multi-Scale Training
为了使模型能适应不同尺度的输入图像,YOLOv2 实现了多尺度训练。在网络训练过程中,每经过一定数量的批次,网络会随机改变输入图像的尺寸。这种做法增强了模型的泛化能力。
-
Hi-Resolution Detector
YOLO v2 相较于 YOLO v1 采用了更高分辨率的网络(引入了 Passthrough Layer 和多尺度训练)。
2.2.1 添加 BN 层
在深度神经网络的训练过程中,每一层的输入分布可能会随着训练的进行而发生变化,这种现象称为内部协变量偏移(Internal Covariate Shift)。具体来说,当网络的前几层参数发生变化时,后续层的输入分布也会随之改变,这会导致以下几个问题:
- 训练不稳定:输入分布的变化使得每一层的参数需要不断调整以适应新的输入分布,增加了训练的难度。
- 梯度消失和爆炸:输入分布的变化可能导致梯度消失或梯度爆炸,使得网络难以学习。
- 学习率受限:为了保持训练的稳定性,往往需要使用较小的学习率,这会延长训练时间。
为了应对内部协变量偏移问题,Batch Normalization (BN) 被提出并广泛应用。BN 通过标准化每一层的输入,使得输入数据的分布保持稳定分布),从而加速模型的训练过程并提高模型的性能。
BN 的步骤主要分为以下几步:
-
计算均值和方差
首先对于一个训练批次(mini-batch)中的所有样本,计算其均值 \(\mu_B\) 和方差 \(\sigma_B^2\)。-
均值 \(\mu_B\) 计算公式
\[\mu_B=\frac{1}{m} \sum_{i=1}^m x_i \] -
方差 \(\sigma_B^2\) 计算公式
\[\sigma_B^2=\frac{1}{m} \sum_{i=1}^m\left(x_i-\mu_B\right)^2 \]
其中,\(m\) 是 mini-batch 的大小,\(x_i\) 是 mini-batch 中第 \(i\) 个样本的输入值。
-
-
标准化
接下来,使用计算得到的均值和方差对 mini-batch 中的每个样本进行标准化,使其均值为 0,方差为 1。标准化公式如下:\[\hat{x}_i=\frac{x_i-\mu_B}{\sqrt{\sigma_B^2+\epsilon}} \]其中,\(\epsilon\) 是一个很小的常数(例如 \(10^{−8}\)),用于防止除零错误。
-
重新缩放和偏移
标准化后的值 \(\hat{x}_i\) 通常会被重新缩放和偏移,以恢复网络的表达能力。具体公式如下:\[y_i = \gamma \hat{x}_i + \beta \]其中,\(\gamma\) 和 \(\beta\) 是可学习的参数,用于恢复标准化过程中可能丢失的表征能力。
使用 BN 的优点主要体现在以下几个方面:
-
加速训练:由于 BN 能够标准化每一层的输入,使得输入分布更加稳定,从而允许使用更大的学习率,这加快了模型的收敛速度。
-
减少梯度消失和爆炸的风险:BN 通过标准化每一层的输入,保持了网络各层输入的稳定分布,减少了激活值进入极端区间的概率。从而减少了减少梯度消失和爆炸的风险。
-
提高泛化能力,减少过拟合风险:BN 在训练过程中引入了 mini-batch 的随机性,由于每个 mini-batch 的均值和方差都不同,BN 在一定程度上引入了噪声,类似于正则化效果。从而减少了模型对训练数据的过度拟合风险,从而提高了模型的泛化能力。
训练和推理时 BN 的机制有所不同:
- 训练阶段,BN 动态计算每个 mini-batch 的均值和方差,对输入进行标准化,同时使用滑动平均更新全局均值和方差。
- 推理阶段,BN 使用训练时记录的全局均值和方差进行标准化,确保输出的稳定性和一致性。
2.2.2 高分辨率的分类模型
训练数据:ImageNet,该数据为 1000 分类,利用该数据对模型进行分类模型的训练,使得模型有更好的初始化权重。
YOLO v1:
- 分类模型训练:
- 训练输入图像尺寸为
224x224
。 - 训练大约一周的时间,top-5 准确率为 88%。
- 训练输入图像尺寸为
- 检测模型训练:
训练轮次约为 135 轮,图像尺寸为448x448
。
YOLO v2:
- 分类模型训练:
- 输入图像尺寸为
224×224
,训练 160 轮次。 - 输入图像尺寸为
448×448
,训练 10 轮次。 - 高分辨率下训练的分类网络在 top-1 准确率为 76.5%,top-5 准确率为 93.3%。
- 输入图像尺寸为
- 检测模型训练:
利用多尺度训练的方法一共训练 160 轮。