1. 程式人生 > >卷積神經網路CNN(3)—— FCN(Fully Convolutional Networks)要點解釋

卷積神經網路CNN(3)—— FCN(Fully Convolutional Networks)要點解釋

前言

參考FCN論文:Fully Convolutional Networks for Semantic Segmentation
FCN作為影象語義分割的先河,實現畫素級別的分類(即end to end,pixel-wise),為後續使用CNN作為基礎的影象語義分割模型提供重要基礎。作者在閱讀FCN論文時,遇到不少困難,同時FCN沒有多少中文資料(更多是英語翻譯),所以作者儘量用淺白的方式講述FCN的原理與過程。

FCN中的CNN

首先回顧CNN測試圖片類別的過程,如下圖
CNN過程
主要由卷積,pool與全連線構成,這裡把卷積與pool都看作圖中綠色的convolution,全連線為圖中藍色的fully connected。卷積主要是獲取高維特徵,pool使圖片縮小一半,全連線與傳統神經網路相似作為權值訓練,最後通過softmax輸出概率最高的類別。上圖中nxn表示feature map(特徵圖)大小, 如原圖大小為227x227,經過卷積與pool後得到55x55的特徵圖(一層的特徵圖可以有多個類別)。注意,不同的卷積操作可能會對圖片大小產生影響,而pool永遠使圖片縮小1/2。–可以參考作者的卷積神經網路CNN(1)。

經過多次卷積後特徵圖大小為13x13,特徵圖的權值展開為1維與後面的權值實現全連線,最後使用softmax輸出類別。這就是CNN的大致網路結構與分類過程。

經過CNN改造的FCN如下圖,
這裡寫圖片描述
看可以看到藍色的全連線層全部換成卷積層,對於CNN的過程就是做了這麼簡單直白的變換,全卷積的名字由此而來,這就是FCN。圖中nxn是表示特徵圖的大小,可以看到最後特徵圖的大小為原圖的1/32(這與FCN論文中解釋upsample實現end to end 的32stride,16stride,8stride有莫大的關係)。

FCN的upsample

upsample意思為上取樣,簡單來說就是pooling的逆過程,所以pooling也就是下采樣,取樣後資料數量減少,upsample取樣後資料數量增多。FCN作者在論文中討論了3種upsample方法,最後選用的是反捲積的方法(FCN作者稱其為後卷積)使影象實現end to end,可以理解upsample就是使大小比原影象小得多的特徵圖變大,使其大小為原影象大小。
這裡寫圖片描述


下面解釋FCN中是如何實現upsample,FCN作者分為FCN-32s,FCN-16s,FCN-8s三種,論文中有一個圖是描述這個三個過程的,如下圖,
這裡寫圖片描述
image是原影象,conv1,conv2..,conv5為卷積操作,pool1,pool2,..pool5為pool操作(pool就是使得圖片變為原圖的1/2),注意con6-7是最後的卷積層,最右邊一列是upsample後的end to end結果。必須說明的是圖中nx是指對應的特徵圖上取樣n倍(即變大n倍),並不是指有n個特徵圖,如32x upsampled 中的32x是影象只變大32倍,不是有32個上取樣影象,又如2x conv7是指conv7的特徵圖變大2倍。

第一行對應FCN-32s,第二行對應FCN-16s,第三行對應FCN-8s。
先從FCN-32s開始說明upsample過程,只需要留意第一行,網路裡面有5個pool,所以conv7的特徵圖是原始影象1/32,可以發現最左邊image的是32x32,同時我們知道在FCN中的卷積是不會改變影象大小(或者只有少量畫素的減少,特徵圖大小基本不會小很多),看到pool1是16x16,pool2是8x8,pool3是4x4,pool4是2x2,pool5是1x1,所以conv7對應特徵圖大小為1x1,然後再經過32x upsampled prediction 圖片變回32x32。FCN作者在這裡增加一個卷積層,卷積後的大小為輸入影象的32(2^5)倍,我們簡單假設這個卷積核大小也為32,這樣就是需要通過反饋訓練32x32個權重變數即可讓影象實現end to end,完成了一個32s的upsample,FCN作者稱做後卷積,他也提及可以稱為反捲積。事實上在原始碼中卷積核的大小為64,同時沒有偏置bias。還有一點就是FCN論文中最後結果都是21x…,這裡的21是指FCN使用的資料集分類,總共有21類。
現在我們把1,2兩行一起看,忽略32x upsampled prediction,說明FCN-16s的upsample過程,,FCN作者在conv7先進行一個2x conv7操作,其實這裡也只是增加1個卷積層,這次卷積後特徵圖的大小為conv7的2倍,可以從pool5與2x conv7中看出來,此時2x conv7與pool4的大小是一樣的,FCN作者提出對pool4與2x conv7進行一個fuse操作(事實上就是將pool4與2x conv7相加),fuse結果進行16x upsampled prediction,與FCN-32s一樣,也是增加一個卷積層,卷積後的大小為輸入影象的16(2^4)倍,我們知道pool4的大小是2x2,放大16倍,就是32x32,這樣最後影象大小也變為原來的大小,至此完成了一個16s的upsample。現在我們可以知道,FCN中的upsample實際是通過增加捲積層,通過bp反饋的訓練方法訓練卷積層達到end to end,這時卷積層的作用可以看作是pool的逆過程
這是我們看第1行與第3行,忽略32x upsampled prediction,conv7經過一次4x upsample,即使用一個卷積層,特徵圖輸出大小為conv7的4倍,所以4x conv7的大小為4x4,然後pool4需要一次2x upsample,變成2x pool4,大小也為4x4,最後吧4x conv7,2x pool4與pool3進行fuse,得到求和後的特徵圖,最後增加一個卷積層,使得輸出圖片大小為pool3的8倍,也就是8x upsampled prediction的過程,最後也得到一個end to end的影象。同時FCN-8s均優於FCN-16s,FCN-32s
我們可以發現,如果繼續仿照FCN作者的步驟,我們可以對pool2,pool1實現同樣的方法,可以有FCN-4s,FCN-2s,最後得到end to end的輸出。這裡作者給出了明確的結論,超過FCN-8s之後,結果並不能繼續優化。

Fina l l y

結合上述的FCN的全卷積與upsample,在upsample最後加上softmax,就可以對不同類別的大小概率進行估計,實現end to end,最後輸出的圖是一個概率估計,對應畫素點的值越大,其畫素為該類的結果也越大。FCN的核心貢獻在於提出使用卷積層通過學習讓圖片實現end to end分類。事實上,FCN有一些短處,例如使用了較淺層的特徵,因為fuse操作會加上較上層的pool特徵值,導致高維特徵不能很好得以使用,同時也因為使用較上層的pool特徵值,導致FCN對影象大小變化有所要求,如果測試集的影象遠大於或小於訓練集的影象,FCN的效果就會變差。但是,也由於FCN提出了一種新的語義分割的方法,才使得有後面韓國Hyeonwoo Noh的對稱反捲積網路,劍橋的SegNet等優秀用於語義分割的CNN網路。