第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 mathimport 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-sizeif p is None:p = k // 2 if isinstance(k, int) else [x // 2 for x in k]  # auto-padreturn 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 activationdef __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 channelsself.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.mzph.cn/news/831503.shtml

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

相关文章

Golang | Leetcode Golang题解之第66题加一

题目&#xff1a; 题解&#xff1a; func plusOne(digits []int) []int {n : len(digits)for i : n - 1; i > 0; i-- {if digits[i] ! 9 {digits[i]for j : i 1; j < n; j {digits[j] 0}return digits}}// digits 中所有的元素均为 9digits make([]int, n1)digits[0]…

如何基于nginx组建多个子目录网站

华子目录 实验要求实验步骤 实验要求 组建多个子目录网站www.openlab.com&#xff0c;该网站有2个子目录www.openlab.com/sxhkt和www.openlab.com/zywww.openlab.com/sxhkt使用http读取www.openlab.com/zy使用https读取 实验步骤 准备工作 [rootserver ~]# setenforce 0[ro…

串口单线半双工转换电路

用来把单线半双工模式的串口转换成双线&#xff0c;然后才能连接到普通的双线USB 串口模块&#xff0c;比如CH340 之类的。电路设计来自大佬的博客&#xff1a;AVR half-duplex software UART supporting single pin operation。他在Arduino 上用软件模拟串口功能&#xff0c;利…

测试PG中事务隔离级别

我们知道事务隔离级别有&#xff1a;读未提交&#xff0c;读已提交&#xff0c;可重复读&#xff0c;可序列化。 读未提交 存在 脏读&#xff0c;不可重复读&#xff0c;幻读&#xff1b; 读已提交 存在 不可重复读&#xff0c;幻读 可重复读 存在 幻读 PG 下默认为读已提交…

微信小程序使用蓝牙连接硬件

目录 一、蓝牙官方api文档 二、蓝牙重要参数介绍 三、案例教程 1. 获取蓝牙权限&#xff08;openBluetoothAdapter&#xff09; 2. 开始搜索蓝牙设备(startBluetoothDevicesDiscovery) 3. 监听搜索到新设备的事件(onBluetoothDeviceFound) 4.连接蓝牙设备&#xff08;crea…

SpringData JPA - ORM 框架下,打造高效数据访问层

目录 一、SpringData JPA 概述 1.1、什么是 JPA 1.2、什么是 ORM 1.3、什么是 Hibernate 1.4、JPA 和 Hibernate 的关系 1.5、JPA 的优势 二、SpringData JPA 实战开发 2.1、依赖 2.2、配置文件 2.3、启动类 2.4、创建实体 2.5、基于 JpaRepository 的 CRUD 三、…

网络安全审计

一、什么叫网络安全审计 网络安全审计是按照一定的安全策略&#xff0c;利用记录、系统活动和用户活动等信息&#xff0c;检查、审查和检验操作时间的环境及活动&#xff0c;从而发现系统漏洞、入侵行为或改善系统性能的过程&#xff0c;它是提高系统安全性的重要手段。 系统…

数据结构:时间复杂度/空间复杂度

目录 一、时间复杂度 定义 常见的时间复杂度 如何计算时间复杂度 计算方法 三、实例分析 二、空间复杂度 定义 重要性 常见的空间复杂度 二、空间复杂度 定义 重要性 常见的空间复杂度 计算方法 三、实例分析 大O的渐进表示法 最好情况&#xff08;Best Case…

spring框架学习记录(1)

前半个月一直在应付期中考试&#xff0c;快被折磨似了orz 文章目录 SpringIoC(Inversion of Control) 控制反转与DI(Dependency Injection)依赖注入bean相关bean配置bean实例化bean的生命周期 依赖注入相关依赖注入方式依赖自动装配 容器创建容器获取bean Spring IoC(Inversi…

leetcode295. 数据流的中位数

class MedianFinder {//A为小根堆&#xff0c;B为大根堆List<Integer> A,B;public MedianFinder() {A new ArrayList<Integer>();B new ArrayList<Integer>();}public void addNum(int num) {int m A.size(),n B.size();if(m n){insert(B,num);int top …

BeanFactory 源码浅析

BeanFactory 功能介绍 BeanFactory 是核心容器&#xff0c;负责管理 Bean 对象 BeanFactory 接口的功能只有一个 getBean() 方法BeanFactory 的实现类&#xff08;DefaultListableBeanFactory&#xff09;包含&#xff1a;控制反转、基本的依赖注入、Bean 生命周期的各种功能…

从浏览器输入url到页面加载(八)你的web网站有几台服务器?

你有没有想过一个问题&#xff0c;做为一名前端开发&#xff0c;你的网站上线后&#xff0c;准备了几台服务器&#xff1f;前端静态资源用了几台&#xff0c;你调接口的那个后端部署了几台&#xff1f; 目录 1 没接触过这个问题很正常 2 当访问量上升的时候 2.1 提升带宽 …

绝了!这是我见过最详细的HashMap源码解析

1 概述 HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长. HashMap是非线程安全的,只适用于单线程环境,多线程环境可以采用并发包下的concurrentHashMap HashMap 实现了Serializable接口&#x…

ArmSoM-Sige5 RK3576开发板 正式发布!

简介​ ArmSoM-Sige5 采用Rockchip RK3576第二代8nm高性能AIOT平台&#xff0c;6 TOPS算力NPU&#xff0c;最大可配16GB大内存。支持8K视频编解码&#xff0c;拥有丰富的接口&#xff0c;支持双千兆网口&#xff0c;WiFi6 & BT5和多种视频输出。支持多种操作系统&#xff…

HTML5实用大全(Part.2)

引言&#xff1a; 哈喽&#xff0c;各位小伙伴们大家好呀&#xff0c;学习了上一篇关于HTML5的文章后&#xff0c;你是否对于入门HTML5有了一定的基础了呢&#xff0c;本篇博客我们将继续学习HTML5的不同标签&#xff0c;跟上队伍&#xff0c;准备出发咯&#xff01; 1.标签之…

2024五一杯数学建模竞赛A题完整成品论文和代码分析:建立钢板切割的工艺路径动态规划、贪心与分层优化模型

2024五一杯数学建模竞赛A题&#xff1a;建立钢板切割的工艺路径动态规划、贪心与分层优化模型 2024五一数学建模A题完整代码和成品论文获取↓↓↓↓↓ https://www.yuque.com/u42168770/qv6z0d/gyoz9ou5upvkv6nx?singleDoc# 本文文章较长&#xff0c;建议先目录。经过不懈的…

三星一季度利润飙涨932%!AI引爆存储热,未来研发狠砸AI

⏩三星一季度利润飙涨932%&#xff01;AI引爆存储热&#xff0c;未来研发狠砸AI 三星电子公布了第一季度财报数据&#xff0c;显示其利润飙涨932.8%。得益于AI拉动的广泛支出&#xff0c;三星电子一季度利润激增。三星表示&#xff0c;预计第二季度业务将主要由生成式人工智能…

算法学习系列(五十四):单源最短路的综合应用

目录 引言一、新年好二、通信线路三、道路与航线四、最优贸易 引言 关于这个单源最短路的综合应用&#xff0c;其实最短路问题最简单的就是模板了&#xff0c;这是一个基础&#xff0c;然后会与各种算法结合到一块&#xff0c;就是不再考察单个知识点了&#xff0c;而是各种知…

ASP.NET图书馆管理信息系统

摘  要 本文首先阐述了基于.NET Framework平台的图书馆管理信息系统的开发背景以及其实践意义&#xff0c;其次说明了图书馆管理信息系统的功能以及相比同类软件的创新之处。然后就图书馆管理系统开发中所使用的一些的技术进行研究探讨。主要针对数据库的设计技术、存储过程…

Copilot Venture Studio創始合伙人楊林苑確認出席“邊緣智能2024 - AI開發者峰會”

隨著AI技術的迅猛發展&#xff0c;全球正逐步進入邊緣計算智能化與分布式AI深度融合的新時代&#xff0c;共同書寫著分布式智能創新應用的壯麗篇章。邊緣智能&#xff0c;作為融合邊緣計算和智能技術的新興領域&#xff0c;正逐漸成為推動AI發展的關鍵力量。借助分布式和去中心…