一種用於快速和準確場景解析的語義流
一、論文資訊
標題:《
Semantic Flow for Fast and Accurate Scene Parsing
》
作者:Xiangtai Li et al。
文章:
https://
arxiv。org/abs/2002。1012
0
原始碼:donnyyou/torchcv
文章收錄於CVPR 2020,bib引用如下:
@article{li2020semantic,
title={Semantic Flow for Fast and Accurate Scene Parsing},
author={Li, Xiangtai and You, Ansheng and Zhu, Zhen and Zhao, Houlong and Yang, Maoke and Yang, Kuiyuan and Tong, Yunhai},
journal={arXiv preprint arXiv:2002。10120},
year={2020}
}
二、論文解讀
本文作者致力於研究一種用於快速和精確的場景解析的高效方法。通常來說,提高語義分割效能的一種方法是獲得具有
強語義代表性的高解析度特徵圖
。有兩種方法被廣泛採用——
空洞卷積
以及
特徵金字塔融合
,第一種需要較大的計算量,第二種不夠高效。在影片語義分割中,人們一般會利用光流(Optical Flow)來對相鄰影片幀進行運動對齊(motion alignment)。受此啟發,作者提出了一種
FAM
(Flow Alignment Module),即
流對齊模組的方法來學習相鄰尺度特徵圖之間的語義流
。透過結合FPN接面構,實現了快速又精確的結果。
場景解析或者語義分割致力於對影象中的每一個畫素進行正確的分類。影響效能的兩個主要因素是:
空間
資訊 以及
語義
資訊。一般來說,高解析度的特徵圖對應著豐富的空間細節資訊,但同時會帶來過大的計算量;與之相反的是,具有強
語義資訊
的特徵圖一般解析度較小,但會缺乏足夠的空間細節資訊,不利於目標的精確定位。這兩者通常來說是互相制約的。諸如FCN引入了全卷積結構提高了語義分割的效能,但目標邊界的定位非常粗糙;在此基礎上,U-Net提出了基於Skip connection操作的編解碼結構,較好的改善了目標邊界的定位問題,對於小樣本資料集(如醫學、遙感、顯著性檢測等)的簡單任務來說,效能超群。但是,上升到較為複雜的道路場景解析層面,U-Net的能力顯然受限,這是由於其不能夠很好的提取出具有強語義性的特徵,特徵表達能力受限。為了更好的解決這個問題,PSPNet和DeepLab系列被提出。這兩個經典的語義分割模型都是基於Backbone+Context Modeling的方式。其中,PSPNet的核心是提出一個PPM模組對每個畫素的特徵進行建模,進而獲取全域性的資訊,讓分割的結果更具有語義一致性。DeepLab則提出了一個ASPP模組透過多個具有不同空洞率的並行空洞
卷積分支
來提取不同尺度的上下文資訊並結合全域性的上下文融合來進一步地提高特徵的表徵能力,缺點就是計算量太過龐大了。對於多尺度上下文資訊的提取,無非就是三種,第一種是對應用同一層級的特徵採用不同的空洞卷積或者不同的池化以透過不同的感受野來獲得;第二種是透過結合Multi-level的特徵來做一個多尺度特徵的提取;最後一種便是結合
注意力機制
或者稱為xx感知(Aware)的機制來動態的獲取。
語義分割一般有兩種框架:
第一種正規化是類似於DeepLab和PSPNet之類的網路,利用一個強大的Backbone作為主要的特徵提取,在網路的後半部分保留較高的解析度,然後利用各自提取的模組來獲取不同尺度的目標資訊,最後再直接多倍上取樣回去輸出最終的分割圖。
第二種正規化是基於
Encoder-Decoder結構
。同樣的,編碼層利用一個帶預訓練的權重作為主要的特徵提取,然後藉助Skip Connection操作,在解碼層中逐步恢復原始影象的空間解析度。這裡最主要的步驟便是Skip Connection,說白了就是一個高低階特徵的融合問題。這方面每年也有相當多的研究,比如U-Net就是直接將相鄰層級的
特徵Conca
t起來;Link-Net則是將其Add起來;ICNet提出一個級聯特徵融合CFF將其Fusion起來;另外還有很多利用注意力機制將其結合起來的,如將高低階特徵結合起來,然後利用一系列的注意力操作來生成相應的權重圖用於修正原來的低階特徵圖,最後再將兩者融合起來等。
主流的框Encoder-Decoder架構,在編碼層階段通常是利用插值演算法來恢復影象的解析度,但是這種方法對會造成語義的不
對齊
的問題。此外,由於殘差連線所引入的不對齊問題則更加複雜。因此,需要明確地建立
特徵對映
之間的對應關係,以解決它們的誤對齊。為了緩解這一問題,作者建議學習不同解析度層之間的語義流(
Semantic Flow
)。如前面所說的,本文旨在提出一種高效的分割模型,並受到影片語義分割領域的光流思想,提出了一個流對齊模組(FAM)。FAM將相鄰層級(adjacent levels)的特徵作為輸入,產生一個偏移場(offset field),最後根據這個偏移域將粗糙特徵(coarse feature)warp到具有高解析度的細化特徵。透過利用FAM,我們便可以將語義資訊更加有效地從深層傳遞到淺層。
影片語義分割的研究重點有兩個:第一個是如何利用影片幀與幀之間的時序關係來提升分割的精度;另一個是如何利用相鄰幀的之間的相似性來減少模型的計算量,從而提高模型的執行效率和吞吐量。其中有一個很重要的概念——光流被提出。光流(Optical Flow),通常是用於跳過某些幀的計算,將前一幀或前幾幀的特徵遷移(Warp)到當前幀,在一定程度上也起到了特徵增強的作用。因此,光流被定義為兩張影象之間對應畫素移動的向量。
圖3。(a) 流對齊模組的細節圖。 我們將變換後的高解析度特徵圖和低解析度特徵圖相結合,生成語義流場,用於將低解析度特徵圖warp到高解析度特徵圖。(b) 流對齊模組的Warp操作。高解析度特徵圖的值是低解析度特徵圖中相鄰畫素之間的雙線性插值,其中根據學習的語義流場(即偏移量)來定義鄰域。
流對齊模組——FAM
該任務在形式上類似於透過光流來對齊兩個影片幀,作者透過設計一個基於流的對齊模組,並透過預測流場(flow field)來對齊兩個相鄰層級的特徵圖。首先,遵守FlowNet-S[1]的設計,我們定義了一個這樣的流場,其中語義流是在特徵金字塔的不同層次之間產生的。具體來說:
(1)給定兩個相鄰層級的輸入特徵圖
和
;
(2)將
透過雙線性上取樣使其解析度與
相等,然後將這兩個特徵圖Concat起來並透過帶有2個濾波器的核大小為3×3卷積,然後便能預測出一個語義流場(semantic flow field)
。
(3)對於
空間網格
中的每個畫素點
,我們可以透過
將其對映到上層級
,然後,我們使用在空間轉換網路[2]中所提出的
可微分
雙線性取樣機制,該機制對
的4個領域(左上、右上、左下和右下)的值進行線性插值,以近似為
,即令
。整個過程如圖3(b)所示。
中間視覺化結果圖。作者這裡是透過基於通道對所有的特徵圖進行一個取平均操作所獲得的。顏色越深代表預測機率值越大,反之亦然。從結果圖可以看出,經過FAM模組(最右手邊)所獲得的特徵圖比直接雙線性上取樣(中間左上角那幅圖)更具有結構性,極大的減小了類內的差異性。
FAM模組相應的pytorch程式碼實現:
class
AlignModule
(
nn
。
Module
):
def
__init__
(
self
,
inplane
,
outplane
):
super
(
AlignModule
,
self
)
。
__init__
()
self
。
down_h
=
nn
。
Conv2d
(
inplane
,
outplane
,
1
,
bias
=
False
)
self
。
down_l
=
nn
。
Conv2d
(
inplane
,
outplane
,
1
,
bias
=
False
)
self
。
flow_make
=
nn
。
Conv2d
(
outplane
*
2
,
2
,
kernel_size
=
3
,
padding
=
1
,
bias
=
False
)
def
forward
(
self
,
x
):
low_feature
,
h_feature
=
x
# low_feature 對應解析度較高的特徵圖,h_feature即為低解析度的high-level feature
h_feature_orign
=
h_feature
h
,
w
=
low_feature
。
size
()[
2
:]
size
=
(
h
,
w
)
# 將high-level 和 low-level feature分別透過兩個1x1卷積進行壓縮
low_feature
=
self
。
down_l
(
low_feature
)
h_feature
=
self
。
down_h
(
h_feature
)
# 將high-level feature進行雙線性上取樣
h_feature
=
F
。
interpolate
(
h_feature
,
size
=
size
,
mode
=
“bilinear”
,
align_corners
=
False
)
# 預測語義流場 === 其實就是輸入一個3x3的卷積
flow
=
self
。
flow_make
(
torch
。
cat
([
h_feature
,
low_feature
],
1
))
# 將Flow Field warp 到當前的 high-level feature中
h_feature
=
self
。
flow_warp
(
h_feature_orign
,
flow
,
size
=
size
)
return
h_feature
@staticmethod
def
flow_warp
(
inputs
,
flow
,
size
):
out_h
,
out_w
=
size
# 對應高解析度的low-level feature的特徵圖尺寸
n
,
c
,
h
,
w
=
inputs
。
size
()
# 對應低解析度的high-level feature的4個輸入維度
norm
=
torch
。
tensor
([[[[
out_w
,
out_h
]]]])
。
type_as
(
inputs
)
。
to
(
inputs
。
device
)
# 從-1到1等距離生成out_h個點,每一行重複out_w個點,最終生成(out_h, out_w)的畫素點
w
=
torch
。
linspace
(
-
1。0
,
1。0
,
out_h
)
。
view
(
-
1
,
1
)
。
repeat
(
1
,
out_w
)
# 生成w的轉置矩陣
h
=
torch
。
linspace
(
-
1。0
,
1。0
,
out_w
)
。
repeat
(
out_h
,
1
)
# 展開後進行合併
grid
=
torch
。
cat
((
h
。
unsqueeze
(
2
),
w
。
unsqueeze
(
2
)),
2
)
grid
=
grid
。
repeat
(
n
,
1
,
1
,
1
)
。
type_as
(
inputs
)
。
to
(
inputs
。
device
)
grid
=
grid
+
flow
。
permute
(
0
,
2
,
3
,
1
)
/
norm
# grid指定由input空間維度歸一化的取樣畫素位置,其大部分值應該在[ -1, 1]的範圍內
# 如x=-1,y=-1是input的左上角畫素,x=1,y=1是input的右下角畫素。
# 具體可以參考《Spatial Transformer Networks》,下方參考文獻[2]
output
=
F
。
grid_sample
(
inputs
,
grid
)
return
output
整體網路結構框圖
上圖顯示了整個網路體系結構,其中包含一個自下而上的路徑(bottom-up pathway)作為編碼器和一個自上而下(top-down pathway)的路徑作為解碼器,編碼器有一個與影象分類相同的骨幹(Backbone),這裡將最後的全連線層替換為上下文建模模組(PPM),解碼器則是一個典型的FPN接面構,其中配備了FAM。 每個部分的細節描述如下:
(1)
Backbone
:作者這裡使用了在ImageNet上預訓練過的
ResNet系列
、ShuffleNet v2以及DF系列作為骨幹網路用於主要的特徵提取,這裡最後一層用於分類的全連線層被移除掉。此外,所有的骨幹均有四個stage,每個stage的第一個卷積層為步長為2的卷積用於對特徵圖進行下采樣以提高計算效率並獲得更大的感受野。
The
receptive field
is defined as the region in the input space that a particular CNN’s feature is looking at (i。e。 be affected by)。 —— A guide to receptive field arithmetic for Convolutional Neural Networks
(2)
Context Module
:作者這裡採用了PPM模組來捕捉長距離的上下文資訊。由於PPM的輸出與最後一個殘差模組具有相同的解析度特徵圖,我們將PPM和最後一個殘差模組作為FPN的最後階段。
(3)
Aligned FPN Decoder
:對齊的FPN解碼器從編碼器中獲取特徵圖,並使用對齊的特徵金字塔進行最終的場景解析。在解碼器中,將原來的雙線性上取樣操作替換為FAM模組來對齊頂層(top-level)特徵圖,並透過Add操作跌加到相應的底層(bottom-level)特徵圖上。最後,將Decoder中每個stage的特徵圖上取樣到原始輸入影象的1/4,然後將這些
特徵圖Conca
t起來,用於最終的預測。考慮到不同層級之間的對齊問題,作者這裡同樣使用了FAM模組來替換原始的上取樣操作。
(4)
Cascaded Deeply Supervised Learning
: 作者這裡使用深監督損失來監督解碼器的中間輸出,以便於最佳化。此外,還利用OHEM(online hard example mining)線上困難樣本挖掘對交叉熵損失排序後的前10%的
hardest畫素
進行訓練。
實驗部分
1。
實現細節
:
訓練階段:全部實驗基於
Pytorch框架
。所有的網路均基於相同的設定:最佳化演算法(SGD with momentum of 0。9 and L2 norm of 5e-4)、
批次大小
(16)、初始學習率(0。01)以及迭代次數(50K)。採用多項式的學習率衰減策略,衰減因子為0。9。資料增強方面採用隨機的水平翻轉,隨機尺度(0。75和2。0兩個尺度)縮放以及隨機裁剪成1024×1024的輸入。
推理階段:除了特別說明外,均採用整圖預測的方式。為了進行量化評估,採用mIoU作為評價指標,同時FLOPs和FPS指標也被採納。在驗證集上做消融實驗,在測試集上比較與其他模型之間的效能。
2。
消融實驗
:
(1)
Comparison with baseline methods:
從表1可以看出,直接採用空洞卷積相對於原始的FCN能提升1。1%的mIoU值。此外,透過在FCN的基礎上加入Decoder(i。e。 FPN),相對原始的FCN提升了3。3個點;接下來,將Decoder部分的雙線性上取樣替換為FAM模組,又獲得了顯著的提升;最後,透過結合PPM模組也獲得一致性的效能提升。
(2)
Positions to insert FAM
:
表2用於驗證在不同stage插入FAM對效能的影響。從前三行開始,FAM改進了所有階段,並在最後階段得到了最大的改進,這表明FPN上的所有階段都存在不對齊的問題,在粗糙層(coarse layers,即解析度越小的層級)中更為嚴重。這種現象與粗層包含更強的語義但解析度較低的事實是一致的,並且當它們被適當地提升到高解析度時,可以大大提高分割效能。
(3)
Ablation study on different contextual heads
:
考慮到目前最先進的上下文模組被用作擴充套件骨幹網路的頭部,作者進一步嘗試在他們的方法中使用不同的上下文頭部,其中粗特徵圖用於上下文建模。可以看出,PPM模組表現效能最佳,達到了78。3%的mIoU值,而基於Non-Local的方法表現則最差。
(4)
Ablation study on different backbones
:
作者進一步地驗證了不同Backbone對效能的影響。這裡統一採用帶有PPM頭部的FPN作為Decoder。可以看出,ResNet-101的效能是最好的,同時也意味著高昂的計算量。從另一個角度看,FAM可以對不同的Backbone進行一致性的效能提升,均漲了2。x個點,而且僅僅增大了一點點計算量。
3。
Visualization of Semantic Flow
:
圖5顯示了FAM在不同階段的語義流。與傳統的光流相似,語義流可以透過對顏色進行編碼視覺化,並被雙線性插值到相同的影象大小(b-d),以便快速的瀏覽。此外,向量場也被視覺化(e),以便進行細節的檢查。從視覺化圖(e)中(由於編輯器的限制,這裡需要找到原paper自行放大來觀察圖中的箭頭流向。。。),可以觀察到
語義流傾向於收斂到物件內部的某些位置
,其中這些位置通常位於目標中心附近,並且有更好的感受野來啟用具有純、強語義的頂層特徵。然後這些位置的頂層特徵在語義流的指導下傳播到適當的高解析度位置。此外,語義流也有從上到下、從粗到細的趨勢,這一現象與語義流逐漸描述逐漸減小的模式之間的偏移量這一事實是一致的。
三、總結
語義分割提升效能最主要的關鍵步驟有兩個:(1)如何高效地提取高度抽象的具有豐富語義資訊的代表性特徵;(2)如何將提取到的高階特徵更有效的還原回去。
對於第(1)點,一般可以利用強有力的Backbone來進行基本的特徵提取,再輔助一些多尺度模組或注意力模組來對全域性的上下文資訊進行建模,有效的獲取整張影象的資訊。對於第(2)點,一般涉及到資訊流的問題。由於在編碼過程中不可避免的會損失掉過多的空間資訊,於是在解碼過程中需要有更多的細節資訊引導才能更加有效的還原回去。
在這篇文章中,作者著重解決第(2)點,設計了一種可學習的語義流來對齊由特徵金字塔產生的多級特徵圖並將其應用到場景解析任務中。在所提出的流對齊模組(FAM)中,低解析度的高階特徵圖上的語義資訊很好地流向了高解析度的低階特徵圖中。透過丟棄空洞卷積來減少計算開銷並利用流對齊模組來豐富低層特徵的語義表示,使網路能夠在語義分割精度和執行時間效率之間實現了最佳的權衡。
Reference:
[1] Alexey Dosovitskiy, Philipp Fischer, Eddy Ilg, Philip Hausser, Caner Hazirbas, Vladimir Golkov, Patrick Van Der Smagt, Daniel Cremers, and Thomas Brox。 Flownet: Learning optical flow with convolutional networks。 In CVPR, 2015。
[2] Max Jaderberg, Karen Simonyan, Andrew Zisserman, and Koray Kavukcuoglu。 Spatial transformer networks。 ArXiv, abs/1506。02025, 2015。