【CV中的Attention機制】CBAM模塊

前言: CBAM模塊由于其使用的廣泛性以及易于集成得到很多應(yīng)用。目前cv領(lǐng)域中的attention機制也是在2019年論文中非常火。這篇cbam雖然是在2018年提出的,但是其影響力比較深遠,在很多領(lǐng)域都用到了該模塊。

1. 什么是注意力機制?

注意力機制(Attention Mechanism)是機器學習中的一種數(shù)據(jù)處理方法,廣泛應(yīng)用在自然語言處理揍鸟、圖像識別及語音識別等各種不同類型的機器學習任務(wù)中。

通俗來講:注意力機制就是希望網(wǎng)絡(luò)能夠自動學出來圖片或者文字序列中的需要注意的地方句旱。比如人眼在看一幅畫的時候阳藻,不會將注意力平等地分配給畫中的所有像素,而是將更多注意力分配給人們關(guān)注的地方谈撒。

從實現(xiàn)的角度來講:注意力機制通過神經(jīng)網(wǎng)絡(luò)的操作生成一個掩碼mask, mask上的值一個打分腥泥,評價當前需要關(guān)注的點的評分。

注意力機制可以分為:

  • 通道注意力機制:對通道生成掩碼mask啃匿,進行打分蛔外,代表是senet, Channel Attention Module
  • 空間注意力機制:對空間進行掩碼的生成,進行打分溯乒,代表是Spatial Attention Module
  • 混合域注意力機制:同時對通道注意力和空間注意力進行評價打分夹厌,代表的有BAM, CBAM

2. CBAM模塊的實現(xiàn)

CBAM全稱是Convolutional Block Attention Module, 是在ECCV2018上發(fā)表的注意力機制代表作之一。本人在打比賽的時候遇見過有人使用過該模塊取得了第一名的好成績裆悄,證明了其有效性矛纹。

在該論文中,作者研究了網(wǎng)絡(luò)架構(gòu)中的注意力光稼,注意力不僅要告訴我們重點關(guān)注哪里或南,還要提高關(guān)注點的表示。 目標是通過使用注意機制來增加表現(xiàn)力艾君,關(guān)注重要特征并抑制不必要的特征采够。為了強調(diào)空間和通道這兩個維度上的有意義特征,作者依次應(yīng)用通道和空間注意模塊冰垄,來分別在通道和空間維度上學習關(guān)注什么蹬癌、在哪里關(guān)注。此外播演,通過了解要強調(diào)或抑制的信息也有助于網(wǎng)絡(luò)內(nèi)的信息流動冀瓦。

主要網(wǎng)絡(luò)架構(gòu)也很簡單,一個是通道注意力模塊写烤,另一個是空間注意力模塊,CBAM就是先后集成了通道注意力模塊和空間注意力模塊拾徙。

2.1 通道注意力機制

image

通道注意力機制按照上圖進行實現(xiàn):

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使用了1\times1卷積完成的洲炊,進行信息的提取。需要注意的是,其中的bias需要人工設(shè)置為False暂衡。

2.2 空間注意力機制

image

空間注意力機制按照上圖進行實現(xiàn):

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)

這個部分實現(xiàn)也很簡單询微,分別從通道維度進行求平均和求最大,合并得到一個通道數(shù)為2的卷積層狂巢,然后通過一個卷積撑毛,得到了一個通道數(shù)為1的spatial attention。

2.3 Convolutional bottleneck attention module

image
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中的模塊作為對象胯杭,實際運用可以單獨將以下模塊融合到網(wǎng)絡(luò)中:

 class cbam(nn.Module):
    def __init__(self, planes):
        self.ca = ChannelAttention(planes)# planes是feature map的通道個數(shù)
        self.sa = SpatialAttention()
     def forward(self, x):
        x = self.ca(out) * x  # 廣播機制
        x = self.sa(out) * x  # 廣播機制

3. 在什么情況下可以使用?

提出CBAM的作者主要對分類網(wǎng)絡(luò)和目標檢測網(wǎng)絡(luò)進行了實驗,證明了CBAM模塊確實是有效的受啥。

以ResNet為例做个,論文中提供了改造的示意圖,如下圖所示:

image

也就是在ResNet中的每個block中添加了CBAM模塊滚局,訓練數(shù)據(jù)來自benchmark ImageNet-1K居暖。檢測使用的是Faster R-CNN, Backbone選擇的ResNet34,ResNet50, WideResNet18, ResNeXt50等藤肢,還跟SE等進行了對比太闺。

消融實驗:消融實驗一般是控制變量,最能看出模型變好起作用的部分在那里谤草。分為三個部分:

  1. 如何更有效地計算channel attention?
image

可以看出來跟束,使用avgpool和maxpool可以更好的降低錯誤率,大概有1-2%的提升丑孩,這個組合就是dual pooling冀宴,能提供更加精細的信息,有利于提升模型的表現(xiàn)温学。

  1. 如何更有效地計算spatial attention?
image

這里的空間注意力機制參數(shù)也是有avg, max組成略贮,另外還有一個卷積的參數(shù)kernel_size(k), 通過以上實驗,可以看出仗岖,當前使用通道的平均和通道的最大化逃延,并且設(shè)置kernel size=7是最好的。

  1. 如何組織這兩個部分轧拄?
image

可以看出揽祥,這里與SENet中的SE模塊也進行了比較,這里使用CBAM也是超出了SE的表現(xiàn)檩电。除此以外拄丰,還進行了順序和并行的測試府树,發(fā)現(xiàn),先channel attention然后spatial attention效果最好料按,所以也是最終的CBAM模塊的組成奄侠。

在MSCOCO數(shù)據(jù)及使用了ResNet50,ResNet101為backbone, Faster RCNN為檢測器的模型進行目標檢測,如下圖所示:

image

在VOC2007數(shù)據(jù)集中采用了StairNet進行了測試载矿,如下圖所示:

image

官方貌似沒有提供目標檢測部分的代碼垄潮,CBAM的作用在于對信息進行精細化分配和處理,所以猜測是在backbone的分類器之前添加的CBAM模塊闷盔,歡迎有研究的小伙伴留言弯洗。

4. 參考

CBAM arxiv link: https://arxiv.org/pdf/1807.06521.pdf

核心代碼:https://github.com/pprp/SimpleCVReproduction/blob/master/attention/CBAM/cbam.py

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市馁筐,隨后出現(xiàn)的幾起案子涂召,更是在濱河造成了極大的恐慌,老刑警劉巖敏沉,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件果正,死亡現(xiàn)場離奇詭異,居然都是意外死亡盟迟,警方通過查閱死者的電腦和手機秋泳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來攒菠,“玉大人迫皱,你說我怎么就攤上這事∠街冢” “怎么了卓起?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凹炸。 經(jīng)常有香客問我戏阅,道長,這世上最難降的妖魔是什么啤它? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任奕筐,我火速辦了婚禮,結(jié)果婚禮上变骡,老公的妹妹穿的比我還像新娘离赫。我一直安慰自己,他們只是感情好塌碌,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布渊胸。 她就那樣靜靜地躺著,像睡著了一般台妆。 火紅的嫁衣襯著肌膚如雪蹬刷。 梳的紋絲不亂的頭發(fā)上瓢捉,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天频丘,我揣著相機與錄音办成,去河邊找鬼。 笑死搂漠,一個胖子當著我的面吹牛迂卢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桐汤,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼而克,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了怔毛?” 一聲冷哼從身側(cè)響起员萍,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拣度,沒想到半個月后碎绎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡抗果,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年筋帖,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冤馏。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡日麸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逮光,到底是詐尸還是另有隱情代箭,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布涕刚,位于F島的核電站嗡综,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏副女。R本人自食惡果不足惜蛤高,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碑幅。 院中可真熱鬧戴陡,春花似錦、人聲如沸沟涨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽裹赴。三九已至喜庞,卻和暖如春诀浪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背延都。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工雷猪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晰房。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓求摇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親殊者。 傳聞我的和親對象是個殘疾皇子与境,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容