1. 程式人生 > >影象分割之FCN

影象分割之FCN

基於caffe的程式碼:https://github.com/shelhamer/fcn.berkeleyvision.org

反捲積:

        在學習FCN之前,需要了解反捲積相關的知識。論文Adaptive deconvolutional networks for mid and high level feature learning中提出了反捲積網路,用於無監督學習。論文visualizing and Understanding Convolutional Networks,利用反捲積過程視覺化一個已經訓練好的卷積網路模型,可以參考部落格中的講解。

        假定利用卷積核卷積影象A後得到影象B,反捲積就是利用剛剛用到的卷積核的轉置對影象B進行卷積得到影象A的近似。本質上,反捲積過程就是先對影象進行padding,然後再進行卷積,可以參考

這裡

FCN:

        傳統的基於CNN的分割方法:為了對一個畫素分類,使用該畫素周圍的一個影象塊作為CNN的輸入,用於訓練與預測,這種方法主要有幾個缺點:1)儲存開銷大,例如,對每個畫素使用15*15的影象塊,然後不斷滑動視窗,將影象塊輸入到CNN中進行類別判斷,因此,需要的儲存空間隨滑動視窗的次數和大小急劇上升;2)效率低下,相鄰畫素塊基本上是重複的,針對每個畫素塊逐個計算卷積,這種計算有很大程度上的重複;3)畫素塊的大小限制了感受區域的大小,通常畫素塊的大小比整幅影象的大小小很多,只能提取一些區域性特徵,從而導致分類效能受到限制。         全卷積網路(FCN)將從抽象的特徵中恢復出每個畫素所屬的類別,進而實現了將從影象級別的分類延伸到畫素級別的分類,如圖所示:

        1)將第一個全連線層變為kernel_size = 7的卷積層         2)將第二個全連線層、第三個全連線層變為kernel_size = 1的卷積層       舉例說明:將224×224的視窗,以步長32在384×384的圖片上滑動,把每個經停的位置都帶入卷積網路,最後得到6×6個位置的類別得分。  如果224×224的輸入圖片經過卷積層和下采樣層之後得到了[7x7x512]的陣列,那麼,384×384的大圖片直接經過同樣的卷積層和下采樣層之後會得到[12x12x512]的陣列。然後再經過上面由3個全連線層轉化得到的3個卷積層,最終得到[6x6x1000]的輸出。這個結果正是視窗在原圖經停的6×6個位置
的得分!       為了能夠在畫素級進行分類,需要將得到影象進行上取樣。FCN輸入的影象是H*W大小,第一層pooling後變為原影象的1/2,第二層pooling後變為原影象的1/4,第三層pooling後變為原影象的1/8,第四層pooling後變為原影象的1/16,第五層pooling後變為原影象的1/32。經過多次卷積和pooling後,得到的影象越來越小,解析度也越來越低,其中,最後得到W/32 * H/32影象,稱為heatmap,共有21張,這些heatmap經過上取樣(unsampling)後變成原圖大小的影象。為了對每個畫素進行分類預測,可以逐畫素在這21張影象中取最大值,將最大值所對應的類別作為對應畫素點的分類,從而產生一張已經分類好的影象。然而,對heatmap進行32倍上取樣得到的影象比較粗糙,為了更精化,結合了多尺度的思想,採用瞭如圖所示的方法:       FCN-16S:分為兩個步驟,先將影象放大2倍,再放大16倍,具體實現如下:將conv7得到的結果進行2倍上取樣,得到21張語義分割score map將pooling4得到的結果,用1*1卷積核進行卷積,得到額外的21張語義分割score map; 將conv7得到的結果與pooling5得到的結果對應相加,然後將相加結果放大16倍。       FCN-8S:分為三個步驟,先將影象放大2倍,再放大2倍,再放大8倍,可以參考下圖。
參考部落格: http://www.cnblogs.com/gujianhan/p/6030639.html http://blog.csdn.net/hjimce/article/details/50268555