YOLOv5、YOLOv8改进:NAMAttention注意力机制

news2024/12/25 1:55:18

目录

1.简介

2.YOLOv5代码修改

2.1增加以下NAMAttention.yaml文件

2.2common.py配置

2.3yolo.py配置


1.简介

paper:https://arxiv.org/pdf/2111.12419.pdf

code:https://github.com/Christian-lyc/NAM

摘要 
        注意机制是近年来人们普遍关注的研究兴趣之一。它帮助深度神经网络抑制较不显著的像素或通道。以往的许多研究都集中于通过注意力操作来捕捉显著特征。这些方法成功地利用了不同特征维度上的互信息。然而,它们没有考虑到权重的贡献因素,而权重能够进一步抑制不重要的信道或像素。本文利用权重的贡献因素来改善注意机制。使用一个批处理(BN)归一化的缩放因子,它使用标准偏差来表示权重的重要性。这可以避免添加在SE、BAM和CBAM中使用的全连接和卷积层。因此,提出了一种有效的注意机制——基于标准化的注意模块(NAM)。

论文背景
        许多先前的工作试图通过抑制无关紧要的权值来改善神经网络的性能。Squeeze-and-Excitation Networks(SENet) 将空间信息整合到通道特征响应中,并使用两个多层感知器(MLP)层计算相应的注意。Bottleneck Attention Module(BAM)并行构建分离的空间子模块和通道子模块,它们可以嵌入到每个Bottleneck  Block中。Convolutional Block Attention Module(CBAM)提供了一种顺序嵌入通道和空间注意力子模块的解决方案。为了避免忽视跨维度的相互作用,Triplet Attention Module (TAM) 通过旋转特征图考虑维度相关性。然而,这些工作忽略了来自训练中调整权重的信息。因此,本文的目标是通过利用训练模型权重的方差度量来突出显著特征。

论文主要思想
        本文提出NAM作为一种高效和轻量级的注意机制。采用了来自CBAM的模块。并重新设计通道和空间注意子模块。然后,在每个网络块的末端嵌入一个NAM模块。对于残差网络,它被嵌入在残余结构的末端。对于信道注意子模块,使用了批归一化(BN)的缩放因子。尺度因子测量了信道的方差,并表明了它们的重要性。

 

 

其中\mu _{B}为均值,\sigma ^{2}_{B}为方差;\gamma\beta是可训练的仿射变换参数(尺度和位移)。 

 通道注意力子模块如图1所示,其中M_{c}表示输出特征。\gamma是每个通道的比例因子,权值为W_{\gamma }=\gamma_{i}/\sum_{j=0}\, \: \gamma_{j}。这里还将BN的比例因子应用于空间维度,来衡量空间特征的重要性。

 

对应的空间注意力子模块如图2所示,其中输出记为M_{s}\lambda为比例因子,权值为W_{\lambda }=\lambda {i}/\sum_{j=0}\, \: \lambda _{j}。 

2.YOLOv5代码修改

2.1增加以下NAMAttention.yaml文件

# YOLOv5 🚀 YOLOair, GPL-3.0 license

# Parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
anchors:
  - [10,13, 16,30, 33,23]  # P3/8
  - [30,61, 62,45, 59,119]  # P4/16
  - [116,90, 156,198, 373,326]  # P5/32

# YOLOv5 v6.0 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Conv, [64, 6, 2, 2]],  # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],  # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],  # 3-P3/8
   [-1, 6, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],  # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [1024, 3, 2]],  # 7-P5/32
   [-1, 3, C3, [1024]],
   [-1, 1, SPPF, [1024, 5]],  # 9
  ]

# YOLOv5 v6.0 head
head:
  [[-1, 1, Conv, [512, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 6], 1, Concat, [1]],  # cat backbone P4
   [-1, 3, C3, [512, False]],  # 13

   [-1, 1, Conv, [256, 1, 1]],
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],
   [[-1, 4], 1, Concat, [1]],  # cat backbone P3
   [-1, 3, C3, [256, False]],  # 17 (P3/8-small)

   [-1, 1, Conv, [256, 3, 2]],
   [[-1, 14], 1, Concat, [1]],  # cat head P4
   [-1, 3, C3, [512, False]],  # 20 (P4/16-medium)

   [-1, 1, Conv, [512, 3, 2]],
   [[-1, 10], 1, Concat, [1]],  # cat head P5
   [-1, 3, C3, [1024, False]],  # 23 (P5/32-large)
   [-1, 1, NAMAttention, [1024]],# 修改

   [[17, 20, 24], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5)
  ]

2.2common.py配置

import torch.nn as nn
import torch
from torch.nn import functional as F


class Channel_Att(nn.Module):
    def __init__(self, channels, t=16):
        super(Channel_Att, self).__init__()
        self.channels = channels
      
        self.bn2 = nn.BatchNorm2d(self.channels, affine=True)


    def forward(self, x):
        residual = x

        x = self.bn2(x)
        weight_bn = self.bn2.weight.data.abs() / torch.sum(self.bn2.weight.data.abs())
        x = x.permute(0, 2, 3, 1).contiguous()
        x = torch.mul(weight_bn, x)
        x = x.permute(0, 3, 1, 2).contiguous()
        
        x = torch.sigmoid(x) * residual #
        
        return x


class NAMAttention(nn.Module):
    def __init__(self, channels, out_channels=None, no_spatial=True):
        super(NAMAttention, self).__init__()
        self.Channel_Att = Channel_Att(channels)
  
    def forward(self, x):
        x_out1=self.Channel_Att(x)
 
        return x_out1  
  

2.3yolo.py配置

在 models/yolo.py文件夹下

  • 定位到parse_model函数中
  • elif m is NAMAttention:
        c1, c2 = ch[f], args[0]
        if c2 != no:
            c2 = make_divisible(c2 * gw, 8)
        args = [c1, *args[1:]]
    

 有不清楚的地方可以评论区留言。

 

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

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

相关文章

day 28 地图

from pyecharts.charts import Map from pyecharts.options import VisualMapOpts# 创建一个地图对象 map Map() # 准备数据 data [("北京市", 99),("上海市", 199),("湖南省", 399),("广东省", 499) ] # 添加数据 map map.add(&qu…

Redis数据结构全解析【万字详解】

文章目录 前言一、SDS1、SDS的必要性2、SDS的数据结构3、SDS的优势O(1)复杂度获取字符串长度二进制安全不会发生缓冲区溢出节省空间 二、链表1、结构设计2、优缺点 三、压缩列表1、结构设计2、连续更新3、压缩列表的缺陷 四、哈希表1、结构设计2、哈希冲…

Python小知识 - 八大排序算法

八大排序算法 排序算法是计算机科学中非常重要的一个研究领域。排序算法可以分为内部排序和外部排序,内部排序是数据记录在计算机内部,而外部排序是数据记录在计算机外部,这里我们主要讨论内部排序。 内部排序中的算法大致可以归纳为四类&…

Matlab图像处理-乘法运算

乘法运算 两幅图像进行乘法运算主要实现两个功能: 一是可以实现掩模操作,即屏蔽图像的某些部分; 二是如果一幅图像乘以一个常数因子,如果常数因子大于1,将增强图像的亮度,如果因子小于1则会使图像变暗。…

day 28 折线图

from pyecharts.charts import Line from pyecharts.options import TitleOpts, LabelOpts# 分别打开三哥国家文件 import jsonf_us open("D:/美国.txt", "r", encoding"UTF-8") f_jp open("D:/日本.txt", "r", encoding&…

OpenCV基础知识(9)— 视频处理(读取并显示摄像头视频、播放视频文件、保存视频文件等)

前言:Hello大家好,我是小哥谈。OpenCV不仅能够处理图像,还能够处理视频。视频是由大量的图像构成的,这些图像是以固定的时间间隔从视频中获取的。这样,就能够使用图像处理的方法对这些图像进行处理,进而达到…

无涯教程-Python机器学习 - Unsupervised Learning函数

无监督学习 顾名思义,它与监督式机器学习方法或算法相反,这意味着在无监督的机器学习算法中,我们没有任何监督者可以提供任何类型的指导。在没有监督学习算法那样的自由的情况下,无监督学习算法非常方便,因为在这种情况下我们没有预先标签训练数据,而我们想从输入数据中提取有…

学信息系统项目管理师第4版系列03_文件与标准

审核未通过,删除文件部分,仅保留标准化相关内容,重发 12. 标准化 12.1. 采用国际标准和国外先进标准的程度分为等同采用、修改采用和等效采用 3 种 12.1.1. 【高21上选20】 12.1.2. 采用指与国际标准在技术内容和文本结构上相同,或者与国…

图的邻接矩阵与邻接表

目录 一、图的概念 二、邻接矩阵 2.1 邻接矩阵存储 2.2 邻接矩阵结构 2.3 构造邻接矩阵 2.4 边的添加 三、邻接表 3.1 邻接矩阵存储 3.2 邻接表结构 3.3 构造邻接表 3.4 边的添加 三、 图的遍历 一、图的相关概念 图是由顶点集合及顶点间的关系组成的一种数据结构&…

微服务dubbo

微服务是一种软件开发架构风格,它将一个应用程序拆分成一组小型、独立的服务,每个服务都可以独立部署、管理和扩展。每个服务都可以通过轻量级的通信机制(通常是 HTTP/REST 或消息队列)相互通信。微服务架构追求高内聚、低耦合&am…

Mybatis学习|第一个Mybatis程序

1.创建一个数据库以及一个用户表,并插入三条数据用来测试 2.创建一个空的maven项目 在pom.xml中导入本次测试用到的三个依赖,mysql驱动、mybatis依赖、以及单元测试junit依赖 将这个 空的maven项目当成一个父项目,再创建一个空的maven子项目用…

并发编程基础知识篇--进程和线程的区别

目录 进程和线程 进程 线程 进程与线程的区别总结 扩展小知识 程序计数器为什么是私有的? 虚拟机栈和本地方法栈为什么是私有的? 简单了解堆和方法区 多进程和多线程区别 Java中的多线程 进程和线程 进程 在一个操作系统中,每个独立执行的程序都可称之…

Linux操作系统--shell编程(运算符)

语法: "$((运算式))" 或 "$[运算式]" 下面我们介绍几种Linux操作系统中的运算符的使用方式: 方式1:这一个使用比较麻烦,不推荐使用 方式2:推荐使用

软考A计划-系统集成项目管理工程师-小抄手册(共25章节)-中

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 👉关于作者 专注于Android/Unity和各种游…

BUUCTF [SWPU2019]Web1

​ 这是一道sql二次注入题目,但是注入点并不在登录处 注册一个用户然后登录 广告申请处进行sql注入 你会发现过滤了很多关键字 空格#information等等 这里用到了一些绕过技巧 使用 /**/ 代替空格 union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,1…

【软件测试】Web自动化测试框架有哪些以及操作流程

测试行业现在70%是以手工测试为主,那么只有20%是自动化测试,剩下的10%是性能测试。 有人可能会说,我现在做手工,我为什么要学自动化呢?我去学性能更好性能的人更少? 其实,性能的要求比自动化要…

D - President - 背包dp

分析: 需要让所有x大于y的对应的z的总数大于z总共的数量的一半,找最小需要转化的数量,那么可以转化为01背包问题,z作为体积,每组的x和y都可以计算出一个值表示需不需要转化,作为背包价值,如果x大…

Java源码分析(二)Double

本篇是源码分析的第二篇,上篇我们一起分析了Integer类的源码,本篇一起学习下Double类的源码,看下其实现。 一、Double类图 首先,相比Integer,Double类的源码只有1000行代码。如下是Integer及其关联类/接口的类图&…

rke2 在线部署 kubernetes

文章目录 1. 还原虚拟机2. 背景3. 介绍4. 预备条件5.1 配置网卡5. 配置主机名 6. 配置互信7. 安装 ansible8. 系统初始化9. kube-master01 部署9.1 定制配置文件(可选)9.2 部署9.3 命令配置9.4 检查节点 10. 配置其他管理节点11. Agent 节点配置12. 检查…

Android 之 WallpaperManager (壁纸管理器)

本节引言: 本节给大家带来的是WallpaperManager(壁纸管理器),如其名,就是手机壁纸相关的 一个API,在本节中我们会描述下WallpaperManager的基本用法,调用系统自带的 壁纸选择功能,将Activity的背景设置为壁…