做动态图网站违法吗,小程序搭建公司,甘州区住房和城乡建设局网站,地方门户网站用户#x1f4a1;#x1f4a1;#x1f4a1;本专栏所有程序均经过测试#xff0c;可成功执行#x1f4a1;#x1f4a1;#x1f4a1;
在图像识别中#xff0c;学习捕捉长距离关系是基础。现有的CNN模型通常通过增加深度来建立这种关系#xff0c;但这种形式效率极低。因此本专栏所有程序均经过测试可成功执行
在图像识别中学习捕捉长距离关系是基础。现有的CNN模型通常通过增加深度来建立这种关系但这种形式效率极低。因此双重注意力被提出这是一个新颖的组件它能够从输入图像的整个时空空间聚合和传播信息丰富的全局特征使得后续的卷积层能够高效地访问整个空间特征。这个组件通过两步的双重注意力机制来设计第一步通过二阶注意力池化从整个空间收集特征到一组紧凑集合第二步通过另一种注意力自适应选择和分配特征到每个位置。在本文中给大家带来的教程是将原来的网络添加DoubleAttention。文章在介绍主要的原理后将手把手教学如何进行模块的代码添加和修改并将修改后的完整代码放在文章的最后方便大家一键运行小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。 专栏地址 YOLOv5改进入门——持续更新各种有效涨点方法 点击即可跳转 目录
1.原理
2. DoubleAttention代码实现
2.1 将DoubleAttention添加到YOLOv5中
2.2 新增yaml文件
2.3 注册模块 2.4 执行程序
3. 完整代码分享
4.GFLOPs
5. 进阶
6. 总结 1.原理 官方论文A2 -Nets: Double Attention Networks——点击即可跳转 官方代码A2 -Nets: Double Attention Networks官方代码仓库——点击即可跳转 双重注意力网络Double Attention Networks是一种用于计算机视觉任务的神经网络架构旨在有效地捕获图像中的全局和局部信息以提高任务的性能。它是建立在注意力机制的基础上的通过两个注意力模块来分别关注全局和局部信息。以下是关于Double Attention Networks的详细解释 注意力机制 注意力机制是一种模仿人类视觉系统的方法它允许神经网络在处理输入数据时集中注意力在最相关的部分上。在计算机视觉中这意味着网络可以动态地选择关注图像的不同部分从而提高任务的性能。 双重注意力 双重注意力网络引入了两个注意力模块分别用于全局和局部信息。这两个模块分别关注图像的整体结构和局部细节从而充分利用了图像中的各种信息。 全局注意力模块 全局注意力模块负责捕获图像中的全局信息。它通常采用全局池化global pooling操作将整个特征图进行压缩然后通过一系列的神经网络层来学习全局上下文信息。这个模块能够帮助网络理解图像的整体语义结构。 局部注意力模块 局部注意力模块专注于捕获图像中的局部信息。它通常采用一种局部感知机制local perception通过对图像进行分块或者使用卷积操作来提取局部特征并且通过注意力机制来选择最相关的局部信息。这个模块有助于网络在处理具有局部结构的图像时更加准确。 特征融合 在双重注意力网络中全局和局部注意力模块学习到的特征需要被合并起来以供最终任务使用。这通常通过简单地将两个模块的输出进行融合例如连接或者加权求和操作。这种特征融合使得网络能够综合利用全局和局部信息来完成任务。
通过以上的双重注意力网络架构神经网络可以更有效地利用图像中的全局和局部信息从而在各种计算机视觉任务中取得更好的性能。
2. DoubleAttention代码实现
2.1 将DoubleAttention添加到YOLOv5中 关键步骤一: 将下面代码粘贴到/projects/yolov5-6.1/models/common.py文件中 from torch import nn
import torch
from torch.autograd import Variable
import torch.nn.functional as Fclass DoubleAttentionLayer(nn.Module):Implementation of Double Attention Network. NIPS 2018def __init__(self, in_channels: int, c_m: int, c_n: int, reconstructFalse):Parameters----------in_channelsc_mc_nreconstruct: bool whether to re-construct output to have shape (B, in_channels, L, R)super(DoubleAttentionLayer, self).__init__()self.c_m c_mself.c_n c_nself.in_channels in_channelsself.reconstruct reconstructself.convA nn.Conv2d(in_channels, c_m, kernel_size1)self.convB nn.Conv2d(in_channels, c_n, kernel_size1)self.convV nn.Conv2d(in_channels, c_n, kernel_size1)if self.reconstruct:self.conv_reconstruct nn.Conv2d(c_m, in_channels, kernel_size1)def forward(self, x: torch.Tensor):Parameters----------x: torch.Tensor of shape (B, C, H, W)Returns-------batch_size, c, h, w x.size()assert c self.in_channels, input channel not equal!A self.convA(x) # (B, c_m, h, w) because kernel size is 1B self.convB(x) # (B, c_n, h, w)V self.convV(x) # (B, c_n, h, w)tmpA A.view(batch_size, self.c_m, h * w)attention_maps B.view(batch_size, self.c_n, h * w)attention_vectors V.view(batch_size, self.c_n, h * w)# softmax on the last dimension to create attention mapsattention_maps F.softmax(attention_maps, dim-1) # 对hxw维度进行softmax# step 1: feature gatheringglobal_descriptors torch.bmm( # attention map(V)和tmpA进行tmpA, attention_maps.permute(0, 2, 1)) # (B, c_m, c_n)# step 2: feature distribution# (B, c_n, h * w) attention on c_n dimension - channel wiseattention_vectors F.softmax(attention_vectors, dim1)tmpZ global_descriptors.matmul(attention_vectors) # B, self.c_m, h * wtmpZ tmpZ.view(batch_size, self.c_m, h, w)if self.reconstruct:tmpZ self.conv_reconstruct(tmpZ)return tmpZ
双重注意力网络的主要过程涉及以下几个关键步骤 输入图像的特征提取 首先输入的图像经过一个预训练的卷积神经网络CNN模型例如ResNet、VGG等以提取图像的特征。这些特征通常是一个高维度的张量表示了图像在不同层次上的抽象特征信息。 全局注意力模块 对于提取的图像特征首先通过全局注意力模块进行处理。这个模块通常包括以下几个步骤 使用全局池化操作如全局平均池化将特征图进行降维得到全局上下文信息。 将降维后的全局特征通过一个全连接网络FCN进行处理以学习全局信息的表示。 使用激活函数如ReLU来增加网络的非线性表示能力。 局部注意力模块 接下来提取的特征经过局部注意力模块的处理。这个模块主要负责捕获图像中的局部信息并结合全局信息进行处理。其主要步骤包括 将特征图分成不同的区域或者使用卷积操作来提取局部特征。 对每个局部特征使用注意力机制计算其与全局信息的相关程度以得到局部的重要性权重。 使用得到的权重对局部特征进行加权合并以得到最终的局部表示。 特征融合 全局和局部模块得到的特征需要被合并起来以供最终任务使用。通常的融合方式包括简单的连接、加权求和或者其他组合方式。这种特征融合能够让网络充分利用全局和局部信息从而提高任务性能。 任务特定的输出 最后融合后的特征被送入一个或多个任务特定的神经网络层例如全连接层或者卷积层以完成具体的任务。这个任务可以是图像分类、目标检测、语义分割等。 2.2 新增yaml文件 关键步骤二在下/projects/yolov5-6.1/models下新建文件 yolov5_DANet.yaml并将下面代码复制进去 # YOLOv5 by Ultralytics, GPL-3.0 license# Parameters
nc: 80 # number of classes
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # 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, DoubleAttentionLayer, [128,3]],[-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, 7], 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, 5], 1, Concat, [1]], # cat backbone P3[-1, 3, C3, [256, False]], # 17 (P3/8-small)[-1, 1, Conv, [256, 3, 2]],[[-1, 15], 1, Concat, [1]], # cat head P4[-1, 3, C3, [512, False]], # 20 (P4/16-medium)[-1, 1, Conv, [512, 3, 2]],[[-1, 11], 1, Concat, [1]], # cat head P5[-1, 3, C3, [1024, False]], # 23 (P5/32-large)[[18, 21, 24], 1, Detect, [nc, anchors]], # Detect(P3, P4, P5)] 温馨提示本文只是对yolov5l基础上添加swin模块如果要对yolov8n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。 # YOLOv5n
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.25 # layer channel multiple# YOLOv5s
depth_multiple: 0.33 # model depth multiple
width_multiple: 0.50 # layer channel multiple# YOLOv5l
depth_multiple: 1.0 # model depth multiple
width_multiple: 1.0 # layer channel multiple# YOLOv5m
depth_multiple: 0.67 # model depth multiple
width_multiple: 0.75 # layer channel multiple# YOLOv5x
depth_multiple: 1.33 # model depth multiple
width_multiple: 1.25 # layer channel multiple
2.3 注册模块 关键步骤三在yolo.py中注册, 大概在260行左右添加 ‘DoubleAttentionLayer’ 2.4 执行程序
在train.py中将cfg的参数路径设置为yolov5_DANet.yaml的路径
建议大家写绝对路径确保一定能找到 运行程序如果出现下面的内容则说明添加成功 3. 完整代码分享
https://pan.baidu.com/s/1z8fKOHrX0-zTRD8QHmBC4w?pwdvi9l
提取码vi9l
4.GFLOPs
关于GFLOPs的计算方式可以查看百面算法工程师 | 卷积基础知识——Convolution
未改进的GFLOPs 改进后的GFLOPs 5. 进阶
你能在不同的位置添加双重注意力机制吗这非常有趣快去试试吧
6. 总结
双重注意力网络是一种用于计算机视觉任务的神经网络架构旨在通过注意力机制有效地捕获图像中的全局和局部信息从而提高任务性能。该网络引入了两个关键的注意力模块分别用于全局和局部信息的关注全局模块通过全局池化操作学习图像的整体语义结构而局部模块则专注于提取图像的局部特征并通过局部感知机制选择最相关的信息。这两个模块学习到的特征最终被融合起来以供任务使用通常通过连接或加权求和的方式进行特征融合。双重注意力网络通过端到端的训练和优化使用适当的损失函数和正则化技术来提高模型的泛化能力和训练稳定性。这种架构使得神经网络能够更全面地利用图像中的全局和局部信息从而在各种计算机视觉任务中取得更好的性能表现。