Yolov8网络结构
Yolov8网络结构
小游Yolov8网络结构
网络结构
这个是没有区分neck和head的网络结构
yolov8的模型
- n:最小的模型,最快的推理,但最低的准确性
- S:型号小,速度和精度平衡好
- M:中等模型,比推理速度适中的小型模型精度更高
- L:模型大,准确率最高但推理速度最慢
- XL:超大模型,资源密集型应用的最佳精度
Backbone
Backbone部分负责特征提取,采用了一系列卷积和反卷积层,同时使用了残差连接和瓶颈结构来减小网络的大小并提高性能。
该部分采用了C2f模块作为基本构成单元,与YOLOv5日的C3模块相比,C2f模块具有更少的参数量和更优秀的特征提取能力。
具体来说,C2f模块通过更有效的结构设计,减少了冗余参数,提高了计算效率。此外,Backbone部分还包括一些常见的改进技术,如深度可分离卷积(Depthwise Separable Convolution)和膨胀卷积(Dilated Convolution),以进一步增强特征提取的能力。
Neck
Neck部分负责多尺度特征融合,通过将来自Backbone不同阶段的特征图进行融合,增强特征表示能力。具体来说,YOLOv8的Neck部分包括以下组件:
- SPPF模块(Spatial Pyramid Pooling Fast):用于不同尺度的池化操作,将不同尺度的特征图拼接在一起,提高对不同尺寸目标的检测能力。
- PAA模块(Probabilistic Anchor Assignment):用于智能地分配锚框,以优化正负样本的选择,提高模型的训练效果。
- PAN模块(Path Aggregation Network):包括两个PAN模块,用于不同层次特征的路径聚合,通过自底向上和自顶向下的路径增强特征图的表达能力。
Head
Head部分负责最终的目标检测和分类任务,包括一个检测头和一个分类头:
- 检测头:包含一系列卷积层和反卷积层,用于生成检测结果。这些层负责预测每个锚框的边界框回归值和目标存在的置信度。
- 分类头:采用全局平均池化(GlobalAverage Pooling)对每个特征图进行分类,通过减少特征图的维度,输出每个类别的概率分布。分类头的设计使得YOLOv8能够有效地处理多类别分类任秀
其他优化
- Anchor-free机制:减少了锚框的超参数设置,通过直接预测目标的中心点来简化训练过程,
- 自适应NMS(Non-Maximum Suppression):改进了传统的NMS算法,通过自适应调整阈值,减少误检和漏检,提高检测精度。
- 自动混合精度训练(Automatic Mixed Precision Training):通过在训练过程中动态调整计算精度,加快训练速度,同时减少显存占用。
YOLOv8架构中使用的模块
卷积块(Conv Block)
Conv2d层
卷积是一种数学运算,涉及将一个小矩阵(称为核或滤波器)滑动到输入数据上,执行元素级的乘法,并将结果求和以生成特征图。“2D”在Conv2d中表示卷积应用于两个空间维度,通常是高度和宽度。
- k (kernel数量):滤波器或核的数量,代表输出体积的深度,每个滤波器负责检测输入中的不同特征。
- s (stride步幅):步幅,指滤波器/核在输入上滑动的步长。较大的步幅会减少输出体积的空间维度。
- p (padding填充):填充,指在输入的每一侧添加的额外零边框,有助于保持空间信息,并可用于控制输出体积的空间维度。
- c (channels输入通道数)输入的通道数。例如,对于RGB图像,c为3(每个颜色:红色、绿色和蓝色各一个通道)。
BatchNorm2d层
批归一化(BatchNorm2d)是一种在深度神经网络中使用的技术,用于提高训练稳定性和收敛速度。
在卷积神经网络口(CNN)中,BatchNorm2d层特定地对2D输入进行批归一化,通常是卷积层的输出。
它通过在每个小批次的数据中标准化特征,使每个特征在小批次中的均值接近0、方差接近1,确保通过网络的数据不会太大或太小,这有助于防止训练过程中出现的问题,
SiLU激活函数
SiLU(Sigmoid Linear Unit)激活函数,也称为Swish激活函数,是神经网络中使用的激活函数SiLU激活函数定义如下:
SiLU(x)= x·σ(x)]
其中,σ(x)是Sigmoid函数,定义为:
SiLU的关键特性是它允许平滑的梯度,这在神经网络训练过程中是有益的。平滑的梯度可以帮助避免如梯度消失等问题,这些问题会阻碍深度神经网络的学习过程
瓶颈块(Bottleneck Block)
在深度神经网络,尤其是残差网络(ResNet)中,Bottleneck Block(瓶颈块)是一种常用的模块设计。Botleneck Block旨在通过引入瓶颈结构,减少计算复杂度和参数数量,同时保留模型的性能。以下是Bottleneck Block的详细介绍。
Bottleneck Block 的典型结构
Bottleneck Block 典型地由三个卷积层(Conv2d)组成:
- 第一个 1x1 卷积层:用于减少通道数(压缩瓶颈)
- 第二个 3x3 卷积层:用于在减少后的通道数上进行卷积操作。
- 第三个 1x1 卷积层:用于恢复通道数(扩展瓶颈)
这些卷积层之间通常会插入 BatchNorm 和激活函数。一个 Bottleneck Block 还包括一个恒等映射(ldentity Mapping)或一个卷积映射(Convolutional Mapping),用于实现残差连接。
残差连接使得输入可以绕过中间卷积层,直接加到输出上,从而减轻梯度消失的问题。
以下是 Bottleneck Block 的主要特点:
- 降维和升维:通过 1x1 卷积实现通道数的压缩和扩展,降低计算复杂度。
- 残差连接:通过残差连接保留输入信息,有助于缓解梯度消失问题,提高网络的训练效果。
- 高效计算:通过减少中间层的通道数,在保证性能的同时减少计算量和参数数量。
Yolov8中的Bottleneck Block
YOLOv8瓶颈块结构说明
- 卷积层1(Conv 1):首先输入通过一个卷积层,通常卷积核大小为(1 x 1),用于减少特征图的通道数。
- 卷积层 2(Conv 2):紧接着输入通过一个卷积层,通常卷积核大小为(3 x3),用于提取特征并增加感受野。
- 跳跃连接(Skip Connection):在卷积层之间加入跳跃连接,将输入直接连接到输出。这种连接方式可以缓解梯度消失问题,帮助网络更好地学习。
- 拼接(Concatenate):最后,将跳跃连接后的输出与卷积层的输出进行拼接,形成最终输出。
YOLOv8 的瓶颈块通过减少参数、增加网络深度和缓解梯度消失问题,显著提高了模型的性能和训练效果。该结构在保持计算效率的同时,增强了特征提取的能力,使得 YOLOv8 在目标检测任务中表现出色。
C2f 模块
结构概述
- C2f块:首先由一个卷积块(Conv)组成,该卷积块接收输入特征图并生成中间特征图
- 特征图拆分:生成的中间特征图被拆分成两部分,一部分直接传递到最终的Concat块,另一部分传递到多个Bottleneck块进行进一步处理。
- Bottleneck块:输入到这些Bottleneck块的特征图通过一系列的卷积、归一化和激活操作进行处理,最后生成的特征图会与直接传递的那部分特征图在Concat块进行拼接(Concat)。
- 模型深度控制:在C2f模块中,Botleneck模块的数量由模型的depth multiple参数定义,这意味着可以根据需求灵活调整模块的深度和计算复杂度。
- 最终卷积块:拼接后的特征图会输入到一个最终的卷积块进行进一步处理,生成最终的输出特征图。
模块功能
- 特征提取:通过初始的卷积块提取输入图像的基本特征。
- 特征增强:通过多个Bottleneck块进一步提炼和增强特征,这些Bottleneck块可以捕捉更复杂的式和细节,
- 特征融合:通过Concat块将直接传递的特征图和处理后的特征图进行融合,使得模型可以综合用多尺度、多层次的信息。
- 输出生成:通过最后的卷积块生成最终的特征图,为后续的检测和分类任务提供丰富的特征表示。
空间金字塔池化快速(SPPF)模块
SPPF(SpatialPyramid Pooling-Fast)块是为了高效地捕捉多尺度信息而设计的,它利用简化版的空间金字塔池化。这个块允许网络处理不同尺度的特征,这在目标检测任务中特别有用,因为目标在图像中可能以不同的大小出现。
SPPF块的结构
初始卷积块
- 输入特征图首先通过一个卷积块处理。卷积核大小为1x1,输出通道数与输入特征图相同。这个卷积层的作用是减少计算量,同时提取初步特征。
- 组件:
- 卷积层(Conv2d)
- 批归一化(BatchNorm2d)
- 激活函数(通常是SiLU或ReLU)
MaxPool2d层
池化层用于下采样输入体积的空间维度,减少网络的计算复杂度并提取主要特征。最大池化是一种特定的池化操作,对于输入张量的每个区域,仅保留最大值,其他值则被丢弃。
在MaxPool2d的情况下,池化在输入张量的高度和宽度维度上进行。该层通过指定池化核的大小和步幅来定义。核大小决定每个池化区域的空间范围,步幅则决定连续池化区域之间的步长。
- 初始卷积块的输出特征图经过三个MaxPool2d层。
- 每个MaxPool2d层使用特定的卷积核大小和步幅对特征图进行池化,下采样特征图。
- 这些层通过在特征图的不同区域上进行池化来捕捉不同尺度的信息。
池化:减少特征,更利于机器学习,就相当于把土坯那压缩了一下,分辨率降低。
池化操作最初是用来减小数据大小,使模型更容易训练,这个过程即为下采样(downsampling),这里可以称为下池化。随着之后的发展,池化也可以增加数据大小,此时的池化操作为上采样(upsmapling)或上池化。
拼接
- 三个MaxPool2d层的输出特征图在通道维度上拼接
- 这个操作将多尺度特征结合到一个特征图中,丰富了特征表示。
最终卷积块
拼接后的特征图再经过一个卷积层,卷积核大小为1x1,输出通道数与初始输入特征图相同。这个卷积层的作用是融合不同尺度的特征,生成最终的输出特征图。
- 组件:
- 卷积层(Conv2d)
- 批归一化(BatchNorm2d)
- 激活函数(通常是SiLU或ReLU)
- 组件:
检测块(Detect Block)
检测块负责检测物体。与之前版本的YOLO不同,YOLOv8是一个无锚点模型,这意味着它直接预测物体的中心,而不是从已知的锚点框的偏移量进行预测。无锚点检测减少了框预测的数量,加快了推理后筛选候选检测结果的复杂后处理步骤。
检测块包含两个轨道。第一轨道用于边界框预测,第二轨道用于类别预测。这两个轨道都包含两个卷积块,随后是一个单独的Conv2d层,分别给出边界框损失和类别损失。
无锚点指的是模型在目标检测或相关任务中不需要预先设定的锚框(anchor boxes)。锚框是一种在目标检测中常用的策略,用于在图像或空间中的特定位置预设不同大小和形状的框,以预测目标可能存在的区域。而“无锚点”则表示该模型不依赖这种预设的锚框来进行预测,而是直接通过模型学习来预测目标的位置和形状。
检测块的结构
- 输入特征图:
输入特征图来自之前网络层的输出, - 两个卷积块(每个轨道)
- 每个卷积块包含以下组件:
- 卷积层(Conv2d)
- 批归一化(BatchNorm2d)
- 激活函数(通常是SiLU或ReLU)
- 每个卷积块包含以下组件:
- 单独的Conv2d层(每个轨道):
- 用于边界框预测的轨道输出一个Conv2d层,得到边界框损失。
- 用于类别预测的轨道输出一个Conv2d层,得到类别损失。
Backbone
由最上面的YOLOv8网络结构图我们可以看出在其中的Backbone部分,由5个卷积模块和4个C2f模块和一个SPPF模块组成
yolo代码
backbone: |
Neck
Neck使用多尺度特征融合,将 backbone 不同阶段的特征图融合增强特征表现能力。 YOLOv8 的Neck包括 SPFF,一个 PAA module和两个 PAN module
PAN-FPN结构
YOLOv8 中引入了 PAN-FPN (Path Aggregation Network-Feature Pyramid Network)作为其特征金字塔网络,进一步增强了多尺度特征的表示能力。
对比YOLOV5与YOLOv8,YOLOv8将YOLOv5中PAN-FPN上采样阶段中的卷积结构删除了,同时也将C3模块替换为了C2f模块
特征金字塔网络(FPN)
在 YOLOv8 中,FPN 主要负责构建从低层到高层的多尺度特征图。其主要过程如下:
自顶向下路径
- 从深层特征开始,逐层向上采样。
- 每一层的上采样特征与相应的低层特征进行融合,以补充空间信息和增强语义信息。
横向连接
利用1x1卷积调整通道数,使得上采样特征与低层特征的通道数一致。睿
通过逐层相加的方式进行特征融合。
这个金字塔分层不是说把图片越分越小,而是说把照片分为了几个部分。我觉得更像三明治结构哈哈哈
路径聚合网络(PAN)
PAN 是在 FPN 的基础上,进一步增强特征金字塔网络的结构,具体过程如下:
自底向上的路径
- 从底层特征开始,逐层向上传递特征。
- 每一层的特征图通过自底向上的路径,与高层特征图进行融合
特征融合
在每一层,将自顶向下路径和自底向上路径的特征进行融合,确保每一层的特征都包含不同尺度的信息。
这个当时讨论的时候,是说将金字塔分层的那几个又融合到了一起,只不过除了机器觉得重要的部分,都是模糊的。
小疑惑点
为什么下采样之后的数据要和之前的数据进行融合?
下采样之后,数据的特征会变少,而且可能会发现以前没有的特征,所以要将两者融合,找到更好的特征
池化和卷积的区别?
卷积是说将特征融合,而池化只是找出最大值。
所以卷积之后的图片会发生颜色等方面的变化,而池化只是将图片变模糊