天天看點

深度學習之圖像分割 《Fully Convolutional Networks for Semantic Segmentation》—FCN 問題&解決辦法 3.訓練細節 結果

轉載自:http://blog.csdn.net/u011534057/article/details/51247388

【論文資訊】

《Fully Convolutional Networks for Semantic Segmentation》

CVPR 2015 best paper

Reference link: 

http://blog.csdn

.NET

/tangwei2014

http://blog.csdn.net/u010025211/article/details/51209504

概覽&主要貢獻

提出了一種end-to-end的做semantic segmentation的方法,簡稱FCN。

如下圖所示,直接拿segmentation 的 ground truth作為監督資訊,訓練一個端到端的網絡,讓網絡做pixelwise的prediction,直接預測label map。

(筆者自己類比思想:faster rcnn中的rbn->(fc->region proposal) label map-> fast-rcnn for fine tuning)

【方法簡介】

主要思路是把CNN改為FCN,輸入一幅圖像後直接在輸出端得到dense prediction,也就是每個像素所屬的class,進而得到一個end-to-end的方法來實作image  semantic segmentation。    

 我們已經有一個CNN模型,首先要把CNN的全連接配接層看成是卷積層,卷積模闆大小就是輸入的特征map的大小,也就是說把全連接配接網絡看成是對整張輸入map做卷積,全連接配接層分别有4096個6*6的卷積核,4096個1*1的卷積核,1000個1*1的卷積核,如下圖:

接下來就要對這1000個1*1的輸出,做upsampling,得到1000個原圖大小(如32*32)的輸出,這些輸出合并後,得到上圖所示的heatmap。

【細節記錄】

dense prediction

這裡通過upsampling得到dense prediction,作者研究過3種方案:

1,shift-and-stitch:設原圖與FCN所得輸出圖之間的降采樣因子是f,那麼對于原圖的每個f*f的區域(不重疊),“shift the input x pixels to the right and y pixels down for every (x,y) ,0 < x,y < f." 把這個f*f區域對應的output作為此時區域中心點像素對應的output,這樣就對每個f*f的區域得到了f^2個output,也就是每個像素都能對應一個output,是以成為了dense

prediction。

2,filter rarefaction:就是放大CNN網絡中的subsampling層的filter的尺寸,得到新的filter:

其中s是subsampling的滑動步長,這個新filter的滑動步長要設為1,這樣的話,subsampling就沒有縮小圖像尺寸,最後可以得到dense prediction。

以上兩種方法作者都沒有采用,主要是因為這兩種方法都是trad-off的,原因是:

對于第二種方法, 下采樣的功能被減弱,使得更細節的資訊能被filter看到,但是receptive fileds會相對變小,可能會損失全局資訊,且會對卷積層引入更多運算。

對于第一種方法,雖然receptive fileds沒有變小,但是由于原圖被劃分成f*f的區域輸入網絡,使得filters無法感受更精細的資訊。

重點方法:

反卷積層->pixel wise->bp parameters->實作把conv的前傳和反傳過程對調一下即可

3,這裡upsampling的操作可以看成是反卷積(deconvolutional),卷積運算的參數和CNN的參數一樣是在訓練FCN模型的過程中通過bp

算法

學習得到。

fusion prediction

以上是對CNN的結果做處理,得到了dense prediction,而作者在試驗中發現,得到的分割結果比較粗糙,是以考慮加入更多前層的細節資訊,也就是把倒數第幾層的輸出和最後的輸出做一個fusion,實際上也就是加和:

這樣就得到第二行和第三行的結果,實驗表明,這樣的分割結果更細緻更準确。在逐層fusion的過程中,做到第三行再往下,結果又會變差,是以作者做到這裡就停了。可以看到如上三行的對應的結果:

問題&解決辦法

1.如何做pixelwise的prediction?

傳統的網絡是subsampling的,對應的輸出尺寸會降低,要想做pixelwiseprediction,必須保證輸出尺寸。

解決辦法:

(1)對傳統網絡如AlexNet,VGG等的最後全連接配接層變成卷積層。

例如VGG16中第一個全連接配接層是25088x4096的,将之解釋為512x7x7x4096的卷積核,則如果在一個更大的輸入圖像上進行卷積操作(上圖的下半部分),原來輸出4096維feature的節點處(上圖的上半部分),就會輸出一個coarsefeature map。

這樣做的好處是,能夠很好的利用已經訓練好的supervisedpre-training的網絡,不用像已有的方法那樣,從頭到尾訓練,隻需要fine-tuning即可,訓練efficient。

(2)加In-network upsampling layer。

對中間得到的featuremap做bilinear上采樣,就是反卷積層。實作把conv的前傳和反傳過程對調一下即可。

2.如何refine,得到更好的結果?

upsampling中步長是32,輸入為3x500x500的時候,輸出是544x544,邊緣很不好,并且limit thescale of detail of the upsampling output。

采用skiplayer的方法,在淺層處減小upsampling的步長,得到的finelayer 和 高層得到的coarselayer做融合,然後再upsampling得到輸出。

這種做法兼顧local和global資訊,即文中說的combiningwhat and where,取得了不錯的效果提升。FCN-32s為59.4,FCN-16s提升到了62.4,FCN-8s提升到62.7。可以看出效果還是很明顯的。

3.訓練細節

用AlexNet,VGG16或者GoogleNet訓練好的模型做初始化,在這個基礎上做fine-tuning,全部都fine-tuning。

采用wholeimage做訓練,不進行patchwise sampling。實驗證明直接用全圖已經很effectiveand efficient。

對classscore的卷積層做全零初始化。随機初始化在性能和收斂上沒有優勢。

【實驗設計】

1,對比3種性能較好的幾種CNN:AlexNet, VGG16, GoogLeNet進行實驗,選擇VGG16

2,對比FCN-32s-fixed, FCN-32s, FCN-16s, FCN-8s,證明最好的dense prediction組合是8s

3,FCN-8s和state-of-the-art對比是最優的,R-CNN, SDS.   FCN-16s

4,FCN-16s和現有的一些工作對比,是最優的

5,FCN-32s和FCN-16s在RGB-D和HHA的圖像資料集上,優于state-of-the-art

【總結】

優點

1,訓練一個end-to-end的FCN模型,利用卷積神經網絡的很強的學習能力,得到較準确的結果,以前的基于CNN的方法都是要對輸入或者輸出做一些處理,才能得到最終結果。

2,直接使用現有的CNN網絡,如AlexNet, VGG16, GoogLeNet,隻需在末尾加上upsampling,參數的學習還是利用CNN本身的反向傳播原理,"whole image training is effective and efficient."

3,不限制輸入圖檔的尺寸,不要求圖檔集中所有圖檔都是同樣尺寸,隻需在最後upsampling時按原圖被subsampling的比例縮放回來,最後都會輸出一張與原圖大小一緻的dense prediction map。

缺陷

根據論文的conclusion部分所示的實驗輸出sample如下圖:

可以直覺地看出,本文方法和Groud truth相比,容易丢失較小的目标,比如第一幅圖檔中的汽車,和第二幅圖檔中的觀衆人群,如果要改進的話,這一點上應該是有一些提升空間的。

結果

當然是state-of-the-art的了。

感受一下:

繼續閱讀