YOLO 目标检测:YOLOv5网络结构、Focus、CSP、自适应Anchor、激活函数SiLU、SPPF、C3
文章目录
- YOLOv5
- 1. YOLOv5 改进点
- 1.1 轻量化设计
- 1.2 自动化训练流程
- 1.3 更高效的推理
- 2. Focus 模块
- 3. 网络结构
- 3.1 CSP 的基本原理
- 3.2 CSP1_X
- 3.3 CSP2_X
- 4. 自适应 Anchor
- 5. 激活函数
- 5.1 SiLU
- 5.2 Swish
- 6. Bottleneck 结构
- 7. C3 模块
- 7.1 BottleneckCSP
- 7.2 C3
- 8. SPPF(Spatial Pyramid Pooling Fusion)
- SPP 和 SPPF 区别
- 9. 输出头(Output Heads)
YOLOv5
YOLOv5 有 YOLOv5n、YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x 五个版本。这几个模型的结构基本一样,不同的是depth_multiple 模型深度和 width_multiple 模型宽度这两个参数。YOLOv5n 网络是 YOLOv5系列中深度最小、特征图的宽度最小的网络。其他三种都是在此基础上不断加深,不断加宽其参数量依次上升,其效果也越来越好
1. YOLOv5 改进点
YOLOv5 相较于早期的 YOLO 版本进行了一系列关键改进,目的是提高模型的性能、训练效率以及推理速度。这些改进主要体现在以下几个方面:
1.1 轻量化设计
YOLOv5 采用了 轻量化设计,通过以下几种方法实现:
- 减少模型参数:与 YOLOv4 和其他版本相比,YOLOv5 在参数量上进行了优化,通过高效的卷积结构(如 CSPNet、Bottleneck)来降低计算复杂度。
- 更少的计算量:通过减少冗余的计算,YOLOv5 提高了处理速度,尤其是在资源有限的设备(如嵌入式设备)上表现优秀。
1.2 自动化训练流程
YOLOv5 提供了 自动化的训练流程,包括自动调整学习率、批量大小和其他训练超参数。这使得训练过程更加简单且无需进行过多手动调节。
- 学习率自动调整:YOLOv5 使用了 OneCycleLR 调度策略,这种方法能够在训练过程中根据当前训练状态自动调整学习率,从而提高模型的收敛速度并避免过拟合。
- 数据增强:YOLOv5 内置了丰富的数据增强策略,包括图像翻转、旋转、剪裁、亮度调整等,这些策略有助于增加训练数据的多样性,提高模型的鲁棒性。
1.3 更高效的推理
YOLOv5 在推理速度方面也进行了优化,特别是在 推理速度 和 内存占用 上:
- TensorRT优化:YOLOv5 支持在推理阶段使用 TensorRT 进行加速,可以显著提高模型在 NVIDIA GPU 上的运行效率。
- ONNX 支持:YOLOv5 可以导出为 ONNX 格式,这样就可以在不同硬件平台上运行(如移动端、嵌入式设备等)。
2. Focus 模块
Focus 模块在 YOLOv5 中的作用是高效地提取输入图像中的高频特征,并降低计算量。传统的卷积神经网络通常对图像进行整个卷积处理,而 Focus 模块通过切分输入图像并进行局部卷积,原理与 Yolov2 的 passthrough 层类似,采用切片操作把高分辨率的图片(特征图)拆分成多个低分辨率的图片(特征图),即隔列采样+拼接,从而减少了计算量。
工作原理:
Focus 模块将输入图像按通道进行分组,然后通过卷积操作进行特征提取。假设输入图像的大小为 H×W×CH \times W \times CH×W×C,其中 HHH 和 WWW 是图像的高度和宽度,CCC 是通道数。Focus 模块将输入图像切分成多个小块,并通过卷积将这些块合并为更小的特征图。
具体来说,Focus 模块的处理流程如下:
- 图像切分:输入图像被切分成多个小块,通常通过按通道进行分组。
- 卷积处理:每个小块通过卷积层进行特征提取,得到更精细的局部特征。
- 合并特征:将每个卷积处理后的特征图合并,形成最终的输出。
具体操作是在一张图片中每隔一个像素拿到一个值,类似于邻近下采样,这样就拿到了 4 张图片,4 张图片互补,但是没有信息丢失,这样一来,将空间信息就集中到了通道空间,输入通道扩充了 4 倍,即拼接起来的图片相对于原先的 RGB 3 通道模式变成了 12 个通道,最后将得到的新图片再经过卷积操作,最终得到了没有信息丢失情况下的二倍下采样特征图
【案例】:假设输入一张图像大小为 640x640x3
- 第一步:640 x 640 x 3的图像输入 Focus 结构,采用切片操作
-
第二步:然后进行一个连接(concat),变成 320 x 320 x 12 的特征图
-
第三步:经过一次 32 个卷积核的卷积操作,最终输出 320 x 320 x 32 的特征图
通过这种方式,Focus 模块在不牺牲信息质量的情况下,减少了计算量。
3. 网络结构
CSP 是一种通过分段处理特征图来改善梯度流的技术。在 YOLOv5 中,CSP 被用于减少深层网络中的梯度消失问题,并增强特征提取的效率。
3.1 CSP 的基本原理
它的基本做法是:把输入特征划分成两部分,一部分走 残差/卷积模块,另一部分走 捷径 (shortcut),最后再合并。这样可以有效增强梯度流,并降低网络中的信息丢失。
CSP 网络的结构可以表示为:
CSP(x)=f1(x)⊕f2(x)\text{CSP}(x) = f_1(x) \oplus f_2(x) CSP(x)=f1(x)⊕f2(x)
其中,xxx 是输入特征图,f1f_1f1 和 f2f_2f2 是两个子网络,通过某种合并方式(如加法、拼接)得到最终结果。通过这种方式,CSP 网络在处理深层特征时能够有效避免梯度消失,增强了网络的表达能力。
3.2 CSP1_X
CSP1_X 主要用于 Backbone(主干网络),即特征提取阶段。
定义:带 shortcut(残差连接)的 CSP 模块
结构特点:
- 输入特征被分成两支:一支直接通过捷径;另一支进入 Bottleneck 堆叠。
- Bottleneck 堆叠的数量为 XXX,因此记为 CSP1_X。
- 两支在输出时进行 concat 拼接,然后再过一次卷积进行融合。
3.3 CSP2_X
CSP2_X 主要用于 Neck/Head(检测头部分),即特征融合与输出阶段。
定义:不带 shortcut 的 CSP 模块
结构特点:
- 输入特征同样被分成两支,但此时 Bottleneck 堆叠更轻量。
- 输出时采用 加法融合或拼接,但 Bottleneck 的数量和复杂度通常比 CSP1_X 少。
- 适合在检测头中快速融合特征,而不增加太多计算量。
4. 自适应 Anchor
YOLOv5 采用了 自适应 anchor 的策略,以提高对目标的检测能力。传统的 YOLO 模型采用的是手动设置的锚框,这些锚框可能无法适应不同数据集中的目标形状和大小。
- 有些不用锚框计算例如yolov5u
自适应 anchor 的基本思想是根据数据集中的目标尺寸、比例等信息动态调整锚框。这意味着模型在训练过程中可以自动调整锚框的尺寸和形状,以适应不同目标的检测需求。
自适应 anchor 机制的步骤如下:
- 生成候选锚框:在训练开始前,YOLOv5 会自动加载训练集中的标注框。根据训练数据中目标的宽高比,自动生成候选锚框。
- 调整锚框:根据生成的候选锚框,使用 K-means 聚类算法对锚框进行优化,使得锚框尽量接近目标的真实大小和形状。
- 动态更新:在训练过程中,锚框会随着网络的学习不断进行调整,从而提高检测精度。
自适应锚框的优势是能够根据实际数据集的特点进行优化,从而提高检测精度,尤其是对于目标尺寸分布不均的数据集。
5. 激活函数
5.1 SiLU
YOLOv5 使用了 SiLU(Sigmoid-weighted Linear Unit)作为主要的激活函数。SiLU 函数的优点是相比传统的 ReLU 函数,它在训练过程中能够更好地避免梯度消失问题。
SiLU 函数的定义如下:
SiLU(x)=x⋅σ(x){SiLU}(x) = x \cdot \sigma(x) SiLU(x)=x⋅σ(x)
其中,σ(x)\sigma(x)σ(x) 是 Sigmoid 函数,定义为:
σ(x)=11+e−x\sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1
SiLU 函数的特点是它结合了线性和 Sigmoid 函数的优势,在训练时能够更平滑地传播梯度,从而加速收敛并提高模型性能。
5.2 Swish
- Swish 激活函数是一个近似于 SiLU 函数的非线性激活函数,具有以下形式:
- β\betaβ是一个可调节的参数,通常设定为 1
6. Bottleneck 结构
Bottleneck 结构是一种常用于卷积神经网络中的设计模式,目的是通过减少网络中某一层的通道数,从而降低计算量,并加快训练速度。
Bottleneck 结构通常由三个部分组成:
- 1x1 卷积:首先使用 1x1 卷积对输入特征图进行降维,将通道数减少。
- 3x3 卷积:然后使用 3x3 卷积进行特征提取,得到压缩后的特征图。
- 1x1 卷积:最后,使用另一个 1x1 卷积将特征图的通道数恢复到原始尺寸。
- 跳跃连接(Shortcut):将输入直接加到输出上,以形成残差连接
Bottleneck 结构的优势在于,它通过减少中间层的通道数,降低了计算复杂度,同时保留了网络的表达能力。
7. C3 模块
C3 模块是 YOLOv5 中为提高网络表达能力而设计的模块。它结合了卷积、残差连接和深度可分离卷积的优点,通过多种方式对特征图进行增强。
C3 模块包含以下几个部分:
- 卷积层:通过常规的卷积操作提取特征。
- 残差连接:通过残差连接,允许梯度更有效地反向传播,增强网络学习能力。
- 深度可分离卷积:减少计算量,提高特征提取的效率。
7.1 BottleneckCSP
- 结构特点:
- 包含多个带 shortcut 的 Bottleneck(shortcut残差连接的线)
- 输入通道被划分,一部分直接传递,一部分经过 Bottleneck 块
- 激活函数:LeakyReLU
- 用途:主要用于早期 YOLOv5 的 backbone
7.2 C3
- 结构特点:
- 不再使用 shortcut(即 Bottleneck 不带残差连接)
- 更加简洁,更适合部署
- 激活函数:SiLU
- 用途:广泛用于 backbone 和 neck(如 PANet)
8. SPPF(Spatial Pyramid Pooling Fusion)
在 YOLOv4 中,SPP 模块大概是这样:
- 输入特征图 FFF;
- 分别通过 1×1, 5×5, 9×9, 13×13 的最大池化层;
- 把这些池化后的结果拼接(concat),再卷积融合。
公式表示:
Fspp(1)=MaxPool1×1(F)F_{spp}^{(1)} = \text{MaxPool}_{1\times1}(F)Fspp(1)=MaxPool1×1(F)
Fspp(2)=MaxPool5×5(F)F_{spp}^{(2)} = \text{MaxPool}_{5\times5}(F)Fspp(2)=MaxPool5×5(F)
Fspp(3)=MaxPool9×9(F)F_{spp}^{(3)} = \text{MaxPool}_{9\times9}(F)Fspp(3)=MaxPool9×9(F)
Fspp(4)=MaxPool13×13(F)F_{spp}^{(4)} = \text{MaxPool}_{13\times13}(F)Fspp(4)=MaxPool13×13(F)
Fspp=Concat(Fspp(1),Fspp(2),Fspp(3),Fspp(4))F_{spp} = \text{Concat}(F_{spp}^{(1)}, F_{spp}^{(2)}, F_{spp}^{(3)}, F_{spp}^{(4)})Fspp=Concat(Fspp(1),Fspp(2),Fspp(3),Fspp(4))
问题:大核池化(如 13×13)计算量大,推理速度下降。
YOLOv5 作者对 SPP 进行优化,提出了 SPPF(SPP-Fast)。
关键思想:
不用直接做大核池化,而是 重复叠加 5×5 池化,等价实现大感受野。
比如:
- 一次 5×5 最大池化 → 感受野扩大到 5×55\times55×5;
- 两次叠加 → 等价于 9×99\times99×9;
- 三次叠加 → 等价于 13×1313\times1313×13。
这样,只需要写一层 5×5 的池化,循环叠加三次,就能得到 13×13 的效果,大大减少计算。
公式:
F1=MaxPool5×5(F)F_1 = \text{MaxPool}_{5\times5}(F)F1=MaxPool5×5(F)
F2=MaxPool5×5(F1)F_2 = \text{MaxPool}_{5\times5}(F_1)F2=MaxPool5×5(F1)
F3=MaxPool5×5(F2)F_3 = \text{MaxPool}_{5\times5}(F_2)F3=MaxPool5×5(F2)
Fsppf=Concat(F,F1,F2,F3)F_{sppf} = \text{Concat}(F, F_1, F_2, F_3)Fsppf=Concat(F,F1,F2,F3)
最后再经过 1×11\times11×1 卷积进行通道融合。
SPP 和 SPPF 区别
9. 输出头(Output Heads)
YOLOv5 的输出头负责最终的检测任务,包括目标框的回归、目标类别的预测和置信度评分的生成。
- 类别预测:每个预测框会输出一个类别概率,表示该框属于某个类别的概率。
- 边界框回归:对于每个预测框,输出其位置和尺寸信息。
- 置信度评分:为每个预测框生成一个置信度分数,表示框内是否有目标以及目标的预测准确性。
YOLOv5 的 Backbone(CSPDarknet) 提取特征后,Neck(PAN-FPN)进一步融合多层信息,最后在 三个尺度上预测目标:
-
输入图像尺寸:通常为 640x640(或者其它尺寸,如 416x416 等)
-
输出特征图:YOLOv5 使用大、中、小三个尺寸
-
输出尺寸:
-
大目标: 通常是输入图像尺寸的 1/32
-
中目标: 通常是输入图像尺寸的 1/16
-
小目标: 通常是输入图像尺寸的 1/8
-
-
-
假设输入图像尺寸为640x640,具体的特征图尺寸如下:
大目标:64032×64032=20×20\text{大目标:}\frac{640}{32}\times\frac{640}{32}=20\times20\\ 大目标:32640×32640=20×20
中目标:64016×64016=40×40\text{中目标:}\frac{640}{16}\times\frac{640}{16}=40\times40\\ 中目标:16640×16640=40×40
小目标:6408×6408=80×80\text{小目标:}\frac{640}8\times\frac{640}8=80\times80 小目标:8640×8640=80×80