SegNet网络简析及caffe工程应用
最近在工作的業務中需要應用到圖像分割,在這里總結一下在應用中遇到的一些問題。
一、SegNet簡介
自2015年FCN的提出后,使用卷積層替代全連接層成為了解決像素級分類種where和what的一種有效辦法。在最初的的FCN網絡中,作者將最后用于分類的卷積層結果通過雙線性差值擴大分辨率后,與前面pooling層之后的feature map進行結合,在提高分類準確率的同時,增加了更多的位置信息。
SegNet與FCN最大的區別在于,將低分辨率feature map轉換為高分辨率feature map的上采樣所使用的方法。FCN使用反卷積的方法通過卷積的方式來將分辨率翻倍(卷積核采用雙線性差值初始化)。而SegNet采用的是使用下采樣時的位置信息,上采樣將值填入擴大分辨率后的feature map中。
SegNet論文地址為https://arxiv.org/abs/1511.00561
這里寫圖片描述
圖1. SegNet結構圖
模型細節:
??? 每層保留64個特征
??? 解碼層不采用ReLU讓優化變得簡單
??? 核大小為7x7
采用64個特征的好處:
??? 防止參數過多爆炸增長
??? 每增加一對編碼解碼層,都增加相同時間。小的特征圖,使用時間短。(減少內存訪問損耗MAC時間)
使用7x7固定核,可以把輸出層的像素追溯到輸入層中。
使用LCN預處理:
??? 修改不均勻場景,提高陰影部分對比度。
??? 強調輪廓,使網絡更容易學習輪廓
??? 更易收斂
?
二、caffe平臺上的SegNet
原版的SegNet的caffe開源代碼地址:https://github.com/alexgkendall/caffe-segnet
支持cudnn 2的caffe開源代碼地址:https://github.com/TimoSaemann/caffe-segnet-cudnn5
與其他深度學習模型中的caffe代碼類似,僅需要編譯caffe后即可運行。
?
1. Batch Normalization
在使用SegNet模型時,遇到的最大的問題是BN層,這里回憶一下BN層的作用及使用方法。
推薦文章:https://www.cnblogs.com/guoyaohua/p/8724433.html
文章中對BN層進行了抽象和實例解析,非常清楚,下面我用自己的理解來說一下:
BN層的出現,主要是為了解決機器學習IID問題,即訓練集和測試集保持獨立同分布。如果輸入的分布不能保持穩定,那么訓練就會很難收斂,而在圖像處理領域的白化處理,即將輸入數據轉換為以0為均值,1為方差的正態分布。這樣能夠讓神經網絡更快更好的收斂,而這就是BN層所要做的。
“深度神經網絡之所以收斂慢,是由于輸入的分布逐漸向非線性函數的兩端靠攏”,而BN層的作用,就是將輸入的分布,拉回到均值為0,方差為1的正態分布上,這樣就使輸入激活函數的值,在反向傳播史能夠產生更明顯的梯度,更容易收斂,避免了梯度消失的問題。之所以能夠在反向傳播時產生更明顯的變化,我們將輸入分布變為標準正態分布后,輸入的值靠近中心的概率會變大,若我們的激活函數為sigmoid函數,那么即使輸入存在微小的變化,也能夠在反向傳播時產生很明顯的變化。
圖2. Sigmoid函數
2. Batch Normalization在訓練中
每層神經網絡在線性激活后,通過如下公式進行轉換,這個轉換就是BN層的操作。
公式中的x是經過該層線性變換后的值,即x = wu+b,u為上一層神經層的輸出。
通過這個操作,將輸入非線性激活函數的輸入值,盡量拉伸到變化較大的區域,即激活函數中間區域。這樣能夠增大激活函數的導數值,使收斂更快速。而這樣也會引入一個問題,強行變換分布后,會導致部分特征無法學習到,因此引入了另一種操作Scale,操作如下:
mean和variance是不會進行學習的,而gamma和beta兩個參數是可以通過反向傳播學習的,通過這兩個參數對數據進行擴大和平移,恢復部分特征的分布。
這里之所以提一下BN層,是因為SegNet官方Caffe工程中,將BN操作和Scale操作進行了融合,將兩層變為一層。這個操作導致了以前可以用于其他模型上,將BN層參數和scale參數(以下統稱BN層參數)與conv層參數融合的腳本無法使用。
注:
添加BN層后,卷積中偏移量bias可以不添加,因為會被抵消。
3.BN層參數融合
為何需要將BN層參數與conv參數融合呢?在SegNet Caffe工程的github主頁上,作者在QA中提到,融合參數后,模型的性能提高了30%,這對于將模型部署于應用中是非常大的提升。
在SegNet Caffe cudnn版本中,作者提供了一個腳本來幫助我們融合BN層參數和conv層參數,即BN-absorber.py。
此處需要注意,在使用BN-absorber.py腳本前,我們需要先運行另一個腳本,由于在訓練過程中,我們采用的batch size會直接影響到mean和variance的計算,若每個batch之間的樣本分布非常不均勻,可能會影響模型的收斂情況,因此,運行compute_bn_statistics.py腳本,會將整個測試集作為一個batch,計算整個測試集的mean和variance。
--------------------- ?
作者:huang_nansen ?
來源:CSDN ?
原文:https://blog.csdn.net/huang_nansen/article/details/82723561 ?
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!
總結
以上是生活随笔為你收集整理的SegNet网络简析及caffe工程应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: yolov3项目工程
- 下一篇: Qt Creator的下载和安装