語義分割之Dual Attention Network for Scene Segmentation


Dual Attention Network for Scene Segmentation

 

        在本文中,我們通過 基於自我約束機制捕獲豐富的上下文依賴關系來解決場景分割任務。
       與之前通過多尺度特征融合捕獲上下文的工作不同,我們提出了一種雙重注意網絡(DANet)來自適應地集成局部特征及其全局依賴性

       具體來說,我們在傳統的擴張FCN之上附加兩種類型的注意力模塊,它們分別對空間和通道維度中的語義相互依賴性進行建模。

  • 位置力關注模塊通過所有位置處的特征的加權和來選擇性地聚合每個位置處的特征。無論距離如何,相似的特征都將彼此相關。
  • 同時,通道注意力模塊通過整合所有通道映射中的相關特征來選擇性地強調相互依賴的信道映射。

       我們將兩個注意模塊的輸出相加以進一步改進特征表示,這有助於更精確的分割結果。

相關工作

       場景分割是一個基本且具有挑戰性的問題,其目標是將場景圖像分割和解析到與語義類別相關聯的不同圖像區域,包括填充物(例如天空,道路,草地)和離散物體(例如人,汽車,自行車)。 該任務的研究可應用於潛在的應用,例如自動駕駛,機器人傳感和圖像編輯。 為了有效地完成場景分割任務,我們需要區分一些令人困惑的類別,並將不同外觀的對象分解。 例如,“田地”和“草地”的區域通常是難以區分的,並且通常難以區分的“汽車”可能具有不同的尺度,遮擋和照明。 因此,有必要提高像素級識別特征表示的辨別能力
 

  • 一種方法是利用多標簽文本融合。 例如,一些作品通過組合由不同的擴張卷積和池化操作生成的特征圖來聚合多尺度上下文。
  • 有些作品通過使用分解結構擴大核大小或在網絡頂部引入有效編碼層來捕獲更豐富的全局通信信息。
  • 此外,提出編碼器 - 解碼器結構來融合中級和高級語義特征。

雖然上下文融合有助於捕獲不同比例的對象,但它無法利用全局視圖中對象或東西之間的關系,這對於場景分割也是必不可少的。

          另一種類型的方法使用遞歸神經網絡來利用長程依賴性,從而提高分割精度。提出了基於2DLSTM網絡的方法來捕獲標簽上復雜的空間依賴性。         

         工作[DAGRNN]使用有向無環圖構建一個遞歸神經網絡,以捕獲局部特征上豐富的上下文依賴性。然而,這些方法使用遞歸神經網絡隱含地捕捉全局關系,其有效性在很大程度上依賴於長期記憶的學習結果。
 

本文工作

為了解決上述問題,在本文中,我們提出了一種新的框架,稱為雙注意網絡(DANet),用於自然場景圖像分割,如圖所示。它引入了一種自注意力機制來分別捕捉空間和通道尺寸中的視覺特征依賴性。

具體來說,我們在傳統的_擴張FCN_之上添加了兩個並行的注意模塊。一個是位置注意力模塊(position attention module),另一個是通道注意模塊(channel attention module)。

1、對於位置注意模塊,我們引入自注意力制來捕獲特征圖的任意兩個位置之間的空間依賴性。對於特定位置的特征,通過**加權累積的所有位置的特征來聚合更新特征 權重由相應兩個位置之間的特征相似性決定。也就是說,任何具有相似特征的兩個位置都可以貢獻出改進,無論它們在空間維度上的距離如何。
2、對於通道注意力模塊,我們使用相似的自注意力機制來捕獲任意兩個通道映射之間的通道依賴關系,並 使用所有通道映射的加權和來更新每個通道映射。
最后,這兩個注意模塊的輸出被融合以進一步增強特征表示。
 

      值得注意的是,在處理復雜多樣的場景時,我們的方法比以前的方法[Rethinking atrous convolution for semantic image segmentation, PSPNet]更有效,更靈活。走圖中的街景。以圖1為例。

1、首先,第一行中的一些“人”和“交通信號燈”因為光照和視角, 是不顯眼或不完整的物體。
2、如果探索簡單的上下文嵌入,來自主導的顯着對象(例如汽車,建築物)的上下文將損害那些不顯眼的對象標記。
3、相比之下,我們的注意模型選擇性地聚合不顯眼對象的相似特征,以突出其特征表示,並避免顯着對象的影響。
4、其次,“汽車”和“人”的尺度是多樣的,並且識別這種不同的對象需要不同尺度的背景信息。也就是說,應該平等對待不同尺度的特征以表示相同的語義。
5、我們的注意機制模型只是旨在從全局視角自適應地集成任何尺度的相似特征,這可以解決上述問題的程度。
6、第三,我們明確地考慮空間關系和通道關系,以便場景理解可以受益於遠程依賴。
 

我們的主要貢獻可歸納如下:

 

  • 我們提出了一種具有自注意力機制的新型雙重注意網絡(DANet),以增強場景分割的特征表示的判別能力。
  • 提出了一種位置注意力模塊來學習特征的空間相互依賴性,並設計了一個通道注意力模塊來模擬通道相互依賴性。 它通過在本地特征上建模豐富的上下文依賴性來顯着改善分割結果。
  • 我們在三個流行基准測試中獲得了新的最新結果,包括Cityscapes數據集,PASCAL Context數據集和COCO Stuff數據集。

 

雙注意力網絡

  • We employ a pretrained residual network with the dilated strategy as the backbone.
  • Note that we** remove the downsampling operations and employ dilation convolutions in the last two ResNet blocks**, thus enlarging the size of the final feature map size to 1/8 of the input image. This retains more details without adding extra parameters.
  • Then the features from the dilated residual network would be fed into two parallel attention modules.

1、Dilated ResNet

2、A convolution layer: obtain the feature of dimension reduction => CxHxW
3、Position attention module: generate new features of spatial long-range contextual information:
4、The first step is to generate a spatial attention matrix which models the spatial relationship between any two pixels of the features.
5、Next, we perform a matrix multiplication between the attention matrix and the original features.
6、Third, we perform an element-wise sum operation on the above multiplied resulting matrix and original features to obtain the final representations reflecting long-range contexts.
7、Channel attention module: Meanwhile, channel long-range contextual information are captured by a channel attention module.
 除了第一步之外,捕獲通道關系的過程類似於位置注意力模塊,其中在通道維度中計算通道注意力矩陣。最后,我們匯總了兩個注意模塊的輸出特征,以獲得更好的像素級預測特征表示。

 

 

Position Attention Module

       對於場景理解, 判別特征表示是必不可少的,可以通過捕獲遠程上下文信息來獲得。然而,許多作品表明傳統FCN產生的局部特征表示可能導致objects和stuff的錯誤分類。
       為了在局部特征表示之上建模豐富的上下文關系,我們引入了一個位置注意力模塊。位置注意力模塊將更廣泛的上下文信息編碼到局部特征中,從而增強其表示能力。
 

如圖:

 

 

Important:

1、A為CxHxW => Conv+BN+ReLU => B, C 都為CxHxW

2、Reshape B, C to CxN (N=HxW)
3、Transpose B to B’
4、Softmax(Matmul(B’, C)) => spatial attention map S為NxN(HWxHW)
5、如上式1, 其中sji測量了第i個位置在第j位置上的影響
6、也就是第i個位置和第j個位置之間的關聯程度/相關性, 越大越相似.
7、A => Covn+BN+ReLU => D 為CxHxW => reshape to CxN
8、Matmul(D, S’) => CxHxW, 這里設置為DS
9、Element-wise sum(scale parameter alpha * DS, A) => the final output E 為 CxHxW (式2)
10、alpha is initialized as 0 and gradually learn to assign more weight.

 

 


   這樣一來, 每個算出來的特征E的每個位置都是來自所有位置的特征和原始特征的加權和. 因此可以獲得一個全局的上下文信息, 並且可以根據空間注意力圖來有選擇的集成上下文信息. 相似的特征會互相獲得增益, 因此可以提升類間對比度和語義一致性.

利用矩陣乘法來實現對於全局上下文信息的利用與融合, 實際上和全連接是一樣的. 全連接確實可以更為全面的利用所有位置的信息, 但是會破壞空間結構, 這也是相互矛盾的, 所以, 不能完全的利用全連接. 還得想辦法保留更多的空間結構信息. 這里使用這個全連接的結果用在原始數據信息上, 互相利用, 互相促進.

Channel Attention Module

高級特征的每個通道映射可以被重新看作特定於類的響應,並且不同的語義響應彼此相關聯。通過利用通道映射之間的相互依賴關系,我們可以強調相互依賴的特征映射,並改進特定語義的特征表示。因此,我們建立了一個通道注意力模塊, 以顯式的建模通道之間的相互依賴性。

結構如下:

1、A(CxHxW) => 直接計算得到通道注意力圖X(CxC)
2、Reshape(A) to CxN(N=HxW)
3、Softmax(Matmul(A, A’)(大小為CxC)) => channel attention map X(CxC), 這里使用公式3
4、xji測量在第j個通道上, 第i個通道的影響.(因為對於xji實際上就是使用A的j行和A’的i列(或者說是A的i行)的矢量乘積(坐標對應乘積之和))
5、Matmul(X’, A) => reshape to CxHxW
6、Element-wise sum(scale parameter beta * X, A)
7、beta從0開始逐漸學習.
 

公式4顯示 每個通道的最終特征是所有通道和原始特征的特征的加權數據,其建模特征映射之間的遠程語義依賴性。它 強調依賴於類的特征映射並有助於提高特征可辨性。

我們在計算兩個通道的關系之前,我們不使用卷積層來嵌入特征,因為可以維持不同通道映射之間的關系。此外,與最近通過全局池化或者編碼層探索通道關系的工作[26]不同,我們利用所有相應位置的空間信息來建通道相關性。
 

Attention Module Embedding with Networks

為了充分利用遠程上下文信息的優勢, 我們集成來自兩個注意力模塊的特征. 特別地, 我們通過一個卷積層和元素級加法來聚合兩個注意力模塊的輸出, 以實現特征融合.

在最后緊跟着一個用來生成最終預測圖的卷積層. 我們不采用級聯操作, 因為它需要更多的 GPU 內存.

注意到我們的注意力模塊很簡單, 可以直接插入現有的 FCN流程中。 它們不會增加太多的參數, 卻又能有效地增強特征表示。
 

雙注意力模塊參考代碼

# https://github.com/junfu1115/DANet/blob/master/encoding/nn/attention.py

###########################################################################
# Created by: CASIA IVA
# Email: jliu@nlpr.ia.ac.cn
# Copyright (c) 2018
###########################################################################

import numpy as np
import torch
import math
from torch.nn import (Module, Sequential, Conv2d, ReLU, AdaptiveMaxPool2d,
                      AdaptiveAvgPool2d, NLLLoss, BCELoss, CrossEntropyLoss,
                      AvgPool2d, MaxPool2d, Parameter, Linear, Sigmoid, Softmax,
                      Dropout, Embedding)
from torch.nn import functional as F
from torch.autograd import Variable


class PAM_Module(Module):
    """ Position attention module"""

    # Ref from SAGAN
    def __init__(self, in_dim):
        super(PAM_Module, self).__init__()
        self.query_conv = Conv2d(in_channels=in_dim,
                                 out_channels=in_dim // 8,
                                 kernel_size=1)
        self.key_conv = Conv2d(in_channels=in_dim,
                               out_channels=in_dim // 8,
                               kernel_size=1)
        self.value_conv = Conv2d(in_channels=in_dim,
                                 out_channels=in_dim,
                                 kernel_size=1)
        self.gamma = Parameter(torch.zeros(1))

        self.softmax = Softmax(dim=-1)

    def forward(self, x):
        """
        inputs :
            x : input feature maps( N X C X H X W)
        returns :
            out : attention value + input feature
            attention: N X (HxW) X (HxW)
        """
        m_batchsize, C, height, width = x.size()

        # B => N, C, HW
        proj_query = self.query_conv(x).view(m_batchsize, -1, width * height)
        # B' => N, HW, C
        proj_query = proj_query.permute(0, 2, 1)

        # C => N, C, HW
        proj_key = self.key_conv(x).view(m_batchsize, -1, width * height)

        # B'xC => N, HW, HW
        energy = torch.bmm(proj_query, proj_key)
        # S = softmax(B'xC) => N, HW, HW
        attention = self.softmax(energy)

        # D => N, C, HW
        proj_value = self.value_conv(x).view(m_batchsize, -1, width * height)

        # DxS' => N, C, HW
        out = torch.bmm(proj_value, attention.permute(0, 2, 1))
        # N, C, H, W
        out = out.view(m_batchsize, C, height, width)

        out = self.gamma * out + x
        return out


class CAM_Module(Module):
    """ Channel attention module"""

    def __init__(self):
        super(CAM_Module, self).__init__()

        self.gamma = Parameter(torch.zeros(1))
        self.softmax = Softmax(dim=-1)

    def forward(self, x):
        """
        inputs :
            x : input feature maps( N X C X H X W)
        returns :
            out : attention value + input feature
            attention: N X C X C
        """
        m_batchsize, C, height, width = x.size()
        proj_query = x.view(m_batchsize, C, -1)
        proj_key = x.view(m_batchsize, C, -1).permute(0, 2, 1)
        # N, C, C, bmm 批次矩陣乘法
        energy = torch.bmm(proj_query, proj_key)

        # 這里實現了softmax用最后一維的最大值減去了原始數據, 獲得了一個不是太大的值
        # 沿着最后一維的C選擇最大值, keepdim保證輸出和輸入形狀一致, 除了指定的dim維度大小為1
        energy_new = torch.max(energy, -1, keepdim=True)
        energy_new = energy_new[0].expand_as(energy)  # 復制的形式擴展到energy的尺寸
        energy_new = energy_new - energy
        attention = self.softmax(energy_new)

        proj_value = x.view(m_batchsize, C, -1)

        out = torch.bmm(attention, proj_value)
        out = out.view(m_batchsize, C, height, width)

        out = self.gamma * out + x
        return out


if __name__ == '__main__':
    module = CAM_Module()
    in_data = torch.randint(0, 255, (2, 3, 7, 7), dtype=torch.float32)
    print(module(in_data).size())

 

實驗細節

 

  • employ a poly learning rate policy (lr(1-iter/total_iter)^0,9)*
  • momentum 0.9
  • weight decay 0.0001
  • Synchronized BN
  • batchsize 8(cityscapes) or 16(other datasets)
  • When adopting multi-scale augmentation, we set training time to 180 epochs for COCO Stuff and 240 epochs for other datasets
  • Following [Deeplab: Semantic image segmentation with deep convolutional nets, atrous convolution, and fully connected crfs], we also adopt auxiliary supervision on the top of two attention modules.
  • For data augmentation, we apply random cropping (crop-size 768) and random left-right flipping during training in the ablation study for Cityscapes datasets.

Ablation Study for Attention Modules

 

 

      位置注意力模塊的效果在圖4中可視化, 一些細節和對象邊界在使用位置注意力模塊時更加清晰, 例如第一行中的 “桿子” 和第三行的 “人行道”。對局部特征的選擇性融合增強了對細節的區分。

同時, 圖5證明, 利用我們的信道注意模塊, 一些錯誤分類的類別現在被正確地分類, 如第一行和第三行中的 “公交車”。 通道映射之間的選擇性集成有助於捕獲上下文信息。 語義一致性得到了明顯的改善。

 

Ablation Study for Improvement Strategies

Following [Rethinking atrous convolution for semantic image segmentation], we adopt the same strategies to improve peformance further.

1、DA: Data augmentation with random scaling.
2、Multi-Grid: we apply employ a hierarchy of grids of different sizes (4,8,16) in the last ResNet block.
3、MS: We average the segmentation probability maps from 8 image scales {0.5 0.75 1 1.25 1.5 1.75 2 2.2} for inference.
 

Visualization of Attention Module

Comparing with State-of-the-art

 

其他數據集的測試

另外的一些想法

  • 這里的雙注意力模塊如何更好的集成到現有的FCN結構上, 一定要放在最后預測之前么?
  • 這里的實驗中, 沒有和現在最強的DeepLabV3+進行比較, 這一點有點可惜. 感覺還是超不過DeepLabV3+.

 

補充內容

文中的注意力模塊中的位置注意力模塊, 基本上與何凱明的<X. Wang, R. Girshick, A. Gupta, and K. He. Non-Local
Neural Networks. In CVPR , 2018>提出的Non-Local結構是一致的.
 

而該自注意力的思路主要來源於google的一份工作(Attention Is All You Need):   https://arxiv.org/abs/1706.03762

在Goodfellow的這篇文章中使用了 <H. Zhang, I. J. Goodfellow, D. N. Metaxas, and A. Odena. Self-attention generative adversarial networks. CoRR, abs/1805.08318, 2018> 類似的結構.https://arxiv.org/abs/1805.08318
 

 

 


免責聲明!

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



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