1. 程式人生 > >論文筆記《Fully Convolutional Networks for Semantic Segmentation》

論文筆記《Fully Convolutional Networks for Semantic Segmentation》

FCN 的全稱是Fully Convolutional Networks,即全卷積網路。通常的CNN是在若干個卷積層之連線上若干個全連線層,將卷積層產生的特徵圖對映成一個固定長度的特徵向量。例如,AlexNet就是五個卷積層後面連線三個全連線層,它在Imagenet資料集上的輸出就是一個1000維的向量,表示影象屬於每一類的概率(通過softmax產生最後的預測)。

       FCN的出現最早是用於解決語義級別的影象分割問題。FCN與CNN的直接區別就是,將CNN後面的全連線層全都換成卷積層,就是FCN。如下圖所示。

圖1 CNN與FCN

       CNN的強大之處在於它的多層結構能自動學習特徵,並且可以學習到多個層次的特徵:這些抽象特徵對物體的大小、位置和方向等敏感性更低,可以很好地判斷出一幅影象中包含什麼類別的物體,但是因為丟失了一些物體的細節,不能很好地給出物體的具體輪廓、指出每個畫素具體屬於哪個物體,因此做到精確的分割就很有難度。

       全連線層和卷積層之間唯一的不同就是卷積層中的神經元只與輸入資料中的一個區域性區域連線,並且在卷積列中的神經元共享引數。然而在兩類層中,神經元都是計算點積,所以它們的函式形式是一樣的。因此,將此兩者相互轉化是可能的。

       全連線層轉化為卷積層:在兩種變換中,將全連線層轉化為卷積層在實際運用中更加有用。假設一個卷積神經網路的輸入是 224x224x3 的影象,一系列的卷積層和下采樣層將影象資料變為尺寸為 7x7x512 的啟用資料體。AlexNet使用了兩個尺寸為4096的全連線層,最後一個有1000個神經元的全連線層用於計算分類評分。我們可以將這3個全連線層中的任意一個轉化為卷積層:

       1)針對第一個連線區域是[7x7x512]的全連線層,令其濾波器尺寸為F=7,這樣輸出資料體就為[1x1x4096]了。

       2)針對第二個全連線層,令其濾波器尺寸為F=1,這樣輸出資料體為[1x1x4096]。

       3)對最後一個全連線層也做類似的,令其F=1,最終輸出為[1x1x1000]

       實際操作中,每次這樣的變換都需要把全連線層的權重W重塑成卷積層的濾波器。這樣的轉化在下面的情況下可以更高效:讓卷積網路在一張更大的輸入圖片上滑動,得到多個輸出,這樣的轉化可以讓我們在單個向前傳播的過程中完成上述的操作。而這就是傳統的CNN網路用於影象分割時需要進行的操作。

       比如,如果我們想讓224×224尺寸的浮窗,以步長為32在384×384的圖片上滑動,把每個經停的位置都帶入卷積網路,最後得到6×6個位置的類別得分。上述的把全連線層轉換成卷積層的做法會更簡便。如果224×224的輸入圖片經過卷積層和下采樣層之後得到了[7x7x512]的陣列,那麼,384×384的大圖片直接經過同樣的卷積層和下采樣層之後會得到[12x12x512]的陣列。然後再經過上面由3個全連線層轉化得到的3個卷積層,最終得到[6x6x1000]的輸出((12 – 7)/1 + 1 = 6)。這個結果正是浮窗在原圖經停的6×6個位置的得分。

       下圖是一個全卷積層,FCN輸入的影象是H*W大小,第一層pooling後變為原圖大小的1/4,第二層變為原圖大小的1/8,第五層變為原圖大小的1/16,第八層變為原圖大小的1/32。

圖2 全卷積網路的影象尺寸

       文章採用的網路經過5次卷積+池化後,影象尺寸依次縮小了 2、4、8、16、32倍,對最後一層做32倍上取樣,就可以得到與原圖一樣的大小。作者發現,僅對第5層做32倍反捲積(deconvolution),得到的結果不太精確。於是將第 4 層和第 3 層的輸出也依次反捲積。如下圖為上取樣過程。

圖3 分別做 8、16、32倍上取樣,雙線性插值輸出3個不同尺度的結果

      

       關於將FCN網路用於細粒度分類的文章之後再看。

 

參考網址:

Long J, Shelhamer E, Darrell T. Fully convolutional networks for semantic segmentation[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2015: 3431-3440.

程式碼初學者 全卷積網路FCN詳解(主要參考)