文章目录
- 一、`...\ultralytics-main\ultralytics\nn\modules\conv.py`:
- (1)`__all__`说明:
- (2)`autopad()`说明:
- (3)`conv()`说明:
- (4)`Focus()`说明:
- 二、`...\ultralytics-main\ultralytics\nn\modules\block.py`:
- (1)`C2f()`说明:
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊 | 接辅导、项目定制
文件路径:
...\ultralytics-main\ultralytics\nn\modules\***.py
一、...\ultralytics-main\ultralytics\nn\modules\conv.py
:
(1)__all__
说明:
(2)autopad()
说明:
这段代码定义了一个名为 autopad 的函数
-
功能:
- 在卷积操作中实现 ‘same’ 填充,使输入和输出具有相同的空间维度
-
参数说明:
- k:卷积核的大小。可以是单个整数,也可以是整数列表(对于不同维度的卷积核)。
- p:填充大小。如果未提供,函数将自动计算。
- d:膨胀率(dilation rate),默认为1。膨胀卷积是一种可以增大卷积核感受野的卷积方式,不影响参数数量。
autopad 函数在实现卷积神经网络时非常有用,特别是在需要保持特征图尺寸不变的情况下。通过自动计算填充大小,它简化了卷积层的实现过程。
(3)conv()
说明:
这段代码定义了一个名为 conv的函数,继承自nn.Module
,通过参数(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)
来定义卷积层的行为。
通过将卷积(nn.Conv2d
)、批量归一化(nn.BatchNorm2d
)和激活函数(default_act
,默认是nn.SiLU()
)组合在一起,简化了模型构建过程,并提高了代码的可读性和可维护性。
-
类属性
default_act
:定义了默认的激活函数,这里使用的是 SiLU 激活函数。 -
构造函数
__init__
:初始化卷积层,接受多个参数:- c1:输入通道数。
- c2:输出通道数。
- k:卷积核大小,默认为1。
- s:步长,默认为1。
- p:填充大小。如果没有提供,将使用 autopad 函数自动计算。
- g:groups参数,用于控制分组卷积,默认为1。
- d:膨胀率,默认为1。
- act:激活函数。如果为True,则使用默认的SiLU激活函数;如果是一个 nn.Module 实例,则使用该实例;否则不使用激活函数。
在构造函数中,创建了 nn.Conv2d、nn.BatchNorm2d 和激活函数实例。
-
前向传播函数
forward
:定义了数据通过层的传播方式。它首先应用卷积,然后是批量归一化,最后是激活函数。 -
前向融合函数
forward_fuse
:与 forward 类似,但没有使用批量归一化,用于执行卷积转置操作。它直接在卷积操作后应用激活函数。这个函数可能在某些特定情况下使用,例如当模型需要融合某些层以优化性能时。
(4)Focus()
说明:
Focus模块结构如下所示:
Focus类实现了一个特殊的操作,将宽度和高度信息“聚焦”到通道空间中,这通常用于减少图像的分辨率同时增加其深度。下面是对这个类的详细解释:
- 构造函数 init:
- 初始化 Focus 层。它接受多个参数,与 Conv 类似,包括输入和输出通道数、卷积核大小、步长、填充、分组等。
- 在构造函数中,创建了一个 Conv 实例,其输入通道数是原始通道数的4倍。这是因为 Focus 层会将输入图像分割成四个部分并沿通道维度拼接。
- 前向传播函数 forward:
- 定义了数据通过层的传播方式。首先将输入图像 x 沿宽度和高度维度切分成四个部分,然后将这四个部分沿通道维度拼接。拼接后的张量随后被送入卷积层进行处理。
输出张量的形状是 (b, 4c, w/2, h/2),其中 b 是批量大小,c 是原始通道数,w 和 h 是宽度和高度的一半。
- 定义了数据通过层的传播方式。首先将输入图像 x 沿宽度和高度维度切分成四个部分,然后将这四个部分沿通道维度拼接。拼接后的张量随后被送入卷积层进行处理。
Focus 类是 YOLOv8 中的一个关键组件,它通过将图像分割成四个部分并沿通道维度拼接,有效地减少了图像的分辨率,同时增加了通道数。这种方法有助于网络关注更细粒度的特征,同时保持计算效率。
二、...\ultralytics-main\ultralytics\nn\modules\block.py
:
(1)C2f()
说明:
C2f层:快速实现带有2个卷积的CSP Bottleneck
-
初始化函数:def init(self, c1, c2, n=1, shortcut=False, g=1, e=0.5)
c1
:输入通道c2
:输出通道n
:Bottleneck的重复次数shortcut
:是否使用捷径连接g
:分组数e
:膨胀系数,用于计算隐藏层通道数- 创建了两个卷积层
cv1
和cv2
,以及一个nn.ModuleList
(nn.ModuleList
包含n
个Bottleneck
模块)
-
前向传播函数 forward:定义了数据通过层的传播方式。
- 首先,输入 x 通过 cv1 卷积层,然后其输出被分割成两部分。分割后的两部分以及通过 Bottleneck 模块的输出被连接起来,然后通过 cv2 卷积层。
- 使用
chunk()
方法来分割张良
-
前向分割函数 forward_split:使用
split()
方法 来分割张量