以YOLO V5s为例,介绍YOLO V5的网络结构,以及其中具体的功能模块
1 YOLO V5的整体网络结构
YOLO V5网络结构分为四个部分:
- 输入端: 输入端负责对输入图像进行预处理,包括数据增强、锚框计算等。
- 骨干网络(Backbone): Backbone是网络的主干部分,用于提取图像中的特征。
- 颈部网络(Neck): 融合Backbone提取的特征,增强网络对目标的位置和大小信息的敏感性。
- 头部(Head): 负责对Neck输出的特征进行预测,包括目标的类别和边界框的位置。
2 输入端
输入端会把图片处理成需要的尺寸,并进行归一化操作,然后进行批处理等操作。YOLO V5输入端有三种创新操作:Mosaic数据增强、自适应锚框计算、自适应图片缩放
2.1 Mosaic数据增强
本方法就是把4张图片,通过随机缩放、随机裁减、随机排布的方式进行拼接,具体步骤如下:
- 随机读取四张图片
- 分别对四张图片进行翻转(对原始图片进行左右的翻转)、缩放(对原始图片进行大小的缩放)、色域变化(对原始图片的明亮度、饱和度、色调进行改变)等操作
- 将四张图片组合到一张图片中,并筛除掉一些没用的框。
如下图所示:
该方法极大的丰富了检测物体的背景,并且在标准化计算的时候,会同时计算了四张图片的数据。
2.2 自适应锚框计算
Yolov5 中并不是只使用默认锚定框,在开始训练之前会对数据集中标注信息进行核查,计算此数据集标注信息针对默认锚定框的最佳召回率。当最佳召回率大于或等于0.98,则不需要更新锚定框;如果最佳召回率小于0.98,则需要重新计算符合此数据集的锚定框。
重新计算符合此数据集标注框的锚定框,是利用 kmean聚类方法实现的。
2.3 自适应图片缩放
传统的缩放方式都是按照原始比例缩放图像并用黑色填充至目标大小,由于实际的使用中很多图片的宽高比不同,因此缩放填充之后,两端的黑边大小不一定相同,而如果填充过多,则会存在大量的信息冗余,从而影响整个算法的推理速度。
Yolov5算法则提出Letterbox方法,能够自适应的添加最少的黑边到缩放之后的图片中,这样推理时计算量减少,目标检测速度也会得到提升,步骤如下:
-
计算缩放比例。例如原始缩放尺寸为416x416,都除以原始图像尺寸,可以得到0.52和0.69两个缩放系数,选择较小系数0.52。
-
计算缩放后的尺寸。原始图片的长宽都乘以最小缩放系数0.52,宽变成了416,高变为312。
-
计算黑边填充数值。将416-312=104,得到原本需要填充的高度。
注意: :缩减黑边方式仅在模型推理时使用,用于提高目标检测及推理速度。训练时仍采用传统填充方式,即缩放到416x416大小
此处参考的Yolov5原理详细解析!一文看懂。
3 骨干网络(Backbone)
该结构负责提取各个尺度的的特征,增强网络对目标的位置和大小信息的敏感性,骨干网络结构如下:
下面分别介绍这些功能模块。
3.1 Focus模块
在不增加额外计算成本的情况下,增强模型对输入图像的理解能力,处理步骤如下:
- 切片(Slicing): Focus模块将输入图像分割成更小的块,每个子区域包含了原始图像的一部分信息。
- 重排(Rearrangement): 这些子区域的信息被重新排列组合到一起,会形成一个新的特征图。
- 连接(Concatenation): 把经过处理后的特征图连接在一起,形成一个更加丰富的输入表示,供后续的网络层进一步处理。
- 自定义卷积(CBL模块): 通过CBL模块操作,最终得到了没有信息丢失情况下的二倍下采样特征图。
下图展示了切片、重排、组合操作的结果:
原始的
640
×
640
×
3
640 × 640 × 3
640×640×3的图像输入Focus结构,采用切片操作,先变成
320
×
320
×
12
320 × 320 × 12
320×320×12的特征图,然后进行拼接(Concat),再经过一次步长为2的自定义卷积操作(CBL模块),最终变成
320
×
320
×
32
320 × 320 × 32
320×320×32的特征图。
3.2 CBL模块(自定义卷积操作)
负责特征提取和非线性映射,CBL模块的处理步骤如下:
- 卷积操作: 负责从输入数据中提取特征。
- 批量归一化操作: 对卷积层的输出计算均值和方差,并用它们来标准化该层的输入,有助于加快训练速度、提高模型收敛性并减少过拟合的风险。
- Leaky_relu激活函数: 引入非线性因素,得模型能够学习到复杂的映射关系。
3.3 CSP1_x模块
CSP1模块是基于CSPNet(Cross Stage Partial Network)设计的一种结构,它旨在通过更高效的计算资源利用来提升模型的性能。CSPNet 的核心思想是在不显著增加计算成本的情况下,增强特征表达能力,从而提高检测精度。
其中,残差组件结构如下图,主要作用是解决或缓解深度神经网络训练过程中遇到的退化问题(Degradation Problem),即随着网络层数增加,模型准确率反而下降的问题。
CSP1_1就代表有一个是含有1个残差组件的CSP1组件,CSP1_3就代表有一个是含有3个残差组件的CSP1组件,
3.4 SSP模块
该模块是何恺明提出的Spatial Pyramid Pooling(空间金字塔池化),传统的 CNN 在最后几层通常使用固定尺寸的输入(例如 224x224),这意味着所有输入图像必须被缩放到相同的尺寸。然而,这种做法可能会导致信息丢失或引入不必要的变形。相比之下,SPP 可以接受任意尺寸的输入图像,并通过以下步骤将其转换为固定长度的特征表示:
- 多级划分: 将最后一个卷积层生成的特征图划分为多个不同尺度的空间区域。这些区域可以按照金字塔结构组织,比如分成 1x1、2x2、4x4等等不同数量的块。每个级别的划分代表了不同尺度的感受野。
- 池化操作: 对每个划分后的区域应用最大池化(Max Pooling)或其他类型的池化操作。这样可以从每个区域内提取出最具代表性的特征。由于每个级别都有固定的池化区域数目,所以无论原始输入图像的尺寸如何,最终都会得到相同数量的池化结果。
- 特征拼接: 将所有级别池化后的特征向量进行拼接,形成一个单一的长向量作为整个图像的特征表示。这个特征向量随后可以被送入全连接层来进行分类或其他任务。
YOLO V5 模型中的SSP操作步骤如下:
- 自定义卷积操作: CBL模块 。
- 最大池化: 分别进行 13 × 13 13\times13 13×13、 9 × 9 9\times9 9×9、 5 × 5 5\times5 5×5最大池化,再和原来的组合成新的特征。
- 自定义卷积操作: CBL模块。
4 颈部网络(Neck)
负责融合Backbone提取的特征,增强网络对目标的位置和大小信息的敏感性。,结构如下如下:
4.1 CSP2_x模块
CSP2_x也是基于CSPNet(Cross Stage Partial Network)设计的一种结构,作用和CSP1_x类似,结构图如下:
4.2 上采样
YOLOv5 默认采用的是 最近邻插值(Nearest neighbor interpolation) 作为其上采样方法,尝试其他类型的上采样方法,例如双线性插值(Bi-linear interpolation)、双立方插值(Bi-cubic interpolation)、三线性插值(Trilinear interpolation),甚至是转置卷积(Transposed Convolution, 也称为反卷积)。最近邻插值法效果如下图所示:
4.3 FPN(Feature Pyramid Networks)、PAN(Path Aggregation Network)
整个Neck网络采用了特征金字塔网络FPN和路径聚合网络PAN结构,实现了多尺度特征融合,效果步骤图如下:
- FPN 结构通过自顶向下进行上采样,使得底层特征图包含更强的图像强语义信息。
- PAN 结构自底向上进行下采样,使顶层特征包含图像位置信息。
- 两个特征最后进行融合,使不同尺寸的特征图都包含图像语义信息和图像特征信息,保证了对不同尺寸的图片的准确预测。
5 头部(Head)
负责对Neck输出的特征进行预测,包括目标的类别和边界框的位置,结构如下:
5.1 损失函数
损失函数由三部分组成:
- 分类损失(Classes loss): 采用BCE loss,只计算正样本的分类损失。
- OBJ置信度损失(ObJectness loss): 采用BCE loss,计算的是所有样本的obj损失。注意这里的OBJ指的是网络预测的目标边界框与GT Box的CIoU。
- 定位损失(Location loss): 采用CIoU loss,只计算正样本的定位损失。
L o s s = λ L c l s + λ L o b j + λ L l o c Loss = \lambda L_{cls} + \lambda L_{obj} + \lambda L_{loc} Loss=λLcls+λLobj+λLloc
可以看到会出三个预测特征层,针对不同的层,OBJ置信度损失采用不同的权重。
- 针对预测小目标的预测特征层采用的权重是4.0
- 针对预测中目标的预测特征层采用的权重是1.0
- 针对预测大目标的预测特征层采用的权重是0.4
5.3 匹配样本方式
- 根据GT Box与对应的Anchor Templates模板的高宽比例(0.25~4)进行匹配。
- 栅格左上角点距离GT中心点在( − 0.5 , 1.5 ) 范围,它们对应的Anchor都能回归到GT的位置,这样会让正样本的数量得到大量的扩充。