FCN的學習及理解(Fully Convolutional Networks for Semantic Segmentation)


論文Fully Convolutional Networks for Semantic Segmentation 是圖像分割的milestone論文。

 GitHub - shelhamer/fcn.berkeleyvision.org: Fully Convolutional Networks for Semantic Segmentation by Jonathan Long*, Evan Shelhamer*, and Trevor Darrell. CVPR 2015 and PAMI 2016.

fcn開源代碼

github下載地址https://github.com/shelhamer/fcn.berkeleyvision.org 

核心思想

該論文包含了當下CNN的三個思潮 
- 不含全連接層(fc)的全卷積(fully conv)網絡。可適應任意尺寸輸入。 
- 增大數據尺寸的反卷積(deconv)層。能夠輸出精細的結果。 

- 結合不同深度層結果的跳級(skip)結構。同時確保魯棒性和精確性。

 

損失函數是在最后一層的 spatial map上的 pixel 的 loss 和,在每一個 pixel 使用 softmax loss

使用 skip 結構融合多層(3層)輸出底層網絡應該可以預測更多的位置信息,因為他的感受野小可以看到小的 pixels

上采樣 lower-resolution layers 時,如果采樣后的圖因為 padding 等原因和前面的圖大小不同,使用 crop ,當裁剪成大小相同的,spatially aligned ,使用 concat 操作融合兩個層

預備知識:

 

CNN與FCN
通常cnn網絡在卷積之后會接上若干個全連接層,將卷積層產生的特征圖(feature map)映射成為一個固定長度的特征向量。一般的CNN結構適用於圖像級別的分類回歸任務,因為它們最后都期望得到輸入圖像的分類的概率,如ALexNet網絡最后輸出一個1000維的向量表示輸入圖像屬於每一類的概率


FCN對圖像進行像素級的分類,從而解決了語義級別的圖像分割問題。與經典的CNN在卷積層使用全連接層得到固定長度的特征向量進行分類不同FCN可以接受任意尺寸的輸入圖像,采用反卷積層對最后一個卷基層的特征圖(feature map)進行上采樣,使它恢復到輸入圖像相同的尺寸,從而可以對每一個像素都產生一個預測,同時保留了原始輸入圖像中的空間信息,最后奇偶在上采樣的特征圖進行像素的分類。
-全卷積網絡(FCN)從抽象的特征中恢復出每個像素所屬的類別。即從圖像級別的分類進一步延伸到像素級別的分類
FCN將傳統CNN中的全連接層轉化成一個個的卷積層。如下圖所示,在傳統的CNN結構中,前5層是卷積層第6層和第7層分別是一個長度為4096的一維向量第8層是長度為1000的一維向量,分別對應1000個類別的概率。FCN將這3層表示為卷積層,卷積核的大小(通道數,寬,高)分別為(4096,7,7)、(4096,1,1)、(1000,1,1)。所有的層都是卷積層,故稱為全卷積網絡。

 

網絡結構

網絡結構如下。輸入可為任意尺寸圖像彩色圖像;輸出與輸入尺寸相同,深度為:20類目標+背景=21。 (在PASCAL數據集上進行的,PASCAL一共20類)

 

 

全卷積-提取特征

虛線上半部分為全卷積網絡。(藍:卷積,綠:max pooling)。對於不同尺寸的輸入圖像,各層數據的尺寸(height,width)相應變化,深度(channel)不變。
這部分由深度學習分類問題中經典網絡AlexNet1修改而來。只不過,把最后兩個全連接層(fc)改成了卷積層。

論文中,達到最高精度的分類網絡是VGG16,但提供的模型基於AlexNet。此處使用AlexNet便於繪圖。

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

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

針對第二個全連接層,令其濾波器尺寸為F=1,這樣輸出數據體為[1x1x4096]。

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

逐像素預測

虛線下半部分中,分別從卷積網絡的不同階段,以卷積層(藍色×3)預測深度為21的分類結果。

例:第一個預測模塊 
輸入16*16*4096,卷積模板尺寸1*1,輸出16*16*21。 

相當於對每個像素施加一個全連接層,從4096維特征,預測21類結果。

 

怎么具體逐像素點預測分類的:
參考博客:http://www.cnblogs.com/gujianhan/p/6030639.html

采用反卷積層對最后一個卷積層的feature map進行上采樣, 使它恢復到輸入圖像相同的尺寸,從而可以對每個像素都產生了一個預測, 同時保留了原始輸入圖像中的空間信息, 最后在上采樣的特征圖上進行逐像素分類

具體過程:

 

 

 

經過多次卷積和pooling以后,得到的圖像越來越小分辨率越來越低。其中圖像到 H/32∗W/32 的時候圖片是最小的一層時,所產生圖叫做heatmap熱圖,熱圖就是我們最重要的高維特征圖

得到高維特征的heatmap之后就是最重要的一步也是最后的一步對原圖像進行upsampling,把圖像進行放大、放大、放大,到原圖像的大小

(也就是將高維特征圖翻譯成原圖時對應的分割圖像!!)

 

 

 

最后的輸出是21張heatmap經過upsampling變為原圖大小的圖片,為了對每個像素進行分類預測label成最后已經進行語義分割的圖像,這里有一個小trick,就是最后通過逐個像素地求其在21張圖像該像素位置的最大數值描述(概率)作為該像素的分類。因此產生了一張已經分類好的圖片,如下圖右側有狗狗和貓貓的圖。

 

反卷積-升采樣
(這里會先進行上采樣,即擴大像素再進行卷積——通過學習獲得權值)

下半部分,反卷積層(橙色×3)可以把輸入數據尺寸放大。和卷積層一樣,上采樣的具體參數經過訓練確定。

這里圖像的反卷積下圖的full卷積原理是一樣的,使用了這一種反卷積手段使得圖像可以變大,FCN作者使用的方法是這里所說反卷積的一種變體,這樣就可以獲得相應的像素值,圖像可以實現end to end。

(feature map值與權重不同,生成的上采樣的二值區域也是不一樣的。)

 

跳級結構

對原圖進行卷積conv1、pool1后圖像縮小為1/2;對圖像進行第二次卷積conv2、pool2后圖像縮小為1/4;對圖像進行第三次卷積conv3、pool3后圖像縮小為1/8,此時保留pool3的featuremap;對圖像進行第四次卷積conv4、pool4后圖像縮小為1/16,此時保留pool4的featuremap;對圖像進行第五次卷積conv5、pool5后圖像縮小為1/32,然后把原來CNN操作過程中的全連接編程卷積操作的conv6、conv7,圖像的featuremap的大小依然為原圖的1/32,此時圖像不再叫featuremap而是叫heatmap

其實直接使用前兩種結構就已經可以得到結果了,這個上采樣是通過反卷積(deconvolution)實現的,對第五層的輸出(32倍放大)反卷積到原圖大小。但是得到的結果還上不不夠精確,一些細節無法恢復。於是將第四層的輸出和第三層的輸出也依次反卷積,分別需要16倍和8倍上采樣,結果過也更精細一些了。這種做法的好處是兼顧了local和global信息。

 

網絡的loss層


sem是網絡輸入層的top:’sem’ 是數據的標簽

fcn網絡的輸入batchsize是1,因為分割loss的計算在每一個像素點都一個真值(標簽),相當於每一個像素點的都是一個分類任務,一個圖像就有對應像素點個樣本。所以分割任務的batch是一個圖片,將一個圖片最后在所有像素點上的分類loss加起來計算一次梯度的更新

 

訓練

 

訓練過程分為四個階段,也體現了作者的設計思路,值得研究。

第1階段

 

 


經典的分類網絡為初始化。最后兩級是全連接(紅色),參數棄去不用。

第2階段

 

 從特征小圖(16*16*4096)預測分割小圖(16*16*21),之后直接升采樣為大圖。 
反卷積(橙色)的步長為32,這個網絡稱為FCN-32s。 
這一階段使用單GPU訓練約需3天。

第3階段

 

 升采樣分為兩次完成(橙色×2)。 
第二次升采樣前,把第4個pooling層(綠色)的預測結果(藍色)融合進來。使用跳級結構提升精確性。 
第二次反卷積步長為16,這個網絡稱為FCN-16s。 
這一階段使用單GPU訓練約需1天。

第4階段

 

 

升采樣分為三次完成(橙色×3)
進一步融合了第3個pooling層的預測結果
第三次反卷積步長為8,記為FCN-8s。
這一階段使用單GPU訓練約需1天。

較淺層的預測結果包含了更多細節信息。比較2,3,4階段可以看出,跳級結構利用淺層信息輔助逐步升采樣,有更精細的結果。

 

 

其他參數
minibatch:20張圖片
learning rate:0.001


初始化:
分類網絡之外的卷積層參數初始化為0。
反卷積參數初始化為bilinear插值。最后一層反卷積固定位bilinear插值不做學習。

 

結論
總體來說,本文的邏輯如下:
- 想要精確預測每個像素的分割結果
- 必須經歷從大到小,再從小到大的兩個過程
- 在升采樣過程中,分階段增大比一步到位效果更好
- 在升采樣的每個階段,使用降采樣對應層的特征進行輔助

 

后續的一個發展:
采用條件隨機場建立類別的關系。

舉個簡單的例子,"天空"和"鳥"這樣的像素在物理空間是相鄰的概率,應該要比"天空"和"魚"這樣像素相鄰的概率大,那么天空的邊緣就更應該判斷為鳥而不是魚(從概率的角度)。https://blog.csdn.net/DL_CreepingBird/article/details/78574059

 

配置caffe運行FCN:http://melonteam.com/posts/quan_juan_ji_shen_jing_wang_luo_fcn_xue_xi_bi_ji/

 

我覺得思路最清晰的一個博主:https://blog.csdn.net/qq_37274615/article/details/73251503
————————————————

原文鏈接:https://blog.csdn.net/qq_36269513/article/details/80420363




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM