精华内容
下载资源
问答
  • 注意力模块
    千次阅读
    2021-04-06 22:13:56

    通道(时间)注意力模块

    为了汇总空间特征,作者采用了全局平均池化最大池化两种方式来分别利用不同的信息。

    在这里插入图片描述
    输入是一个 H×W×C 的特征 F,

    1. 我们先分别进行一个空间的全局平均池化和最大池化得到两个 1×1×C 的通道描述。
    2. 接着,再将它们分别送入一个两层的神经网络,第一层神经元个数为 C/r,激活函数为 Relu,第二层神经元个数为 C。这个两层的神经网络是共享的。
    3. 然后,再将得到的两个特征相加后经过一个 Sigmoid 激活函数得到权重系数 Mc。
    4. 最后,拿权重系数和原来的特征 F 相乘即可得到缩放后的新特征。
      在这里插入图片描述
      实现代码如下:
    class ChannelAttention(nn.Module):
        def __init__(self, in_planes, rotio=16):
            super(ChannelAttention, self).__init__()
            #两个 1×1×C 的通道描述
            self.avg_pool = nn.AdaptiveAvgPool2d(1)
            self.max_pool = nn.AdaptiveMaxPool2d(1)
            
    		# 两层的神经网络,1x1卷积实现通道降维与升维
            self.sharedMLP = nn.Sequential(
                nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False), nn.ReLU(),
                nn.Conv2d(in_planes // rotio, in_planes, 1, bias=False))
            # 再将得到的两个特征相加后经过一个 Sigmoid 激活函数得到权重系数 Mc
            self.sigmoid = nn.Sigmoid()
    
        def forward(self, x):
            avgout = self.sharedMLP(self.avg_pool(x))
            maxout = self.sharedMLP(self.max_pool(x))
            return self.sigmoid(avgout + maxout)
    

    空间注意力模块

    在通道注意力模块之后,我们再引入空间注意力模块来关注哪里的特征是有意义的。
    在这里插入图片描述
    与通道注意力相似,给定一个 H×W×C 的特征 F’,

    1. 我们先分别进行一个通道维度的平均池化和最大池化得到两个 H×W×1 的通道描述,并将这两个描述按照通道拼接在一起。
    2. 然后,经过一个 7×7 的卷积层,激活函数为 Sigmoid,得到权重系数 Ms。
    3. 最后,拿权重系数和特征 F’ 相乘即可得到缩放后的新特征。

    在这里插入图片描述
    实现代码如下:

    class SpatialAttention(nn.Module):
        def __init__(self, kernel_size=7):
            super(SpatialAttention, self).__init__()
    
            assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
            padding = 3 if kernel_size == 7 else 1
    
    		# avg_out和max_out 进行拼接cat后为两层,输出为一层
            self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
            # 激活函数
            self.sigmoid = nn.Sigmoid()
    
        def forward(self, x):
            avg_out = torch.mean(x, dim=1, keepdim=True)
            max_out, _ = torch.max(x, dim=1, keepdim=True)
            x = torch.cat([avg_out, max_out], dim=1)
            x = self.conv1(x)
            return self.sigmoid(x)
    

    更多相关内容
  • 超强通道注意力模块ECANet

    千次阅读 2021-01-24 11:19:13
    CVPR2020论文阅读——超强通道注意力模块ECANet!论文地址:https://arxiv.org/abs/1910.03151 摘要 最近,通道注意机制已被证明在改善深度卷积神经网络(CNN)的性能方面具有巨大潜力。然而,大多数现有方法...

    CVPR2020论文阅读——超强通道注意力模块ECANet!论文地址:https://arxiv.org/abs/1910.03151

     

    摘要

    最近,通道注意机制已被证明在改善深度卷积神经网络(CNN)的性能方面具有巨大潜力。然而,大多数现有方法致力于开发更复杂的注意模块以实现更好的性能,这不可避免地会增加模型的复杂性。 为了克服性能和复杂性折衷之间的矛盾,本文提出了一种有效的信道注意(ECA)模块,该模块仅包含少量参数,同时带来明显的性能提升。 通过剖析SENet中的通道注意模块,我们从经验上表明避免降维对于学习通道注意很重要,并且适当的跨通道交互可以在保持性能的同时显着降低模型的复杂性。因此,我们提出了一种无需降维的局部跨通道交互策略,该策略可以通过一维卷积有效地实现。 此外,我们提出了一种方法来自适应选择一维卷积的内核大小,确定局部跨通道交互的覆盖范围。提出的ECA模块既有效又有效,例如,针对ResNet50主干的模块参数和计算分别为80 vs. 24.37M4.7e-4 GFLOP3.86 GFLOPTop-1准确性而言提升超过2 我们使用ResNetsMobileNetV2的骨干广泛评估了ECA模块的图像分类,对象检测和实例分割。 实验结果表明,我们的模块效率更高,同时性能优于同类模块。

    1. 简介

    深卷积神经网络(CNN)已在计算机视觉社区中得到广泛使用,并且在图像分类,对象检测和语义分割等广泛的任务中取得了长足的进步。从开创性的AlexNet [17]开始,许多研究 不断研究以进一步改善深层CNN的性能。 近来,将通道注意力并入卷积块中引起了很多兴趣,显示出在性能改进方面的巨大潜力。 代表性的方法之一是挤压和激励网络(SENet[14],它可以学习每个卷积块的通道注意,从而为各种深层CNN架构带来明显的性能提升。

    SENet [14]中设置了压缩(即特征聚合)和激励(即特征重新校准)之后,一些研究通过捕获更复杂的通道相关性或结合额外的空间关注来改善SE块。 尽管这些方法已经实现了更高的精度,但是它们通常带来更高的模型复杂度并承受更大的计算负担。 与前面提到的以更高的模型复杂度为代价实现更好的性能的方法不同,本文重点关注的问题是:是否可以以一种更有效的方式来学习有效的通道注意力机制?

    为了回答这个问题,我们首先回顾一下SENet中的通道注意力模块。 具体而言,给定输入特征,SE块首先为每个通道独立采用全局平均池化,然后使用两个全连接(FC)层以及非线性Sigmoid函数来生成通道权重。 两个FC层旨在捕获非线性跨通道交互,其中涉及降低维度以控制模型的复杂性。 尽管此策略在后续的通道注意力模块中被广泛使用[33139],但我们的经验研究表明,降维会给通道注意力预测带来副作用,并且捕获所有通道之间的依存关系效率不高且不必要。

    因此,本文提出了一种用于深层CNN的有效通道注意(ECA)模块,该模块避免了维度缩减,并有效捕获了跨通道交互。如图2所示,在不降低维度的情况下进行逐通道全局平均池化之后,我们的ECA通过考虑每个通道及其k个近邻来捕获本地跨通道交互 。实践证明,这种方法可以保证效率和有效性。请注意,我们的ECA可以通过大小为k的快速一维卷积有效实现,其中内核大小k代表本地跨通道交互的覆盖范围,即有多少个相近邻参与一个通道的注意力预测。我们提出了一种自适应确定k的方法,其中交互作用的覆盖范围(即内核大小k)与通道维成比例。如图1和表3所示,与骨干模型[11]相比,带有我们的ECA模块(称为ECA-Net)的深层CNN引入了很少的附加参数和可忽略的计算,同时带来了显着的性能提升。例如,对于具有24.37M参数和3.86 GFLOPResNet-50ECA-Net50的附加参数和计算分别为804.7e-4 GFLOP;同时,在Top-1准确性方面,ECA-Net50优于ResNet-50 2.28%。

    1总结了现有的注意力模块,包括通道降维(DR),通道交互和轻量级模型方面,我们可以看到,我们的ECA模块通过避免通道降维,同时以极轻量的方式捕获了不同通道间的交互。 为了评估我们的方法,我们在ImageNet-1K [6]MS COCO [23]上使用不同的深度CNN架构在各种任务中进行了实验。

    本文的主要工作概括如下:(1)解析SE块,并通过经验证明避免降维对于学习有效,适当的不同通道交互对于通道注意力非常重要。 2)基于以上分析,我们尝试通过提出一种有效的通道注意(ECA)来用于深度CNN的极其轻量级的通道注意模块,该模块在增加明显改进的同时,增加了很少的模型复杂性。 3)在ImageNet-1K和MS COCO上的实验结果表明,该方法具有比最新技术更低的模型复杂度,同时具有非常好的竞争性能。

    2. 相关工作

    事实证明,注意力机制是增强深层CNN的潜在手段。 SE-Net [14]首次提出了一种有效的机制来学习通道关注度并实现并有不错的效果。随后,注意力模块的发展可以大致分为两个方向:(1)增强特征聚合; 2)通道和空间注意的结合。具体来说,CBAM [33]使用平均池和最大池来聚合特征。 GSoP [9]引入了二阶池,以实现更有效的特征聚合。 GE [13]探索了使用深度卷积[5]聚合特征的空间扩展。 CBAM [33]scSE [27]使用内核大小为k x k2D卷积计算空间注意力,然后将其与通道注意力结合起来。与非本地(NL)神经网络[32]共享相似的哲学,GCNet [2]开发了一个简化的NL网络并与SE块集成在一起,从而形成了一个用于建模远程依赖性的轻量级模块。 Double Attention NetworksA2-Nets[4]为图像或视频识别的NL块引入了一种新颖的关联函数。双重注意网络(DAN[7]同时考虑了基于NL的信道和空间注意,以进行语义分割。但是,由于它们的高模型复杂性,大多数以上基于NL的注意力模块只能在单个或几个卷积块中使用。显然,所有上述方法都集中于提出复杂的注意力模块以提高性能。与它们不同的是,我们的ECA旨在以较低的模型复杂性来学习有效的通道注意力。

    我们的工作还涉及为轻量级CNN设计的高效卷积。 两种广泛使用的有效卷积是组卷积和深度方向可分离卷积 如表2所示,尽管这些有效的卷积涉及较少的参数,但它们在注意力模块中的作用不大。我们的ECA模块旨在捕获局部跨通道交互,这与通道局部卷积[36]和通道级卷积具有相似之处 [8]; 与它们不同的是,我们的方法研究了具有自适应内核大小的一维卷积来替换通道注意力模块中的FC层。 与分组和深度可分离卷积相比,我们的方法以较低的模型复杂度实现了更好的性能。

    3. 被提出的方法

    在本节中,我们首先回顾了SENet [14]中的通道注意力模块(即SE块)。 然后,通过分析降维和跨通道交互的影响,对SE块进行经验判断。 这激励我们提出ECA模块。 此外,我们提出了一种自适应确定ECA参数的方法,并最终展示了如何将其用于深度CNN

    3.1. Revisiting Channel Attention in SE Block

    3.2. Efficient Channel Attention (ECA) Module

    重新审视SE模块后,我们进行了实证比较,以分析通道降维和跨通道交互对通道注意力学习的影响。 根据这些分析,我们提出了有效的通道注意(ECA)模块。

    3.2.1 Avoiding Dimensionality Reduction

    为了验证其效果,我们将原始SE块与它的三个变体(即SE-Var1SE-Var2SEVar3)进行了比较,它们均不执行降维。如表2所示,SE-Var1不带参数仍然优于原始网络,这表明通道的注意力确实能够提高深层CNN的性能。同时,SE-Var2独立学习每个通道的权重,这比SE块略胜一筹,但涉及的参数较少。这可能表明通道及其权重需要直接关联,而避免降维比考虑非线性通道相关性更为重要。此外,采用单个FC层的SEVar3的性能要优于两个FC层,并且SE块的尺寸减小。以上所有结果清楚地表明,避免降维有助于学习有效的通道注意力。因此,我们提出的ECA模块不降低通道尺寸。

    3.2.2 Local Cross-Channel Interaction

    3.2.3 Coverage of Local Cross-Channel Interaction

    4. 实验

    在本节中,我们使用所提出的方法在ImageNet [6]MS COCO [23]数据集上的大规模图像分类,目标检测和实例分割任务进行评估。 具体来说,我们首先评估内核大小对ECA模块的影响,然后与ImageNet上的最新技术进行比较。 然后,我们使用Faster R-CNN [26]Mask R-CNN [10]RetinaNet [22]验证了ECA-NetMS COCO上的有效性。

    4.1. Implementation Details

    为了评估我们在ImageNet分类上的ECA-Net,我们使用了四个广泛使用的CNN作为骨干模型,包括ResNet-50 [11]ResNet-101 [11]ResNet-512 [11]MobileNetV2 [28]。为了用我们的ECA训练ResNet,我们在[1114]中采用了完全相同的数据扩充和超参数设置。具体地,通过随机水平翻转将输入图像随机裁剪到224 224。网络的参数是通过随机梯度下降(SGD)进行优化的,权重衰减为1e-4,动量为0.9,最小批量大小为256。通过将初始学习率设置为0.1,可以在100epoch内训练所有模型。每30个时代减少10倍。为了用ECA训练MobileNetV2,我们遵循[28]中的设置,其中使用SGD400个纪元内训练网络,权重衰减为4e-5,动量为0.9,最小批量为96。设定了初始学习率到0.045,并以0.98的线性衰减率减小。为了在验证集上进行测试,首先将输入图像的短边调整为256大小,并使用224 x 224的中心裁剪进行评估。

    我们使用Faster R-CNN [26]Mask R-CNN [10]RetinaNet [22]进一步评估我们在MS COCO上的方法,其中ResNet-50ResNet-101以及FPN [21]被用作主干模型。 我们使用MMDetection工具包[3]实现所有检测器,并使用默认设置。具体来说,将输入图像的短边调整为800,然后使用权重衰减为1e-4,动量为0.9和最小的SGD优化所有模型 -批大小为84GPU,每个GPU 2个图像)。 学习率被初始化为0.01,并分别在811epoch后降低了10倍。


    5. 结论

    在本文中,我们专注于为模型复杂度较低的深层CNN学习有效的渠道关注度。 为此,我们提出了一种有效的通道注意力(ECA)模块,该模块通过快速的1D卷积生成通道注意力,其内核大小可以通过通道尺寸的非线性映射来自适应确定。 实验结果表明,我们的ECA是一种极其轻巧的即插即用模块,可提高各种深度CNN架构的性能,包括广泛使用的ResNets和轻巧的MobileNetV2 此外,我们的ECA-Net在对象检测和实例分割任务中表现出良好的概括能力。 将来,我们会将ECA模块应用于更多的CNN架构(例如ResNeXtInception [31]),并进一步研究将ECA与空间关注模块的结合。

    虽然大家喜欢白嫖,但是我依然相信有人打赏,打赏二维码:

    展开全文
  • 卷积注意力模块是一种结合了通道注意力模块(Channel Attention Module)和空间注意力模块(Spatial Attention Module) 两个维度的注意力机制模块。通过这两个模块分别对输入特征图在 通道向和空间向进行自适应地特征...

    卷集注意力模块(CBAM)

    在这里插入图片描述

    为后续YOLOv4网络加入卷集注意力模块,在这里记录一下卷集注意力模块的理解。

    1.卷集注意力模块整体结构

    卷积注意力模块是一种结合了通道注意力模块(Channel Attention Module)和空间注意力模块(Spatial Attention Module) 两个维度的注意力机制模块。通过这两个模块分别对输入特征图在 通道向和空间向进行自适应地特征选择和增强,突出主要特征,抑制无关特征,从而使网络更加关注需要检测目标的内容信息和位置 信息,以提高网络的检测精度。

    在使用 CBAM 时先输入一个特征图𝐹,其通道数为𝐶,且各个 通道特征图的宽和高均分别为𝑊和𝐻。然后 CBAM 使用通道注意 力模块将输入的特征图 F 转换为一维的通道注意力图 A T A_T AT,再将输入的特征图𝐹与 A T A_T AT进行像素级相乘,得到通道向的显著特征图 F T F_T FT, 计算公式如(1.1)。而后使用空间注意力模块将 F T F_T FT转换为二 维的空间注意力图 A K A_K AK,最后将 F T F_T FT A K A_K AK进行像素级相乘得到输出的 特征图 F R F_R FR,计算公式如(1.2)。

    F T = A T ( F ) ⊗ F (1.1) F_T=A_T(F)⊗F \tag{1.1} FT=AT(F)F(1.1) F R = A K ( F T ) ⊗ F T (1.2) F_R=A_K(F_T)⊗F_T \tag{1.2} FR=AK(FT)FT(1.2)
    其中⊗代表像素级相乘,以上过程可表示为下图。
    在这里插入图片描述

    2.通道注意力模块

    在通道注意力模块中,特征图的每一个通道都被认为是一个特征检测器。通道注意力模块关注的是特征在通道间的关系,主要提取输入图像中有意义的内容信息,压缩输入特征图的空间向信息。在CBAM中通道注意力模块同时采用全局平均池化和全局最大池化,其中平均池化反应了全局信息,最大池化反应了特征图中的突出特点,两种不同池化的同时使用可以提取更加丰富的高层次特征。

    在通道注意力模块中对输入的特征图F分别进行最大池化和平均池化,生成两个不同的空间信息描述特征图 F m a x 和 F a v g F_{max}和F_{avg} FmaxFavg,再将这两个特征图送入一个共享网络之中计算得到通道注意力图 A T A_T AT。这里的共享网络由含有一个隐藏层的多层感知机(Multi­layer Perceptron,MLP)构成。最后通过点像素逐位相加将共享网络输出的两个向量融合为 A T A_T AT,计算方法如公式(2.1)所示。
    A T = σ ( A v g P o o l ( F ) ) + M L P ( M a x P o o l ( F ) ) ) = σ ( W 1 ( W 0 ( F a v g ) ) + W 1 ( W 0 ( F m a x ) ) ) (2.1) \begin{aligned} A_T&= \sigma(AvgPool(F))+MLP(MaxPool(F)))\\ & =\sigma(W_1(W_0(F_{avg}))+W_1(W_0(F_{max}))) \end{aligned}\tag{2.1} AT=σ(AvgPool(F))+MLP(MaxPool(F)))=σ(W1(W0(Favg))+W1(W0(Fmax)))(2.1)
    式中σ表示sigmoid函数,MLP为多层感知机,AvgPool与MaxPool分别表示平均池化与最大池化, W 1 W_1 W1 W 0 W_0 W0为多层感知机模型中的参数。以上具体计算过程如下图所示。
    在这里插入图片描述

    3.空间注意力模块

    空间注意力模块关注的是特征在空间上的关系,主要提取输入图像中目标的位置信息,与通道注意力模块相互补充,选择出特征图中目标的内容和位置信息。在CBAM中空间注意力模块在通道注意力模块之后,将通道向的显著特征图F_T在通道的维度上分别进行最大池化和平均池化,得到两个二维特征图 F m a x ′ F^{'}_{max} Fmax F a v g ′ F^{'}_{avg} Favg,再将得到的两个特征图进行拼接,生成特征描述器,从而突出目标区域,计算方法如公式(3.1)
    A K = σ ( C o n v 7 × 7 ( [ M a x P o o l ( F T ) ; A v g P o o l ( F C ) ] ) ) = σ ( C o n v 7 × 7 ( [ F m a x ′ ⋅ F a v g ′ ] ) ) (3.1) \begin{aligned} A_K&= \sigma(Conv_{7\times7}([MaxPool(F_T);AvgPool(F_C)]))\\ & =\sigma(Conv_{7\times7}([F^{'}_{max}\cdot F^{'}_{avg}])) \end{aligned}\tag{3.1} AK=σ(Conv7×7([MaxPool(FT);AvgPool(FC)]))=σ(Conv7×7([FmaxFavg]))(3.1)
    最后,使用一个7×7卷积生成二维空间注意力图 A K A_K AK。上述操作步骤可由下图所示。
    在这里插入图片描述
    下面是实现卷积注意力模块的代码,基于Pytorch来写的,后续可以直接植入到YOLOv4网络中使用

    class BasicConv(nn.Module):
        def __init__(
            self,
            in_planes,
            out_planes,
            kernel_size,
            stride=1,
            padding=0,
            dilation=1,
            groups=1,
            relu=True,
            bn=True,
            bias=False,
        ):
            super(BasicConv, self).__init__()
            self.out_planes = out_planes
            self.conv = nn.Conv2d(
                in_planes,
                out_planes,
                kernel_size=kernel_size,
                stride=stride,
                padding=padding,
                dilation=dilation,
                groups=groups,
                bias=bias,
            )
            self.bn = (
                nn.BatchNorm2d(out_planes, eps=1e-5, momentum=0.01, affine=True)
                if bn
                else None
            )
            self.relu = nn.ReLU() if relu else None
    
        def forward(self, x):
            x = self.conv(x)
            if self.bn is not None:
                x = self.bn(x)
            if self.relu is not None:
                x = self.relu(x)
            return x
    
    
    class Flatten(nn.Module):
        def forward(self, x):
            return x.view(x.size(0), -1)
    
    
    class ChannelGate(nn.Module):
        def __init__(
            self, gate_channels, reduction_ratio=16, pool_types=["avg", "max"]
        ):
            super(ChannelGate, self).__init__()
            self.gate_channels = gate_channels
            self.mlp = nn.Sequential(
                Flatten(),
                nn.Linear(gate_channels, gate_channels // reduction_ratio),
                nn.ReLU(),
                nn.Linear(gate_channels // reduction_ratio, gate_channels),
            )
            self.pool_types = pool_types
    
        def forward(self, x):
            channel_att_sum = None
            for pool_type in self.pool_types:
                if pool_type == "avg":
                    avg_pool = F.avg_pool2d(
                        x, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3))
                    )
                    channel_att_raw = self.mlp(avg_pool)
                elif pool_type == "max":
                    max_pool = F.max_pool2d(
                        x, (x.size(2), x.size(3)), stride=(x.size(2), x.size(3))
                    )
                    channel_att_raw = self.mlp(max_pool)
                elif pool_type == "lp":
                    lp_pool = F.lp_pool2d(
                        x,
                        2,
                        (x.size(2), x.size(3)),
                        stride=(x.size(2), x.size * (3)),
                    )
                    channel_att_raw = self.mlp(lp_pool)
                elif pool_type == "lse":
                    # LSE pool
                    lse_pool = logsumexp_2d(x)
                    channel_att_raw = self.mlp(lse_pool)
    
                if channel_att_sum is None:
                    channel_att_sum = channel_att_raw
                else:
                    channel_att_sum = channel_att_sum + channel_att_raw
            scale = (
                F.sigmoid(channel_att_sum).unsqueeze(2).unsqueeze(3).expand_as(x)
            )
            return x * scale
    
    
    def logsumexp_2d(tensor):
        tensor_flatten = tensor.view(tensor.size(0), tensor.size(1), -1)
        s, _ = torch.max(tensor_flatten, dim=2, keepdim=True)
        outputs = s + (tensor_flatten - s).exp().sum(dim=2, keepdim=True).log()
        return outputs
    
    
    class ChannelPool(nn.Module):
        def forward(self, x):
            return torch.cat(
                (torch.max(x, 1)[0].unsqueeze(1), torch.mean(x, 1).unsqueeze(1)),
                dim=1,
            )
    
    
    class SpatialGate(nn.Module):
        def __init__(self):
            super(SpatialGate, self).__init__()
            kernel_size = 7
            self.compress = ChannelPool()
            self.spatial = BasicConv(
                2,
                1,
                kernel_size,
                stride=1,
                padding=(kernel_size - 1) // 2,
                relu=False,
            )
    
        def forward(self, x):
            x_compress = self.compress(x)
            x_out = self.spatial(x_compress)
            scale = F.sigmoid(x_out)
            return x * scale
    
    
    class CBAM(nn.Module):
        def __init__(
            self,
            gate_channels,
            reduction_ratio=16,
            pool_types=["avg", "max"],
            no_spatial=False,
        ):
            super(CBAM, self).__init__()
            self.ChannelGate = ChannelGate(
                gate_channels, reduction_ratio, pool_types
            )
            self.no_spatial = no_spatial
            if not no_spatial:
                self.SpatialGate = SpatialGate()
    
        def forward(self, x):
            x_out = self.ChannelGate(x)
            if not self.no_spatial:
                x_out = self.SpatialGate(x_out)
            return x_out
    
    展开全文
  • 通道注意力与空间注意力模块

    千次阅读 2022-01-18 11:17:05
    初学通道注意力模块和空间注意力模块简单理解,不涉及详细原理

    通道注意力模块

    在这里插入图片描述
    使用通道注意力模块的目的:为了让输入的图像更有意义,大概理解就是,通过网络计算出输入图像各个通道的重要性(权重),也就是哪些通道包含关键信息就多加关注,少关注没什么重要信息的通道,从而达到提高特征表示能力的目的。

    简而言之:注意力机制可对特征进行校正,校正后的特征可保留有价值的特征,剔除没价值的特征。

    通道注意力机制步骤:

    • 挤压(Squeeze)输入图像

      对输入特征图的空间维度进行压缩,这一步可以通过全局平均池化(GAP)全局最大池化(GMP)(全局平均池化效果相对来说会比最大池化要好),通过这一步。HxWxC的输入图像被压缩成为1x1x``C的通道描述符。下方公式输入为SxSxB的feature map:
      在这里插入图片描述
      ​ 将全局空间信息压缩到通道描述符,既降低了网络参数,也能达到防止过拟合的作用。

    • excitation通道描述符

      这一步主要是将上一步得到的通道描述符送到两个全连接网络中,得到注意力权重矩阵,再与原图做乘法运算得到校准之后的注意力特征图。

    在这里插入图片描述

    空间注意力模块

    在这里插入图片描述
    使用通道注意力的目的:找到关键信息在map上哪个位置上最多,是对通道注意力的补充,简单来说,通道注意力是为了找到哪个通道上有重要信息,而空间注意力则是在这个基础上,基于通道的方向,找到哪一块位置信息聚集的最多。

    空间注意力步骤:

    • 沿着通道轴应用平均池化和最大池操作,然后将它们连接起来生成一个有效的特征描述符。

      注意:池化操作是沿着通道轴进行的,即每次池化时对比的是不同通道之间的数值,而非同一个通道不同区域的数值。

    • 将特征描述符送入一个卷积网络进行卷积,将得到的特征图通过激活函数得到最终的空间注意特征图。

    在这里插入图片描述

    具体来说,使用两个pooling操作聚合成一个feature map的通道信息,生成两个2D图: Fsavg大小为1×H×WFsmax大小为1×H×Wσ表示sigmoid函数,f7×7表示一个滤波器大小为7×7的卷积运算。

    参考链接:

    (1)https://blog.csdn.net/u011984148/article/details/109475440

    (2)https://zhuanlan.zhihu.com/p/334349672

    (3)https://zhuanlan.zhihu.com/p/101590167

    349672

    (3)https://zhuanlan.zhihu.com/p/101590167

    展开全文
  • 本篇文章录用于ECCV2018:CBAM:卷积块注意模块 论文地址:https://arxiv.org/pdf/1807.06521.pdf 非官方代码实现:https://github.com/Youngkl0726/Convolutional-Block-Attention-Module/blob/master/CBAMNet.py ...
  • CBAM——即插即用的注意力模块(附代码)

    千次阅读 多人点赞 2022-04-06 10:09:47
    输入特征,然后是通道注意力模块一维卷积,将卷积结果乘原图,将CAM输出结果作为输入,进行空间注意力模块的二维卷积,再将输出结果与原图相乘。 (1)Channel attention module(CAM) ​ 通道注意力模块:通道维度...
  • 通道注意力模块 通道注意力模块 通道注意力聚焦在“什么”是有意义的输入图像,为了有效计算通道注意力,需要对输入特征图的空间维度进行压缩,对于空间信息的聚合,常用的方法是平均池化。但有人认为,最大池化...
  • 各种图像注意力模块的实现.zip 大学生课程设计 基于python的课程设计 自己大二写的课程设计
  • CVPR2020论文阅读——超强通道注意力模块ECANet!

    万次阅读 热门讨论 2020-07-02 17:11:11
    为了克服性能和复杂性折衷之间的矛盾,本文提出了一种有效的信道注意(ECA)模块,该模块仅包含少量参数,同时带来明显的性能提升。 通过剖析SENet中的通道注意模块,我们从经验上表明避免降维对于学习通道注意很...
  • 导读本文是通道注意力机制的又一重大改进,主要是在通道注意力的基础上,引入多尺度思想,本文主要提出了金字塔分割注意力模块,即PSA module。进一步,基于PSA ,我们将PSA注意力模...
  • ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks(2020)注意力模块比较ECA模块Avoiding Dimensionality Reduction(避免维度减少)Local Cross-Channel Interaction(局部跨通道交互...
  • 在[【深度学习经典网络架构—8】:注意力机制之SE_Block](https://blog.csdn.net/qq_42856191/article/details/123655146?spm=1001.2014.3001.5501)中,我们介绍了CNN的通道注意力模块SE_Block,本次带来的是另一个...
  • 注意力模块比较 纵坐标为准确性,横坐标为模型参数量(复杂度)。 ECA模块 Avoiding Dimensionaluity Reduction SE-Net 在SE-Net中,通道注意力模块通过公式(2)进行降维(简单来说,就是SE-Net模块中的全连接层...
  • 在本文,将介绍另一个基于同样出发点的注意力模块,即Pyramid Split Attention (PSA)。PSA具备即插即用、轻量、简单高效的特点。该模块与ResNet结合,通过PSA替代ResNet的bottleneck中的3x3卷积,组成了EPSANet。 ...
  • 自己在查阅文献的时候,发现了这篇文章,觉得里面提到的SCA和CCA模块很有意思,自己尝试复现出来了,即插即用的模块,用在我的方法中,提点很明显。 import torch from torchvision import models import torch.nn ...
  • 这篇文章探索了通道上的注意力,明确地建模通道间的依赖关系,并提出了一个新颖的模块,称为SE-block。 2、方法 SE的架构如上图所示,简单描述为: 对于一个输入X,其经过卷积之后得到一个feature map(U),对于该...
  • EPSANet:金字塔拆分注意力模块

    千次阅读 2021-06-05 15:00:12
    编辑:Happy 首发:AIWalker 本文是深圳大学&...已有研究表明:将注意力模块嵌入都现有CNN中可以带来显著的性能提升。比如,知名的SENet、BAM、CBAM、ECANet、GCNet、FcaNet等注意力机制均带来了客观的性.
  • 在网络中添加SE通道注意力模块

    千次阅读 2021-11-04 21:44:47
    注意:这个75是要修改的数字,比如我这里用的yolov3,使用的是voc数据集,所以这里应该是3*(4+1+20)=75.如果是两个类别就要改成3*(4+1+2)=21. 第三步: 在网络最后的output地方使用SE模块。 效果: voc数据集...
  • 轻量型注意力模块:ULSAM

    千次阅读 热门讨论 2020-10-10 15:53:56
    作者提出了一种新的用于紧凑网络神经网络的注意力块(ULSAM),它可以学习每个特征子空间的个体注意力映射,并能够在多尺度、多频率特征学习的同时高效地学习跨信道信息。 主要思想:将提取的特征分成g组,对每组的子...
  • 用matlab实现注意力机制模块
  • SEnet注意力机制.py

    2021-08-05 19:37:07
    Keras实现SEnet注意力机制模块
  • 原文:EPSANet: An Efficient Pyramid...论文在CenterNet基础上增加通道注意力,所以基于CenterNet代码进行了修改,由于CenterNet有三种主干网络(hourglass、ResNet、 DLA),此文针对的是基于ResNet骨干网络的Cent...
  • 在这项工作中,我们提出了一种新颖的基于归一化的注意力模块(NAM),它抑制了不太显着的权重。 它将权重稀疏惩罚应用于注意力模块,从而使它们在保持相似性能的同时具有更高的计算效率。 与 Resnet 和 Mobilenet ...
  • 提出CBAM的作者主要对分类网络和目标检测网络进行了实验,证明了CBAM模块确实是有效的。 以ResNet为例,论文中提供了改造的示意图,如下图所示: 在ResNet中的每个block中添加了CBAM模块,训练数据来自...
  • 注册表是用来干什么的? MMDection的所有功能都是基于注册器来实现的。注册器的使用目的是为了在算法训练、调参中通过直接更改配置文件(超参数,如学习率等),完成对整个网络的修改。注册器在这期间可以帮助... ... All
  • Keras复现CBAM注意力模块

    千次阅读 热门讨论 2020-09-23 17:52:04
    CBAM注意力机制模块介绍2.模块复现2.1 TensorFlow 2.0 卷积神经网络实战书上的代码(tf与keras混合的代码)2.2 Keras代码复现2.3 测试3. 知识点补充3.1 全局平均/最大池化3.2 Keras构建模型 1. CBAM注意力机制模块...
  • 论文主要是提出了一种轻量级的注意力模块,同时在空间和通道上进行特征的attention,可以加到现有的模型中,提升CNN网络的表达能力 CBAM 包含两个子模块,分别是 channel attention 模块和spatial attention 模块...
  • 很多工作中也都主要关注空间维度上的注意力,而这篇文章要做的事情就是建模特征通道维度上的注意力,起到特征校准的功能(feature recalibration):加强有用的特征 + 抑制无用的特征。 主要的操作如上图所示:先对...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 194,801
精华内容 77,920
关键字:

注意力模块

友情链接: PhoneBook.rar