細粒度圖像分類論文閱讀筆記
- 摘要
- Abstract
- 1. 用于細粒度圖像分類的聚合注意力模塊
- 1.1 文獻摘要
- 1.2 研究背景
- 1.3 本文創新點
- 1.4 計算機視覺中的注意力機制
- 1.5 模型方法
- 1.5.1 聚合注意力模塊
- 1.5.2 通道注意力模塊
- 通道注意力代碼實現
- 1.5.3 空間注意力模塊
- 空間注意力代碼實現
- 1.5.4 CBAM注意力機制
- CBAM注意力代碼實現
- 1.5.5 本文模型整體架構
- 1.6 實驗
- 1.6.1 數據集
- 1.6.1 實施細節
- 1.6.2 實驗結果
- 1.7 結論
- 總結
摘要
本周閱讀了SCI二區的文章 Aggregate attention module for fine?grained image classification,該論文解決了以往網絡中的參數過多、計算過多的問題,提出了一種名為聚合注意力模塊的注意力機制,可以用更少的參數對細粒度圖像進行準確分類。所提出的注意力模塊將通道注意力與空間注意力并行結合,有效地學習關鍵特征,并且可以輕松擴展到其他神經模型。本文將詳細介紹該模型。
Abstract
This week I read the SCI Region 2 article Aggregate attention module for fine-grained image classification, which solves the problem of too many parameters and too much computation in the previous network by proposing an attention mechanism called aggregated attention module that can accurately classify fine-grained images with fewer parameters. The proposed attention module combines channel attention and spatial attention in parallel to learn key features efficiently and can be easily extended to other neural models. In this paper, the model is described in detail.
文獻出處:Aggregate attention module for fine?grained image classification
1. 用于細粒度圖像分類的聚合注意力模塊
1.1 文獻摘要
注意力機制對于聚合特征和發現有區別的局部細節非常有用。網絡中參數的增加會導致不必要的計算。本文提出了一種名為聚合注意力模塊的注意力機制,可以用更少的參數對細粒度圖像進行準確分類。 具體來說,為了平衡性能和復雜性之間的權衡,所提出的注意力模塊將通道注意力與空間注意力并行結合,有效地學習關鍵特征,并且可以輕松擴展到其他神經模型。 與最先進的模型相比,實驗表明,作者提出的模型可以使用不同的細粒度圖像基準(CUB-200-2011、FGVC Aircraft 和Stanford Cars)實現卓越的精度。
1.2 研究背景
細粒度圖像分類就是將同一物種進行細分,比如將貓的種類細分,同一類別的圖像之間的差異就比較小,由于特定細粒度子類別之間的類間差異較小,以及類內差異較大,因此它不同于傳統的圖像分析問題。由于細粒度圖像具有標記粒度細的特點,因此直接利用整個圖像級別的所有特征來識別細粒度圖像是很不合理的,如下圖所示:
上圖每行的三張圖片屬于同一鳥類。 可以觀察到,同一物種的鳥類受拍攝角度和環境的影響也有很大差異。我們很容易看出,即使屬于同一子類別的圖像本身在形態、姿勢、背景等方面也存在巨大差異,基于這個研究背景,我們需要有效解決類別內差異問題。
針對這個問題,本文作者提出一種 利用注意力機制的細粒度圖像分類 方法。 該方法在提取圖像的細粒度特征的同時,消除了有害特征對分類性能的影響。 訓練時盡量少使用細粒度的標記數據,以提高細粒度圖像分類的效果。
1.3 本文創新點
- 提出了聚合注意力模塊來平衡細粒度圖像分類任務的性能和復雜性之間的權衡,該模塊可廣泛應用于神經網絡中。
- 設計并在整個網絡中使用跨通道損失函數,以提高深度卷積神經網絡的特征學習和表達能力。
- 在四個不同的公共基準數據集上針對細粒度圖像分類任務進行了廣泛的實驗,模型的性能優秀。
1.4 計算機視覺中的注意力機制
注意力思想已被應用于計算機視覺任務,包括圖像標記、目標檢測等,特別是圖像分類。 2019年,注意力網絡模型CBAM被開發出來,其中 Convolutional block attention module 和 Attention-based label consistency for semi-supervised deep learning based image classification 將通道注意力與空間注意力相結合,下周將詳細介紹這兩篇論文。視覺注意機制通過通道或空間尺度操作來探索圖像關鍵部分的特征。 但對于類內差異而言,一般的視覺注意機制并不能表現出突出的效果。
本文作者提出了一種簡單有效的注意力單元,稱為聚合注意力模塊,具有跨通道損失函數。 創新的注意力模塊擅長發現細微差異,并且優于其他注意力機制。
1.5 模型方法
SENet專注于通道維度的注意力計算,對通道之間的相互依賴關系進行建模,并通過網絡的全局損失函數自適應地重新校正通道之間特征的相應強度。 它的目的是有選擇地增強有用的特征并抑制不太有用的特征。 盡管SE塊表現良好,但整個模型的成本增加了,這體現在參數數量以及額外的訓練周期上。
ECA-Net是一種超通道注意力模塊,僅涉及k(k≤9)個參數,但卻帶來了顯著的性能提升,ECA-Net一味追求減少通道注意力中的參數數量,而忽略了空間注意力的有效性,這在一定程度上影響了模型的準確性。
作者提出的模型綜合解決了上述兩個網絡模型的缺陷,將通道注意力和空間注意力的有效使用結合起來。 在保證優異性能的同時最大限度地減少參數數量。 對于細粒度的圖像分類任務,具有出色的學習能力和泛化能力。
1.5.1 聚合注意力模塊
作者將 ResNet 修改為深度神經網絡架構中的骨干網絡。 給定中間生成的特征矩陣 F ∈ R C × H × W R^{C×H×W} RC×H×W 作為模塊輸入,所提出的 AAM 并行生成 1D 通道注意力圖 M c ∈ R C × 1 × 1 M_c ∈ R^{C×1×1} Mc?∈RC×1×1 和 2D 空間注意力圖 M s ∈ R 1 × H × W M_s ∈ R^{1×H×W} Ms?∈R1×H×W 。 整個注意力過程表示為:
1.5.2 通道注意力模塊
為了平衡通道注意力的額外計算成本和提高的模型精度,當我們利用特征通道之間的相關性生成通道注意力特征圖時,本文僅提取k個通道的相關信息。 k 個通道與當前通道相鄰。 此外,全局最大池化可以提取有效的空間特征。輸入特征圖矩陣通過通道全局最大池化進行操作,并通過 sigmoid 函數在 0 和 1 之間生成。
因此,對輸入的原始特征圖進行全局最大池化,提取并學習相鄰k通道信息。 生成的通道注意力張量按元素相加。 通過sigmoid函數并通過復制路徑進行相應的廣播,最終與原始輸入特征圖矩陣逐個相乘。 這是通道注意力模塊的輸出。 圖4展示了通道注意力模塊的結構。 簡而言之,通道注意力表示為:
下圖為通道注意力模塊的結構。 給定輸入特征圖,該模塊通過大小為 k 的全局最大池化操作生成通道權重,其中 k 由經驗確定
通道注意力機制的核心思想是讓模型自動學習每個通道的重要性,并根據通道的貢獻調整輸入數據的表示。通過引入通道注意力機制,模型可以更加有效地利用每個通道的信息,提高模型對輸入數據的表征能力,從而改善模型在各種任務中的性能。
如下圖:先將輸入特征圖分別進行全局最大池化和全局平均池化(是在特征層的高和寬上進行池化),得到兩張不同維度的特征描述。然后池化后的特征圖共用一個多層感知器網絡,先通過一個全連接層進行特征降維,再通過全連接層進行特征升維。將兩張特征圖在通道維度堆疊,經過 sigmoid 激活函數將特征圖的每個通道的權重歸一化到0-1之間。最后,將歸一化后的權重和輸入特征圖相乘,得到處理好的特征圖。
通道注意力代碼實現
import torch.nn as nn
import torch
import torch.nn.functional as fprint("************************通道注意力機制*********************")# 通道注意力機制
class ChannelAttention(nn.Module):# 初始化,in_planes參數指定了輸入特征圖的通道數,ratio參數用于控制通道注意力機制中特征降維和升維過程中的壓縮比率。默認值為8def __init__(self, in_planes, ratio=8):# 繼承父類初始化方法super().__init__()# 全局最大池化 [b,c,h,w]==>[b,c,1,1]self.avg_pool = nn.AdaptiveAvgPool3d((4, 1, 1)) # C*H*W# 全局平均池化 [b,c,h,w]==>[b,c,1,1]self.max_pool = nn.AdaptiveMaxPool3d((4, 1, 1)) # C*H*W# 使用1x1x1卷積核代替全連接層進行特征降維self.fc1 = nn.Conv3d(in_planes, in_planes // ratio, 1, bias=False)# 激活函數self.relu1 = nn.ReLU()# 使用1x1x1卷積核進行特征升維self.fc2 = nn.Conv3d(in_planes // ratio, 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)))) # 平均池化-->卷積-->RELu激活-->卷積max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x)))) # 最大池化-->卷積-->RELu激活-->卷積# 將兩個輸出相加out = avg_out + max_out# 應用Sigmoid函數return self.sigmoid(out)# 創建ChannelAttention模型的實例,輸入通道數為256
model = ChannelAttention(256)
# 打印模型結構
print(model)
# 創建一個形狀為[2, 256, 4, 8, 8]的輸入張量,所有元素初始化為1
inputs = torch.ones([2, 256, 4, 8, 8]) # 2是批次大小(batch size),256是通道數,4、8、8分別是深度、高度和寬度的維度
# 將輸入張量傳遞給模型,并獲取輸出
outputs = model(inputs)
# 打印輸入張量的形狀
print(inputs.shape) # [2, 256, 4, 8, 8]
# 打印輸出張量的形狀
print(outputs.shape) # [2, 256, 4, 1, 1]
輸出結果
1.5.3 空間注意力模塊
與通道注意力不同,空間注意力提供了更有用的信息,重點關注圖像的不同位置。 由于基于空間尺度的全局最大池化操作,可以有效地提取特征圖的關鍵特征。 就全局平均池化操作而言,一方面可以盡可能保存特征圖的整體信息。 另一方面,同一類別差異可能較大,關鍵部位可能會受到光照、遮擋等因素的影響,可能導致學習效果不足。 全局平均池化操作可以在一定程度上緩解這一障礙。
本文將特征圖的空間注意力分布逐個元素地傳遞、復制并與原始輸入特征圖矩陣相乘,即為空間注意力模塊 M s ( F ) ∈ R 1 × H × W M_s(F) ∈ R^{1×H×W} Ms?(F)∈R1×H×W 的輸出。 空間注意力模塊的結構如下圖所示。我們使用兩次池化計算來合成當前特征矩陣的空間值,獲得兩個2D中間圖 M s a v g ∈ R 1 × H × W M^{avg}_{s} ∈ R^{1×H×W} Msavg?∈R1×H×W和 M s m a x ∈ R 1 × H × W M^{max}_{s} ∈ R^{1×H×W} Msmax?∈R1×H×W。 每個特征圖代表通道中的平均池化特征以及最大池化特征。 該模塊通過標準卷積層將它們連接起來并進行卷積以生成2D空間注意力分布。 簡而言之,空間注意力定義為:
空間注意力代碼實現
import torch.nn as nn
import torch
import torch.nn.functional as fprint("************************空間注意力機制*********************")# 空間注意力機制
class SpatialAttention(nn.Module):def __init__(self, kernel_size=3):super().__init__()# 斷言法:kernel_size必須為3或7assert kernel_size in (3, 7),'kernel size must be 3 or 7'# 三元操作:如果kernel_size的值等于7,則padding被設置為3;否則(即kernel_size的值為3),padding被設置為1。padding = 3 if kernel_size == 7 else 1# 定義一個卷積層,輸入通道數為2,輸出通道數為1self.conv1 = nn.Conv3d(2, 1, kernel_size, padding=padding, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):# (N, C, H, W),dim=1沿著通道維度C,計算張量的平均值和最大值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)model = SpatialAttention(kernel_size=7)
print(model)
inputs = torch.ones([2, 256, 4, 8, 8])
outputs = model(inputs)
print(inputs.shape)
print(outputs.shape)
輸出結果
空間注意力機制(Spatial Attention Module)是一種用于處理空間信息的注意力機制,主要用于在深度學習模型中動態地調整輸入數據的不同空間位置的重要性,以增強有用信息并抑制無用信息。在圖像處理等領域,空間注意力機制可以幫助模型更好地關注圖像中不同區域的特征,從而提高模型的表征能力和性能。
1.5.4 CBAM注意力機制
CBAM(Convolutional Block Attention Module)模塊是一種結合了通道注意力和空間注意力機制的注意力模塊,旨在提高卷積神經網絡(CNN)對圖像特征的表征能力。CBAM模塊通過同時關注通道維度和空間維度的特征信息,實現了對圖像特征的全局感知和重要性調整。
CBAM模塊通常由兩個子模塊組成:通道注意力模塊(Channel Attention Module)和空間注意力模塊(Spatial Attention Module)。這兩個子模塊分別用于對通道維度和空間維度的特征進行加權調整,從而提高特征表示的表征能力。(兩個Attention進行串聯,Channel 在前,Spatial在后)如下圖:
模塊會沿著兩個獨立的維度(通道和空間)依次推斷注意力圖,然后將注意力圖乘以輸入特征圖以進行自適應特征修飾。 由于CBAM是輕量級的通用模塊,因此可以以可忽略的開銷將其無縫集成到任何CNN架構中,并且可以與基礎CNN一起進行端到端訓練。
CBAM注意力代碼實現
import torch.nn as nn
import torch
import torch.nn.functional as fprint("************************通道注意力機制*********************")# 通道注意力機制
class ChannelAttention(nn.Module):# 初始化,in_planes參數指定了輸入特征圖的通道數,ratio參數用于控制通道注意力機制中特征降維和升維過程中的壓縮比率。默認值為8def __init__(self, in_planes, ratio=8):# 繼承父類初始化方法super().__init__()# 全局最大池化 [b,c,h,w]==>[b,c,1,1]self.avg_pool = nn.AdaptiveAvgPool3d((4, 1, 1)) # C*H*W# 全局平均池化 [b,c,h,w]==>[b,c,1,1]self.max_pool = nn.AdaptiveMaxPool3d((4, 1, 1)) # C*H*W# 使用1x1x1卷積核代替全連接層進行特征降維self.fc1 = nn.Conv3d(in_planes, in_planes // ratio, 1, bias=False)# 激活函數self.relu1 = nn.ReLU()# 使用1x1x1卷積核進行特征升維self.fc2 = nn.Conv3d(in_planes // ratio, 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)))) # 平均池化-->卷積-->RELu激活-->卷積max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x)))) # 最大池化-->卷積-->RELu激活-->卷積# 將兩個輸出相加out = avg_out + max_out# 應用Sigmoid函數return self.sigmoid(out)# 創建ChannelAttention模型的實例,輸入通道數為256
model = ChannelAttention(256)
# 打印模型結構
print(model)
# 創建一個形狀為[2, 256, 4, 8, 8]的輸入張量,所有元素初始化為1
inputs = torch.ones([2, 256, 4, 8, 8]) # 2是批次大小(batch size),256是通道數,4、8、8分別是深度、高度和寬度的維度
# 將輸入張量傳遞給模型,并獲取輸出
outputs = model(inputs)
# 打印輸入張量的形狀
print(inputs.shape) # [2, 256, 4, 8, 8]
# 打印輸出張量的形狀
print(outputs.shape) # [2, 256, 4, 1, 1]print("************************空間注意力機制*********************")# 空間注意力機制
class SpatialAttention(nn.Module):def __init__(self, kernel_size=3):super().__init__()# 斷言法:kernel_size必須為3或7assert kernel_size in (3, 7),'kernel size must be 3 or 7'# 三元操作:如果kernel_size的值等于7,則padding被設置為3;否則(即kernel_size的值為3),padding被設置為1。padding = 3 if kernel_size == 7 else 1# 定義一個卷積層,輸入通道數為2,輸出通道數為1self.conv1 = nn.Conv3d(2, 1, kernel_size, padding=padding, bias=False)self.sigmoid = nn.Sigmoid()def forward(self, x):# (N, C, H, W),dim=1沿著通道維度C,計算張量的平均值和最大值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)model = SpatialAttention(kernel_size=7)
print(model)
inputs = torch.ones([2, 256, 4, 8, 8])
outputs = model(inputs)
print(inputs.shape)
print(outputs.shape)print("************************CBAM模塊*********************")
class CBAM_Block(nn.Module):def __init__(self, channel, ratio=8, kernel_size=3):super().__init__()# 初始化通道注意力模塊self.channelAttention = ChannelAttention(channel, ratio=ratio)# 初始化空間注意力模塊self.SpatialAttention = SpatialAttention(kernel_size=kernel_size)def forward(self, x):# 應用通道注意力和空間注意力x = x * self.channelAttention(x)x = x * self.SpatialAttention(x)return xmodel = CBAM_Block(256)
print(model)
inputs = torch.ones([2, 256, 4, 8, 8])
outputs = model(inputs)
print(inputs.shape)
print(outputs.shape)
輸出結果
1.5.5 本文模型整體架構
該方法的架構如下圖所示。給定前面的卷積塊獲得的特征圖,聚合注意力模塊將通道注意力和空間注意力結合起來計算注意力分布。 生成的最終分布被輸入到下一個卷積塊。 網絡的整體損失是通過提出的跨通道損失和交叉熵損失來計算的。
1.6 實驗
1.6.1 數據集
作者在四個廣泛采用的細粒度基準上驗證了模型。 實驗期間的基準數據是 Caltech-UCSD-Birds (CUB-200-2011)、FGVC-Aircraft (Maji et al. 2013)、Stanford Cars 和 Stanley Dogs (Khosla et al. 2011)。 數據集的詳細介紹如下表所示。
1.6.1 實施細節
采用 PyTorch 框架來實現我們提出的方法。 隨機梯度下降優化器與“poly”的學習率策略一起使用(動量參數設置為0.8,初始學習率設置為1e?4,終止學習率設置為1e?6,并且 權重衰減設置為 2.5e?4)。 我們在并行 Titan XP GPU 上訓練我們提出的模型 200 個時期。 訓練圖像的批量大小設置為 16。所有原始圖像都經過隨機重新縮放、裁剪和翻轉。 然后將輸入訓練圖像的大小調整為 224 × 224,而用于驗證和測試的圖像根本不必改變。 經過實驗驗證,不同的 η 值以及數據集相應的訓練效果如表 2 所示。請注意,我們從頭開始訓練我們的網絡,這意味著除了官方提供的數據集中的標記圖像之外,我們不需要使用任何額外的數據 。 此外,我們將超參數μ設置為0.01。
1.6.2 實驗結果
如下表所示,AAM 方法比其他 SOTA 模型表現更好。 具體來說,我們提出的方法顯示,CUB-200-2011 上的結果明顯改善了 0.7%,FGVC-Aircraft 上改善了 1.5%,Stanford Cars 上改善了 0.2%,Stanford Dogs 上改善了 2.7%。 這項工作提供了圖 7,將所提出的 CC-Loss 與中心損失(Wen et al. 2016)和交叉熵損失(CE 損失)進行比較。 在這個實驗中,模型都是從頭開始訓練的。
1.7 結論
在本文中,作者提出了用于細粒度圖像分類任務的 AAM。 在這個注意力模塊中,作者并行地將通道注意力和空間注意力結合起來。 此外,作者還開發了 CC-Loss 來最大化細粒度圖像類別之間的差異。 大量實驗表明,無論骨干網絡如何,所提出的 AAM 的性能都比其他最近使用的模型好得多。
總結
本周學習了AAM模型,聚合注意力模塊、通道注意力、空間注意力模塊,同時也進行了代碼實踐,下周將繼續學習細粒度圖像相關的文獻模型。加油~