天天看點

注意力機制--CBAM

注意力機制CBAM

    • 簡介
            • 目的
    • 算法流程圖
    • 代碼
    • 實驗
          • 最後

簡介

2018年ECCV,和BAM為同一團隊打造。論文連接配接:CBAM

Convolutional Block Attention Module.

CBAM是輕量級注意力機制子產品,不僅參數量和計算量小,而且能即插即用。

目的

對中間特征圖從空間、通道兩個次元上進行特征重構,無縫銜接到CNN中,實作端到端的訓練。

算法流程圖

注意力機制--CBAM

首先,利用通道注意力機制對輸入特征圖進行特征重構,然後利用空間注意力機制對重構後的特征圖在進行重構,等到最後的特征圖。

step1:CBAM通道注意力操作:

注意力機制--CBAM

輸入特征圖 F F F經過全局平均池化和全局最大池化,分别得到一維特征向量;兩個特征向量經過一個權值共享的MLP,然後再進行權值相加,最後記過sigmoid激活函數得到通道注意力機制 M c M_c Mc​。

詳細計算公式如下:

注意力機制--CBAM

step2:CBAM空間注意力操作:

注意力機制--CBAM

輸入特征圖 F ′ F' F′在通道次元上經過全局平均池化和全局最大池化,分别得到size與 F ′ F' F′相同,通道數為1的兩個特征圖;然後将兩個特征圖進行concat,再利用一個7*7的卷積核進行卷積操作,最後經過sigmoid激活函數得到空間注意力向量 M s M_s Ms​。

詳細計算公式如下:

注意力機制--CBAM

最後将 F ′ F' F′與注意力向量 M s M_s Ms​相乘,得到最後的Refine Feature。

代碼

代碼粘貼自github。CBAM

位址:https://github.com/luuuyi/CBAM.PyTorch/blob/master/model/resnet_cbam.py

class ChannelAttention(nn.Module):
    def __init__(self, in_planes, ratio=16):
        super(ChannelAttention, self).__init__()
        self.avg_pool = nn.AdaptiveAvgPool2d(1)
        self.max_pool = nn.AdaptiveMaxPool2d(1)
           
        self.fc = nn.Sequential(nn.Conv2d(in_planes, in_planes // 16, 1, bias=False),
                               nn.ReLU(),
                               nn.Conv2d(in_planes // 16, in_planes, 1, bias=False))
        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        avg_out = self.fc(self.avg_pool(x))
        max_out = self.fc(self.max_pool(x))
        out = avg_out + max_out
        return self.sigmoid(out)

class SpatialAttention(nn.Module):
    def __init__(self, kernel_size=7):
        super(SpatialAttention, self).__init__()

        self.conv1 = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, 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)
           

實驗

作者進行了大量的實驗進行驗證:

通道注意力上消融實驗:

注意力機制--CBAM

通過上述實驗可以看出,通道注意力中同時使用平均池化金額最大池化,在參數量與浮點數運算量上無明顯增加,但錯誤率更低。

空間注意力上消融實驗:

注意力機制--CBAM

通過上述實驗可以看出,同時使用最大池化和平均池化,且卷積核尺寸為7*7時效果最好,且參數量與運算量差異性很小。

空間注意力、通道注意力組合方式實驗:

注意力機制--CBAM

作者進行了多種不同的組合嘗試,通過實驗發現先通道再空間的串聯方式是效果最好的。

此外

作者還進行了許多的對比實驗,這裡不過多闡述。

最後

簡單進行記錄,如有問題請大家指正。

繼續閱讀