1.YOLO(You Only Look Once)v1算法是一个单阶段目标检测模型
它的关键思想是将目标检测问题转化为回归问题,通过一次前向传递同时预测多个边界框和类别概率。
1.1. 网络结构
YOLO v1使用一个单一的卷积神经网络(CNN)来同时预测多个边界框和这些框内的类别概率。网络的输入是一个固定大小的图像(例如448x448),输出是一个SxSx(B*5 + C)的张量,其中:
- SxS 是将输入图像划分成的网格单元数(通常为7x7)。
- B 是每个网格单元预测的边界框数量(通常为2)。
- 5 表示每个边界框的5个参数(x, y, w, h, confidence)。
- C 是类别的数量。
1.2. 网格划分
YOLO v1将输入图像划分为一个SxS的网格,每个网格单元负责检测该单元内的对象。每个网格单元预测B个边界框和这些框的置信度(confidence),以及C个类别概率。
1.3. 预测
每个边界框预测5个参数:
- (x) 和 (y):边界框中心相对于网格单元的位置。
- (w) 和 (h):边界框的宽度和高度,相对于整个图像的归一化值。
- 置信度(confidence):边界框包含对象的置信度分数,计算方式为:
confidence = P ( object ) × IOU ( pred , truth ) \text{confidence} = P(\text{object}) \times \text{IOU}(\text{pred}, \text{truth}) confidence=P(object)×IOU(pred,truth)
其中, P ( object ) P(\text{object}) P(object)表示该网格单元内存在对象的概率, IOU ( pred , truth ) \text{IOU}(\text{pred}, \text{truth}) IOU(pred,truth)是预测边界框和真实边界框之间的交并比。
1.4. 损失函数
YOLO v1的损失函数包括三个部分:
- 边界框位置误差(x, y, w, h)的平方差。
- 边界框置信度误差(confidence)的平方差。
- 分类误差(类别概率)的平方差。
公式如下:
Loss
=
λ
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
]
+
∑
i
=
0
S
2
∑
j
=
0
B
1
i
j
obj
(
C
i
−
C
^
i
)
2
+
λ
noobj
∑
i
=
0
S
2
∑
j
=
0
B
1
i
j
noobj
(
C
i
−
C
^
i
)
2
+
∑
i
=
0
S
2
1
i
obj
∑
c
∈
classes
(
p
i
(
c
)
−
p
^
i
(
c
)
)
2
\text{Loss} = \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbf{1}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 + (w_i - \hat{w}_i)^2 + (h_i - \hat{h}_i)^2 \right] + \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbf{1}_{ij}^{\text{obj}} (C_i - \hat{C}_i)^2 + \lambda_{\text{noobj}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbf{1}_{ij}^{\text{noobj}} (C_i - \hat{C}_i)^2 + \sum_{i=0}^{S^2} \mathbf{1}_{i}^{\text{obj}} \sum_{c \in \text{classes}} (p_i(c) - \hat{p}_i(c))^2
Loss=λcoordi=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2+(wi−w^i)2+(hi−h^i)2]+i=0∑S2j=0∑B1ijobj(Ci−C^i)2+λnoobji=0∑S2j=0∑B1ijnoobj(Ci−C^i)2+i=0∑S21iobjc∈classes∑(pi(c)−p^i(c))2
其中:
- λ coord \lambda_{\text{coord}} λcoord 和 λ noobj \lambda_{\text{noobj}} λnoobj是用于平衡损失项的权重(通常 λ coord = 5 \lambda_{\text{coord}} = 5 λcoord=5和 λ noobj = 0.5 \lambda_{\text{noobj}} = 0.5 λnoobj=0.5)。
- 1 i j obj \mathbf{1}_{ij}^{\text{obj}} 1ijobj和 1 i j noobj \mathbf{1}_{ij}^{\text{noobj}} 1ijnoobj是指示变量,表示网格单元是否包含对象。
1.5. 非极大值抑制(NMS)
为了减少重叠的边界框,YOLO v1使用非极大值抑制(NMS)来抑制低置信度的预测。具体步骤是:
- 根据置信度分数对所有预测的边界框进行排序。
- 从最高置信度开始,选择该框并删除所有与其重叠度(IOU)超过阈值的其他框。
1.6 总结
YOLO v1通过将目标检测问题转化为回归问题,实现了实时的目标检测速度。它通过一个单一的卷积神经网络一次性预测多个边界框和类别概率,大大简化了检测过程,适用于需要高效实时检测的场景。尽管YOLO v1在定位精度上稍逊色于一些多阶段检测器,但它的速度和简洁性使其成为许多实际应用中的首选。
2. YOLO v2(You Only Look Once v2)通过以下具体方法实现了改进:
2.1. 更高分辨率的输入图像
YOLO v2 支持多种输入图像分辨率(如 416x416),通过多尺度训练使模型在不同分辨率下均能有效工作。具体方法是,在训练过程中每隔几次迭代随机调整输入图像的尺寸。
2.2. 批量归一化
在每个卷积层后添加批量归一化层。这不仅有助于正则化模型,防止过拟合,还加速了模型收敛,提高了训练速度和稳定性。
2.3. 高效的网络结构
YOLO v2 使用了 Darknet-19 作为基础网络。Darknet-19 是一个包含 19 个卷积层和 5 个池化层的深层网络,比 YOLO v1 的网络更深,特征提取能力更强。同时采用了 1x1 卷积减少特征图的维度,降低计算成本。
2.4. 更好的锚点机制
引入了先验框(Anchors),通过在训练前对数据集中的边界框进行 k-means 聚类分析,确定一组适合该数据集的锚点框。这些锚点框在预测时用作参考,模型预测的是相对于这些锚点框的偏移量。
2.5. 直接位置预测
YOLO v2 通过 logistic 回归预测边界框中心坐标,确保预测的中心点位于所属的网格单元内。此外,预测的是边界框的宽度和高度的对数值,有助于更稳定的训练。
2.6. 多尺度训练
在训练过程中,YOLO v2 每隔一定次数迭代随机改变输入图像的尺寸,使得模型在不同大小的图像下都能适应,增强了模型的鲁棒性。这种训练方式使得模型在推理时也能处理不同尺寸的图像。
2.7 总结
YOLO v2 通过网络结构优化、批量归一化、锚点机制、直接位置预测和多尺度训练等方法,在保持实时检测速度的同时显著提升了检测精度和鲁棒性。上述改进使得 YOLO v2 在实际应用中更加高效和实用。
3.YOLO v3(You Only Look Once v3)相对于YOLO v2进行了多方面的改进
3.1. 改进的网络结构
YOLO v3 使用了称为Darknet-53的网络结构,它比Darknet-19更深,更强大。Darknet-53包含53个卷积层,并广泛使用了残差块(Residual Blocks),这有助于缓解深层网络的梯度消失问题,并提升特征提取能力。
3.2. 多尺度预测
YOLO v3 在三个不同的尺度上进行预测,每个尺度对应于不同的特征层。这种方法使得模型能够更好地检测不同大小的目标。
3.3. 改进的锚点框
YOLO v3 使用9个锚点框,分别分配给3个不同的尺度层。每个尺度层都有自己的3个锚点框,这样能够更好地捕捉不同大小的目标。
实现方法:
anchors = [
# 3 anchors for each scale
[(10, 13), (16, 30), (33, 23)], # Scale 1
[(30, 61), (62, 45), (59, 119)], # Scale 2
[(116, 90), (156, 198), (373, 326)] # Scale 3
]
3.4. 改进的损失函数
YOLO v3 在损失函数中使用了二元交叉熵损失来处理类预测,并在边界框回归损失中考虑了IOU(Intersection over Union),使得训练更加稳定。
3.5. 更高的分类能力
YOLO v3 支持多达80个类别的分类预测,使用了softmax层来输出每个类别的概率。
3.6总结
YOLO v3 通过改进网络结构、使用多尺度预测、优化锚点框、改进损失函数和增强分类能力等方面的改进,在保持实时检测速度的同时显著提升了检测精度和鲁棒性。这些改进使得YOLO v3在实际应用中更为高效和实用。