第Y9周:重要模块解读

news2024/11/27 12:24:43
  • 🍨 本文为🔗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 模块来提取特征,这些模块可以有效地减少计算量,同时保持或提高模型的性能。这种方法在深度学习中常用于构建高效的网络结构。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门系列-基于范围的for循环(C++11)和指针空值nullptr(C++11)

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 基于范围的for循环 范围for的语法 在C98中如果要遍历一个数组,可以按照以下方式进行: void TestFor() {int array[] { 1,2,3,4,5 };for (int i 1; i …

nuxt3使用记录六:禁用莫名其妙的Tailwind CSS(html文件大大减小)

发现这个问题是因为,今天我突然很好奇,我发现之前构建的自动产生的200.html和404.html足足290k,怎么这么大呢?不是很占用我带宽? 一个啥东西都没有的静态页面,凭啥这么大!所以我就想着手动把他…

JavaEE 初阶篇-深入了解 Junit 单元测试框架和 Java 中的反射机制(使用反射做一个简易版框架)

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 Junit 单元测试框架概述 1.1 使用 Junit 框架进行测试业务代码 1.2 Junit 单元测试框架的常用注解(Junit 4.xxx 版本) 2.0 反射概述 2.1 获…

20240502解决ARM32编译器编译quectel-CM时for循环出错的解决

20240502解决ARM32编译器编译quectel-CM时for循环出错的解决 2024/5/2 17:17 缘起:QMIThread.c:2100:9: error: ‘for’ loop initial declarations are only allowed in C99 or C11 mode 1、修改Makefile为ARM32架构: Z:\quectel-CM\Makefile ifneq ($…

VFS 虚拟文件系统(上)

目录 概念 通用文件模型 VFS所处理的系统调用 VFS的数据结构 超级块对象 索引节点对象(inode) 文件对象 目录项对象 目录项高速缓存 与进程相关的文件 文件系统类型 特殊文件系统 文件系统类型注册 文件系统处理 命名空间 概念 虚拟文件系…

LabVIEW换智能仿真三相电能表研制

LabVIEW换智能仿真三相电能表研制 在当前电力工业飞速发展的背景下,确保电能计量的准确性与公正性变得尤为重要。本文提出了一种基于LabVIEW和单片机技术,具有灵活状态切换功能的智能仿真三相电能表,旨在通过技术创新提高电能计量人员的培训…

微信服装分销配送商城小程序的效果是什么

无论服装经销商还是厂家主要思考的就是怎样获客转化销售,衣服款式多样化、线下门店和线上电商平台各品牌竞争愈加激烈,客户消费渠道广,促进着商家需要寻找更多机会以及怎样服务好流量。 私域运营模式中小程序是重要的工具之一,服…

excel办公系列-图表元素及其作用

Excel图表元素及其作用 Excel图表由各种元素组成,每个元素都有其特定的作用,可以帮助我们更清晰地传达数据信息。下面将介绍Excel图表中常见的一些元素及其作用,并附上相关截图。 原始数据 月份 网站访问量 (万次) 销售额 (万…

机器学习:深入解析SVM的核心概念【二、对偶问题】

对偶问题 **问题一:什么叫做凸二次优化问题?而且为什么符合凸二次优化问题?**为什么约束条件也是凸的半空间(Half-Space)凸集(Convex Set)半空间是凸集的例子SVM 约束定义的半空间总结 **问题二…

PDF中伪代码、原理示意图等导出为矢量图

需求:将 LaTeX 中生成的伪代码 PDF 转换成 svg 或 emf 格式的矢量图,然后插入 word 或 ppt 中。 1 伪代码PDF导出为矢量图 1.1 通过 Adobe Illustrator 处理将 先新建一个空白的PDF,然后文件-->置入导入PDF; 2.选中这个图片…

基于Springboot的交流互动系统

基于SpringbootVue的交流互动系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 帖子信息 聚会信息 后台登录 后台管理首页 用户管理 帖子分类管理 帖子信息…

C语言例题29:在屏幕上显示一个等腰三角形

#include <stdio.h>void main() {int i, j;int x;printf("输入等腰三角形行数&#xff1a;");scanf("%d", &x);for (i 1; i < x; i) {for (j i; j < x; j) {printf(" "); //输出空格占位}for (j 1; j < 2 * i; j) {printf…

HTTP协议Request

文章目录 HTTP协议介绍概念版本分类特点 浏览器抓包观察请求报文协议步骤实现 Request和Response概述Request对象Request继承体系Request获取请求数据获取请求行数据获取请求头数据获取请求体数据获取请求参数(通用方式) 解决post请求乱码问题解决思路解决方案 Request请求转发…

【20-时间序列预测:使用Scikit-learn处理时间数据】

文章目录 前言理解时间序列数据处理时间数据数据格式与解析时间组件提取时间序列可视化构建时间序列预测模型数据集分割特征工程选择模型验证与评估评价指标选择结论前言 时间序列预测在金融、天气预报和销售分析等领域中扮演着重要角色。在本文中,我们将探讨如何使用Scikit-l…

Linux快速安装Nginx和重新添加模块

目录 一、Nginx快速安装1、下载Nginx2、配置Nginx模块 二、Ngnix重新编译和安装模块 一、Nginx快速安装 1、下载Nginx 直接进入Nginx官网下载Linux最新稳定版本&#xff0c;我之前下载的版本是1.23.0。 2、配置Nginx模块 下载完后我把源码压缩文件解压放在/opt/appl/nginx…

ICode国际青少年编程竞赛- Python-1级训练场-for循环入门

ICode国际青少年编程竞赛- Python-1级训练场-for循环入门 1、 for i in range(4):Dev.step(4)Dev.turnLeft()2、 for i in range(3):Dev.step(6)Dev.turnRight()3、 for i in range(3):Dev.turnRight()Dev.step(2)Dev.turnLeft()Dev.step(-3)4、 for i in range(4):Dev…

DNS、ICMP、NAT以及代理服务器

目录 1. DNS 1.1. DNS 背景 1.2. 域名简介 1.3. 域名解析过程 2. ICMP 2.1. ICMP 的功能 2.2. ICMP 的报文格式 2.3. ping 命令 2.4. traceroute 命令 3. NAT和代理服务器 3.1. NAT 技术 3.2. NAT IP转换过程 3.3. NAT 技术的缺陷 3.4. 代理服务器 3.4.1. 正向…

【redis】Redis数据类型(四)Set类型

目录 Set类型介绍使用场景 Set类型数据结构set的单个元素的添加过程IntSet哈希表内存结构 常用命令SADD示例 SREM示例 SMEMBERS示例 SISMEMBER示例 SCARD示例 SMOVE示例 SPOP示例 SRANDMEMBER示例 SINTER示例 SINTERSTORE示例 SUNION示例 SUNIONSTORE示例 SDIFF示例 SDIFFSTORE…

【每日算法】理论:大模型相关 刷题:队列的应用

上期文章 【每日算法】理论&#xff1a;多模态系列 刷题&#xff1a;栈的应用 文章目录 上期文章一、上期问题二、本期理论问题1、GPT1&#xff0c;2&#xff0c;3的区别2、解决过拟合的方法3、LLM的生成原理4、对比LSTM,GRU,transformer5、zero-shot6、pre-norm和post-norm的…

vscode远程免密ssh原理与实操方法

什么是SSH SSH是一种加密协议&#xff0c;全称为Secure Shell&#xff0c;用于安全地远程登录到服务器或其他远程设备上执行命令或传输文件。它提供了一种安全的加密通信机制&#xff0c;使得远程登录和文件传输等操作不会被恶意攻击者窃取或篡改&#xff0c;确保了数据的保密…