不得不說,這篇論文和DANet撞車了,而且撞的死死的,用的同樣的核心內容,爲什麼會撞車,那是因爲,兩個篇文章都套用了同一篇文章的方法,同時想到了一起,你說巧不巧
不同於之前圖像級的context的方法,這篇論文提出逐像素的object context,object context由像素P所對應的類別的物體組成。由於測試時不知道標籤信息,所以用Self Attention方法通過學習逐像素的相似度圖估計objects。在此基礎上有進一步提出了Pyramid Object Context和Atrous Spatial Pyramid Object Context來捕獲多尺度的上下文。在object context module基礎上提出了OCNet,OCNet在Cityscapes和ADE20K數據集上取得了state-of-the-art的結果。
paper: https://arxiv.org/abs/1809.00916
code: https://github.com/PkuRainBow/OCNet
主要貢獻:
- 提出了逐像素的object context,包含了與像素P相同類別的objects的信息。
- OCNet在Cityscapes和ADE20K數據集上取得了state-of-the-art的結果
OverView
OCNet以ResNet-101爲backbone(後兩個block爲dilated convolution,dilation rate分別爲2和4),其後是這篇文章提出的object context module去計算逐像素的object context,最後是1×1的卷積輸出預測圖。object context module是基於Self Attention Mechanism,作者一共提出了3種不同的object context module: base-OC, Pyramid-OC, ASP-OC。
Object Context
這裏大致介紹了Object Context module中的變量和基本原理。
X爲輸入的特徵圖,P爲位置特徵圖,W爲由self-attention得到的逐像素的相似度圖,第i行表示所有像素與第i個像素的相關性,C爲Object Context module最後得到的逐像素的object context表達。用公式表示爲:
其中W可由以下公式得到:
進一步又可以寫成:
其中:
Object Context Module
這裏介紹了3種不同的object context module: base-OC, Pyramid-OC, ASP-OC。每個object context module都含有3個階段:(1)計算X;(2)計算C;(3)融合。
Base-OC
(1)計算X: 3×3的卷積減少channel從2048到512
(2)計算C: 用self-attention模塊計算逐像素的attention map和object context
(3)融合: concatenate C 和 X
進一步用1×1的卷積減少channel維度爲512
Pyramid-OC(受PSPNet的啓發)
(1)計算X: 3×3的卷積減少channel從2048到512
(2)計算C: 在四個分支中分別用self-attention模塊計算逐像素的attention map和object context。第一個分支把全部特徵圖作爲輸入,第二個分支把特徵圖分爲2×2的子區域,每個子區域應用共享的transform,第三個和第四個分支把輸入分爲3×3和6×6的子區域,每個子區域的transform不共享。最後concatenate每個分支的結果並用1×1的卷積增加X的維度與object context的維度相等再進行concatenate
(3)融合: 進一步用1×1的卷積減少channel維度爲512
ASP-OC(受DeepLAbV3的ASPP啓發)
(1)計算X: 共有5個分支。分別爲1×1的卷積,3×3的卷積,dilation rate爲12的3×3卷積,dilation rate爲24的3×3卷積,dilation rate爲36的3×3卷積
(2)計算C: 對每個分支的結果分別用self-attention模塊計算逐像素的attention map和object context。實驗發現再2,3,4,5分支中使用self-attention模塊會有害performance
(3)融合: concatenate C 和 X,進一步用1×1的卷積減少channel維度爲512