您的位置:首页 > 财经 > 金融 > 中国著名十大vi设计案例_什么软件制作图片_个人网页制作成品_百度快速收录网站

中国著名十大vi设计案例_什么软件制作图片_个人网页制作成品_百度快速收录网站

2024/12/23 10:06:36 来源:https://blog.csdn.net/qq_42591591/article/details/142584017  浏览:    关键词:中国著名十大vi设计案例_什么软件制作图片_个人网页制作成品_百度快速收录网站
中国著名十大vi设计案例_什么软件制作图片_个人网页制作成品_百度快速收录网站

一、本文介绍

本文记录的是基于Shuffle Attention注意力模块的YOLOv10目标检测改进方法研究Shuffle Attention模块通过独特的设计原理,在保持轻量级的同时实现了高效的特征注意力机制,增强了网络的表示能力。本文对YOLOv10C2f模块进行二次创新,以增强模型性能。

文章目录

  • 一、本文介绍
  • 二、Shuffle Attention注意力原理
    • 2.1、设计原理
    • 2.2、优势
  • 三、Shuffle Attention的实现代码
  • 四、添加步骤
    • 4.1 改进点1
    • 4.2 改进点2⭐
  • 五、添加步骤
    • 5.1 修改ultralytics/nn/modules/block.py
    • 5.2 修改ultralytics/nn/modules/__init__.py
    • 5.3 修改ultralytics/nn/modules/tasks.py
  • 六、yaml模型文件
    • 6.1 模型改进版本一
    • 6.2 模型改进版本二⭐
  • 七、成功运行结果


二、Shuffle Attention注意力原理

深度卷积神经网络的Shuffle Attention

Shuffle Attention(SA)模块是一种用于深度卷积神经网络的高效注意力模块,其设计原理和优势如下:

2.1、设计原理

  1. 特征分组(Feature Grouping):对于给定的特征图 X ∈ R C × H × W X \in R^{C \times H \times W} XRC×H×W(其中 C C C H H H W W W分别表示通道数、空间高度和宽度),SA首先沿着通道维度将 X X X分为 G G G组,即 X = [ X 1 , ⋯ , X G ] X = [X_1, \cdots, X_G] X=[X1,,XG] X k ∈ R C G × H × W X_k \in R^{\frac{C}{G} \times H \times W} XkRGC×H×W。在每个注意力单元开始时, X k X_k Xk的输入沿着通道维度被拆分为两个分支 X k 1 X_{k1} Xk1 X k 2 X_{k2} Xk2 X k 1 , X k 2 ∈ R C 2 G × H × W X_{k1}, X_{k2} \in R^{\frac{C}{2G} \times H \times W} Xk1,Xk2R2GC×H×W)。一个分支用于通过利用通道间的相互关系来生成通道注意力图,另一个分支用于通过利用特征的空间间关系来生成空间注意力图,从而使模型能够关注“什么”和“哪里”是有意义的。
  2. 通道注意力(Channel Attention):为了充分捕获通道间的依赖关系,SA使用全局平均池化(GAP)来生成通道级别的统计信息 s ∈ R C 2 G × 1 × 1 s \in R^{\frac{C}{2G} \times 1 \times 1} sR2GC×1×1,即 s = F g p ( X k 1 ) = 1 H × W ∑ i = 1 H ∑ j = 1 W X k 1 ( i , j ) s = \mathcal{F}_{gp}(X_{k1}) = \frac{1}{H \times W} \sum_{i = 1}^{H} \sum_{j = 1}^{W} X_{k1}(i, j) s=Fgp(Xk1)=H×W1i=1Hj=1WXk1(i,j)。然后,通过一个简单的带有sigmoid激活的门控机制创建一个紧凑的特征,以实现精确和自适应的选择指导。通道注意力的最终输出通过 X k 1 ′ = σ ( F c ( s ) ) ⋅ X k 1 = σ ( W 1 s + b 1 ) ⋅ X k 1 X_{k1}' = \sigma(\mathcal{F}_{c}(s)) \cdot X_{k1} = \sigma(W_1 s + b_1) \cdot X_{k1} Xk1=σ(Fc(s))Xk1=σ(W1s+b1)Xk1获得,其中 W 1 ∈ R C 2 G × 1 × 1 W_1 \in R^{\frac{C}{2G} \times 1 \times 1} W1R2GC×1×1 b 1 ∈ R C 2 G × 1 × 1 b_1 \in R^{\frac{C}{2G} \times 1 \times 1} b1R2GC×1×1是用于缩放和移动 s s s的参数。
  3. 空间注意力(Spatial Attention):与通道注意力不同,空间注意力关注“哪里”是信息丰富的部分,这与通道注意力是互补的。首先,使用组归一化(GN) X k 2 X_{k2} Xk2进行处理以获得空间级别的统计信息,然后采用 F c ( ⋅ ) Fc(\cdot) Fc()来增强 X ^ k 2 \hat{X}_{k2} X^k2的表示。空间注意力的最终输出通过 X k 2 ′ = σ ( W 2 ⋅ G N ( X k 2 ) + b 2 ) ⋅ X k 2 X_{k2}' = \sigma(W_2 \cdot GN(X_{k2}) + b_2) \cdot X_{k2} Xk2=σ(W2GN(Xk2)+b2)Xk2获得,其中 W 2 W_2 W2 b 2 b_2 b2是形状为 R C 2 G × 1 × 1 R^{\frac{C}{2G} \times 1 \times 1} R2GC×1×1的参数。
  4. 聚合(Aggregation):之后,所有子特征被聚合。最后,类似于ShuffleNet v2,采用“通道洗牌”(channel shuffle)操作来实现跨组信息在通道维度上的流动。

在这里插入图片描述

2.2、优势

  1. 轻量级且高效SA模块通过将通道维度分组为子特征,并利用Shuffle Unit为每个子特征集成互补的通道和空间注意力模块,参数和计算量相对较少。例如,在ResNet50中,SA的参数为300,计算量为2.76e - 3 GFLOPs,而ResNet50的参数为25.56M,计算量为4.12 GFLOPs,但SA在Top - 1准确率上的提升超过了1.34%。
  2. 增强语义表示:通过特征分组和通道洗牌,SA能够显著增强特征图的语义表示。实验表明,在使用SA模块后,Top - 1准确率统计上有所提高,并且“通道洗牌”使得每个组的平均得分增加(约0.4%)。
  3. 验证有效性:通过对不同深度的平均激活分布的观察以及使用GradCAM进行可视化,验证了SA模块能够使分类模型更关注相关区域,从而有效提高分类准确率。
  4. 在各种任务中表现出色:在ImageNet - 1k分类、MS COCO对象检测和实例分割等任务的实验中,SA相比于当前的SOTA方法,在实现更高准确率的同时具有更低的模型复杂度,验证了其在各种计算机视觉任务中具有良好的泛化能力。

论文:https://arxiv.org/pdf/2102.00240
源码:https://github.com/wofmanaf/SA-Net

三、Shuffle Attention的实现代码

Shuffle Attention模块的实现代码如下:

from torch.nn.parameter import Parameter
from torch.nn import initclass ShuffleAttention(nn.Module):def __init__(self, channel=512, reduction=16, G=8):super().__init__()self.G = Gself.channel = channelself.avg_pool = nn.AdaptiveAvgPool2d(1)self.gn = nn.GroupNorm(channel // (2 * G), channel // (2 * G))self.cweight = Parameter(torch.zeros(1, channel // (2 * G), 1, 1))self.cbias = Parameter(torch.ones(1, channel // (2 * G), 1, 1))self.sweight = Parameter(torch.zeros(1, channel // (2 * G), 1, 1))self.sbias = Parameter(torch.ones(1, channel // (2 * G), 1, 1))self.sigmoid = 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)@staticmethoddef channel_shuffle(x, groups):b, c, h, w = x.shapex = x.reshape(b, groups, -1, h, w)x = x.permute(0, 2, 1, 3, 4)# flattenx = x.reshape(b, -1, h, w)return xdef forward(self, x):b, c, h, w = x.size()# group into subfeaturesx = x.view(b * self.G, -1, h, w)  # bs*G,c//G,h,w# channel_splitx_0, x_1 = x.chunk(2, dim=1)  # bs*G,c//(2*G),h,w# channel attentionx_channel = self.avg_pool(x_0)  # bs*G,c//(2*G),1,1x_channel = self.cweight * x_channel + self.cbias  # bs*G,c//(2*G),1,1x_channel = x_0 * self.sigmoid(x_channel)# spatial attentionx_spatial = self.gn(x_1)  # bs*G,c//(2*G),h,wx_spatial = self.sweight * x_spatial + self.sbias  # bs*G,c//(2*G),h,wx_spatial = x_1 * self.sigmoid(x_spatial)  # bs*G,c//(2*G),h,w# concatenate along channel axisout = torch.cat([x_channel, x_spatial], dim=1)  # bs*G,c//G,h,wout = out.contiguous().view(b, -1, h, w)# channel shuffleout = self.channel_shuffle(out, 2)return out

四、添加步骤

4.1 改进点1

模块改进方法1️⃣:直接加入ShuffleAttention模块
ShuffleAttention模块添加后如下:

在这里插入图片描述

注意❗:在5.2和5.3小节中需要声明的模块名称为:ShuffleAttention

4.2 改进点2⭐

模块改进方法2️⃣:基于ShuffleAttention模块C2f

相较方法一中的直接插入注意力模块,利用注意力模块对卷积等其他模块进行改进,其新颖程度会更高一些,训练精度可能会表现的更高。

第二种改进方法是对YOLOv10中的C2f模块进行改进,Shuffle Attention模块能够关注特征的空间和通道维度的依赖关系,在与C2f模块结合可以更全面地提取和强调重要特征,从而增强特征提取的效果。

改进代码如下:

class C2f_SA(nn.Module):"""Faster Implementation of CSP Bottleneck with 2 convolutions."""def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):"""Initialize CSP bottleneck layer with two convolutions with arguments ch_in, ch_out, number, shortcut, groups,expansion."""super().__init__()self.c = int(c2 * e)  # hidden channelsself.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))self.att = ShuffleAttention(c2)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.att(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.att(self.cv2(torch.cat(y, 1)))

在这里插入图片描述

注意❗:在5.2和5.3小节中需要声明的模块名称为:C2f_SA


五、添加步骤

5.1 修改ultralytics/nn/modules/block.py

此处需要修改的文件是ultralytics/nn/modules/block.py

block.py中定义了网络结构的通用模块,我们想要加入新的模块就只需要将模块代码放到这个文件内即可。

ShuffleAttentionC2f_SA模块代码添加到此文件下。

5.2 修改ultralytics/nn/modules/init.py

此处需要修改的文件是ultralytics/nn/modules/__init__.py

__init__.py文件中定义了所有模块的初始化,我们只需要将block.py中的新的模块命添加到对应的函数即可。

ShuffleAttentionC2f_SAblock.py中实现,所有要添加在from .block import

from .block import (C1,C2,...ShuffleAttention,C2f_SA
)

在这里插入图片描述

5.3 修改ultralytics/nn/modules/tasks.py

tasks.py文件中,需要在两处位置添加各模块类名称。

首先:在函数声明中引入ShuffleAttentionC2f_SA

在这里插入图片描述

在这里插入图片描述

其次:在parse_model函数中注册ShuffleAttentionC2f_SA模块

在这里插入图片描述

在这里插入图片描述


六、yaml模型文件

6.1 模型改进版本一

在代码配置完成后,配置模型的YAML文件。

此处以ultralytics/cfg/models/v10/yolov10m.yaml为例,在同目录下创建一个用于自己数据集训练的模型文件yolov10m-SA.yaml

yolov10m.yaml中的内容复制到yolov10m-SA.yaml文件下,修改nc数量等于自己数据中目标的数量。
在骨干网络中添加ShuffleAttention模块,即下方代码中的第45行,只需要填入一个参数,通道数

📌 Shuffle Attention模块能够有效地捕捉特征的空间和通道维度的依赖关系,从而使模型更加关注输入中相关的元素。在骨干网络的最后一层添加该模块,可以对高层特征进行重新校准,突出重要特征,抑制不重要的特征,提高特征的表达能力。

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 1 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs# YOLOv8.0n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, SCDown, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, SCDown, [1024, 3, 2]] # 7-P5/32- [-1, 3, C2fCIB, [1024, True]]- [-1, 1, ShuffleAttention, [1024]]- [-1, 1, SPPF, [1024, 5]] # 10- [-1, 1, PSA, [1024]] # 11# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 14- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 17 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 14], 1, Concat, [1]] # cat head P4- [-1, 3, C2fCIB, [512, True]] # 20 (P4/16-medium)- [-1, 1, SCDown, [512, 3, 2]]- [[-1, 11], 1, Concat, [1]] # cat head P5- [-1, 3, C2fCIB, [1024, True]] # 23 (P5/32-large)- [[17, 20, 23], 1, v10Detect, [nc]] # Detect(P3, P4, P5)

6.2 模型改进版本二⭐

此处同样以ultralytics/cfg/models/v10/yolov10m.yaml为例,在同目录下创建一个用于自己数据集训练的模型文件yolov10m-C2f_SA.yaml

yolov10m.yaml中的内容复制到yolov10m-C2f_SA.yaml文件下,修改nc数量等于自己数据中目标的数量。

📌 模型的修改方法是将骨干网络中的所有C2f模块替换成C2f_SA模块

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 1 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'# [depth, width, max_channels]m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs# YOLOv8.0n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 3, C2f_SA, [128, True]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 6, C2f_SA, [256, True]]- [-1, 1, SCDown, [512, 3, 2]] # 5-P4/16- [-1, 6, C2f_SA, [512, True]]- [-1, 1, SCDown, [1024, 3, 2]] # 7-P5/32- [-1, 3, C2fCIB, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9- [-1, 1, PSA, [1024]] # 10# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 3, C2f, [512]] # 13- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 3, C2f, [256]] # 16 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]] # cat head P4- [-1, 3, C2fCIB, [512, True]] # 19 (P4/16-medium)- [-1, 1, SCDown, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]] # cat head P5- [-1, 3, C2fCIB, [1024, True]] # 22 (P5/32-large)- [[16, 19, 22], 1, v10Detect, [nc]] # Detect(P3, P4, P5)

七、成功运行结果

分别打印网络模型可以看到ShuffleAttention模块C2f_SA已经加入到模型中,并可以进行训练了。

YOLOv10m-SA

                   from  n    params  module                                       arguments                     0                  -1  1      1392  ultralytics.nn.modules.conv.Conv             [3, 48, 3, 2]                 1                  -1  1     41664  ultralytics.nn.modules.conv.Conv             [48, 96, 3, 2]                2                  -1  2    111360  ultralytics.nn.modules.block.C2f             [96, 96, 2, True]             3                  -1  1    166272  ultralytics.nn.modules.conv.Conv             [96, 192, 3, 2]               4                  -1  4    813312  ultralytics.nn.modules.block.C2f             [192, 192, 4, True]           5                  -1  1     78720  ultralytics.nn.modules.block.SCDown          [192, 384, 3, 2]              6                  -1  4   3248640  ultralytics.nn.modules.block.C2f             [384, 384, 4, True]           7                  -1  1    228672  ultralytics.nn.modules.block.SCDown          [384, 576, 3, 2]              8                  -1  2   1689984  ultralytics.nn.modules.block.C2fCIB          [576, 576, 2, True]           9                  -1  1       216  ultralytics.nn.modules.block.ShuffleAttention[576, 576]                    10                  -1  1    831168  ultralytics.nn.modules.block.SPPF            [576, 576, 5]                 11                  -1  1   1253088  ultralytics.nn.modules.block.PSA             [576, 576]                    12                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          13             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           14                  -1  2   1993728  ultralytics.nn.modules.block.C2f             [960, 384, 2]                 15                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          16             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           17                  -1  2    517632  ultralytics.nn.modules.block.C2f             [576, 192, 2]                 18                  -1  1    332160  ultralytics.nn.modules.conv.Conv             [192, 192, 3, 2]              19            [-1, 14]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           20                  -1  2    831744  ultralytics.nn.modules.block.C2fCIB          [576, 384, 2, True]           21                  -1  1    152448  ultralytics.nn.modules.block.SCDown          [384, 384, 3, 2]              22            [-1, 11]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           23                  -1  2   1911168  ultralytics.nn.modules.block.C2fCIB          [960, 576, 2, True]           24        [17, 20, 23]  1   2282134  ultralytics.nn.modules.head.v10Detect        [1, [192, 384, 576]]          
YOLOv10m-SA summary: 502 layers, 16485502 parameters, 16485486 gradients, 64.0 GFLOPs

YOLOv10m-C2f_SA

                   from  n    params  module                                       arguments                     0                  -1  1      1392  ultralytics.nn.modules.conv.Conv             [3, 48, 3, 2]                 1                  -1  1     41664  ultralytics.nn.modules.conv.Conv             [48, 96, 3, 2]                2                  -1  2    130248  ultralytics.nn.modules.block.C2f_SA          [96, 96, True]                3                  -1  1    166272  ultralytics.nn.modules.conv.Conv             [96, 192, 3, 2]               4                  -1  4   1037088  ultralytics.nn.modules.block.C2f_SA          [192, 192, True]              5                  -1  1     78720  ultralytics.nn.modules.block.SCDown          [192, 384, 3, 2]              6                  -1  4   4138560  ultralytics.nn.modules.block.C2f_SA          [384, 384, True]              7                  -1  1    228672  ultralytics.nn.modules.block.SCDown          [384, 576, 3, 2]              8                  -1  2   1689984  ultralytics.nn.modules.block.C2fCIB          [576, 576, 2, True]           9                  -1  1    831168  ultralytics.nn.modules.block.SPPF            [576, 576, 5]                 10                  -1  1   1253088  ultralytics.nn.modules.block.PSA             [576, 576]                    11                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          12             [-1, 6]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           13                  -1  2   1993728  ultralytics.nn.modules.block.C2f             [960, 384, 2]                 14                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          15             [-1, 4]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           16                  -1  2    517632  ultralytics.nn.modules.block.C2f             [576, 192, 2]                 17                  -1  1    332160  ultralytics.nn.modules.conv.Conv             [192, 192, 3, 2]              18            [-1, 13]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           19                  -1  2    831744  ultralytics.nn.modules.block.C2fCIB          [576, 384, 2, True]           20                  -1  1    152448  ultralytics.nn.modules.block.SCDown          [384, 384, 3, 2]              21            [-1, 10]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           22                  -1  2   1911168  ultralytics.nn.modules.block.C2fCIB          [960, 576, 2, True]           23        [16, 19, 22]  1   2282134  ultralytics.nn.modules.head.v10Detect        [1, [192, 384, 576]]          
YOLOv10m-C2f_SA summary: 597 layers, 17617870 parameters, 17617854 gradients, 70.7 GFLOPs

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com