注意力機制【2】- CV中的注意力機制


有一些其他理論先暫時不講了,直奔今天的主題 

 

視覺注意力機制

視覺注意力機制根據 關注域 的不同,可分為三大類:空間域、通道域、混合域

空間域:將圖片中的 空間域信息 做對應的 變換,從而將關鍵得信息提取出來。對空間進行掩碼的生成,進行打分,代表是 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM