【即插即用】漲點神器AFF:注意力特徵融合(已經開源,附論文和源碼連接)

點擊上方【AI人工智能初學者】,選擇【星標】公衆號,期待您個人相遇與進步


這篇文章一種新注意力特徵融合機制AFF!性能優於SKNet、SENet等方法,可應用於分類、語義分割和目標檢測等方向。git

一、簡介

特徵融合是指來自不一樣層或分支的特徵的組合,是現代網絡體系結構中很常見的一種操做。它一般經過簡單的操做(例如求和或串聯)來實現,但這可能不是最佳選擇。在本論文中提出了一個統一而通用的方案,即注意力特徵融合,該方案適用於大多數常見場景,包括由short and long skip connections以及在Inception層內的特徵融合。github

爲了更好地融合語義和尺度不一致的特徵,提出也了一個多尺度的通道注意力模塊,該模塊解決了在融合不一樣尺度的特徵時出現的問題。同時還經過添加另外一個注意力級別(稱爲迭代注意力特徵融合)來緩解特徵圖的初始集成的瓶頸。web

二、相關工做

2.一、Multi-scale Attention Mechanism

深度學習中的注意機制模仿人類視覺注意機制,好比Squeeze-and-Excitation Networks (SENet)將全局空間信息壓縮到通道描述中,以捕獲與通道的依賴關係。近年來,研究者開始考慮注意機制的scale尺度問題:微信

  • 第1類:將多個尺度上的特徵或它們鏈接的結果輸入注意模塊生成多尺度上的Faeture map,注意模塊內上下文聚合的特徵尺度要保持統一。
  • 第2類:也被稱爲多尺度空間注意,經過大小不一樣的卷積核或從注意模塊內的金字塔彙集上下文的特徵。

提出的MS-CAM遵循ParseNet的思想,結合局部和全局特徵和空間注意的想法融合注意力模塊內部的多尺度特徵,在如下2個重要方面有所不一樣:網絡

  • 1)、MS-CAM經過逐點卷積來關注通道的尺度問題,而不是大小不一樣的卷積核。
  • 2)、MS-CAM不是在主幹網中,而是在通道注意力模塊中局部本地和全局的特徵上下文特徵。

2.二、Skip Connections in Deep Learning

skip connection能夠分爲:Short SkipLong Skipapp

Short Skip:即在Res Block中添加的標識映射快捷方式,爲反向傳播期間梯度流提供了一種連續的替代路徑;編輯器

Long Skip:經過鏈接較低層次的細節特徵和較粗分辨率的高級語義特徵,幫助網絡得到高分辨率的語義特徵。ide

最近,一些基於注意的方法,如全局注意Upsampe(GAU)和跳躍注意(SA),被提出使用高級特徵做爲引導來調節長跳躍鏈接中的低級特徵。然而,調製特徵的融合權重仍然是固定的。Highway Networks(高速公路網絡)首次引入在跳連機制(skip connection)中引入選擇機制(selection mechanism),而在某種程度上,注意力跳鏈接的提出能夠被視爲其後續,可是有3個不一樣點:性能

  • 1)、高速公路網絡使用一個簡單的徹底鏈接層,只能生成一個標量融合權重,MSCAM經過dynamic soft選擇元素的方式生成融合權重大小相同的特徵圖;
  • 2)、高速公路網絡只使用一個輸入特徵來生成權重,而AFF模塊同時感知這兩個特徵;
  • 3)、指出了初始特徵集成的重要性,提出了iAFF模塊做爲解決方案;

3 本文方法---MS-CAM

3.一、Multi-Scale Channel Attention Module(MS-CAM)

其核心思想是經過改變空間池的大小,能夠在多個尺度上實現通道關注。爲了使其儘量輕量化只在attention模塊中將局部上下文添加到全局上下文中。選擇逐點卷積(PWConv)做爲通道上下文融合器,它只利用每一個空間位置的點向通道融合。學習

class ResGlobLocaChaFuse(HybridBlock):
    def __init__(self, channels=64):
        super(ResGlobLocaChaFuse, self).__init__()

        with self.name_scope():

            self.local_att = nn.HybridSequential(prefix='local_att')
            self.local_att.add(nn.Conv2D(channels, kernel_size=1, strides=1, padding=0))
            self.local_att.add(nn.BatchNorm())

            self.global_att = nn.HybridSequential(prefix='global_att')
            self.global_att.add(nn.GlobalAvgPool2D())
            self.global_att.add(nn.Conv2D(channels, kernel_size=1, strides=1, padding=0))
            self.global_att.add(nn.BatchNorm())

            self.sig = nn.Activation('sigmoid')

    def hybrid_forward(self, F, x, residual):

        xa = x + residual
        xl = self.local_att(xa)
        xg = self.global_att(xa)
        xlg = F.broadcast_add(xl, xg)
        wei = self.sig(xlg)

        xo = 2 * F.broadcast_mul(x, wei) + 2 * F.broadcast_mul(residual, 1-wei)

        return xo

4. 模塊

4.一、AFF模塊

基於多尺度信道的注意模塊M,Attentional Feature Fusion (AFF) 能夠被表達爲:

class AXYforXplusYAddFuse(HybridBlock):
    def __init__(self, channels=64):
        super(AXYforXplusYAddFuse, self).__init__()

        with self.name_scope():

            self.local_att = nn.HybridSequential(prefix='local_att')
            self.local_att.add(nn.Conv2D(channels, kernel_size=1, strides=1, padding=0))
            self.local_att.add(nn.BatchNorm())

            self.global_att = nn.HybridSequential(prefix='global_att')
            self.global_att.add(nn.GlobalAvgPool2D())
            self.global_att.add(nn.Conv2D(channels, kernel_size=1, strides=1, padding=0))
            self.global_att.add(nn.BatchNorm())

            self.sig = nn.Activation('sigmoid')

    def hybrid_forward(self, F, x, residual):

        xi = x + residual
        xl = self.local_att(xi)
        xg = self.global_att(xi)
        xlg = F.broadcast_add(xl, xg)
        wei = self.sig(xlg)

        xo = F.broadcast_mul(wei, residual) + x

        return xo

4.二、iAFF模塊

徹底上下文感知方法有一個不可避免的問題,即如何初始地集成輸入特性。初始融合質量做爲注意力模塊的輸入會對最終融合權重產生影響。因爲這仍然是一個特徵融合問題,一種直觀的方法是使用另外一個attention模塊來融合輸入的特徵,即iterative Attentional Feature Fusion (iAFF):

class AXYforXYAddFuse(HybridBlock):
    def __init__(self, channels=64):
        super(AXYforXYAddFuse, self).__init__()

        with self.name_scope():

            self.local_att = nn.HybridSequential(prefix='local_att')
            self.local_att.add(nn.Conv2D(channels, kernel_size=1, strides=1, padding=0))
            self.local_att.add(nn.BatchNorm())

            self.global_att = nn.HybridSequential(prefix='global_att')
            self.global_att.add(nn.GlobalAvgPool2D())
            self.global_att.add(nn.Conv2D(channels, kernel_size=1, strides=1, padding=0))
            self.global_att.add(nn.BatchNorm())

            self.sig = nn.Activation('sigmoid')

    def hybrid_forward(self, F, x, residual):

        xi = x + residual
        xl = self.local_att(xi)
        xg = self.global_att(xi)
        xlg = F.broadcast_add(xl, xg)
        wei = self.sig(xlg)

        xo = F.broadcast_mul(wei, xi)

        return xo

5 實驗和可視化結果

如下是做者根據現存的模型設計的部分模塊以進行實驗和對比:

經過下面的表格能夠看出本文所提方法的效果:

如下是基於Cifar100進行的實驗:

如下是基於ImageNet進行的實驗:

如下是Heatmap的輸出圖,能夠看出該方法的注意力的聚焦更加的集中和突出重點:

更多詳細信息,能夠參考論文原文:連接以下:

https://arxiv.org/abs/2009.14082

https://github.com/YimianDai/open-aff

參考:


[1].Attentional Feature Fusion

聲明:轉載請說明出處

掃描下方二維碼關注【AI人工智能初學者】公衆號,獲取更多實踐項目源碼和論文解讀,很是期待你個人相遇,讓咱們以夢爲馬,砥礪前行!!!

點「在看」給我一朵小黃花唄

本文分享自微信公衆號 - AI人工智能初學者(ChaucerG)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索