計算機視覺注意力網絡(三)——CBAM [ECCV 2018]

CBAM: Convolutional Block Attention Module

論文地址https://arxiv.org/abs/1807.06521
PyTorch代碼https://github.com/luuuyi/CBAM.PyTorch


在這裏插入圖片描述
CBAM(Convolutional Block Attention Module)結合了通道注意力空間注意力兩個維度的注意力機制。CBAM通過學習的方式自動獲取每個特徵通道的重要程度,和SEnet類似。此外還通過類似的學習方式自動獲取每個特徵空間的重要程度。並且利用得到的重要程度來提升特徵並抑制對當前任務不重要的特徵

通道注意力

在這裏插入圖片描述
CBAM提取特徵通道注意力的方式基本和SEnet類似,如下ChannelAttention中的代碼所示,在SENet的基礎上增加了max_pool的特徵提取方式,最終的輸出結果是將平均池化的結果與最大池化的結果相加輸出。將通道注意力提取厚的特徵作爲空間注意力模塊的輸入。

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.fc1   = nn.Conv2d(in_planes, in_planes / 16, 1, bias=False)
        self.relu1 = nn.ReLU()
        self.fc2   = nn.Conv2d(in_planes / 16, in_planes, 1, bias=False)

        self.sigmoid = nn.Sigmoid()

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

空間注意力

CBAM提取特徵空間注意力的方式:經過通道注意力後,最終將經過通道重要性選擇後的特徵圖送入特徵空間注意力模塊,和通道注意力模塊類似,空間注意力是以通道爲單位進行最大和平均遲化,並將兩者的結果進行concat,之後再一個卷積降成1wh1*w*h的特徵圖空間權重,再將該權重和輸入特徵進行點積,從而實現空間注意力機制。
在這裏插入圖片描述
CBAM的實現代碼如下:

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

        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)

整體結構

在這裏插入圖片描述
整體過程也很簡單,主要就是如下步驟:

  1. 進入類似SENet類似操作的通道注意力模塊,提取各層特徵重要程度;
  2. 將獲取通道注意力與輸入特徵進行相乘操作,計算新的特徵;
  3. 進入空間注意力模塊,提取各個空間特徵重要程度;
  4. 將空間注意力與特徵進行相應卷積操作;
  5. 將原特徵信息與現有特徵信息進行融合。

整體框架代碼如下:

class BasicBlock(nn.Module):
    expansion = 1
    def __init__(self, inplanes, planes, stride=1, downsample=None):
        super(BasicBlock, self).__init__()
        self.conv1 = conv3x3(inplanes, planes, stride)
        self.bn1 = nn.BatchNorm2d(planes)
        self.relu = nn.ReLU(inplace=True)
        self.conv2 = conv3x3(planes, planes)
        self.bn2 = nn.BatchNorm2d(planes)
        self.ca = ChannelAttention(planes)
        self.sa = SpatialAttention()
        self.downsample = downsample
        self.stride = stride
    def forward(self, x):
        residual = x
        out = self.conv1(x)
        out = self.bn1(out)
        out = self.relu(out)
        out = self.conv2(out)
        out = self.bn2(out)
        out = self.ca(out) * out  # 廣播機制
        out = self.sa(out) * out  # 廣播機制
        if self.downsample is not None:
            residual = self.downsample(x)
        out += residual
        out = self.relu(out)
        return out	

參數解析

1. 通道注意力

在這裏插入圖片描述
論文比較了3種不同的渠道關注:平均池化,最大池化,以及兩個池化的聯合使用。注意,帶有平均池的通道注意模塊與SENet模塊相同。此外,在使用這兩個池時,使用一個共享的MLP進行注意推斷來保存參數,因爲這兩個聚合的通道特徵都位於同一語義嵌入空間。在本實驗中,我們只使用信道注意模塊,並將衰減比定爲16,沒有進行修改。各種池化方法的實驗結果如表1所示。我們觀察到最大彙集的特徵和平均彙集的特徵一樣有意義,比較了從基線提高的準確性。共享網絡的輸出通過按元素進行求和進行合併。我們的經驗表明,我們的通道注意方法是一個有效的方法,以推動性能進一步遠離SE[28]沒有額外的可學習參數。
在這裏插入圖片描述

2. 空間注意力

在這裏插入圖片描述
論文設計探索了一種計算空間注意的有效方法。設計理念與渠道注意分支對稱。爲了生成一個二維空間注意力地圖。

  1. 首先計算一個二維描述特徵圖,該特徵圖編碼所有空間位置上每個像素的信道信息。
  2. 然後對二維描述特徵圖應用一個卷積層,得到原始的注意圖。
  3. 最後的注意力圖用Sigmoid函數歸一化
    在這裏插入圖片描述

對通道數進行降維存在兩種方法:

  1. 在通道維度上使用平均池化與最大值池化,將多通道特徵壓縮爲兩個通道。
  2. 通過111*1卷積核將多個通道的特徵轉換爲一個通道空間特徵圖。

降維以後,將兩個通道變爲一個通道時,論文采用了不用的卷積覈對特徵進行卷積,最終發現使用卷積核大小爲7的效果優於卷積核大小爲3的效果。因爲卷積核大小爲7時,卷積核會具有更大的感受野,更加便於觀察空間中需要注意的部分。

3. 通道注意力與空間注意力前後順序

在這裏插入圖片描述

文中比較了三種不同的通道和空間注意子模塊的排列方式:通道注意力-空間注意力空間注意力-通道注意力,以及兩種注意力子模塊的平行使用。由於每個模塊的功能不同,其順序可能會影響整體性能。例如,從空間的角度來看,通道注意力是全局應用的,而空間注意力是局部工作的。此外,可以結合兩種注意力輸出來構建一個3D注意力特徵圖。在這種情況下,兩個注意模塊可以並行應用,然後將兩個注意模塊的輸出相加,用Sigmoid函數進行歸一化。
表3總結了不同注意安排方法的實驗結果。從結果中,我們可以發現,按順序生成一個注意力圖比並行生成一個更好的注意力圖。此外,通道一階的性能略優於空間一階。請注意,所有的安排方法都優於單獨使用通道注意力,這表明利用兩個注意力是至關重要的,而最佳的安排策略進一步推動性能。

4. 整體設對比

在這裏插入圖片描述
文中設計了通道注意模塊,空間注意模塊,以及兩個模塊的排列。最後的模塊如圖1和圖2所示:通道注意模塊和空間注意模塊都選擇了平均和最大pooling;在空間注意模塊中,我們採用核大小爲7的卷積;我們按順序排列通道和空間子模塊。(也就是我們最後的模塊。ResNet50 + CBAM)的top-1 error爲22.66%,遠低於SE[28](即如表4所示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章