学习注意力机制并将其应用到网络中

什么是注意力机制

注意力机制的核心重点就是让网络关注到它更需要关注的地方

当我们使用卷积神经网络去处理图片的时候,我们会更希望卷积神经网络去注意应该注意的地方,而不是什么都关注,我们不可能手动去调节需要注意的地方,这个时候,如何让卷积神经网络去自适应的注意重要的物体变得极为重要。

注意力机制就是实现网络自适应注意的一个方式。

注意力机制可以分为通道注意力机制空间注意力机制,以及二者的结合。

通道注意力机制关注的是某些重要的通道,空间注意力机制关注的是图片中某些重要的区域

注意力机制的实现方式

在深度学习中,常见的注意力机制的实现方式有SENet,CBAM,ECA等等。

1.SENet的实现

SENet是通道注意力机制的典型实现。
对于输入进来的特征层,我们关注其每一个通道的权重,对于SENet而言,其重点是获得输入进来的特征层,每一个通道的权值。利用SENet,我们可以让网络关注它最需要关注的通道

其具体实现方式就是:
1、对输入进来的特征层进行全局平均池化
2、然后进行两次全连接,第一次全连接神经元个数较少,第二次全连接神经元个数和输入特征层相同。
3、在完成两次全连接后,我们再取一次Sigmoid将值固定到0-1之间,此时我们获得了输入特征层每一个通道的权值(0-1之间)。
4、在获得这个权值后,我们将这个权值乘上原输入特征层即可。

实现代码:

def se_block(input_feature, ratio=16, name=""):
	channel = input_feature._keras_shape[-1]

	se_feature = GlobalAveragePooling2D()(input_feature)
	se_feature = Reshape((1, 1, channel))(se_feature)

	se_feature = Dense(channel // ratio,
					   activation='relu',
					   kernel_initializer='he_normal',
					   use_bias=False,
					   bias_initializer='zeros',
					   name = "se_block_one_"+str(name))(se_feature)
					   
	se_feature = Dense(channel,
					   kernel_initializer='he_normal',
					   use_bias=False,
					   bias_initializer='zeros',
					   name = "se_block_two_"+str(name))(se_feature)
	se_feature = Activation('sigmoid')(se_feature)

	se_feature = multiply([input_feature, se_feature])
	return se_feature

2.CBAM的实现

CBAM将通道注意力机制和空间注意力机制进行一个结合,相比于SENet只关注通道的注意力机制可以取得更好的效果。CBAM会对输入进来的特征层,分别进行通道注意力机制的处理和空间注意力机制的处理。
通道注意力机制的实现可以分为两个部分,我们会对输入进来的单个特征层,分别进行全局平均池化和全局最大池化。之后对平均池化和最大池化的结果,利用共享的全连接层进行处理,我们会对处理后的两个结果进行相加,然后取一个sigmoid,此时我们获得了输入特征层每一个通道的权值(0-1之间)。在获得这个权值后,我们将这个权值乘上原输入特征层即可

空间注意力机制的实现:我们会对输入进来的特征层,在每一个特征点的通道上取最大值和平均值。之后将这两个结果进行一个堆叠,利用一次通道数为1的卷积调整通道数,然后取一个sigmoid,此时我们获得了输入特征层每一个特征点的权值(0-1之间)。在获得这个权值后,我们将这个权值乘上原输入特征层即可。

实现代码如下:

def channel_attention(input_feature, ratio=8, name=""):
	
	channel = input_feature._keras_shape[-1]
	
	shared_layer_one = Dense(channel//ratio,
							 activation='relu',
							 kernel_initializer='he_normal',
							 use_bias=False,
							 bias_initializer='zeros',
							 name = "channel_attention_shared_one_"+str(name))
	shared_layer_two = Dense(channel,
							 kernel_initializer='he_normal',
							 use_bias=False,
							 bias_initializer='zeros',
							 name = "channel_attention_shared_two_"+str(name))
	
	avg_pool = GlobalAveragePooling2D()(input_feature)    
	max_pool = GlobalMaxPooling2D()(input_feature)

	avg_pool = Reshape((1,1,channel))(avg_pool)
	max_pool = Reshape((1,1,channel))(max_pool)

	avg_pool = shared_layer_one(avg_pool)
	max_pool = shared_layer_one(max_pool)

	avg_pool = shared_layer_two(avg_pool)
	max_pool = shared_layer_two(max_pool)
	
	cbam_feature = Add()([avg_pool,max_pool])
	cbam_feature = Activation('sigmoid')(cbam_feature)
	
	
	return multiply([input_feature, cbam_feature])

def spatial_attention(input_feature, name=""):
	kernel_size = 7

	cbam_feature = input_feature
	
	avg_pool = Lambda(lambda x: K.mean(x, axis=3, keepdims=True))(cbam_feature)
	max_pool = Lambda(lambda x: K.max(x, axis=3, keepdims=True))(cbam_feature)
	concat = Concatenate(axis=3)([avg_pool, max_pool])

	cbam_feature = Conv2D(filters = 1,
					kernel_size=kernel_size,
					strides=1,
					padding='same',
					kernel_initializer='he_normal',
					use_bias=False,
					name = "spatial_attention_"+str(name))(concat)	
	cbam_feature = Activation('sigmoid')(cbam_feature)
		
	return multiply([input_feature, cbam_feature])

def cbam_block(cbam_feature, ratio=8, name=""):
	cbam_feature = channel_attention(cbam_feature, ratio, name=name)
	cbam_feature = spatial_attention(cbam_feature, name=name)
	return cbam_feature

3、ECA的实现
ECANet是也是通道注意力机制的一种实现形式。ECANet可以看作是SENet的改进版
ECANet的作者认为SENet对通道注意力机制的预测带来了副作用,捕获所有通道的依赖关系是低效并且是不必要的
ECA模块的思想是非常简单的,它去除了原来SE模块中的全连接层,直接在全局平均池化之后的特征上通过一个1D卷积进行学习

既然使用到了1D卷积,那么1D卷积的卷积核大小的选择就变得非常重要了,了解过卷积原理的同学很快就可以明白,1D卷积的卷积核大小会影响注意力机制每个权重的计算要考虑的通道数量

实现代码如下:

def eca_block(input_feature, b=1, gamma=2, name=""):
	channel = input_feature._keras_shape[-1]
	kernel_size = int(abs((math.log(channel, 2) + b) / gamma))
	kernel_size = kernel_size if kernel_size % 2 else kernel_size + 1
	
	avg_pool = GlobalAveragePooling2D()(input_feature)
	
	x = Reshape((-1,1))(avg_pool)
	x = Conv1D(1, kernel_size=kernel_size, padding="same", name = "eca_layer_"+str(name), use_bias=False,)(x)
	x = Activation('sigmoid')(x)
	x = Reshape((1, 1, -1))(x)

	output = multiply([input_feature,x])
	return output

开始应用:将注意力机制加入到YOLOv8中

1.找到conv.py文件

2.在conv.py中添加名字

3.在__init__.py中添加名字

4.在tasks.py文件中添加名字

5.在tasks.py中添加配置

在该函数中添加代码

添加的代码为:

elif m in {CBAM}:
    c1, c2 = ch[f], args[0]
    if c2 != nc:
        c2 = make_divisible(min(c2, max_channels) * width, 8)
    args = [c1, *args[1:]]

添加后的为:

6.打开yaml文件

7.尽量不要在这个文件中更改内容,我们可以自己创建一个yaml文件(my_yolov8_CBAM.yaml),然后将yolov8.yaml中的内容复制过来

8.在backbone中进行修改

from列中的-1表示应用上一层的参数、repeats列表示重复多少次、module列表示模型的名字、args列表示参数

9.第八点操作添加完后层数会改变,head部分需要进行相应的修改

修改前:

# YOLOv8.0n head
head:
  - [ -1, 1, nn.Upsample, [ None, 2, "nearest" ] ]
  - [ [ -1, 6 ], 1, Concat, [ 1 ] ] # cat backbone P4
  - [ -1, 3, C2f, [ 512 ] ] # 12

  - [ -1, 1, nn.Upsample, [ None, 2, "nearest" ] ]
  - [ [ -1, 4 ], 1, Concat, [ 1 ] ] # cat backbone P3
  - [ -1, 3, C2f, [ 256 ] ] # 15 (P3/8-small)

  - [ -1, 1, Conv, [ 256, 3, 2 ] ]
  - [ [ -1, 12 ], 1, Concat, [ 1 ] ] # cat head P4
  - [ -1, 3, C2f, [ 512 ] ] # 18 (P4/16-medium)

  - [ -1, 1, Conv, [ 512, 3, 2 ] ]
  - [ [ -1, 9 ], 1, Concat, [ 1 ] ] # cat head P5
  - [ -1, 3, C2f, [ 1024 ] ] # 21 (P5/32-large)

  - [ [ 15, 18, 21 ], 1, Detect, [ nc ] ] # Detect(P3, P4, P5)

修改后:

为什么都+1了?

举个例子,原来要连接第六层,加了注意力层后,原来的第六层就变成第七层,所以在Concat连接时需要修改相应的层数

至此,注意力机制已经插入,可以开始使用了

10.在根目录下新建一个main.py文件,代码如下:

from ultralytics import YOLO

model = (YOLO("ultralytics/cfg/models/v8/my_yolov8_CBAM.yaml"))
model.train(**{'cfg': 'ultralytics/cfg/default.yaml'})

运行即可开始训练

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

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

相关文章

OpenAI 推出 GPT-4o:实现多模态 AI 交互

一、前言 OpenAI 推出了其最新的 AI 模型——GPT-4o,此次发布的并非 GPT-4.5 或 GPT-5,而是一款全新的“全模态模型(Omnimodel)”。这是一个将文本、语音和视觉能力集成到单一无缝 AI 体验中的突破性发展。 GPT-4o 于 2024 年 5 月 14 日发布&#xff0…

北京玻色量子携手赛氪网举办长三角高校数学建模竞赛巡回讲座

2024年5月13日下午,一场聚焦数学建模与量子计算前沿的讲座在中国计量大学隆重举行。此次讲座作为第四届长三角高校数学建模竞赛的巡回宣讲活动之一,由北京玻色量子科技有限公司与竞赛组委会成员赛氪网共同举办,旨在向广大师生介绍量子计算的应…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第六套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第六套 部分题目分享,完整版带答案(有答案和解析,答案非官方,未仔细校正,仅供参考)(共十套,每套四十题选择题)获取(WX:…

渣土车上路识别报警摄像机

随着城市建设的不断推进,渣土车在城市道路上的数量也逐渐增加。然而,一些不法渣土车司机往往会超载、超速行驶或者闯红灯,给道路交通安全和城市环境带来了一定的隐患。为了有效监管渣土车上路行驶的情况,渣土车上路识别报警摄像机…

如何从集装箱的标准化启发软件的模块化设计?

目录 一、集装箱的历史发展 1、早期设想与萌芽 2、英国铁路初步应用 3、美欧多国发展 4、国际组织推动 5、海运集装箱兴起 6、标准化进程加速 7、联运格局形成 8、后续发展与影响 二、集装箱的标准化意义 三、集装箱的标准化与软件设计的模块化 1、集装箱标准化 2…

数字化校园与院校通的关系

数字化校园是以数字化信息和网络为根底,在计算机和网络技术上建立起来的对教育、科研、办理、技术服务、生活服务等校园信息的搜集、处理、整合、存储、传输和运用,使数字资源得到充沛优化运用的一种虚拟教育环境。经过完成从环境(包含设备&a…

USB3.0接口——(2)数据结构

1.数据结构 在 USB 3.0 及更高版本的 xHCI 协议中,“Rings”、“Transfer Request Block (TRB)” 和 “Transfer Descriptor (TD)” 是用于管理 USB 数据传输和事件的重要概念。 1.1.Rings Rings是指一种数据结构,用于组织和管理 USB 数据传输和事件。…

pdfMake,xlsx-js-style,elementTable表格导出大量数据的pdf和xslx表格

使用渲染dom传递给xlsx或将dom转canvas在传给jspdf数据量大都会造成页面负载过大 所以导pdf和xlsx都使用数据传递给pdfMake,xlsx-js-style,pdf涉及分页与合并单元格 一.pdf npm并引入pdfMake和其字体包(记录时使用版本0.2.10 import pdfMake from &qu…

【系统架构师】-案例篇(十二)MQTT、边缘计算与缓存一致性

1、MQTT是一个基于物联网的传输协议,用于轻量级的订阅发布的消息传输。旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。 开放消息协议,简单易实现发布订阅模式,一对多消息发布基于TCP/IP网络连接,提供有序,无损…

【Vue开发】基于SSM++jsp的精品酒销售管理系统【源码+lw+部署文档+讲解】

目录 第一章 绪 论 第二章 关键技术的研究 2.1 JSP技术介绍 2.2 JAVA简介 2.3 ECLIPSE 开发环境 2.4 Tomcat服务器 2.5 MySQL数据库 第三章 系统分析 3.1 系统设计目标 3.2 系统可行性分析 3.3 系统功能分析和描述 3.4系统UML用例分析 3.4.1管理员用例 3.4.2用户用例 3.5系统流…

提升效率! 宏集助力客户实现仓储和物流系统的智能化改造

前言 在现代物流与仓储管理领域,自动存储和检索系统已日益普及,堆垛机和物流小车组合的仓储系统成为高效、精确存储和取货货物的关键。随着技术的进步,堆垛机的定位技术也在不断优化。传统堆垛机采用机械装置和导轨上的光电开关进行定位&…

成都欣丰洪泰文化传媒有限公司电商服务新典范

在数字化浪潮席卷而来的今天,电商行业作为新时代商业发展的重要引擎,正以其独特的魅力和无限潜力,吸引着越来越多的企业和个人投身其中。在这个充满机遇与挑战的领域中,成都欣丰洪泰文化传媒有限公司以其专业的电商服务&#xff0…

CTF如何学习?

CTF如何学习?打CTF有什么用 CTF本身有几个常见的领域 MISC WEB [逆向 密码学](https://www.zhihu.com/search?q逆向 密码学&search_sourceEntity&hybrid_search_sourceEntity&hybrid_search_extra{“sourceType”%3A"answer"%2C"sourc…

yolov8添加FPPI评价指标

这里写自定义目录标题 yolov8 中FPPI实现测试中调用 效果结语 续yolov7添加FPPI评价指标 。之前在yolov7中增加了fppi指标,有不少网友问有没有yolov8中增加,最近没有做算法训练,也一直没时间弄。这几天晚上抽了点时间,弄了一下。不…

Vue3 - 项目配置多环境配置文件

最常见的多环境配置,就是开发环境配置,和生产环境配置(也就是上线的配置),很多情况下我们开发环境下的域名,和一些配置项,和我们生产模式下的不同,这个时候就需要我们进行多环境配置,不然每次发版都要改一波数据多麻烦。 另一种情况就是你两个项目是用的一套代码,但是最…

一文全解聚碳酸酯PC材料在汽车灯罩制造中的诸多显著优势!汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

聚碳酸酯PC材料在汽车灯罩制造中具有诸多显著优势。除了优异的抗冲击性、透明性、耐热性和稳定性外,还有以下一些重要优势: 出色的光学性能:PC材料的光学性能优异,能够确保灯罩内的光源均匀分布,减少光斑和眩光&#…

新人学习笔记值(初始JavaScript)

一、Java Script是什么 1.Java Script是世界上最流行的语言之一,是一种运行在客户端的脚本语言(script是脚本的意思) 2.脚本语言:不需要编译,运行过程中由js解释器(js引擎)进行解释并运行 3.现在…

3dmax材质库导入方法?3dmax云渲染速度体验

3ds Max 材质库包含多种素材,如金属、木材、布料和石材等,但用户在导入材质时常遇到问题。本文将介绍如何在3ds Max中成功导入材质,并探讨使用云渲染服务来加速渲染过程,提高项目效率。 一、3dmax材质库导入教程 自建材质导入方法…

胖东来5月生鲜陈列欣赏

【免责声明】:凡未注明来源的图文内容,版权归原作者所有。本平台所发稿件、图片均用于学习交流,不代表赞同文章观点和对其真实性负责,不用作商业用途。若文章涉及版权,请将马上联系,安排删除。

Google Chrome 设备工具栏原理

1.不同预览模式 2.计算出缩放比 3.固定滚动偏移 关键代码&#xff1a; overview&#xff1a; ratioW getChildRect().width / getParentRect().width ratioH getChildRect().height / getParentRect().height maxRatio max(ratioW, ratioH) if(maxRatio < 1) return 1 …