語義分割--Understand Convolution for Semantic Segmentation
Understanding Convolution for Semantic Segmentation
Understanding Convolution for Semantic Segmentation
收錄:IEEE Winter Conference on Applications of Computer Vision (WACV 2018)
原文地址:HDC
程式碼:
Abstract
本文介紹了兩種操控捲積相關運算(convolution-related operations)方法用於提高語義分割效果:
設計密集上取樣卷積(dense upsampling convolution,DUC)
設計混合空洞卷積框架(hybrid dilated convolution,HDC),用於減輕擴張卷積產生的”gidding issue”影響,擴大接收野聚合全域性資訊。
論文在CityScapes上達到了80.1%mIoU,同樣在KITTI和VOC12上也達到了state-of-the-art 結果.
Introduction
大部分應用在語義分割任務上的CNN系統可分為三類:
- 全卷積神經網路。例如FCN. 使用卷積層代替FC層,提高訓練和推斷效率,並可接收任意大小輸入;
- 使用CRF. 結構預測用於捕獲圖片內的本地和長距離依賴,用於細化分割結果;
- 使用空洞卷積。增加中間featue map的解析度,可在保持相同計算成本的同時提高預測精度。
大部分提高預測準確率的系統可分為兩類:
- 使用更優秀的特徵提取模型。即使用VGG16、ResNet等預訓練架構。這些更深的模型可對更復雜的資訊建模,學習更有區分力的feature並可更好的區分類別。
- 使用CRF作為後端處理,整合CRF到模型內構成end2end訓練,並將額外的資訊例如邊緣合併到CRF內。
本文以另一個角度來提升效能,考慮到現在大多數模型分為encoding和decoding兩部分:
對於decoding:大多數模型在最終預測圖的基礎上,採用雙線性插值上取樣直接獲得與輸入同分辨率的輸出,雙線性插值沒有學習能力並且會丟失細節。本文提出了密集上取樣卷積(dense upsampling convolution,DUC),取代了簡單的雙線性插值,學習一組上取樣濾波器用於放大低解析度的feature。DUC支援end2end,便於融入FCN網路架構中
對於encoding:使用擴張卷積可以擴大感受野,減少使用下采樣(下采樣丟失細節比較嚴重)。本文指出空洞卷積存在”girdding”問題,即空洞卷積在卷積核兩個取樣畫素之間插入0值,如果擴張率過大,卷積會過於稀疏,捕獲資訊能力差。 本文提出了混合擴展卷積架構(hybrid dilation convolution,HDC): 使用一組擴充套件率卷積串接一下構成block,可擴大感受野的同時減輕”gridding”弊端。
論文以DUC和HDC為基礎卷積操作,構建更適合語義分割任務的深度神經網路系統.
Related Work
特徵表示解碼(Decoding of Feature Representation):因為池化操作不可避免的會下采樣。現在多種方案針對低解析度feature解碼出準確資訊,常見的雙線性上取樣節省儲存空間並且快;解卷積:使用池化的位置資訊幫助解碼階段,也有使用堆疊的解卷積層來恢復資訊,等等
擴張卷積(Dilated Convolution): 在卷積取樣中插入0值,用以擴張取樣解析度。例如DeepLab設計的ASPP聚合多個尺度資訊。等等
Approach
Dense Upsampling Convolution
為什麼要使用DUC?
考慮到模型輸入圖片大小,整個模型在預測前的輸出feature map大小為,其中 ,稱為下采樣因子(downsampling factor)。
- 雙線性插值存在的問題:如果模型的,即輸入到輸出下采樣了16倍。如果一個目標物的長或寬長度小於16個pixel,訓練label map需要下采樣到與模型輸出維度相同,即下采樣16倍時已經丟失了許多細節, 對應的模型預測結果雙線性插值上取樣是無法恢復這個資訊 。
DUC的方案:
針對這一問題,DUC將的尺寸通道轉為到, 是分割類別數目。再reshape到label map大小。 reshape操作代替瞭解卷積上取樣,可直接對接label map。
這裡比較難理解的是reshape操作,開源的程式碼如下:
# Base Network
res = get_resnet_hdc(bn_use_global_stats=bn_use_global_stats)
# ASPP
aspp_list = list()
for i in range(aspp_num):
pad = ((i + 1) * aspp_stride, (i + 1) * aspp_stride)
dilate = pad
conv_aspp=mx.symbol.Convolution(data=res, num_filter=cell_cap * label_num, kernel=(3, 3), pad=pad,
dilate=dilate, name=('fc1_%s_c%d' % (exp, i)), workspace=8192)
aspp_list.append(conv_aspp)
# 這是是ASPP模組輸出作畫素和
summ = mx.symbol.ElementWiseSum(*aspp_list, name=('fc1_%s' % exp))
# Reshape操作
cls_score_reshape = mx.symbol.Reshape(data=summ, shape=(0, label_num, -1), name='cls_score_reshape')
# Reshape完後直接送到Softmax
cls = mx.symbol.SoftmaxOutput(data=cls_score_reshape, multi_output=True,
normalization='valid', use_ignore=True, ignore_label=ignore_label, name='seg_loss')
return cls
可以看到reshape操作傳入的是shape= MXNet中0代表保持不變,-1表示推斷
~.
ASPP出來的資料形式為(N,channel,h,w)經過reshape甩成了(N,label_num,-1),即把每類的分類結果拍成向量形式。
下圖是本文一作關於DUC卷積的回答:
下圖更好的闡述了DUC思想:
從另一個角度想:DUC將整個label map分為為個等大小的子圖(subparts),每個子圖和大小和輸出的feature map大小相同。也就是說將label map切分為。
模型的整體結構如下,DUC應用在輸出部分:
DUC以原始解析度畫素級解碼,並且能夠自然的整合到FCN框架中,使得整個編碼和解碼能以end2end方式訓練。
Hybrid Dilated Convolution
對於二維訊號,卷積核大小,經過擴張卷積的結果為,其中.例如:
- 對於左邊:. ,接收野為
- 對於右邊:. ,接收野為
擴張卷積可增加features map的解析度,故可替換FCN架構中的池化層。但是,擴張卷積存在一個理論上的問題,稱之為”gridding“:對於擴張卷積的一個畫素點p,對其有貢獻的是上一層以p為中心的的鄰近區域,因為擴張卷積引入0值,在的區域只計算個畫素點,非0畫素點之間間隔為.
例如的擴張卷積,從