YOLO缺陷检测学习笔记(2)
- 残差连接
- 1. **YOLO 的残差连接结构**
- 2. **YOLO 使用残差连接的目的**
- 3. **YOLO 中的残差块**
- 4. **YOLOv3 和 YOLOv4 的残差连接架构**
- YOLO网络架构概述
- 1. 特征提取网络
- 2. 预测头(Detection Head)
- 3. 后处理(Post-processing)
- YOLOv3/v4的改进
- YOLOv3
- YOLOv4
- Softmax
- Softmax 的性质:
- Softmax 在多分类中的应用:
- 举例:
- Bag of Freebies (BOF)
- Bag of Specials (BOS)
- PAN(Path Aggregation Network)
- 工作原理
- 优势
- 应用
- MISH
- MISH 激活函数
- MISH 激活函数的特点
- 性能比较
- 应用示例
残差连接
在 YOLO(You Only Look Once)网络的后续版本(如 YOLOv3、YOLOv4)中,残差连接(Residual Connection)被引入以改进网络的深度和性能。残差连接最初由 ResNet 提出,旨在解决深度网络的梯度消失问题,同时提高网络的训练效率和性能。在 YOLO 中使用残差连接的主要目的是增强特征提取能力并保持稳定的梯度传播,尤其是在处理复杂场景时。
1. YOLO 的残差连接结构
在 YOLO 中,残差连接的作用类似于 ResNet,它通过在某些层之间跳过连接输入,直接将输入信息传递到后面的层。这可以避免信息在深层网络中丢失。对于 YOLOv3 及之后的版本,通常在每一个卷积层后引入残差块(Residual Block)。残差块的结构如下:
y = f ( x ) + x y = f(x) + x y=f(x)+x
其中:
- x x x 是输入特征,
- f ( x ) f(x) f(x) 是经过一系列卷积、Batch Normalization(BN)和激活函数(Leaky ReLU)后的输出,
- y y y 是残差块的输出,通过将输入 x x x 和卷积变换后的特征 f ( x ) f(x) f(x) 相加得到。
2. YOLO 使用残差连接的目的
引入残差连接的主要目的有以下几点:
-
改善梯度传播:在深层神经网络中,梯度随着网络深度的增加可能会逐渐变得非常小(即梯度消失问题)。残差连接允许梯度更稳定地从网络后层反向传播回前层,减轻了这一问题。
-
提升模型性能:YOLO 的残差块帮助模型保留更多的低层特征,使得网络在处理不同尺度和复杂性的目标时更有效。尤其是对于小目标,残差连接可以让模型保留更多的细节信息。
-
简化训练过程:残差连接使得网络的训练更加稳定,允许模型使用更深的网络架构(如 YOLOv3 中引入了 53 层深的 Darknet-53 作为特征提取器),而不会导致性能下降或训练困难。
3. YOLO 中的残差块
在 YOLOv3 和 YOLOv4 中,残差块的结构与 ResNet 中的残差块非常相似,通常包括两个卷积层、Batch Normalization 和 Leaky ReLU 激活函数。具体步骤如下:
- 输入特征 x x x 进入第一个卷积层,进行卷积操作。
- 卷积后的特征通过 Batch Normalization 和 Leaky ReLU 激活函数进行非线性变换。
- 经过第二个卷积层后,再次通过 Batch Normalization 和 Leaky ReLU 激活。
- 最后,将输入 x x x 与变换后的特征 f ( x ) f(x) f(x) 相加,得到残差块的输出。
这种结构允许网络在进行非线性变换的同时,保留原始输入的信息。
4. YOLOv3 和 YOLOv4 的残差连接架构
-
YOLOv3 使用了 Darknet-53 作为骨干网络,Darknet-53 是由 53 层卷积组成的深度网络,其中多个残差块相互堆叠而成。每个残差块可以帮助模型在深层次上提取更丰富的特征,同时保持输入信息的完整性。
-
YOLOv4 继续优化了残差连接,并结合了 CSPNet(Cross Stage Partial Network)结构,在保持性能的同时减少计算复杂度。这使得 YOLOv4 的推理速度更快,但检测效果更好。
-
YOLO(You Only Look Once)是一种实时目标检测算法,它通过将整个图像作为输入,并在一次前向传播中同时进行分类和定位。YOLO的网络架构简洁高效,能够在保持较高准确率的同时,实现实时检测。
YOLO网络架构概述
YOLO的网络架构可以分为三个主要部分:
- 特征提取网络:用于提取输入图像中的特征。
- 预测头(Detection Head):基于提取的特征,预测目标的边界框和类别。
- 后处理(Post-processing):将预测结果进行筛选和优化,得到最终的检测结果。
1. 特征提取网络
YOLO的特征提取网络是一个卷积神经网络(CNN),通常基于经典的网络架构(如Darknet、ResNet等)。这个部分的主要任务是从输入的图像中提取高级特征。
- 输入尺寸:YOLO通常接受尺寸固定的图像输入,如
$416 \times 416$
。 - 卷积层和池化层:通过堆叠卷积层和池化层,逐步提取图像的不同层次特征。卷积层使用不同的卷积核大小来捕捉不同尺度的特征。
- 残差连接:从YOLOv3开始,网络引入了残差连接,灵感来自ResNet。这种结构有助于缓解深度网络中的梯度消失问题。
特征提取部分的输出是一个特征图,它总结了输入图像中的信息,并传递到预测头进行进一步处理。
2. 预测头(Detection Head)
YOLO的关键在于其创新的检测头设计,它通过回归来同时预测每个区域的边界框和类别。每个位置预测的内容包括:
- 边界框坐标:中心点
(x, y)
和宽高(w, h)
。 - 置信度(Confidence):边界框内是否包含物体的概率。
- 类别概率(Class Probability):目标属于每个类别的概率。
具体的步骤为:
- 将特征图划分为
$S \times S$
个网格,每个网格预测多个边界框。 - 每个边界框包含预测的
(x, y)
,宽高(w, h)
,以及一个置信度分数。 - 置信度分数反映该框中包含物体的概率和边界框的精度。
- 每个边界框同时预测多个类别的概率,用于确定目标的类别。
3. 后处理(Post-processing)
YOLO的后处理步骤包括:
- Non-Maximum Suppression(NMS):在同一目标的多个重叠边界框中,保留置信度最高的框,并去除冗余框。
- Thresholding:根据置信度阈值,筛选掉置信度较低的预测结果。
YOLO使用的是一种全局的框架来检测目标,它在一次前向传播中完成所有的目标预测。这种架构让YOLO相比其他目标检测算法,如R-CNN、Faster R-CNN,具有更快的检测速度。
YOLOv3/v4的改进
YOLOv3
- 多尺度预测:YOLOv3在不同尺度上进行检测,适应不同大小的目标。这是通过使用FPN(特征金字塔网络)的思想来提高对小目标的检测效果。
- 残差网络(ResNet):YOLOv3引入了残差连接,使得更深的网络更容易训练,提升了检测效果。
YOLOv4
- CSPDarknet53 Backbone:YOLOv4使用了CSPNet(Cross Stage Partial Network)架构,进一步提升了模型的准确率和速度。
- Bag of Freebies (BoF):YOLOv4在训练过程中使用了一些免费的增强技巧,如Mosaic数据增强、DropBlock正则化等。
Softmax
Softmax 是一种常用于多分类问题的激活函数,通常出现在深度学习模型的输出层。它的作用是将一个包含未归一化数值(即 logits)的向量转换为概率分布,即每个输出值的范围都在 [ 0 , 1 ] [0, 1] [0,1] 之间,并且这些输出值的和为 1。这样就可以表示每个类别的预测概率。
Softmax 函数的定义如下:
σ ( z i ) = e z i ∑ j = 1 N e z j \sigma(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{N} e^{z_j}} σ(zi)=∑j=1Nezjezi
其中:
- z i z_i zi 是输入向量中的第 i i i 个元素,
- N N N 是输出类别的数量,
- e e e 是自然常数。
Softmax 的性质:
- 归一化:输出的概率总和为 1,因此可以直接用作分类问题中的概率。
- 数值稳定性:计算过程中可能会出现数值溢出问题,尤其是在 logits 非常大的情况下。通常通过减去输入中的最大值来避免这种情况,公式改写为:
σ ( z i ) = e z i − max ( z ) ∑ j = 1 N e z j − max ( z ) \sigma(z_i) = \frac{e^{z_i - \max(z)}}{\sum_{j=1}^{N} e^{z_j - \max(z)}} σ(zi)=∑j=1Nezj−max(z)ezi−max(z)
Softmax 在多分类中的应用:
Softmax 通常用于多分类问题的输出层,比如在分类任务中,将模型的最终输出通过 Softmax 转换为各个类别的概率,然后根据概率的大小来决定最终的分类结果。
举例:
假设我们有一个 3 类分类问题,模型的输出 logits 为:
z
=
[
2.0
,
1.0
,
0.1
]
z = [2.0, 1.0, 0.1]
z=[2.0,1.0,0.1]
经过 Softmax 转换后的结果为:
σ
(
z
)
=
[
e
2.0
e
2.0
+
e
1.0
+
e
0.1
,
e
1.0
e
2.0
+
e
1.0
+
e
0.1
,
e
0.1
e
2.0
+
e
1.0
+
e
0.1
]
\sigma(z) = \left[ \frac{e^{2.0}}{e^{2.0} + e^{1.0} + e^{0.1}}, \frac{e^{1.0}}{e^{2.0} + e^{1.0} + e^{0.1}}, \frac{e^{0.1}}{e^{2.0} + e^{1.0} + e^{0.1}} \right]
σ(z)=[e2.0+e1.0+e0.1e2.0,e2.0+e1.0+e0.1e1.0,e2.0+e1.0+e0.1e0.1]
Bag of Freebies (BOF)
BOF指的是一种通过改进模型训练过程或数据增强技术来提升模型性能的方法,而无需增加推理时的计算量或模型复杂度。BOF 主要集中在优化训练流程和提升模型鲁棒性,而不改变推理时的架构或计算成本。
Bag of Freebies 的例子包括:
- 数据增强:例如随机裁剪、旋转、平移等方法,使得模型在训练时能够看到更多的变体,提高模型的泛化能力。
- 正则化技术:像 Dropout、Label Smoothing 等,能够在训练过程中防止过拟合。
- 损失函数的改进:例如 Focal Loss、IoU-based 损失等,能够帮助模型更好地优化目标检测任务。
通过这些“免费”的技术,可以在不增加推理时的开销的情况下,提高模型的准确性和鲁棒性。
Bag of Specials (BOS)
是目标检测算法中的一种技术,类似于 Bag of Freebies (BOF),其目标是通过在训练过程中不增加推理时间的情况下提升模型性能。与 BOF 强调优化已有数据的使用方式不同,BOS 更注重特征提取或网络结构的调整。具体来说,它可以通过设计特定的网络结构、增加有效的层次等方式来优化性能。
BOS 常被用于卷积神经网络(CNN)和 YOLO 等目标检测算法中,以提高检测精度而不增加计算开销。这些“specials”通常包括创新的激活函数、归一化层、或者注意力机制,帮助模型更好地学习目标特征。
PAN(Path Aggregation Network)是一种用于目标检测任务的网络架构,旨在增强特征图的表达能力和上下文信息。PAN 主要通过路径聚合机制来结合不同层次的特征信息,从而提高检测精度。以下是 PAN 的核心概念和工作原理:
PAN(Path Aggregation Network)
PAN(Path Aggregation Network)是一种用于目标检测任务的网络架构,旨在增强特征图的表达能力和上下文信息。PAN 主要通过路径聚合机制来结合不同层次的特征信息,从而提高检测精度。以下是 PAN 的核心概念和工作原理:
-
路径聚合:
– PAN 通过将不同层次的特征图进行融合,以利用不同层次的语义信息。这种机制能够捕捉到更加丰富的上下文信息,并且加强了特征图的表达能力。 -
特征融合:
– PAN 通过多种方式将高层特征(语义信息更丰富)与低层特征(包含更多的空间细节)进行融合。这样的融合使得检测器可以更好地处理不同尺度的目标。
工作原理
-
特征提取:
– 从图像中提取不同层次的特征图。高层特征通常语义信息丰富但空间分辨率低,低层特征则空间分辨率高但语义信息较少。 -
特征融合:
– 使用路径聚合网络将这些不同层次的特征进行融合。常见的融合方式包括自底向上的路径聚合和自顶向下的路径聚合。 -
自底向上聚合:
– 从低层特征图开始,通过卷积和上采样等操作,将低层特征逐步向高层特征图传递,直到达到目标分辨率。 -
自顶向下聚合:
– 从高层特征图开始,通过卷积和下采样等操作,将高层特征逐步向低层特征图传递。这有助于融合高层的语义信息。 -
特征融合和预测:
– 将融合后的特征图用于目标检测模型进行预测。通过这种特征融合机制,PAN 可以提高模型对不同尺度和复杂背景目标的检测能力。
优势
- 增强特征表达能力:通过融合不同层次的特征,PAN 能够更好地捕捉目标的多尺度信息。
- 提高检测精度:路径聚合机制可以提升对不同尺寸和背景复杂度目标的检测效果。
- 适应性强:适用于各种目标检测任务,包括目标定位和分类。
应用
PAN 主要用于目标检测任务中的特征图增强,例如在像 YOLO 和 Faster R-CNN 等目标检测模型中,PAN 可以作为一种有效的特征融合策略,提升模型的检测精度和鲁棒性。
MISH
MISH(Monotonic Inverted-Swish)是一种激活函数,用于提升深度神经网络的性能。它是 Swish 函数的改进版,具有更好的性能和稳定性。
MISH 激活函数
MISH 函数定义为:
MISH
(
x
)
=
x
⋅
tanh
(
softplus
(
x
)
)
\text{MISH}(x) = x \cdot \tanh(\text{softplus}(x))
MISH(x)=x⋅tanh(softplus(x))
其中:
-
softplus
(
x
)
\text{softplus}(x)
softplus(x) 是一个平滑的修正线性单元(ReLU)函数,定义为:
softplus ( x ) = log ( 1 + e x ) \text{softplus}(x) = \log(1 + e^x) softplus(x)=log(1+ex) -
tanh
(
x
)
\tanh(x)
tanh(x) 是双曲正切函数,定义为:
tanh ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x
MISH 激活函数的特点
-
平滑性:
- MISH 函数是光滑且连续的,有助于减少梯度消失和梯度爆炸的问题。
-
单调性:
- 由于 softplus \text{softplus} softplus 函数和 tanh \tanh tanh 函数都是单调递增的,MISH 函数也具备单调性,这有助于保持网络的稳定性。
-
非线性:
- MISH 函数在输入为负时表现出不同于 ReLU 的非线性行为,这有助于增强网络的表达能力。
-
自适应性:
- MISH 可以在不同的输入范围内自适应地调整激活值,提供更多的信息和更好的特征表示。
性能比较
与传统的 ReLU 激活函数相比,MISH 在多个任务上(如图像分类、目标检测)通常能够提供更好的性能。这是因为 MISH 在处理负值和较小值时比 ReLU 更加柔和,从而能够更好地保留有用的信息。
应用示例
在深度学习框架中,MISH 激活函数可以通过自定义层或函数来实现。例如,在 PyTorch 中,可以自定义 MISH 激活函数如下:
import torch
import torch.nn as nn
class Mish(nn.Module):
def forward(self, x):
return x * torch.tanh(torch.nn.functional.softplus(x))
# 使用 MISH 激活函数的示例
mish = Mish()
input_tensor = torch.tensor([1.0, -1.0, 0.0])
output_tensor = mish(input_tensor)
print(output_tensor)
感觉YOLO好难,万事开头难,一点点做起来吧.想多了都是问题,做多了都是答案,加油.