【Week Y9】yolo-v8网络结构的主要模块学习

文件路径:...\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 是宽度和高度的一半。

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包含 nBottleneck 模块)
  • 前向传播函数 forward:定义了数据通过层的传播方式。

    • 首先,输入 x 通过 cv1 卷积层,然后其输出被分割成两部分。分割后的两部分以及通过 Bottleneck 模块的输出被连接起来,然后通过 cv2 卷积层。
    • 使用chunk()方法来分割张良
  • 前向分割函数 forward_split:使用 split()方法 来分割张量
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值