有一些其他理論先暫時不講了,直奔今天的主題
視覺注意力機制
視覺注意力機制根據 關注域 的不同,可分為三大類:空間域、通道域、混合域
空間域:將圖片中的 空間域信息 做對應的 變換,從而將關鍵得信息提取出來。對空間進行掩碼的生成,進行打分,代表是 Spatial Attention Module
// 設特征圖 HWC,空間注意力是學習到一個 HxW 的權重,即每個像素一個權重,C個通道共用該權重;
通道域:類似於給每個通道一個權重,來代表 該通道 與關鍵信息的相關程度。對通道生成掩碼,進行打分,代表是 Channel Attention Module、SENet
// 設特征圖 HWC,通道注意力是學習到一個長度為 C 的向量,每個通道上的像素點權重相同,仔細想想這是什么概念?
// 由於每個通道像素點權重相同,通道注意力通常會把一個通道內的信息直接做 全局平均池化,而忽略每個通道內的局部信息;
混合域:即 空間域 和 通道域 的融合,代表是 BAM,CBAM
空間域忽略了通道域的信息,將每個通道中的圖片特征做同等處理,缺點是將空間域方法局限在原始圖片特征提取階段,而忽略了不同通道代表的不同特征;
通道域 - SENet
通道注意力在圖像分類方面的典型應用就是 SENet
Squeeze-and-Excitation Networks;
由Momenta公司所作並發於2017CVPR,論文中的SENet贏得了ImageNet最后一屆(ImageNet 2017)的圖像識別冠軍,SENet主要是學習了channel之間的相關性,篩選出了針對通道的注意力,稍微增加了一點計算量,但是效果比較好。
論文地址 https://arxiv.org/abs/1709.01507
官方代碼地址 https://github.com/hujie-frank/SENet
Pytorch實現代碼 https://github.com/moskomule/senet.pytorch
原理圖如下

今天心情不好,少寫點廢話
第一個方塊 X 沒用,就是個 特征圖;
第二個方塊 U 作為 SENet 的輸入;
Sequeeze:對 U 每個通道做 全局平均池化,生成一個 1x1xC 的 fm,這個 fm 具有全局感受野; 【空白長條】
Exciation:對 Sequeeze 輸出的 1x1xC,經過 兩個全連接 的神經網絡,也就是 兩層神經網絡,第二層神經元個數為 C,給每個 通道 一個 預測值,即權重; 【彩色長條】
// 資料里說利用的 lstm 中的 門機制,其實 就是 sigmoid 把 Exciation 的輸出限制到 0-1,權重嘛,而 lstm 中的門就是用的 sigmoid;
特征重標定:第三個方塊,U x Wc = X‘,這個 X’ 就是 帶注意力機制 的 特征圖, Scale 就是利用權重縮放特征;
下面這個公式就是全局平均池化,沒啥看的

下面是 GoogleNet 和 ResNet 加入 SENet 的網絡結構,也沒啥說的

上圖只是作者的嘗試,實際上 SENet 可以放到任何網絡內
Pytorch 實現
class SELayer(nn.Module): def __init__(self, channel, reduction=16): super(SELayer, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channel, channel // reduction, bias=False), nn.ReLU(inplace=True), nn.Linear(channel // reduction, channel, bias=False), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * y.expand_as(x)
通道域 - ECAnet
Efficient Channel Attention for Deep Convolutional Neural Networks,高效的通道注意力 深度卷積網絡;
SENet 的提出引發了 注意力機制 的廣泛研究,
ECAnet 就是作者在 SENet 上進行的改進,提出了一種 輕量級 的 通道注意力模塊,
作者從 SE模塊 中 維度縮減 (第一個FC) 和 跨通道信息交互 (2個FC)兩方面入手,證明了 維度縮減 對 通道注意力機制 的預測帶來了副作用,其對捕獲所有通道的依賴關系是低效且不必要的,
於是作者提出了一種 不降維 的局部跨通道交互策略,該策略可通過一維卷積有效實現,進一步,作者又提出了一種自適應選擇一維卷積核大小的方法,以確定局部跨信道交互的覆蓋率;
論文地址 https://arxiv.org/abs/1910.03151
代碼地址 https://github.com/BangguWu/ECANet
網絡結構


∣x∣ odd的意思為選擇最近的奇數; γ = 2 , b = 1
Pytorch 代碼
有啥不懂的看代碼吧,其實沒啥,有時候事很小,作用很大,就看你認事還是認作用
import torch from torch import nn from torch.nn.parameter import Parameter class eca_layer(nn.Module): """Constructs a ECA module. Args: channel: Number of channels of the input feature map k_size: Adaptive selection of kernel size """ def __init__(self, channel, k_size=3): super(eca_layer, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.conv = nn.Conv1d(1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): # x: input features with shape [b, c, h, w] b, c, h, w = x.size() # feature descriptor on the global spatial information y = self.avg_pool(x) # Two different branches of ECA module y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1) # Multi-scale information fusion y = self.sigmoid(y) return x * y.expand_as(x)
混合域 - CBAM
Convolutional Block Attention Module;
論文地址 https://arxiv.org/pdf/1807.06521.pdf
論文(2018)提出了一種輕量的注意力模塊,結合了 通道域 和 空間域 的注意力機制,效果好於 SENet;
論文在 ResNet 和 MobileNet 等經典結構上添加了 CBAM 模塊並進行對比分析,同時也進行了可視化,發現 CBAM 更關注識別目標物體,這也使得 CBAM 具有更好的解釋性
CBAM 是一個 卷積塊 注意力模型,即插即用,block 結構如下

可以看到 CBAM 實際上是 Channel Attention Module(CAM) 和 Spatial Attention Module(SAM) 的串行結構;
具體結構如下圖


通道注意力 對每個fm 分別進行 最大池化 和 平均池化,然后通過 共享一個的 MLP多層感知器,得到兩個 長度為 C 的列表,相加,sigmoid;

空間注意力 是在 通道維度上 分別進行 最大池化 和 平均池化,生成 HxWx2 的fm,然后接一個 卷積網絡,卷積大小7x7,一個卷積核,生成 HxWx1 的fm,sigmoid;

參考資料:
https://blog.csdn.net/mrjkzhangma/article/details/106178250 【CV中的Attention機制】基礎篇-視覺注意力機制和SENet
https://zhuanlan.zhihu.com/p/102035721 【CV中的Attention機制】SENet中的SE模塊
https://blog.csdn.net/m0_46646835/article/details/120526262 SEnet 通道注意力機制
https://www.jianshu.com/p/4340b5f48b4a SENet 簡書 挺全的,有興趣的可以看看
https://www.jianshu.com/p/69b1548974d5 2020-CVPR-通道注意力超強改進-ECANet
https://zhuanlan.zhihu.com/p/153112149 通道注意力超強改進,輕量模塊ECANet來了!即插即用,顯著提高CNN性能|已開源
https://blog.csdn.net/qq_19784349/article/details/107107432 【論文閱讀筆記】ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks
https://blog.csdn.net/Roaddd/article/details/114646354 【注意力機制】CBAM詳解
https://zhuanlan.zhihu.com/p/96966170 CBAM--卷積層中的注意力模塊 有 Pytroch 代碼
https://www.jianshu.com/p/4fac94eaca91 【論文解讀】用於卷積神經網絡的注意力機制 有 tf 代碼
那個可愛研究生的視頻和代碼
https://github.com/bubbliiiing/yolov4-tiny-pytorch
https://www.bilibili.com/video/BV1rL4y1n7p3?p=2&spm_id_from=pageDriver
