1. 程式人生 > >影象語義分割之FCN和CRF

影象語義分割之FCN和CRF

前言

(嘔血製作啊!)前幾天剛好做了個影象語義分割的彙報,把最近看的論文和一些想法講了一下。所以今天就把它總結成文章啦,方便大家一起討論討論。本文只是展示了一些比較經典和自己覺得比較不錯的結構,畢竟這方面還是有挺多的結構方法了。

介紹

影象語義分割,簡單而言就是給定一張圖片,對圖片上的每一個畫素點分類

從影象上來看,就是我們需要將實際的場景圖分割成下面的分割圖:

分割圖
不同顏色代表不同類別。

經過我閱讀“大量”論文(羞澀)和檢視Pascal VOC 2012 Learderboard,我發現影象語義分割從深度學習引入這個任務(FCN)到現在而言,一個通用的框架已經大概確定了。即:

Created with Raphaël 2.1.0原圖FCNCRF/MRF分割圖
  • FCN-全卷積網路
  • CRF-條件隨機場
  • MRF-馬爾科夫隨機場

前端使用FCN進行特徵粗提取,後端使用CRF/MRF優化前端的輸出,最後得到分割圖。

接下來,我會從前端和後端兩部分進行總結。

前端

為什麼需要FCN

我們分類使用的網路通常會在最後連線幾層全連線層,它會將原來二維的矩陣(圖片)壓扁成一維的,從而丟失了空間資訊,最後訓練輸出一個標量,這就是我們的分類結果。

而影象語義分割的輸出需要是個分割圖,且不論尺寸大小,但是至少是二維的。所以,我們需要丟棄全連線層,換上全卷積層,而這就是全卷積網路了。具體定義請參看論文:

Fully Convolutional Networks for Semantic Segmentation

前端結構

FCN

作者的FCN主要使用了三種技術:

  • 卷積化(Convolutional)
  • 上取樣(Upsample)
  • 跳躍結構(Skip Layer)

卷積化

卷積化即是將普通的分類網路,比如VGG16,ResNet50/101等網路丟棄全連線層,換上對應的卷積層即可。如下圖:
這裡寫圖片描述

上取樣

此處的上取樣即是反捲積(Deconvolution)。當然關於這個名字不同框架不同,Caffe和Kera裡叫Deconvolution,而tensorflow裡叫conv_transpose。CS231n這門課中說,叫conv_transpose更為合適。

眾所諸知,普通的池化(為什麼這兒是普通的池化請看後文)會縮小圖片的尺寸,比如VGG16 五次池化後圖片被縮小了32倍。為了得到和原圖等大的分割圖,我們需要上取樣/反捲積。

反捲積和卷積類似,都是相乘相加的運算。只不過後者是多對一,前者是一對多。而反捲積的前向和後向傳播,只用顛倒卷積的前後向傳播即可。所以無論優化還是後向傳播演算法都是沒有問題。圖解如下:

這裡寫圖片描述

但是,雖然文中說是可學習的反捲積,但是作者實際程式碼並沒有讓它學習,可能正是因為這個一對多的邏輯關係。程式碼如下:

layer {
  name: "upscore"
  type: "Deconvolution"
  bottom: "score_fr"
  top: "upscore"
  param {
    lr_mult: 0
  }
  convolution_param {
    num_output: 21
    bias_term: false
    kernel_size: 64
    stride: 32
  }
}

可以看到lr_mult被設定為了0.

跳躍結構

(這個奇怪的名字是我翻譯的,好像一般叫忽略連線結構)這個結構的作用就在於優化結果,因為如果將全卷積之後的結果直接上取樣得到的結果是很粗糙的,所以作者將不同池化層的結果進行上取樣之後來優化輸出。具體結構如下:

這裡寫圖片描述

而不同上取樣結構得到的結果對比如下:
這裡寫圖片描述

當然,你也可以將pool1, pool2的輸出再上取樣輸出。不過,作者說了這樣得到的結果提升並不大。
這是第一種結構,也是深度學習應用於影象語義分割的開山之作,所以得了CVPR2015的最佳論文。但是,還是有一些處理比較粗糙的地方,具體和後面對比就知道了。

SegNet/DeconvNet

這樣的結構總結在這兒,只是我覺得結構上比較優雅,它得到的結果不一定比上一種好。

SegNet

這裡寫圖片描述

DeconvNet

這裡寫圖片描述

這樣的對稱結構有種自編碼器的感覺在裡面,先編碼再解碼。這樣的結構主要使用了反捲積和上池化。即:
這裡寫圖片描述
這裡寫圖片描述

反捲積如上。而上池化的實現主要在於池化時記住輸出值的位置,在上池化時再將這個值填回原來的位置,其他位置填0即OK。

DeepLab

接下來介紹一個很成熟優雅的結構,以至於現在的很多改進是基於這個網路結構的進行的。

首先這裡我們將指出一個第一個結構FCN的粗糙之處:為了保證之後輸出的尺寸不至於太小,FCN的作者在第一層直接對原圖加了100的padding,可想而知,這會引入噪聲。

而怎樣才能保證輸出的尺寸不會太小而又不會產生加100padding這樣的做法呢?可能有人會說減少池化層不就行了,這樣理論上是可以的,但是這樣直接就改變了原先可用的結構了,而且最重要的一點是就不能用以前的結構引數進行fine-tune了。所以,Deeplab這裡使用了一個非常優雅的做法:將pooling的stride改為1,再加上1padding。這樣池化後的圖片尺寸並未減小,並且依然保留了池化整合特徵的特性。

但是,事情還沒完。因為池化層變了,後面的卷積的感受野也對應的改變了,這樣也不能進行fine-tune了。所以,Deeplab提出了一種新的卷積,帶孔的卷積:Atrous Convolution.即:
這裡寫圖片描述

而具體的感受野變化如下:
這裡寫圖片描述

a為普通的池化的結果,b為“優雅”池化的結果。我們設想在a上進行卷積核尺寸為3的普通卷積,則對應的感受野大小為7.而在b上進行同樣的操作,對應的感受野變為了5.感受野減小了。但是如果使用hole為1的Atrous Convolution則感受野依然為7.所以,Atrous Convolution能夠保證這樣的池化後的感受野不變,從而可以fine tune,同時也能保證輸出的結果更加精細。即:

這裡寫圖片描述

總結

這裡介紹了三種結構:FCN, SegNet/DeconvNet,DeepLab。當然還有一些其他的結構方法,比如有用RNN來做的,還有更有實際意義的weakly-supervised方法等等。

後端

終於到後端了,後端這裡會講幾個場,涉及到一些數學的東西。我的理解也不是特別深刻,所以歡迎吐槽。

全連線條件隨機場(DenseCRF)

對於每個畫素i具有類別標籤xi還有對應的觀測值yi,這樣每個畫素點作為節點,畫素與畫素間的關係作為邊,即構成了一個條件隨機場。而且我們通過觀測變數yi來推測畫素i對應的類別標籤xi。條件隨機場如下:
這裡寫圖片描述

條件隨機場符合吉布斯分佈:(此處的x即上面說的觀測值)

P(X=x|I)=1Z(I)exp(E(x|I))
其中的E(x|I)是能量函式,為了簡便,以下省略全域性觀測I
E(x)=iΨu(xi)+i<jΨp(xi,xj)
其中的一元勢函式iΨu(xi)即來自於前端FCN的輸出。而二元勢函式如下:
Ψp(xi,xj)=u(xi,xj)m=1Mω(m)k(m)G(fi,fj)
二元勢函式就是描述畫素點與畫素點之間的關係,鼓勵相似畫素分配相同的標籤,而相差較大的畫素分配不同標籤,而這個“距離”的定義與顏色值和實際相對距離有關。所以這樣CRF能夠使圖片儘量在邊界處分割。而全連線條件隨機場的不同就在於,二元勢函式描述的是每一個畫素與其他所有畫素的關係,所以叫“全連線”。

關於這一堆公式大家隨意理解一下吧… …而直接計算這些公式是比較麻煩的(我想也麻煩),所以一般會使用平均場近似方法進行計算。而平均場近似又是一堆公式,這裡我就不給出了(我想大家也不太願意看),原意瞭解的同學直接看論文吧。

CRFasRNN

最開始使用DenseCRF是直接加在FCN的輸出後面,可想這樣是比較粗糙的。而且在深度學習中,我們都追求end-to-end的系統,所以CRFasRNN這篇文章將DenseCRF真正結合進了FCN中。這篇文章也使用了平均場近似的方法,因為分解的每一步都是一些相乘相加的計算,和普通的加減(具體公式還是看論文吧),所以可以方便的把每一步描述成一層類似卷積的計算。這樣即可結合進神經網路中,並且前後向傳播也不存在問題。當然,這裡作者還將它進行了迭代,不同次數的迭代得到的結果優化程度也不同(一般取10以內的迭代次數),所以文章才說是as RNN。優化結果如下:
這裡寫圖片描述

馬爾科夫隨機場(MRF)

在Deep Parsing Network中使用的是MRF,它的公式具體的定義和CRF類似,只不過作者對二元勢函式進行了修改:

Ψ(yui,yvi)=k=1Kλkuk(i,u,j,v)zNjd(j,z)pvz
其中,作者加入的λk為label context,因為uk只是定義了兩個畫素同時出現的頻率,而λk可以對一些情況進行懲罰,比如,人可能在桌子旁邊,但是在桌子下面的可能性就更小一些。所以這個量可以學習不同情況出現的概率。而原來的距離d(i,j)只定義了兩個畫素間的關係,作者在這兒加入了個triple penalty,即還引入了j附近的z,這樣描述三方關係便於得到更充足的區域性上下文。具體結構如下:
這裡寫圖片描述

這個結構的優點在於:

  • 將平均場構造成了CNN
  • 聯合訓練並且可以one-pass inference,而不用迭代

高斯條件隨機場(G-CRF)

這個結構使用CNN分別來學習一元勢函式和二元勢函式。這樣的結構是我們更喜歡的:
這裡寫圖片描述

而此中的能量函式又不同於之前:

E(x)=12xT(A+λI)xBx
而當(A+λI)是對稱正定時,求E(x)的最小值等於求解:

相關推薦

影象語義分割FCNCRF

前言 (嘔血製作啊!)前幾天剛好做了個影象語義分割的彙報,把最近看的論文和一些想法講了一下。所以今天就把它總結成文章啦,方便大家一起討論討論。本文只是展示了一些比較經典和自己覺得比較不錯的結構,畢竟這方面還是有挺多的結構方法了。 介紹 影象語義分

Recorder︱影象語義分割FCNCRF、MRF)、論文延伸(Pixel Objectness、)

影象語義分割的意思就是機器自動分割並識別出影象中的內容,我的理解是摳圖… 之前在Faster R-CNN中借用了RPN(region proposal network)選擇候選框,但是僅僅是候選框,那麼我想提取候選框裡面的內容,就是影象語義分割了。

影象語義分割特徵整合結構預測

前言 近來閱讀了PASCAL VOC 2012排行榜上前幾的文章,包括PSPNet和林國省老師的幾篇論文,覺得現在在semantic segmentation領域對於Multi-scale Features ensembling的關注又多起來了(當然其實一直都

[深度學習]Semantic Segmentation語義分割FCN(1)

論文全稱:《Fully Convolutional Networks for Semantic Segmentation》 論文地址:https://arxiv.org/pdf/1411.4038.pdf 論文程式碼: python caffe版本 https://github

語義分割FCN個人總結

一、網路結構 FCN涉及到了不同尺度的feature map的融合。 融合理由是:低層特徵具有較多的的解析度資訊,更加精細,但語義資訊較弱。高層特徵具有較多語義資訊,然而較粗糙,解析度資訊不足。為了融合語義資訊和細節資訊,對高層的feature map進行反

影象語義分割(1)-FCN:用於語義分割的全卷積神經網路

論文地址:Fully Convolutional Networks for Semantic Segmentation [Long J , Shelhamer E , Darrell T . Fully Convolutional Networks for Semantic Segmen

關於影象語義分割的總結感悟

layer { name: "upscore" type: "Deconvolution" bottom: "score_fr" top: "upscore" param { lr_mult: 0 } convolution_param { num_output:

基於深度學習的影象語義分割技術概述4常用方法 5.4未來研究方向

https://blog.csdn.net/u014593748/article/details/72794459 本文為論文閱讀筆記,不當之處,敬請指正。 A Review on Deep Learning Techniques Applied to Semantic Segmen

影象語義分割文章彙總(附論文連結公開程式碼)

吶,我也是做影象分割的啦,最近看到有大佬整理了影象分割方面最新的論文,覺得很有幫助,就轉載過來了,感覺又有很多要學的內容了。   Semantic Segmentation Adaptive Affinity Field for Sem

影象分割FCN

基於caffe的程式碼:https://github.com/shelhamer/fcn.berkeleyvision.org 反捲積:         在學習FCN之前,需要了解反捲積相關的知識。論文Adaptive deconvolutional networks

推薦一些用CRF影象語義分割的資源 此博文包含圖片

(201http://blog.csdn.net/moonzjaw/article/details/46744163http://blog.csdn.net/moonzjaw/article/details/467441632-04-19 17:32:11) (adsbygoo

影象語義分割(12)-重新思考空洞卷積: 為弱監督半監督語義分割設計的簡捷方法

論文地址 :Revisiting Dilated Convolution: A Simple Approach for Weakly- and Semi- Supervised Semantic Segmentation 1. 摘要   儘管弱監督分割方法的精度有所提升,但是和全

影象語義分割(5)-DeepLabV2: 使用深度卷積網路、空洞卷積全連線條件隨機場進行影象語義分割

論文地址 :DeepLab: Semantic Image Segmentation with Deep Convolutional Nets, Atrous Convolution, and Fully Connected CRFs 論文程式碼:工程連結 1. 簡介   Dee

影象語義分割(2)-DeepLabV1: 使用深度卷積網路全連線條件隨機場進行影象語義分割

論文地址:SEMANTIC IMAGE SEGMENTATION WITH DEEP CONVOLUTIONAL NETS AND FULLY CONNECTED CRFS 論文程式碼: 工程連結1 工程連結2 1. 提出問題   首先明確一個概念-high level task

Caffe-Windows + FCN進行影象語義分割

一:目的 利用上篇文章編譯好的python介面,採用FCN(Caffe版本)進行影象分割; 二:影象語義分割 1. 環境準備 (1) Caffe-Windows的python介面編譯,可參見上篇博文。 (2) 下載FCN原始碼。作者在github上開源了程式碼

keras版FCN網路進行影象語義分割--使用VOC2012資料

原始碼下載:https://github.com/aurora95/Keras-FCN 下載FCN的原始碼,安裝完畢後,下載資料集VOC 2012和MS COCO。 使用按下ctrl+h組合掉出Li

基於深度學習的影象語義分割技術概述4常用方法

本文為論文閱讀筆記,不當之處,敬請指正。 A Review on Deep Learning Techniques Applied to Semantic Segmentation:原文連結 4 深度學習影象分割的常用方法 深度學習在多種高階計算機視

基於深度學習的影象語義分割技術概述背景與深度網路架構

本文為論文閱讀筆記,不當之處,敬請指正。  A Review on Deep Learning Techniques Applied to Semantic Segmentation: 原文連結 摘要 影象語義分割正在逐漸成為計算機視覺及機器學習研究人員的研究熱點。大

影象語義分割:從頭開始訓練deeplab v2系列三【pascal-context資料集】

在之前的部落格已經講過deeplab v2原始碼解析與基於VOC2012資料集的訓練,本部落格基於pascal-context資料集進行fine tuning txt檔案:檔案中有資料集的名字列表的txt檔案,此處不同於原始碼,在pascal-con

FCN影象語義分割

歡迎訪問人工智慧研究網課程中心 -----------------------------------------------------------------------------------