转载:CBAM


CBAM:Convolutional Block Attention Module
论文地址: https://arxiv.org/pdf/1807.06521.pdf

前言

CBAM是轻量级的卷积块注意力模型,它可以添加到任何CNN架构中,提升模型的性能。它总结了之前做过的关于注意力机制应用到图像领域的工作,链接如下

  1. https://arxiv.org/abs/1704.06904
  2. https://arxiv.org/pdf/1709.01507.pdf
  3. https://arxiv.org/abs/1611.05594

在这里插入图片描述

一、什么是CBAM?

在这里插入图片描述
如图所示,CBAM是针对feature map进行操作的,通过通道注意力模块和空间注意力模块,使提取到的特征更加精炼,提升模型的表现力。

Channel attention module

在这里插入图片描述
通道注意力模块:通道维度不变,压缩空间维度。该模块关注输入图片中有意义的信息(分类任务就关注因为什么分成了不同类别)。

操作流程如下:

输入特征图F,经过两个并行的最大值池化和平均池化将C×H×W的特征图变成C×1×1的大小,然后经过一个Shared MLP(Conv/Linear,ReLU,Conv/Linear),压缩通道数C/r (reduction=16),再扩张回C,得到两个激活后的结果。最后将二者相加再接一个sigmoid得到channel_out,channel_out再乘以最初的输入,大小变回了C×H×W,完成通道注意力操作。

此步骤与SENet不同之处是加了一个并行的最大值池化,提取到的高层特征更全面,更丰富。

Spatial attention module

在这里插入图片描述
空间注意力模块:空间维度不变,压缩通道维度。该模块关注的是目标的位置信息。

操作流程如下:

将上一步得到的结果通过最大值池化和平均池化分成两个大小为H×W×1的张量,然后通过Concat操作将二者堆叠在一起(C为2),再通过卷积操作将通道变为1同时保证H和W不变,经过一个sigmoid得到spatial_out,最后spatial_out乘上一步的输入变回C×H×W,完成空间注意力操作

如果看到这还是没有详细理解流程,那就上一张笔者自己画的CBAM详细的流程图供大家参考:
在这里插入图片描述

二、Pytorch实现CBAM

CBAM模块完整代码:

import torch
import torch.nn as nn

class CBAMLayer(nn.Module):
    def __init__(self,channel,reduction = 16,spatial_kernel = 7):
        super(CBAMLayer,self).__init__()
        
        #channel attention 压缩H,W为1
        self.max_pool = nn.AdaptiveMaxPool2d(1)
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        
        #shared MLP
        self.mlp = nn.Sequential(
            #Conv2d比Linear方便操作
            #nn.Linear(channel, channel // reduction, bias=False)
            nn.Conv2d(channel,channel//reduction,1,bias = False),
            #inplace=True直接替换,节省内存
            nn.ReLU(inplace=True),
            #nn.Linear(channel // reduction, channel,bias=False)
            nn.Conv2d(channel//reduction,channel,1,bias = False)
        )
        
        #spatial attention
        self.conv = nn.Conv2d(2,1,kernel_size = spatial_kernel,
                              padding = spatial_kernel//2,bias=False)
        self.sigmoid = nn.Sigmoid()
    
    def forward(self,x):
        
        max_out = self.mlp(self.max_pool(x))
        avg_out = self.mlp(self.avg_pool(x))
        channel_out = self.sigmoid(max_out+avg_out)
        x = channel_out * x
        
        max_out,_ = torch.max(x,dim = 1,keepdim=True)
        avg_out = torch.mean(x,dim = 1,keepdim=True)
        spatial_out = self.sigmoid(self.conv(torch.cat([max_out,avg_out],dim = 1)))
        x = spatial_out * x
        return x

测试网络结构代码:

x = torch.randn(1,16,64,64)
net = CBAMLayer(16)
y = net.forward(x)
y.shape

总结

在这里插入图片描述
转载于:https://blog.csdn.net/qq_36584673/article/details/116088055?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165206173116782395358120%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165206173116782395358120&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-116088055-null-null.nonecase&utm_term=CBAM&spm=1018.2226.3001.4450

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值