YOLOv9最新改进系列:完美融合即插即用的涨点模块之注意力机制(SEAttention)。

news2024/11/20 14:23:31

YOLOv9最新改进系列:完美融合即插即用的涨点模块之注意力机制(SEAttention)。

YOLOv9原文链接戳这里,原文全文翻译请关注B站Ai学术叫叫首er

B站全文戳这里!

详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:AI学术叫叫兽 源码在相簿的链接中,动态中也有链接,感谢支持!祝科研遥遥领先!

YOLOv9最新改进系列:完美融合即插即用的涨点模块之注意力机制(SEAttention)!

  • YOLOv9最新改进系列:完美融合即插即用的涨点模块之注意力机制(SEAttention)。
  • 摘要
  • 1 SENet结构
  • 2 SENet计算流程
  • 3 SENet参数
  • 4 代码讲解
  • 5 结论
  • 6 修改步骤!
    • 6.1 修改YAML文件
    • 6.2 新建.py
    • 6.3 修改tasks.py
  • 7、验证是否成功即可


SE(提出原文戳这)

详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:AI学术叫叫兽 源码在相簿的链接中,动态中也有链接,感谢支持!祝科研遥遥领先!
截止到发稿时,B站YOLOv9最新改进系列的源码包,已更新了11种的改进!自己排列组合2-4种后,考虑位置不同后可排列组合上千种!!专注AI学术,关注B站博主:Ai学术叫叫兽er!

摘要

什么是通道特征?通道特征(Channel Features)是指卷积神经网络(CNN)中每个卷积核产生的输出。一个通道对应于网络中的一个卷积核,而每个通道的输出表示该卷积核在输入上的响应。通道特征捕捉了输入数据中不同方面的抽象信息。每个通道对应于某种特定的抽象特征,例如纹理、颜色、边缘等。通道特征在整个网络中负责提取和表示不同层次的信息。

什么是通道注意力机制?通道注意力机制(Channel Attention Mechanism)是深度学习中一种用于增强通道特征捕捉能力的注意力机制。它主要应用于卷积神经网络(CNN)中,以提高模型对不同通道(channel)的特征的关注度,从而使网络更加有效地学习和利用输入数据的信息。在通道注意力机制中,通过学习每个通道的权重,模型可以在处理特定通道的特征时给予更多的注意力。这有助于网络在学习过程中更好地区分不同通道的重要性,从而提高模型对输入数据的表示能力。

1 SENet结构

SENet是一种通道注意力机制,结构如图1所示。SE注意力模块,由Squeeze操作、Excitation操作、Scale操作三部分组成。Squeeze操作:对输入的特征图进行全局平均池化,将每个通道的特征值降维为一个全局向量。这一步旨在捕捉每个通道的全局信息。Excitation操作:由两个全连接和一个ReLU激活函数、一个Softmax激活函数组成,先进行降维在升维,最后通过sigmoid函数生成权重向量,确保它们的总和为1。Scale操作:将上一步得到的通道注意力权重乘以输入的原始特征图。这一步用于调整每个通道的特征值,强调重要通道的信息,抑制不重要通道的信息。SE注意力模块与Inception、ResNet的结合,分别如图2、图3所示。
在这里插入图片描述在这里插入图片描述

2 SENet计算流程

如图1所示,给定一个输入X∈H’×W’×C’ ,通过一个卷积变化Ftr 得到 U∈H×W×C 。将特征U 经过Squeeze操作Fsq 在空间维度H×W 上聚合特征得到Z∈1×1×C 。接下来进行Excitation操作,得到s。其中W1 、W2 为全连接层后的权重,δ 为ReLU函数,σ 为Sigmoid函数。

s=Fex(z,W)=σ(g(z,W))=σ(W2δ(W1z))

    最后进行Scale操作,将特征U和特征s相乘得到x,通过相乘,注意力机制可以对每个通道进行更细粒度的权重调整,将更多的注意力集中在对任务更为关键的通道上。从而调整该特征值的重要性。这个过程使得网络更加关注那些在给定任务中对应通道上重要的特征。

x=Fscale (U,s)=U⋅s

3 SENet参数

利用thop库的profile函数计算FLOPs和Param。Input:(512,7,7)。
在这里插入图片描述

4 代码讲解

import torch
from torch import nn
from torch.nn import init
 
 
class SEAttention(nn.Module):
 
    def __init__(self, channel=512, reduction=16):
        super().__init__()
        # 在空间维度上,将H×W压缩为1×1
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        # 包含两层全连接,先降维,后升维。最后接一个sigmoid函数
        self.fc = nn.Sequential(
            nn.Linear(channel, channel // reduction, bias=False),
            nn.ReLU(inplace=True),
            nn.Linear(channel // reduction, channel, bias=False),
            nn.Sigmoid()
        )
 
    def init_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                init.kaiming_normal_(m.weight, mode='fan_out')
                if m.bias is not None:
                    init.constant_(m.bias, 0)
            elif isinstance(m, nn.BatchNorm2d):
                init.constant_(m.weight, 1)
                init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                init.normal_(m.weight, std=0.001)
                if m.bias is not None:
                    init.constant_(m.bias, 0)
 
    def forward(self, x):
        # (B,C,H,W)
        B, C, H, W = x.size()
        # Squeeze: (B,C,H,W)-->avg_pool-->(B,C,1,1)-->view-->(B,C)
        y = self.avg_pool(x).view(B, C)
        # Excitation: (B,C)-->fc-->(B,C)-->(B, C, 1, 1)
        y = self.fc(y).view(B, C, 1, 1)
        # scale: (B,C,H,W) * (B, C, 1, 1) == (B,C,H,W)
        out = x * y
        return out
 
 
 
 
if __name__ == '__main__':
    from  torchsummary import summary
    from thop import profile
    model = SEAttention(channel=512, reduction=8)
    summary(model, (512, 7, 7), device='cpu')
    flops, params = profile(model, inputs=(torch.randn(1, 512, 7, 7),))
    print(f"FLOPs: {flops}, Params: {params}")

…详情见原文!

5 结论

在本文中,我们提出了 SE 块,这是一种架构单元,旨在通过使其能够执行动态通道特征重新校准来提高网络的表示能力。 广泛的实验证明了 SENet 的有效性,它在多个数据集和任务中实现了最先进的性能。 此外,SE 模块揭示了以前的架构无法充分模拟通道特征依赖性的问题。 我们希望这种见解对于需要强区分性特征的其他任务可能有用。 最后,SE 块生成的特征重要性值可能可用于其他任务,例如用于模型压缩的网络修剪。

6 修改步骤!

6.1 修改YAML文件

详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:AI学术叫叫兽 源码在相簿的链接中,动态中也有链接,感谢支持!祝科研遥遥领先!

6.2 新建.py

详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:AI学术叫叫兽er 源码在相簿的链接中,动态中也有链接,感谢支持!祝科研遥遥领先!

6.3 修改tasks.py

详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:AI学术叫叫兽er 源码在相簿的链接中,动态中也有链接,感谢支持!祝科研遥遥领先!

7、验证是否成功即可

执行命令

python train.py

改完收工!
关注B站:Ai学术叫叫兽er
从此走上科研快速路
遥遥领先同行!!!!

详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:AI学术叫叫兽er 源码在相簿的链接中,动态中也有链接,感谢支持!祝科研遥遥领先!

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

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

相关文章

QingHub Studio快速部署

简要介绍 QingHub Studio部署套件,主要针对需要本地化离线部署的用户提供一键部署的能力。目前本地化部署只支持单机版。需高可用部署的可以自行研究或寻求轻云研发团队技术支持。本地部署只作为用户开发的前后端应用的运行环境,不包括应用设计及监控运…

(22408)武汉大学计算机专硕初试备考经验贴

首先谈一下,写这篇文章的初衷。 我相信考武大计算机的同学都是优秀的,应该有自己的备考方法,所以这里并不介绍具体怎么备考某一科目。 计算机考研热度较高,备考不易,这里将自己备考过程中遇到的问题,分享…

(六)小案例银行家应用程序-删除账号-findindex方法

findindex方法和find方法非常类似,只不过findindex顾名思义,他返回的是index; ● 下面我们使用删除账号的功能来学习一下findindex的 ● 当用户登录成功之后,可以在下方输入自己的用户名和密码,然后提交&#xff0c…

【C++】类和对象完结篇——日期类实现

再谈构造函数 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值 class Date { public:Date(int year, int month, int day){_year year;//只能是说是赋初始值,不能说初始化_month month;_day …

【Flutter】GetX

前言 状态管理 / 路由管理 / 依赖管理 这三部分之间存在联系 参考文章 建议看官网文章,很详细 ,pub.dev搜索get pub.dev的文档 状态管理文章相关链接 状态管理 案例 实现一个计算器,运用GetX去管理它 构建界面 构建一个计算器界面 …

Vue入门到关门之Vue介绍与使用

一、vue框架介绍 1、什么是Vue? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与…

软件测试(Web自动化测试)(二)

一.Selenium WebDriver的基本应用 (一)安装浏览器驱动 1.关闭浏览器的自动更新功能 以Windows7(64位)操作系统为例,讲解如何关闭Chrome浏览器的自动更新。首先按下快捷键“WinR”,打开运行对话框&#x…

FPGA 以太网通信UDP通信环回

1 实验任务 上位机通过网口调试助手发送数据给 FPGA , FPGA 通过 PL 端以太网接口接收数据并将接收到的数据发送给上位机,完成以太网 UDP 数据的环回。 2 系统设计 系统时钟经过PLL时钟模块后,生成了两种不同频率和相位的时钟信号&#…

Java高阶私房菜-JVM垃圾回收机制及算法原理探究

目录 垃圾回收机制 什么是垃圾回收机制 JVM的自动垃圾回收机制 垃圾回收机制的关键知识点 初步了解判断方法-引用计数法 GCRoot和可达性分析算法 什么是可达性分析算法 什么是GC Root 对象回收的关键知识点 标记对象可回收就一定会被回收吗? 可达性分析算…

线程池处理任务的流程、步骤

线程池处理任务的流程 如果当前运行的线程数小于核心线程数,那么就会新建一个线程来执行任务。如果当前运行的线程数等于或大于核心线程数,但是小于最大线程数,那么就把该任务放入到任务队列里等待执行。如果向任务队列投放任务失败&#xf…

web-traffic-generator:一款功能强大的HTTP和HTTPs流量混淆工具

关于web-traffic-generator web-traffic-generator是一款功能强大的HTTP和HTTPs流量混淆工具,该工具基于纯Python开发,可以帮助广大研究人员在HTTP或HTTPs网络流量中提添加噪声,以此来实现流量混淆的目的。 本质上来说,web-traff…

为什么堆排序的时间复杂度是O(N*logN)?

目录 前言: 堆排序(以排升序为例) 步骤(用大根堆,倒这排,排升序): 1.先把要排列的数组建立成大根堆 2.堆顶元素(82)和最后一个元素交换(2&…

Docker之常见FAQ记录清单

一、前言 本文记录Docker使用过程中遇见的问题,供后续回顾参考。 关联资源:网络Docker博客、官方FAQ、文档、Docker 从入门到实践、中文社区、riptutorial 二、问题及处理记录 2.1、docker容器内没有vi,nano等编辑器 1)如果宿主机本地有&a…

ESP8266刷入WI-PWN制作wifi杀手的过程、准备材料、报错解决、烧录固件等

文章目录 ESP8266---介绍1. 技术规格:2. 软件支持:3. 特性:4. 应用领域: ESP8266---材料准备1.硬件设备1.1(micro-usb)梯形安卓数据线(必须要可以传数据)1.2(ESP8266&…

docker启动的mysql8中文乱码问题和无法输入中文

问题描述: 1.中文显示乱码 2.无法输入中文 中文乱码临时方案: show variables like ‘character%’; SET NAMES utf8mb4; SET CHARACTER SET utf8mb4; 中文乱码永久方案: vim /etc/my.cnf[client] default-character-setutf8mb4[mysql]…

笔试强训未见过题(个人向)

1.游游的水果大礼包 题目 解析 我们设卖出价值为c,卖出x个一号礼包,y个二号礼包。则caxby,那么就可以一一枚举,x的最大值为min(a/2,b),则y就为min(a-2*min,…

《Kafka 3.x.x 入门到精通》

Kafka 3.x.x 入门到精通 Kafka是一个由Scala和Java语言开发的,经典高吞吐量的分布式消息发布和订阅系统,也是大数据技术领域中用作数据交换的核心组件之一。以高吞吐,低延迟,高伸缩,高可靠性,高并发&#x…

AIGC学习步骤

目录 AIGC学习步骤 步骤一:理解基本概念 步骤二:学习资源 步骤三:深入研究 步骤四:联系专家 步骤五:实践应用 步骤六:持续学习 AIGC学习步骤 我们先来说说什么是AIGC? 生成式人工智能—…

数组和指针经典笔试题讲解

目录 创作不易,如对您有帮助,还望一键三连,谢谢!!! 1.sizeof和strlen的对比 1.1sizeof 1.2strlen 1.3sizeof和strlen对比 2.数组笔试题讲解 数组名的理解 2.1一维数组 2.2字符数组 题目一&#x…

快速进入Windows中的特殊文件夹

目录 一. 进入方式二. startup ⇒ 开机自启三. fonts ⇒ 电脑字体四. sendto ⇒ 发送到五. programs ⇒ 开始菜单应用六. appsfolder ⇒ 电脑中安装的所有应用七. appdata ⇒ 应用程序的数据八. desktop ⇒ 桌面文件夹九. ConnectionsFolder ⇒ 网络连接 一. 进入方式 ⏹文件管…