論文Fully Convolutional Networks for Semantic Segmentation 是圖像分割的milestone論文。
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