CV中的Attention機制:簡單而有效的CBAM模塊

2021-03-02 極市平臺
1. 什麼是注意力機制?注意力機制(Attention Mechanism)是機器學習中的一種數據處理方法,廣泛應用在自然語言處理、圖像識別及語音識別等各種不同類型的機器學習任務中。通俗來講:注意力機制就是希望網絡能夠自動學出來圖片或者文字序列中的需要注意的地方。比如人眼在看一幅畫的時候,不會將注意力平等地分配給畫中的所有像素,而是將更多注意力分配給人們關注的地方。從實現的角度來講:注意力機制通過神經網絡的操作生成一個掩碼mask, mask上的值一個打分,評價當前需要關注的點的評分。通道注意力機制:對通道生成掩碼mask,進行打分,代表是senet, Channel Attention Module空間注意力機制:對空間進行掩碼的生成,進行打分,代表是Spatial Attention Module混合域注意力機制:同時對通道注意力和空間注意力進行評價打分,代表的有BAM, CBAM2. CBAM模塊的實現CBAM全稱是Convolutional Block Attention Module, 是在**ECCV2018**上發表的注意力機制代表作之一。本人在打比賽的時候遇見過有人使用過該模塊取得了第一名的好成績,證明了其有效性。在該論文中,作者研究了網絡架構中的注意力,注意力不僅要告訴我們重點關注哪裡,還要提高關注點的表示。目標是通過使用注意機制來增加表現力,關注重要特徵並抑制不必要的特徵。為了強調空間和通道這兩個維度上的有意義特徵,作者依次應用通道和空間注意模塊,來分別在通道和空間維度上學習關注什麼、在哪裡關注。此外,通過了解要強調或抑制的信息也有助於網絡內的信息流動。主要網絡架構也很簡單,一個是通道注意力模塊,另一個是空間注意力模塊,CBAM就是先後集成了通道注意力模塊和空間注意力模塊。2.1 通道注意力機制
class ChannelAttention(nn.Module):    def __init__(self, in_planes, rotio=16):        super(ChannelAttention, self).__init__()        self.avg_pool = nn.AdaptiveAvgPool2d(1)        self.max_pool = nn.AdaptiveMaxPool2d(1)
self.sharedMLP = nn.Sequential( nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False), nn.ReLU(), nn.Conv2d(in_planes // rotio, in_planes, 1, bias=False)) self.sigmoid = nn.Sigmoid()
def forward(self, x): avgout = self.sharedMLP(self.avg_pool(x)) maxout = self.sharedMLP(self.max_pool(x)) return self.sigmoid(avgout + maxout)

核心的部分Shared MLP使用了12.2 空間注意力機制
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.conv = nn.Conv2d(2,1,kernel_size, padding=padding, bias=False) self.sigmoid = nn.Sigmoid()
def forward(self, x): avgout = torch.mean(x, dim=1, keepdim=True) maxout, _ = torch.max(x, dim=1, keepdim=True) x = torch.cat([avgout, maxout], dim=1) x = self.conv(x) return self.sigmoid(x)

這個部分實現也很簡單,分別從通道維度進行求平均和求最大,合併得到一個通道數為2的卷積層,然後通過一個卷積,得到了一個通道數為1的spatial attention。2.3 Convolutional bottleneck attention module
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

最後的使用一個類進行兩個模塊的集成,得到的通道注意力和空間注意力以後,使用廣播機制對原有的feature map進行信息提煉,最終得到提煉後的feature map。以上代碼以ResNet中的模塊作為對象,實際運用可以單獨將以下模塊融合到網絡中:
class cbam(nn.Module):   def __init__(self, planes):        self.ca = ChannelAttention(planes)# planes是feature map的通道個數        self.sa = SpatialAttention()     def forward(self, x):        x = self.ca(out) * x  # 廣播機制        x = self.sa(out) * x  # 廣播機制

3. 在什麼情況下可以使用?提出CBAM的作者主要對分類網絡和目標檢測網絡進行了實驗,證明了CBAM模塊確實是有效的。以ResNet為例,論文中提供了改造的示意圖,如下圖所示:也就是在ResNet中的每個block中添加了CBAM模塊,訓練數據來自benchmark ImageNet-1K。檢測使用的是Faster R-CNN, Backbone選擇的ResNet34,ResNet50, WideResNet18, ResNeXt50等,還跟SE等進行了對比。消融實驗:消融實驗一般是控制變量,最能看出模型變好起作用的部分在那裡。分為三個部分:如何更有效地計算channel attention?可以看出來,使用avgpool和maxpool可以更好的降低錯誤率,大概有1-2%的提升,這個組合就是dual pooling,能提供更加精細的信息,有利於提升模型的表現。如何更有效地計算spatial attention?這裡的空間注意力機制參數也是有avg, max組成,另外還有一個卷積的參數kernel_size(k), 通過以上實驗,可以看出,當前使用通道的平均和通道的最大化,並且設置kernel size=7是最好的。可以看出,這裡與SENet中的SE模塊也進行了比較,這裡使用CBAM也是超出了SE的表現。除此以外,還進行了順序和並行的測試,發現,先channel attention然後spatial attention效果最好,所以也是最終的CBAM模塊的組成。在MSCOCO數據及使用了ResNet50,ResNet101為backbone, Faster RCNN為檢測器的模型進行目標檢測,如下圖所示:在VOC2007數據集中採用了StairNet進行了測試,如下圖所示:官方貌似沒有提供目標檢測部分的代碼,CBAM的作用在於對信息進行精細化分配和處理,所以猜測是在backbone的分類器之前添加的CBAM模塊,歡迎有研究的小夥伴留言。4. 參考https://arxiv.org/pdf/1807.06521.pdfhttps://github.com/pprp/SimpleCVReproduction/blob/master/attention/CBAM/cbam.py

相關焦點

  • 【CV中的Attention機制】BiSeNet中的FFM模塊與ARM模塊
    前言:之前介紹過一個語義分割中的注意力機制模塊-scSE模塊,效果很不錯。今天講的也是語義分割中使用到注意力機制的網絡BiSeNet,這個網絡有兩個模塊,分別是FFM模塊和ARM模塊。其實現也很簡單,不過作者對注意力機制模塊理解比較深入,提出的FFM模塊進行的特徵融合方式也很新穎。1.
  • 【CV中的Attention機制】ShuffleAttention
    本文提出了Shuffle Attention(SA)模塊來解決這個問題,可以高效地結合兩種注意力機制。具體來講:對每個子特徵使用SA Unit同時使用空間和通道間注意力機制。最後,所有的子特徵會被匯集起來,然後使用Channel Shuffle操作讓不同組的特徵進行融合。
  • 品覽AI論技|論CCNet如何有效減輕Attention機制的計算量
    本次大會總結了過去一年cv領域的不同方向的發展,許多國內的大牛都分享了自己實驗室的一些最新的研究成果,當然也有安利自己的框架。當然,這個是Attention的nlp的應用思想,不過這並不影響Attention在cv領域的應用,因為我們看一張圖片的時候也是挑重點看,比如下面這張圖片,應該沒有人會重點看椰子吧。 CCNet的背景注意力最開始是14年應用在MT(機器翻譯)任務中的,並且顯著改善了MT的性能。
  • 重新思考深度學習中的Attention機制
    寫在前面: 本文是一篇關於深度學習中的 Attention機制 的文章。與之前的系列文章不同,本文並非定位於對Attention機制的各類框架和玩法進行綜述,因此不會花費過多的篇章去介紹Attention的發展歷史或數學計算方法;更多是簡單地介紹幾個Attention的代表性和有意思的工作,並去思考Attention機制的合理性,提出一些進一步的思考。以下是本文的主要框架:1.
  • 注意力機制Attention
    注意力機制(attention mechanism)Attention實質上是一種分配機制,其核心思想是突出對象的某些重要特徵。根據Attention對象的重要程度,重新分配資源,即權重,實現核心思想是基於原有的數據找到其之間的關聯性,然後突出其某些重要特徵。注意力可以被描述為將一個查詢和一組鍵值對映射到一個輸出,其中查詢、鍵、值和輸出都是向量。
  • 視覺注意力機制 | 視覺注意力機制用於分類:SENet、CBAM、SKNet
    點擊上方「AI算法修煉營」,選擇加星標或「置頂」標題以下,全是乾貨前面的話上次文章中,我們主要關注了視覺應用中的Self-attention機制及其應用——Non-local網絡模塊,從最開始的了解什麼是視覺注意力機制到對自注意力機制的細節把握,再到Non-local模塊的學習。
  • 注意力機制(Attention Mechanism)在自然語言處理中的應用
    基於注意力(attention)機制的神經網絡成為了最近神經網絡研究的一個熱點,本人最近也學習了一些基於attention機制的神經網絡在自然語言處理(NLP)領域的論文,現在來對attention在NLP中的應用進行一個總結,和大家一起分享。
  • 機器翻譯中的 Attention 機制
    基本 seq2seq 模型用於機器翻譯時,對於短句和中等長度句子是較為有效的,但對於長句,encoder-decoder 之間使用的固定長度編碼可能會成為信息瓶頸,影響翻譯效果,類似人聽完一大段話後,只記得大概,「遺漏」了一些細節
  • 【Attention】淺談Attention機制的理解
    隨後Bahdanau等人在論文《Neural Machine Translation by Jointly Learning to Align and Translate》中,使用類似attention的機制在機器翻譯任務上將翻譯和對齊同時進行,他們的工作算是第一個將attention機制應用到NLP領域中。
  • 一文讀懂Attention機制
    Attention 的本質是什麼Attention機制源自於人類視覺注意力機制:將有限的注意力集中在重點信息上,「從關注全部到關注重點」,從而節省資源,快速獲得最有效的信息。對於Attention而言,就是一種權重參數的分配機制,目標是協助模型捕捉重要信息,「帶權求和」就可以高度概括,在不同的 context 下,focusing 不同的信息。
  • 淺談Attention機制的理解
    隨後Bahdanau等人在論文《Neural Machine Translation by Jointly Learning to Align and Translate》中,使用類似attention的機制在機器翻譯任務上將翻譯和對齊同時進行,他們的工作算是第一個將attention機制應用到NLP領域中。
  • 乾貨|理解attention機制本質及self-attention
    的知識,這篇接上篇,更加深入的理解attention的有關思想和最新的self-attention機制一、Attention機制的本質思想如果把Attention機制從上文講述例子中的Encoder-Decoder框架中剝離,並進一步做抽象,可以更容易看懂Attention機制的本質思想。
  • nlp領域發生了新的技術突破,用attention機制研究nlp領域
    包括:attention機制,cnn,adaptive attention network(an),兩層cnn相比較,an表現優於一層的cn。lstm,已經有了兩種不同的,看似性能和效率差異不大的attention機制:rnnattention,lstmattention。今天我們將從這兩種attention機制開始研究nlp領域突破性技術!
  • 機器翻譯的Attention機制
    = BahdanauAttention(self.dec_units) def call(self, x, hidden, enc_output): context_vector, attention_weights = self.attention(hidden, enc_output) x = self.embedding(x)
  • 關於attention機制的一些細節的思考
    之前看過的一些attention機制,除了self attention之外,基於rnn或者cnn的attention在處理文本問題的時候基本上是embedding之後經過了rnn或者cnn結構的映射之後得到了映射後的向量V,然後attention是針對於V進行注意力weights的計算,問題來了,能不能直接在embedding上進行score的計算?
  • Attention 掃盲:注意力機制及其 PyTorch 應用實現
    機制是對人類視覺注意力機制的仿生,本質上是一種資源分配機制。使用 LSTM 進行文本建模時當前流行的有效方法[2]。attention 機制的最典型應用是統計機器翻譯。給定任務,輸入是「Echt」, 「Dicke」 and 「Kiste」進 encoder,使用 rnn 表示文本為固定長度向量 h3。但問題就在於,當前 decoder 生成 y1 時僅僅依賴於最後一個隱層狀態h3,也就是 sentence_embedding。
  • l7805cv中的5指的什麼_l7805cv全稱是什麼
    打開APP l7805cv中的5指的什麼_l7805cv全稱是什麼 發表於 2017-10-23 10:27:37   l7805cv的全稱是串聯型三端穩壓模塊。
  • 一文搞懂NLP中的Attention機制(附詳細代碼講解)
    Analysis3.1 Prosattention的好處主要是具有很好的解釋性,並且極大的提高了模型的效果,已經是很多SOTA 模型必備的模塊,特別是transformer(使用了self / global/ multi-level/ multihead/ attention)的出現極大得改變了NLP的格局。3.2 Cons沒法捕捉位置信息,需要添加位置信息。
  • Attention!當推薦系統遇見注意力機制
    NewBeeNLP原創出品公眾號專欄作者@上杉翔二悠閒會 · 信息檢索當注意力機制都已經變成很tasteless的手法的時候,使用或者魔改注意力機制一定要專注講好自己的故事:即『為什麼要用Attention,為什麼要魔改Attention』
  • 谷歌推出基於注意機制的全新翻譯框架,Attention is All You Need!
    Transformer是完全基於注意力機制(attention mechanism)的網絡框架,放棄了RNN和CNN模型。眾所周知,在編碼-解碼框架中,主流的序列傳導模型都是基於RNN或者CNN的,其中能完美連接編碼器和解碼器的是注意力機制。而谷歌提出的這一新框架Transformer,則是完全基於注意力機制的。