FCN【一】
直觀展現網絡結構:http://ethereon.github.io/netscope/#/editor
卷積與逆卷積的動圖https://github.com/vdumoulin/conv_arithmetic
【原文圖】“Fully convolutional networks for semantic segmentation.”
上圖中,32x即為擴大32倍。
Pool5擴大32倍就可以得到原來圖像大小了。
Pool5擴大2倍與Pool4融合得到,再擴大16倍也可以得到原來圖像大小了。
擴大2倍與Pool3融合再擴大8倍也可以得到原來圖像大小了。
以下內容來自http://blog.csdn.net/shenxiaolu1984/article/details/51348149
核心思想
本文包含了當下CNN的三個思潮
- 不含全連接層(fc)的全卷積(fully conv)網絡。可適應任意尺寸輸入。
- 增大數據尺寸的反卷積(deconv)層。能夠輸出精細的結果。
- 結合不同深度層結果的跳級(skip)結構。同時確保魯棒性和精確性。
網絡結構
網絡結構如下。輸入可為任意尺寸圖像彩色圖像;輸出與輸入尺寸相同,深度為:20類目標+背景=21。
全卷積-提取特征
虛線上半部分為全卷積網絡。(藍:卷積,綠:max pooling)。對于不同尺寸的輸入圖像,各層數據的尺寸(height,width)相應變化,深度(channel)不變。
這部分由深度學習分類問題中經典網絡AlexNet1修改而來。只不過,把最后兩個全連接層(fc)改成了卷積層。
論文中,達到最高精度的分類網絡是VGG16,但提供的模型基于AlexNet。此處使用AlexNet便于繪圖。
逐像素預測
虛線下半部分中,分別從卷積網絡的不同階段,以卷積層(藍色×3)預測深度為21的分類結果。
例:第一個預測模塊
輸入16*16*4096,卷積模板尺寸1*1,輸出16*16*21。
相當于對每個像素施加一個全連接層,從4096維特征,預測21類結果。
反卷積-升采樣
(這里會先進行上采樣,即擴大像素;再進行卷積——通過學習獲得權值)
下半部分,反卷積層(橙色×3)可以把輸入數據尺寸放大。和卷積層一樣,上采樣的具體參數經過訓練確定。
這里圖像的反卷積與下圖的full卷積原理是一樣的,使用了這一種反卷積手段使得圖像可以變大,FCN作者使用的方法是這里所說反卷積的一種變體,這樣就可以獲得相應的像素值,圖像可以實現end to end。
例:反卷積2
輸入:每個像素值等于filter的權重
輸出:步長為stride,截取的寬度為pad。
跳級結構
下半部分,使用逐數據相加(黃色×2),把三個不同深度的預測結果進行融合:較淺的結果更為精細,較深的結果更為魯棒。
在融合之前,使用裁剪層(灰色×2)統一兩者大小。最后裁剪成和輸入相同尺寸輸出。
訓練
訓練過程分為四個階段,也體現了作者的設計思路,值得研究。
第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插值不做學習。
結論
總體來說,本文的邏輯如下:
- 想要精確預測每個像素的分割結果
- 必須經歷從大到小,再從小到大的兩個過程
- 在升采樣過程中,分階段增大比一步到位效果更好
- 在升采樣的每個階段,使用降采樣對應層的特征進行輔助
總結
- 上一篇: 医疗影像技术简介(X射线,CT,MRI等
- 下一篇: Linux 下Oracle Client