1. 程式人生 > >語義分割--Understand Convolution for Semantic Segmentation

語義分割--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系統可分為三類:

  1. 全卷積神經網路。例如FCN. 使用卷積層代替FC層,提高訓練和推斷效率,並可接收任意大小輸入;
  2. 使用CRF. 結構預測用於捕獲圖片內的本地和長距離依賴,用於細化分割結果;
  3. 使用空洞卷積。增加中間featue map的解析度,可在保持相同計算成本的同時提高預測精度。

大部分提高預測準確率的系統可分為兩類:

  1. 使用更優秀的特徵提取模型。即使用VGG16、ResNet等預訓練架構。這些更深的模型可對更復雜的資訊建模,學習更有區分力的feature並可更好的區分類別。
  2. 使用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?

考慮到模型輸入圖片大小(H,W,C),整個模型在預測前的輸出feature map大小為Fout=(h,w,c),其中 H/d=h,W/d=wd稱為下采樣因子(downsampling factor)。

  • 雙線性插值存在的問題:如果模型的d=16,即輸入到輸出下采樣了16倍。如果一個目標物的長或寬長度小於16個pixel,訓練label map需要下采樣到與模型輸出維度相同,即下采樣16倍時已經丟失了許多細節, 對應的模型預測結果雙線性插值上取樣是無法恢復這個資訊 。

DUC的方案:

針對這一問題,DUC將Fout的尺寸(h,w,c)通道轉為到(h,w,d2×L), L是分割類別數目。再reshape到label map大小(H,W,L)。 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=(0,label_num,1) MXNet中0代表保持不變,-1表示推斷~.
ASPP出來的資料形式為(N,channel,h,w)經過reshape甩成了(N,label_num,-1),即把每類的分類結果拍成向量形式。

下圖是本文一作關於DUC卷積的回答:
mark

下圖更好的闡述了DUC思想:

mark

從另一個角度想:DUC將整個label map(H,W,L)分為為d2個等大小的子圖(subparts),每個子圖和大小和Fout輸出的feature map大小相同。也就是說將label map切分為(h,w,d2×L)

模型的整體結構如下,DUC應用在輸出部分:

mark

DUC以原始解析度畫素級解碼,並且能夠自然的整合到FCN框架中,使得整個編碼和解碼能以end2end方式訓練。

Hybrid Dilated Convolution

對於二維訊號,卷積核大小k×k,經過擴張卷積的結果為kd×kd,其中kd=k+(k1)(r1).例如:

mark

  • 對於左邊:r=2,k=3. kd=3+(31)(21)=5,接收野為5×5
  • 對於右邊:r=3,k=3. kd=3+(31)(31)=7,接收野為7×7

擴張卷積可增加features map的解析度,故可替換FCN架構中的池化層。但是,擴張卷積存在一個理論上的問題,稱之為”gridding“:對於擴張卷積的一個畫素點p,對其有貢獻的是上一層以p為中心的kd×kd的鄰近區域,因為擴張卷積引入0值,在kd×kd的區域只計算k×k個畫素點,非0畫素點之間間隔為r1.

例如k=3,r=2的擴張卷積,從