深度學習方法下圖像分割的記錄和理解

分割分類

  • 普通分割php

    將不一樣類別物體的像素區域分開。
    如前景與後景分割開,狗的區域與貓的區域、背景分割開。git

  • 語義分割github

    在普通分割的基礎上,分類出每一塊區域的語義(即這塊區域是什麼物體)。
    如把畫面中的全部物體都指出它們各自的類別。網絡

  • 實例分割app

    在語義分割的基礎上,給每一個物體編號。
    如這個是該畫面中的狗A,那個是畫面中的狗B。框架

當下現狀

最初,圖像塊分類是最經常使用的方法,就是根據圖像像素點周圍的圖像塊肯定每一個像素的類別CNN極大的提升了圖像分割的精度。FCN的出現改變了這個現狀,也把分割任務提高到新的階段。如今幾乎全部的語義分割都是在這個結構上改來改去的。dom

主要的套路以下:性能

  • encoder-decoder結構。
  • 多尺度的特徵融合,空洞卷積,不一樣級別的上採樣。
  • 條件隨機場(Conditional Random Field,CRF)進行後期處理

FCN

FCN是深度學習用於語義分割的鼻祖了。學習

FullyConvolutional Networks forSemantic Segmentation 是 UC Berkeley提出來的,也是 2015 年CVPR的best paper 。2014年11月發表在arXiv上。測試

FCN的主要思想以下圖所說:

將本來的分類模型(AlexNet)的最後的全鏈接層,轉化成全卷積,不在輸出分類特徵,而是一個熱圖(heatmap)。

20180717210043

下面FCN更詳細的信息:

  • FCN-32s

    在模型最後conv 7的特徵圖上,進行步長爲32的,上採樣,還原到原始圖片大小。

  • FCN-16s

    在pool 4 層後,加上一個1x1的卷積層,產生一個支路輸出特徵圖A。

    對conv 7的輸出進行步長爲 2的上採樣,獲得特徵圖B。

    這時候A和B大小同樣,進行特徵融合,而後進行步長爲16的上採樣,還原到原始圖片大小。

  • FCN-8s

    在pool 3 層後,加上一個1x1的卷積層,產生一個支路輸出特徵圖A。

    在pool 4 層後,加上一個1x1的卷積層,輸出進行步長爲 2的上採樣,產生一個支路輸出特徵圖B。

    對conv 7 的輸出進行步長爲 4 的上採樣,獲得特徵圖C。

    這時候A、B、C大小同樣,進行特徵融合,而後進行步長爲8的上採樣,還原到原始圖片大小。

關於上面所說的上採樣:

上採樣本質是插值。FCN中上採樣的方法是反捲積(Deconvolution)。Caffe和Kera裏叫Deconvolution,而tensorflow 裏叫 conv_transpose。論文中,做者說反捲積的卷積核是能夠學習的,可是代碼中並無學習,lr_mult: 0。和網絡前面卷積層不一樣,deconvolution 中卷積核個數不是隨機的,而是根據放大的尺寸生成了與類別相同數量的矩陣。

論文中採用的上採樣是雙線性內插,經過卷積操做完成的。先上池化,而後卷積。以下圖:(藍色是輸入,藍綠色是輸出)

DeconvNet

是韓國的Hyeonwoo Noh 在 ICCV 2015 的文章。2015年5月17日發表在arXiv上的文章。Learning Deconvolution Network for Semantic Segmentation是對FCN的改進。

DeconvNet 的結構是經典encoder-decoder結構。相比於FCN有點混亂的結構,這種對稱的結構就顯得很優雅。以下圖:

前面的encoder部分是VGG-16去掉分類部分的前13個卷積層,末尾是2個全鏈接層。Decoder部分是對稱的反捲積層。

有兩點比較獨特:

  1. 在 pooling 處理的過程當中會記錄最大值位置,unpooling 的時候會把相應的值放回到原來位置。
  2. 做者強調他們的反捲積網絡權重是學習的。

SegNet

SegNet: A Deep Convolutional Encoder-Decoder Architecture for Robust Semantic Pixel-Wise Labelling

這是和DeconvNet 同期的模型,是Vijay Badrinarayanan在2015年5月27日(僅僅相差10天)發表在arXiv上的。

結構和DeconvNet十分類似,給人一種撞衫的感受。(可見科研的激烈程度,23333)

20180719175435

相同的兩點:

  1. 都是經典encoder-decoder結構,encoder部分都是根據VGG-16來的。

  2. pooling 過程都記錄了位置信息,upsampling 的時候使用位置信息。以下圖:

    20180719180108

不一樣點:

  1. 仔細看,SegNet在encoder-decoder中間沒有deconvNet的兩個全鏈接層。
  2. SegNet 在卷積層上加了BN結構。

知乎上有網友的評價:

segnet去掉了全鏈接層從而提高了速度,加了batch normalization加快了收斂抑制了過擬合,加了bayesion能夠輸出圖像的不肯定性分割數值,加了test batch dropout提高測試時的性能,加了帶權重softmax應對分割樣本不均衡現象。能夠說,segnet是更實用的框架。

Tensorflow 目前還不支持在池化的時候保留索引,這就很尷尬了。因此上面兩個都只有caffe的代碼。有人重現了Tensorflow版本的SegNet,不是仍是和原始的有些不一樣。有cpu版本的可用,會比較慢。

Deeplab

DeepLab 是 Google 在這個領域一系列的工做。


參考連接

https://blog.csdn.net/JNingWei/article/details/73610318

https://github.com/vdumoulin/conv_arithmetic

https://www.zhihu.com/question/50349594

http://app.myzaker.com/news/article.php?pk=59633978d1f1499a4a000016

https://blog.csdn.net/u011974639/article/details/79148719

http://www.javashuo.com/article/p-zxxvrroe-mw.html

相關文章
相關標籤/搜索