天天看點

6.4 DeepLab系列6.4 DeepLab系列

6.4 DeepLab系列

學習目标

  • 目标
    • 知道DeepLab系列算法的特點
    • 說明DeeplabV1的結構特點
    • 掌握DeeplabV1的空洞卷積與CRF應用
  • 應用

6.4.1 DeepLab 背景

相比于傳統的視覺算法(SIFT或HOG),Deep-CNN以其end-to-end方式獲得了很好的效果。這樣的成功部分可以歸功于Deep-CNN對圖像轉換的平移不變性(invariance),這根本是源于重複的池化和下采樣組合層。平移不變性增強了對資料分層抽象的能力,但同時可能會阻礙低級(low-level)視覺任務,例如姿态估計、語義分割等,在這些任務中我們傾向于精确的定位而不是抽象的空間關系。

Deep-CNN在圖像标記任務中存在兩個技術障礙:

  • 信号下采樣:在Deep-CNN中重複最大池化和下采樣帶來的分辨率下降問題,分辨率的下降會丢失細節。
    • 了解:也就是小物體資訊無法重建 (假設有四個pooling layer 則 任何小于 2^4 = 16 pixel 的物體資訊将理論上無法重建。)
  • 空間不敏感(invariance):分類器擷取以對象中心的決策是需要空間變換的不變性,這就限制了Deep-CNN的定位精度
    • 比如對于同一張圖檔進行空間變換(如平移、旋轉),其圖檔分類結果是不變的。對于圖像分割等Low-Level Vision Task,對于一張圖檔進行空間變換後,其結果是改變的。

High-Level & Low-level vision task

CNN适合于Hight-Level Vision Task(如圖像分類),不太适合于Low-Level Vision Task(如圖像分割、姿态估計)。

  • lower level feature :也叫進階的語義資訊,包括邊緣檢測,角點檢測,顔色之類的對細節敏感、抽象度比較低的任務。
  • high level feature:一些表面,表觀的資訊,比如紋理、邊緣。目标檢測、圖像分類等對細節資訊不敏感、抽象度比較高的任務。

6.4.2 Deeplab V1介紹

在實驗中發現DCNNs做語義分割時精準度不夠的問題,根本原因是DCNNs的進階特征的平移不變性(即高層次特征映射)。

  • DeepLab是結合了深度卷積神經網絡(DCNNs)和機率圖模型(DenseCRFs)的方法。
    • 系統與其他先進模型的主要差別在于DenseCRFs和DCNN的結合。是将每個像素視為CRF節點,利用遠端依賴關系,并使用CRF推理直接優化DCNN的損失函數。拓展:Koltun(2011)的工作表明完全連接配接的CRF在語義分割下非常有效。
6.4 DeepLab系列6.4 DeepLab系列

6.4.2.1 密集分類下的卷積神經網絡

1、結構

6.4 DeepLab系列6.4 DeepLab系列
  • 1、把最後的全連接配接層FC6、7、8改造成卷積層
  • 2、pool4的stride由2變為1,則緊接着的conv5_1, conv5_2和conv5_3中hole size為2。接着pool5由2變為1, 則後面的fc6中hole size為4。
  • 3、fc7,8為标準卷積
注:由于Hole(Atrous convolution)算法讓feature map更加dense,是以網絡直接用內插補點升采樣就能獲得很好的結果,而不用去學習升采樣的參數了(FCN中采用了de-convolution)

問題:FCN中有兩個關鍵,一個是pooling減小圖像尺寸增大感受野,另一個是upsampling擴大圖像尺寸。在先減小再增大尺寸的過程中,肯定有一些資訊損失掉了,那麼能不能設計一種新的操作,不通過pooling也能有較大的感受野看到更多的資訊呢?答案就是dilated conv/atrous conv

2、空洞卷積的使用

DeepLab是采用的atrous(帶孔)算法擴充感受野,擷取更多的上下文資訊

從兩個角度考慮空洞卷積:

  • 相當于在标準概念的kernel(卷積核)中,相鄰點之間添加(rate - 1)個0,然後使用擴張後的kernel(卷積核)與原圖進行卷積。下面的圖rate=2,相當于标準的3x3卷積核變為5x5卷積核,每一行中間添加(2-1)個0
    • 也就是說3x3的kernel在rate為2的情況下得到相當于5x5的空洞kernel,但是隻有圖中的9個點的權重不為0,其餘都為0。 可以看到雖然kernel size隻有3x3,但是這個卷積的感受野已經增大到了7x7。
6.4 DeepLab系列6.4 DeepLab系列

1、dilated的好處是不做pooling損失資訊的情況下,加大了感受野,讓每個卷積輸出都包含較大範圍的資訊。采樣率為r的空洞卷積插入r−1個零,将k×k的卷積核變為ke=k+(k−1)(r−1)而不增加計算量。下圖表示含有空洞卷積和不用空洞卷積的效果。結果就是使用采樣率計算更加密集的特征映射。

6.4 DeepLab系列6.4 DeepLab系列
  • 2、增大感受野的同時,不增加參數數量

3、問題:

  • signal down-sampling
    • 問題:DCNNs每一層重複執行下采樣 (如max-pooling和downsampling),導緻signal分辨率降低。
    • 将stride改小,能得到更加dense的feature map,可是卻也帶來了另外一個問題即receptive field(RF)變小的問題。
    • 将Hole(Atrous convolution)算法應用到DCNNs模型上來擴充感受野,擷取更多的上下文資訊。
  • spatial “insensitivity”(invariance)
    • 問題:以擷取圖像中物體為核心的決策(High Level Vision Task,如圖檔分類、目标檢測任務)需要空間不變性,即DCNNs的high-level的平移不變性(invariance),導緻DCNNs做語義分割時定位精準度不夠。
    • 将DCNNs層的響應和 完全連接配接條件随機場(Fully Connected CRFs)結合(DeepLab是由兩個非常成熟的子產品(DCNN和CRFs)級聯而成)

5、API實作

tf.nn.atrous_conv2d(value, filters, rate, padding, name=None)

value: 指需要做卷積的輸入圖像,要求是一個4維Tensor,具有[batch, height, width, channels]這樣的shape,具體含義是[訓練時一個batch的圖檔數量, 圖檔高度, 圖檔寬度, 圖像通道數]

filters: 相當于CNN中的卷積核,要求是一個4維Tensor,具有[filter_height, filter_width, channels, out_channels]這樣的shape,具體含義是[卷積核的高度,卷積核的寬度,圖像通道數,卷積核個數],同理這裡第三維channels,就是參數value的第四維

rate: 要求是一個int型的正數,正常的卷積操作應該會有stride(即卷積核的滑動步長),但是空洞卷積是沒有stride參數的,這一點尤其要注意。取而代之,它使用了新的rate參數,那麼rate參數有什麼用呢?它定義為我們在輸入圖像上卷積時的采樣間隔,你可以了解為卷積核當中穿插了(rate-1)數量的“0”,把原來的卷積核插出了很多“洞洞”,這樣做卷積時就相當于對原圖像的采樣間隔變大了。具體怎麼插得,可以看後面更加詳細的描述。此時我們很容易得出rate=1時,就沒有0插入,此時這個函數就變成了普通卷積。

padding: string類型的量,隻能是”SAME”,”VALID”其中之一,這個值決定了不同邊緣填充方式。

img =tf.constant(value=[[[[1],[2],[3],[4]],

[[1],[2],[3],[4]],

[[1],[2],[3],[4]],

[[1],[2],[3],[4]]]],dtype=tf.float32)

img =tf.concat(values=[img,img],axis=3)

filter =tf.constant(value=1, shape=[3,3,2,5], dtype=tf.float32)

out_img1 =tf.nn.atrous_conv2d(value=img, filters=filter, rate=1, padding='SAME')

out_img2 =tf.nn.atrous_conv2d(value=img, filters=filter, rate=1, padding='VALID')

out_img3 =tf.nn.atrous_conv2d(value=img, filters=filter, rate=2, padding='SAME')

#error#out_img4 = tf.nn.atrous_conv2d(value=img, filters=filter, rate=2, padding='VALID')

print('rate=1, SAME mode result:')

print(sess.run(out_img1.numpy()))

print('rate=1, VALID mode result:')

print(sess.run(out_img2.numpy()))

print('rate=2, SAME mode result:')

print(sess.run(out_img3.numpy())) # error #print 'rate=2, VALID mode result:' #print(sess.run(out_img4))
           

6.4.2.2 CRF的應用

1、背景

  • DCNN的預測物體的位置是粗略的,沒有确切的輪廓。圖像輸入CNN是一個被逐漸抽象的過程,原來的位置資訊會随着深度而減少甚至消失

2、CRFs for accurate localization

  • CRF:簡單來講就是每個像素點作為節點,像素與像素間的關系作為邊,即構成了一個條件随機場。通過二進制勢函數描述像素點與像素點之間的關系,鼓勵相似像素配置設定相同的标簽,而相差較大的像素配置設定不同标簽。
    • CRF在傳統圖像處理上主要做平滑處理。就是在決定一個位置的像素值時,會考慮周圍鄰居的像素值,這樣能抹除一些噪音。
  • 但對于CNN來說,short-range CRFs可能會起到反作用,因為我們的目标是恢複局部資訊,而不是進一步平滑圖像。引入fully connected CRF來考慮全局的資訊。

效果:

3、論文CRF設定

6.4.2.3 主要貢獻

  • 速度:帶atrous算法的DCNN可以保持8FPS的速度,全連接配接CRF平均推斷需要0.5s
  • 準确:在PASCAL語義分割挑戰中獲得了第二的成績
  • 簡單:DeepLab是由兩個非常成熟的子產品(DCNN和CRFs)級聯而成

6.4.3 DeepLab V1 實驗

  • 損失函數:輸出的特征圖與ground truth下采樣8倍做交叉熵和。
  • 訓練資料label:對原始Ground Truth進行下采樣8倍,得到訓練label。
  • 預測資料label:對預測結果進行雙線性上采樣8倍,得到預測結果。

測試細節:

item set
資料集 PASCAL VOC 2012 segmentation benchmark
DCNN模型 權重采用預訓練的VGG16
DCNN損失函數 交叉熵
訓練器 SGD,batch=20
學習率 初始為0.001,最後的分類層是0.01。每2000次疊代乘0.1
權重 0.9的動量, 0.0005的衰減

CRF和多尺度的表現

經過DeepLap之後的效果和之前的效果對比:

6.4.4 總結

  • DeepLab系列算法的特點
  • DeeplabV1的結構特點
  • DeeplabV1的空洞卷積與CRF應用