YOLO组件之C2f模块介绍

        C2F类是yolo算法中的组件之一,该类是一个继承自 nn.Module 的神经网络模块。

1. C2f 类的前向传播过程

        首先将输入数据经过第一个卷积层 cv1,然后将输出分为两个部分。其中一个部分直接传递给输出,另一个部分经过多个 Bottleneck 模块的处理。最后,两个部分的结果在通道维度上进行拼接,并经过第二个卷积层 cv2 得到最终的输出。

        结构如下:

2. C2f模块的作用

                特征转换:C2f模块通过两个卷积层(cv1和cv2)对输入数据进行特征转换。cv1卷积层将输入数据的通道数从c1变换为2 * self.c,cv2卷积层将经过一系列操作后的特征图的通道数从(2 + n) * self.c变换为c2。这些卷积操作有助于提取输入数据中的不同层次和抽象程度的特征。

                分支处理:C2f模块将输入数据分为两个分支进行处理。其中一个分支直接传递给输出,另一个分支经过多个Bottleneck模块的处理。这样的分支设计有助于增加网络的非线性能力和表示能力,从而提高网络对复杂数据的建模能力。

                特征融合:C2f模块通过在通道维度上对不同分支的特征进行拼接,实现特征融合。拼接后的特征将包含来自不同分支的信息,丰富了特征的表达能力。

  3. yolov8中代码实现

class C2f(nn.Module):
    """CSP Bottleneck with 2 convolutions."""
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):  # 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))

代码解析:

        a. __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):初始化函数,用于定义和初始化类的属性和子模块。

                c1:输入通道数。

                c2:输出通道数。

                n:Bottleneck 模块的数量。

                shortcut:是否使用残差连接(shortcut)。

                g:分组卷积中的组数。

                e:扩展因子,用于计算隐藏通道数。

        self.c = int(c2 * e):计算隐藏通道数。

        self.cv1 = Conv(c1, 2 * self.c, 1, 1):定义第一个卷积层 cv1,输入通道数为 c1,输出通道数为 2 * self.c,卷积核大小为 1x1,步长为 1。

        self.cv2 = Conv((2 + n) * self.c, c2, 1):定义第二个卷积层 cv2,输入通道数为 (2 + n) * self.c,输出通道数为 c2,卷积核大小为 1x1。

        self.m = nn.ModuleList(Bottleneck(self.c, self.c, shortcut, g, k=((3, 3), (3, 3)), e=1.0) for _ in range(n)):创建一个包含 n 个 Bottleneck 模块的 nn.ModuleList 对象,并将其赋值给属性 self.m。每个 Bottleneck 模块的输入通道数和输出通道数都为 self.c,使用的卷积核大小为 ((3, 3), (3, 3)),扩展因子为 1.0。

        b. forward(self, x):前向传播函数,定义了数据在网络中的正向流动。

                x:输入数据。

        y = list(self.cv1(x).chunk(2, 1)):将输入数据 x 经过 cv1 卷积层后的结果进行分割成两个张量,并存储在列表 y 中。

        y.extend(m(y[-1]) for m in self.m):将列表 y 的最后一个张量作为输入,依次经过 self.m 中的每个 Bottleneck 模块,并将结果添加到列表 y 中。

        return self.cv2(torch.cat(y, 1)):将列表 y 中的张量在维度 1 上进行拼接,并将拼接后的结果经过 cv2 卷积层得到最终的输出。

        c. forward_split(self, x):前向传播函数的另一种实现方式,它与 forward 函数的区别在于使用了 split() 方法代替了 chunk() 方法。

        y = list(self.cv1(x).split((self.c, self.c), 1)):将输入数据 x 经过 cv1 卷积层后的结果按照指定大小进行切割,并存储在列表 y 中。

        y.extend(m(y[-1]) for m in self.m):将列表 y 的最后一个张量作为输入,依次经过 self.m 中的每个 Bottleneck 模块,并将结果添加到列表 y 中。

        return self.cv2(torch.cat(y, 1)):将列表 y 中的张量在维度 1 上进行拼接,并将拼接后的结果经过 cv2 卷积层得到最终的输出。

4. 总结

        综上,C2f模块在CSP Bottleneck结构中起到关键的作用,通过特征转换、分支处理和特征融合等操作,提取和转换输入数据的特征,生成更具表征能力的输出。这有助于提高网络的性能和表示能力,使得网络能够更好地适应复杂的数据任务。

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

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

相关文章

Xinstall助力推广结算统计,让数据一目了然

在当今数字化营销的时代,推广活动的成功与否往往取决于精准的数据统计和分析。然而,对于许多广告主和开发者来说,推广结算统计却是一个令人头疼的问题。数据分散、渠道繁多、统计口径不一,这些问题都给推广效果的衡量带来了极大的…

Unity图文混排EmojiText的使用方式和注意事项

​​​​​​​ 效果演示: 使用方式: 1、导入表情 2、设置图片格式 3、生成表情图集 4、创建/修改目标材质球 5、测试 修复换行问题 修复前: 修复后: 修复代码: 组件扩展 1、右键扩展 2、组件归类&#…

LINUX 入门 4

LINUX 入门 4 day6 7 20240429 20240504 耗时:240min 课程链接地址 第4章 LINUX环境编程——实现线程池 C基础 第3节 #define里面的行不能乱空行,要换行就打\ typedef 是 C 和 C 中的一个关键字,用于为已有的数据类型定义一个新的名字。…

新书速览|图神经网络基础、模型与应用实战

掌握PyTorch图神经网络基础与模型,实战自然语言处理、计算机视觉、推荐系统、社交网络应用开发 01 本书内容 图神经网络不仅能够解决传统机器学习方法无法解决的图数据问题,而且能够应用于许多实际场景,例如社交网络、药物发现、网络安全、…

新手向的s2-046漏洞复现

一、前期准备 1.docker容器 作为第一次接触struts2漏洞类型的小白,第一步从搭建环境开始。首先我们需要准备一个服务器或者本地系统,我这里是使用本地的kali,kali里面需要有docker容器,docker容器的安装教程请自行搜索&#xff0c…

女性名字有孤寡数,易离婚

丁老师:您好!我孩子(女孩)准备取名:周小程,宝宝出生于阳历2016年8月13号16时30分左右,准备给孩子取个名字,在网上查询了哈,这个名字的分数还蛮高的,99分&…

韦东山嵌入式Liunx驱动大全二

文章目录 一、LCD1-1 不同接口的LCD硬件操作原理1-2 LCD驱动程序框架1-3 结合APP分析LCD驱动程序框架1-4 LCD硬件时序图1-5 分析内核自带的LCD驱动程序1-6 编程LCD驱动程序框架_使用设备树1-7 LCD驱动程序框架_引脚配置1-8 LCD驱动程序框架_时钟配置1-9 LCD驱动程序框架_LCD控制…

1069 微博转发抽奖

solution #include<iostream> #include<string> #include<map> using namespace std; int main(){int n, m, s, loop 0, have 0;string id;map<string, int> mp;cin >> m >> n >> s;for(int i 1; i < m; i){//编号从1开始cin…

专题五_位运算(3)

目录 137. 只出现一次的数字 II 解析 题解 面试题 17.19. 消失的两个数字 解析 题解 137. 只出现一次的数字 II 137. 只出现一次的数字 II - 力扣&#xff08;LeetCode&#xff09; 解析 注意这里指的是比特位上的01来进行统计的 题解 class Solution { public:int sin…

Unity与C#的关系

第一&#xff0c;我们首先需要知道Unity与C#的关系是什么&#xff1f; 第二&#xff0c;我们要明白为什么Unity会使用C#&#xff0c;而不是C&#xff1f; 第三&#xff0c;我们需要知道Unity是怎么使用C#的&#xff1f; 第一点&#xff1a; 先说结论&#xff1a;C#是Unity用…

windows如何安装python框架

windows如何安装Python框架&#xff1f;以安装Django框架为例&#xff0c;具体如下&#xff1a; 在idea上运行Python项目时&#xff0c;出现了如下错误&#xff0c;这是因为系统中只安装了Python&#xff0c;没有安装Django。 既然报错的原因就是缺少Django&#xff0c;那我们…

深度解析 Spring 源码:揭秘 AbstractAutowireCapableBeanFactory 的 Bean 生命周期处理

文章目录 一、AbstractAutowireCapableBeanFactory 概述1.1 详细分析1.2 设计思想 二、深入解析AbstractAutowireCapableBeanFactory 的实现细节2.1 Bean 实例化过程分析2.1.1 createBean()2.1.2 createBeanInstance() 2.2 Bean 属性注入的实现机制2.2.1 populateBean()2.2.2 a…

560. 和为 K 的子数组 974. 和可被 K 整除的子数组 【前缀和】

题目链接 ​​​​​​​974. 和可被 K 整除的子数组 560. 和为 K 的子数组 今天刷题的时候&#xff0c;刷了这两题&#xff0c;感觉挺有意思的。代码写起来挺简单的&#xff0c;但是思路和其中的细节以及涉及到的知识点确实让我挺意外的。这里写个博客解析一波&#xff0c;也是…

Charles抓包工具

Charles是一个HTTP代理工具&#xff0c;使开发人员能够查看客服端和服务器之间的所有HTTP/ HTTPS/SSL网络请求。 Charles是在PC环境下常用的网络抓包截取工具&#xff0c;在做移动开发时&#xff0c;我们为了调试客户端与服务端的网络通讯协议&#xff0c;常常需要截取网络请求…

MCP3008-I/SL 模数转换器ADC SPI接口 模拟信号采集

MCP3008-I/SL 模数转换器ADC 贴片SOIC16 MCP3008-I/SL 是一款模数转换器&#xff08;ADC&#xff09;&#xff0c;属于 SAR&#xff08;逐次逼近寄存器&#xff09;架构的 ADC。它具有以下特点&#xff1a; 8 通道单 ADC 最大采样率&#xff1a;200ksps&#xff08;千样点每秒…

鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙防掉坑指南

几点说明 kernel_liteos_a_note | 中文注解鸿蒙内核 是在 OpenHarmony 的 kernel_liteos_a 基础上给内核源码加上中文注解的版本.与官方源码按月保持同步,同步历史如下: 2021/10/09 – 增加性能优化模块perf,优化了文件映射模块2021/09/14 – common,extended等几个目录结构和M…

文献速递:深度学习医学影像心脏疾病检测与诊断--基于深度学习的低剂量SPECT心肌灌注图像去噪:定量评估与临床表现

Title 题目 Deep learning–based denoising of low‑dose SPECT myocardialperfusion images: quantitative assessment and clinical performance 基于深度学习的低剂量SPECT心肌灌注图像去噪&#xff1a;定量评估与临床表现 01 文献速递介绍 单光子发射计算机断层扫描&a…

uniapp + vue3 设置 axios proxy 代理,并重写路径

uniapp vue2 设置代理如下&#xff1a; 已生成的项目架构里面找到manifest.json文件&#xff0c;通过源码视图的方式打开文件&#xff0c;在文件中添加一下代码即可完成代理&#xff1a; "h5": {"devServer": {"disableHostCheck": true, //禁…

基于StatefulSet控制器在Kubernetes上部署MySQL一主多从

一、前提--StatefuSet特性 1.1 有状态的节点控制器 -- StatefulSet 及其网络状态 容器的解决方案是针对无状态应用场景的最佳实践&#xff0c;但对于有状态应用来说&#xff0c;就并非如此了。Kubernetes 用 StatefulSet 解决了有状态应用编排的问题&#xff0c;本文我们就来…

GitHub介绍,GitHub如何订阅充值?

一、GitHub介绍 GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持git 作为唯一的版本库格式进行托管&#xff0c;故名Github。 GitHub于2008年4月10日正式上线&#xff0c;除了git代码仓库托管及基本的Web管理界面以外&#xff0c;还提供了订阅、讨论组、…