Convolutional Block Attention Module(CBAM)是一种用于增强卷积神经网络(CNN)特征表示能力的注意力机制模块。以下是对CBAM的详细解释:
CBAM由两个子模块组成:通道注意力模块(Channel Attention Module, CAM)和空间注意力模块(Spatial Attention Module, SAM)。这两个模块可以串联使用,以增强CNN对图像特征的建模和表示能力。
通道注意力模块(Channel Attention Module, CAM)是卷积神经网络(CNN)中用于增强特征表示的一种机制,特别是在处理图像数据时。CAM的核心思想是自适应地调整不同通道的特征响应,以便网络能够更加关注那些对于特定任务(如图像分类、目标检测等)来说更为重要的特征。
CAM通常包含以下几个关键步骤:
全局信息聚合:首先,CAM会对输入特征图进行全局信息聚合,这通常是通过全局平均池化(Global Average Pooling, GAP)和/或全局最大池化(Global Max Pooling, GMP)来实现的。全局平均池化计算每个通道的平均值,而全局最大池化则选择每个通道的最大值。这两种操作都能够提供全局上下文信息,但侧重点不同。
特征变换:聚合后的全局信息会通过一系列变换(如全连接层、1x1卷积层等)来生成通道注意力权重。这些变换旨在捕捉通道间的依赖关系,并生成每个通道的权重值。
激活函数:变换后的特征通常会通过一个激活函数(如Sigmoid或Softmax)来生成最终的通道注意力权重。这些权重值介于0和1之间,表示每个通道的重要性。
特征重标定:最后,生成的通道注意力权重会与原始特征图相乘,实现特征的重标定。这一过程增强了那些对于任务来说更为重要的通道,同时抑制了那些不重要的通道。
CAM的工作原理基于这样一个假设:不同通道的特征图对于任务的贡献是不同的。因此,通过自适应地调整每个通道的权重,CAM能够增强那些对于任务来说更为关键的特征,从而提高网络的性能。
空间注意力模块(Spatial Attention Module,SAM)是一种在神经网络中应用的注意力机制,特别是在处理图像数据时,它能够帮助模型更好地关注输入数据中不同空间位置的重要性。以下是对SAM的详细介绍:
通道注意力模块(CAM):
空间注意力模块(SAM):
"""
Original paper addresshttps: https://arxiv.org/pdf/1807.06521.pdf
Time: 2024-02-28
"""
import torch
from torch import nn
class ChannelAttention(nn.Module):
def __init__(self, in_planes, reduction=16):
super(ChannelAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
# shared MLP
self.mlp = nn.Sequential(
nn.Conv2d(in_planes, in_planes // reduction, 1, bias=False),
nn.ReLU(inplace=True),
nn.Conv2d(in_planes // reduction, in_planes, 1, bias=False)
)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = self.mlp(self.avg_pool(x))
max_out = self.mlp(self.max_pool(x))
out = avg_out + max_out
return self.sigmoid(out)
class SpatialAttention(nn.Module):
def __init__(self, kernel_size=7, padding=3):
super(SpatialAttention, self).__init__()
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)
class CBAM(nn.Module):
def __init__(self, in_planes, reduction=16, kernel_size=7):
super(CBAM, self).__init__()
self.ca = ChannelAttention(in_planes, reduction)
self.sa = SpatialAttention(kernel_size)
def forward(self, x):
out = x * self.ca(x)
result = out * self.sa(out)
return result
if __name__ == '__main__':
block = CBAM(16)
input = torch.rand(1, 16, 8, 8)
output = block(input)
print(output.shape)
CBAM模块广泛应用于各种深度学习模型中,特别是在图像分类、目标检测、图像分割等计算机视觉任务中。通过引入CBAM模块,这些模型可以更加有效地学习图像特征,从而提升性能。
综上所述,CBAM是一种强大的注意力模块,为CNN的性能提升和特征建模提供了重要的工具。它结合了通道和空间注意力机制,能够自适应地调整特征图的权重,以适应不同的任务和场景。
参考: