天天看點

卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術

在這篇教程中,我也使用了scikit-imag庫、numpy以及其他的一些依賴。你可以通過下載下傳anaconda的python軟體包來安裝這些軟體。

此外,你還需要按照之前幾篇文章介紹的步驟來配置你的訓練環境——包括如何下載下傳vgg-16模型以及其他所有的必需操作。

在這一部分中,我們定義前一篇文章使用的輔助函數。如果你還記得的話,我們使用了上采樣技術對我們從網絡中獲得的下采樣預測結果進行采樣。我們從vgg-16模型使用的最大值池化層中獲得模型的下采樣預測結果。

我們也為圖像與各個實際分割區域的加載操作編寫了程式。這些代碼加入了足夠的注釋,是以不必擔心無法了解它。

在這一部分中,我們把準備好的所有東西整合到一起:為我們的網絡添加上采樣層,定義可微分求導的損失函數,并進行模型的訓練。

參照論文《fully convolutional networks for semantic segmentation》,我們将模型的損失定義為像素間的交叉熵。我們之是以這樣定義,是因為在上采樣後我們可以得到與輸入圖像尺寸相同的預測結果,進而我們可以将獲得的分割結果與實際的各個分割區域進行比較:

其中,n表示像素的數量,k表示類别的數量,變量tnk表示第n個像素對應的實際分割區域,實際區域以1至k的數字表示,變量ynk為我們模型的預測結果(使用softmax函數來規範輸出)。

對于這種情況,由于adam優化器僅調整較少的參數就能使模型取得很好的效果,我們将其應用到了模型的訓練當中。

在這個特殊的情況下,我們使用一張圖像來訓練模型并評估模型的效果——與真實場景相比,這種訓練方式非常簡單。我們這樣做是為了展示這種方法的不足——隻為了說明這種方法糟糕的定位能力。如果在這種簡單場景下這種方法的效果尚且如此,那麼在未訓練的圖像上,這種方法隻會産生類似的更糟糕的結果。

卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術
卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術
current loss: 201433.0
卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術
current loss: 245565.0
卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術
current loss: 135906.0
卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術
current loss: 183353.0
卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術
current loss: 48563.9
卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術
current loss: 37925.8
卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術
current loss: 33199.1
卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術
current loss: 26540.3
卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術
current loss: 23658.0
卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術
current loss: 29404.9
卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術
final loss: 18177.5

正如你所看到的,結果非常粗糙——而且,這還是我們使用模型訓練同一張圖像來運作網絡預測的結果。這在圖像分割中一個非常常見的問題——分割結果通常很粗糙。有幾種不同的方法可以解決此類問題——其中之一便是使用跳躍連接配接。主要思路是根據融合網絡中不同層的預測結果來确定模型的最終預測結果。由于在網絡較靠前的層次中下采樣因子較小,是以,可以根據這些層來确定預測結果,進而取得更好的定位效果。long等人發表的論文《fully convolutional networks for semantic segmentation》介紹了這種方法。基于這種方法,研究人員設計了fcn-16s與fcn-8s架構。

另一種方法則基于帶孔卷積與全連接配接條件随機場。chen等人發表的論文《semantic image segmentation with deep convolutional nets and fully connected crfs》介紹了這種方法。在本篇文章中,我們将僅使用條件随機場後處理階段來展示它對模型效果的提高。

還有一點需要注意的是,目前模型訓練時在全連接配接層(我們映射到卷積層的全連接配接層)中應用了dropout技術,這種方法在srivastava等人發表的論文《dropout: a simple way to prevent neural networks from overfitting》中有所提及。dropout是一種用于模型訓練的正則化技術。它有一個非常優秀的理論描述,而且實作起來也非常簡單:我們隻需要在每個訓練步驟中随機地選擇一定數量的神經元,僅根據這些神經元來進行推斷并後向傳播。但是,從理論角度來看,dropout可以看作是通過權重共享來訓練一個稀疏網絡的集合,每個網絡僅進行很少次數的訓練。在測試階段,我們對所有這些網絡的預測結果求均值。在論文中作者表明,dropout線上性回歸情況下預期能夠取得與嶺回歸相同的效果。在我們的具體情況中,dropout僅用于全連接配接層(我們映射到卷積層的全連接配接層)。這也解釋了為什麼最終模型的損失幾乎比最後一次疊代的損失小了兩倍——因為在最後的推斷中,我們使用了損失的均值。

上面提供的代碼用于處理單張圖像,但你可以很容易地在整個資料集上運作這些程式。唯一需要調整的是,在每個疊代步驟中提供不同的圖像。這種訓練方式與論文《fully convolutional networks for semantic segmentation》的做法完全一緻,其中,論文作者采用了數量為1的批處理進行訓練。

總的來說,我們可以看到我們的分割結果仍然很粗糙,需要執行一些額外的處理步驟。在下一節,我們将應用條件随機場的後處理步驟使模型的分割粒度更細。

條件随機場是圖模型的一種特定類型。在我們的應用場景中,條件随機場有助于根據網絡的預測以及圖像原生的rgb特征估計模型預測結果的後驗分布。它通過最小化使用者定義的能量函數來實作這一點。在我們的應用場景中,其效果與雙邊濾波器非常接近,雙邊濾波器綜合考慮了圖像中像素的空間鄰近性以及在rgb特征空間(強度空間)中的相似性。

在一個非常簡單的層面上,這種方法使用rgb特征來使圖像分割結果更加精準——例如,邊界通常表示為極大的強度變化——這是一個關鍵因素,位于該邊界兩側的物體屬于不同的類别。這種方法也同樣對小的分割區域進行懲罰——例如,20像素或50像素大小的小區域通常不可能是一個正确的分割區域。物體通常由大的空間相鄰的區域表示。

下面你可以看到這個後處理步驟是如何影響我們的分割結果的。我們使用了論文《fully connected crfs with gaussian edge potentials》有效性推斷章節中描述的全連接配接條件随機場對分割結果進行調整。

卷積神經網絡應用:基于Tensorflow的CNN/CRF圖像分割技術

在本篇教程中,我們看到了卷積神經網絡應用于圖像分割領域時的一個缺陷——粗糙的分割結果。我們可以看到,這種情況是由于在vgg-16網絡架構中使用最大值池化層所導緻的。

根據像素間交叉熵損失的定義,我們在簡化的場景下進行了模型的訓練,并使用後向傳播來更新權重。

我們使用條件随機場(crfs)來解決分割結果粗糙的問題,并取得了很好的效果。

<a href="https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?usercode=j4nkrg1c&amp;utm_source=j4nkrg1c">數十款阿裡雲産品限時折扣中,趕緊點選領劵開始雲上實踐吧!</a>

原标題《image segmentation with tensorflow using cnns and conditional random fields》,作者:daniil,譯者:6816816151**

繼續閱讀