第Y9周:重要模块解读

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊 | 接辅导、项目定制
  • 🚀 文章来源:K同学的学习圈子

目录

以con.py为例:

一、autopad 

 二、Conv

三、Focus

四、C2f


文件路径:\ultralytics-main\ultralytics\nn\modules\*

本篇文章仅仅介绍YOLOv8中涉及的主要模块,其他可以查看我之前YOLOV5的文章。

以con.py为例:

开头列举了该文件中定义的所有模型,如果你需要新加一个模块,记得在该文件开头这里将其名称加入。(这是YOLOv8新增的一个类似声明的内容)

# Ultralytics YOLO 🚀, AGPL-3.0 license
"""Convolution modules."""

import math

import numpy as np
import torch
import torch.nn as nn

__all__ = (
    "Conv",
    "Conv2",
    "LightConv",
    "DWConv",
    "DWConvTranspose2d",
    "ConvTranspose",
    "Focus",
    "GhostConv",
    "ChannelAttention",
    "SpatialAttention",
    "CBAM",
    "Concat",
    "RepConv",
)
  1. Conv:这是一个标准的卷积层,用于图像的特征提取。

  2. Conv2:这是一个扩展的卷积层。

  3. LightConv:这是一个轻量级的卷积层,旨在减少模型的计算量和参数数量。

  4. DWConv:深度可分离卷积(Depthwise Separable Convolution),它将标准卷积分解为深度卷积和点卷积,以减少参数和计算量。

  5. DWConvTranspose2d:深度可分离转置卷积,用于上采样操作,常用于生成高分辨率特征图。

  6. ConvTranspose:转置卷积(或反卷积),用于上采样和特征图的尺寸增加。

  7. Focus:这是一个特殊的模块,用于减少图像的分辨率同时增加其深度,有助于网络关注更细粒度的特征。

  8. GhostConv:Ghost卷积,一种高效的卷积方式,通过廉价操作生成更多的特征图。

  9. ChannelAttention:通道注意力机制,用于增强网络对重要通道的关注。

  10. SpatialAttention:空间注意力机制,用于增强网络对重要空间位置的关注。

  11. CBAM:结合通道注意力和空间注意力,共同增强网络对特征的关注。

  12. Concat:这是一个简单的连接模块,用于合并多个特征图。

一、autopad 

文件路径:\ultralytics-main\ultralytics\nn\modules\conv.py

def autopad(k, p=None, d=1):  # kernel, padding, dilation
    """Pad to 'same' shape outputs."""
    if d > 1:
        k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k]  # actual kernel-size
    if p is None:
        p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-pad
    return p

这段代码定义了一个名为 autopad 的函数,其目的是为了在卷积操作中实现 ‘same’ padding,即输入和输出具有相同的空间维度

这个函数接受三个参数:k(卷积核大小),p(可选的填充大小),和 d(膨胀率,默认为1)。下面是函数的详细解释:

  • k:卷积核的大小。它可以是单个整数,也可以是整数列表(对于不同维度的卷积核)。
  • p:填充大小。如果未提供,函数将自动计算。
  • d:膨胀率(dilation rate),默认为1。膨胀卷积是一种可以增大卷积核感受野的卷积方式,不影响参数数量。

autopad 函数在实现卷积神经网络时非常有用,特别是在需要保持特征图尺寸不变的情况下。通过自动计算填充大小,它简化了卷积层的实现过程。 

 二、Conv

文件路径:\ultralytics-main\ultralytics\nn\modules\conv.py

class Conv(nn.Module):
    """Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)."""

    default_act = nn.SiLU()  # default activation

    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):
        """Initialize Conv layer with given arguments including activation."""
        super().__init__()
        self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)
        self.bn = nn.BatchNorm2d(c2)
        self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()

    def forward(self, x):
        """Apply convolution, batch normalization and activation to input tensor."""
        return self.act(self.bn(self.conv(x)))

    def forward_fuse(self, x):
        """Perform transposed convolution of 2D data."""
        return self.act(self.conv(x))
  1. 类属性

    • default_act:这是一个类属性,定义了默认的激活函数,这里使用的是 SiLU 激活函数。
  2. 构造函数 __init__

    • 这个函数初始化卷积层。它接受多个参数:

      • c1:输入通道数。
      • c2:输出通道数。
      • k:卷积核大小,默认为1。
      • s:步长,默认为1。
      • p:填充大小。如果没有提供,将使用 autopad 函数自动计算。
      • g:groups参数,用于控制分组卷积,默认为1。
      • d:膨胀率,默认为1。
      • act:激活函数。如果为True,则使用默认的SiLU激活函数;如果是一个 nn.Module 实例,则使用该实例;否则不使用激活函数。
    • 在构造函数中,创建了 nn.Conv2dnn.BatchNorm2d 和激活函数实例。

  3. 前向传播函数 forward

    • 这个函数定义了数据通过层的传播方式。它首先应用卷积,然后是批量归一化,最后是激活函数。
  4. 前向融合函数 forward_fuse

    • 这个函数与 forward 类似,但不使用批量归一化。它直接在卷积操作后应用激活函数。这个函数可能在某些特定情况下使用,例如当模型需要融合某些层以优化性能时。

这个 Conv 类是一个构建块,常用于构建更复杂的卷积神经网络模型。通过将卷积、批量归一化和激活函数组合在一起,它简化了模型构建过程,并提高了代码的可读性和可维护性。

三、Focus

文件路径:\ultralytics-main\ultralytics\nn\modules\conv.py

 Focus模块是作者自己设计出来,为了减少浮点数和提高速度,而不是增加feature map的,本质就是将图像进行切片,类似于下采样取值,将原图像的宽高信息切分,聚合到channel通道中。

结构如下所示:

class Focus(nn.Module):
    """Focus wh information into c-space."""

    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):
        """Initializes Focus object with user defined channel, convolution, padding, group and activation values."""
        super().__init__()
        self.conv = Conv(c1 * 4, c2, k, s, p, g, act=act)
        # self.contract = Contract(gain=2)

    def forward(self, x):
        """
        Applies convolution to concatenated tensor and returns the output.

        Input shape is (b,c,w,h) and output shape is (b,4c,w/2,h/2).
        """
        return self.conv(torch.cat((x[..., ::2, ::2], x[..., 1::2, ::2], x[..., ::2, 1::2], x[..., 1::2, 1::2]), 1))
        # return self.conv(self.contract(x))

Focus类实现了一个特殊的操作,将宽度和高度信息“聚焦”到通道空间中,这通常用于减少图像的分辨率同时增加其深度。下面是对这个类的详细解释:

  1. 构造函数 __init__

    • 这个函数初始化 Focus 层。它接受多个参数,与 Conv 类似,包括输入和输出通道数、卷积核大小、步长、填充、分组等。
    • 在构造函数中,创建了一个 Conv 实例,其输入通道数是原始通道数的4倍。这是因为 Focus 层会将输入图像分割成四个部分并沿通道维度拼接。
  2. 前向传播函数 forward

    • 这个函数定义了数据通过层的传播方式。它首先将输入图像 x 沿宽度和高度维度分成四个部分,然后将这四个部分沿通道维度拼接。
    • 拼接后的张量随后被送入卷积层进行处理。
    • 输出张量的形状是 (b, 4c, w/2, h/2),其中 b 是批量大小,c 是原始通道数,w 和 h 是宽度和高度的一半。

这个 Focus 类是 YOLOv8 中的一个关键组件,它通过将图像分割成四个部分并沿通道维度拼接,有效地减少了图像的分辨率,同时增加了通道数。这种方法有助于网络关注更细粒度的特征,同时保持计算效率。

四、C2f

文件路径:\ultralytics-main\ultralytics\nn\modules\block.py

class C2f(nn.Module):
    """Faster Implementation of CSP Bottleneck with 2 convolutions."""

    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):
        """Initialize CSP bottleneck layer with two convolutions with arguments ch_in, ch_out, number, shortcut, groups,
        expansion.
        """
        super().__init__()
        self.c = int(c2 * e)  # hidden channels
        self.cv1 = Conv(c1, 2 * self.c, 1, 1)
        self.cv2 = Conv((2 + n) * self.c, c2, 1)  # optional act=FReLU(c2)
        self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n))

    def forward(self, x):
        """Forward pass through C2f layer."""
        y = list(self.cv1(x).chunk(2, 1))
        y.extend(m(y[-1]) for m in self.m)
        return self.cv2(torch.cat(y, 1))

    def forward_split(self, x):
        """Forward pass using split() instead of chunk()."""
        y = list(self.cv1(x).split((self.c, self.c), 1))
        y.extend(m(y[-1]) for m in self.m)
        return self.cv2(torch.cat(y, 1))

C2f 类是 CSP(Cross Stage Partial)瓶颈层的更快实现版本,包含两个卷积层。这个类继承自 PyTorch 的 nn.Module 类。下面是对这个类的详细解释:

  1. 构造函数 __init__

    • 这个函数初始化 C2f 层。它接受多个参数:

      • c1:输入通道数。
      • c2:输出通道数。
      • nBottleneck 模块的重复次数。
      • shortcut:是否使用捷径连接。
      • g:分组数。
      • e:膨胀系数,用于计算隐藏层通道数。
    • 在构造函数中,创建了两个卷积层 cv1 和 cv2,以及一个 nn.ModuleList,其中包含 n 个 Bottleneck 模块。

  2. 前向传播函数 forward

    • 这个函数定义了数据通过层的传播方式。首先,输入 x 通过 cv1 卷积层,然后其输出被分割成两部分。
    • 分割后的两部分以及通过 Bottleneck 模块的输出被连接起来,然后通过 cv2 卷积层。
  3. 前向分割函数 forward_split

    • 这个函数与 forward 类似,但使用 split() 而不是 chunk() 来分割张量。

C2f 层通过使用多个 Bottleneck 模块来提取特征,这些模块可以有效地减少计算量,同时保持或提高模型的性能。这种方法在深度学习中常用于构建高效的网络结构。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/590778.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【牛客网】值周

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 差分。 因为l<100000000,所以数组开1e8。 唯一需要注意的点就是前面给b[0]单独赋值为1&#xff08;因为如果在循环中给b[0]赋值&…

Linux PTP学习

前言 本文是对Linux PTP的学习记录&#xff0c;不足之处请指出。Linux PTP用于在Linux系统的精确时钟同步&#xff0c;支持IEEE 1588 Precision Time Protocol&#xff08;PTP&#xff09;标准&#xff0c;目的是实现在网络中&#xff0c;设备之间的高精度时间同步。它是一个工…

SSM整合-前后端分离-项目环境搭建 (上)

整合SSM 项目基础环境搭建项目介绍创建项目项目全局配置web.xmlSpringMVC配置配置Spring和MyBatis, 并完成整合创建表, 使用逆向工程生成Bean, XxxMapper和XxxMapper.xml注意事项和细节说明 实现功能01-搭建Vue前端工程需求分析/图解代码实现搭建Vue前端工程vue3项目目录结构梳…

Pytorch学习笔记——TensorBoard的初使用

1、TensorBoard介绍 TensorBoard是TensorFlow的可视化工具&#xff0c;但它也可以与PyTorch结合使用。TensorBoard提供了一个Web界面&#xff0c;可以展示你训练过程中的各种信息&#xff0c;如损失值、准确度、权重分布等&#xff0c;更好地帮助开发者理解和调试模型。 Tenso…

01 Activiti 7:步骤

01 Activiti 7&#xff1a;步骤 1. 整合Activiti2. 业务流程建模3. 部署业务流程4. 启动流程实例5. 查询待办任务6. 处理待办任务7. 结束流程 1. 整合Activiti 业务系统使用 Activiti 来对系统的业务流程进行自动化管理。为了方便业务系统访问&#xff08;操作&#xff09;Act…

看了这一篇,你不用再为找oracle安装介质发愁了!

写这篇文章的原因是&#xff1a;经常有49年还想要入国军学习Oracle的小伙伴问要不同版本的Oracle软件安装包&#xff08;说明一下&#xff0c;尊重版权&#xff0c;拒绝盗版&#xff0c;还是要从正规渠道获得介质&#xff09; 事实上很多人遇到过样的坑&#xff0c;才发现正规…

YH11047A 三串四串锂电保护板的3串使用问题 8254A电池芯片

网上的示例电路4串正确&#xff0c;但是3串错误 我使用3串接线时&#xff0c;pp-电压只有0.几v。即被保护 根据查询8254A的IC资料 发现3串和4串的电路图有明显区别&#xff1a; 1、3串的sel脚接vss&#xff08;低电势&#xff09;&#xff0c;4串的sel脚接vdd&#xff08;高电…

Python AI 速成课:快速打造高效AI

这个文章主要是对python AI 小白的 。实用性很强&#xff0c;不用太多复杂步骤。 第一步&#xff1a;先到Try NVIDIA NIM APIs这个网站 然后使用邮箱注册&#xff0c;很简单和快捷。 第二步&#xff1a;点击微软的phi-3模型&#xff0c;这个API是免费的 第三步&#xff1a; 获取…

00 Activiti 7:介绍

00 Activiti 7&#xff1a;介绍 1. 前言2. 介绍3. 官网4. 核心机制5. BPMN5.1. 核心要素5.1.1. 流程元素5.1.2. 连接元素5.1.3. 数据和消息5.1.4. 协作 1. 前言 工作流&#xff08;Workflow&#xff09;是一种管理和自动化业务过程的方法&#xff0c;它将一系列任务或活动按照…

117篇 | 3D Gaussian Splatting论文

本论文集划分为4个部分&#xff1a;综述&基础&#xff08;14篇&#xff09;、NeRF在AIGC&#xff08;54篇&#xff09;、NeRF在SLAM&#xff08;自动驾驶&#xff09;&#xff08;25篇&#xff09;、NeRF之场景建模&#xff08;25篇&#xff09; https://t.zsxq.com/3ATyE…

大气官网(1):家居家电,海量案例来袭。

设计一款大气的家居家电官网&#xff0c;可以考虑以下几个方面&#xff1a; 色彩选择&#xff1a;选择适合家居家电风格的色彩搭配。可以选择温暖的中性色调&#xff0c;如米白色、灰色和棕色&#xff0c;以增加页面的大气感和舒适感。图片展示&#xff1a;使用高质量的图片展…

京东JD商品SKU信息API返回值解析:精准掌握商品属性

在电子商务迅猛发展的今天&#xff0c;商家对于商品信息的掌握和管理显得尤为重要。作为电商平台的佼佼者&#xff0c;京东&#xff08;JD&#xff09;提供了丰富的API接口&#xff0c;使得商家能够轻松地获取商品的详细信息&#xff0c;包括SKU&#xff08;Stock Keeping Unit…

ESP32 烧录固件

第一步&#xff1a;下载固件 git clone --recursive https://github.com/espressif/esp-at.git 第二步&#xff1a;执行编译 在该目录执行 python build.py install 如图&#xff1a; 第三步&#xff1a;选择芯片 输入2 第四步&#xff1a;选择固件 输入1 第五步&#…

Excel中怎样把单元格里的数据拆分成多行?

时常会遇到这种情况&#xff0c;需要将一个单元格里的数据分拆到多行&#xff0c;可以使用公式&#xff0c;这里演示使用基础操作的办法。 按照excel使用经验&#xff0c;可以复制数据&#xff0c;粘贴到MS Word里&#xff0c;这个是excel的同族软件&#xff0c;兼容性好。 在…

window系统安装MySQL

MySQL的安装和配置 根据不同的系统平台&#xff0c;MySQL由不同安装方式和安装包。 官方下载对应的安装包 官网&#xff1a;www.mysql.com 下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) window系统 一、安装包&#xff08;Windows…

JavaScript 如何理解柯里化函数结构及调用

文章目录 柯里化函数是什么逐步理解柯里化函数 柯里化函数是什么 柯里化&#xff08;Currying&#xff09;函数&#xff0c;又称部分求值&#xff0c;是一种函数转换技术。这种技术将一个接受多个参数的函数转换为一系列接受单一参数的函数。具体来说&#xff0c;一个柯里化的…

【研发管理】产品经理知识体系-组合管理

导读&#xff1a;新产品开发的组合管理是一个重要的过程&#xff0c;它涉及到对一系列新产品开发项目进行策略性选择、优先级排序、资源分配和监控。这个过程旨在确保企业能够最大化地利用有限的资源&#xff0c;以实现其战略目标。 目录 1、组合管理、五大目标 2、组合管理的…

张大哥笔记:付费进群创业项目玩法及详细操作教程

今天给大家分享一个赚钱小项目&#xff0c;它就是付费进群系统&#xff0c;这个项目应用范围很广。比如表情包&#xff0c;知识付费&#xff0c;美女写真&#xff0c;虚拟资料&#xff0c;交友扩列等都可以。今天我们就来说一下最近爆火的交友搭子付费进群做个演示案例&#xf…

线性卷积和圆周卷积

文章目录 【 1. 线性卷积 】1.1 图解分析1.2 矩阵相乘实现线性卷积1.3 圆周卷积实现线性卷积1.4 实例:线性卷积的两种实现方法【 2. 圆周卷积 】2.1 图解分析2.2 矩阵相乘实现圆周卷积2.3 频域点乘实现圆周卷积2.4 实例:圆周卷积两种实现方法【 3. 线性卷积和圆周卷积的等价 …

题目:吃奶酪

问题描述&#xff1a; 解题思路&#xff1a; 枚举每种吃奶酪顺序&#xff0c;并计算其距离&#xff0c;选择最小的距离即答案。v数组&#xff1a;记录顺序。 注意点&#xff1a;1. 每次用于min的s需要重置为0。 2. 实数包括小数&#xff0c;所以结构体内x,y为double类型。 3. 第…