深度學習經典目標檢測例項分割語義分割網路的理解之一 CNN
這一系列的深度學習網路還是放在一起學習會比較深刻。
CNN, 只分類
RCNN, 分類加標框
FAST-RCNN, 快速分類加標框
FASTER-RCNN, 更快地分類加標框
MASK-RCNN 分類標框加上畫素級別分割
另外網上已經有很多這系列的博文了,幫了我不少忙,但有些不乏沒有說清楚或者是錯誤的內容,我會盡量避免這些,如有不對的地方請指示出來,非常感謝。
本文參考了的博文
https://blog.csdn.net/panglinzhuo/article/details/75207855 @dadadaplz
https://blog.csdn.net/u012389932/article/details/52946887 @fengbingchun
目前的分割任務主要有兩種:
(1)畫素級別的語義分割
(2)例項分割
這個有意思,什麼叫例項分割呢?它與語義分割有什麼區別與聯絡呢?
顧名思義,畫素級別的語義分割,對影象中的每個畫素都劃分出對應的類別,即實現畫素級別的分類;
而類的具體物件,即為例項,那麼例項分割不但要進行畫素級別的分類,還需在具體的類別基礎上區別開不同的例項。比如說影象有多個人甲、乙、丙,那邊他們的語義分割結果都是人,而例項分割結果卻是不同的物件,具體如下圖所示:
1. 卷積
卷積操作的示意圖:
藍色影象為input feature map;綠色影象為output feature map
當有多個input and output feature maps時,卷積核用一個4-D陣列表示:
output_channels,input_channels,filter_rows,filter_columns
output feature maps的個數與output_channels數目相等。
卷積操作的計算方式如下:
已知:
- i input size
- kernel size k
- stride s
- padding size p
則輸出大小為:
特殊的卷積操作
- Half(same) padding
輸出size與輸入size相同(i.e., o = i) - Full padding
輸出size大於輸入size
卷積中的矩陣操作
二維卷積數學表示式:
矩陣A(ma, na)矩陣B(mb, nb)則:
將大小為(3,3)的卷積核表示成如下圖所示的(16,4)矩陣C.T(表示矩陣C的轉置):
其中w的下標i,j分別表示卷積核的第i行第j列元素。
- 卷積的矩陣操作
將輸入4*4的原始影象A展開成(16,1)向量,則將卷積核作用於影象A等同於下面的矩陣操作:C * A = B
其中,B為卷積後得到的(4,1)向量,再reshape成(2,2)矩陣即為輸出。
補充一點,多通道的卷積運算機理
下圖來自 https://blog.csdn.net/u014114990/article/details/51125776 @deep_learninger
在上圖由4個通道卷積得到2個通道的過程中,引數的數目為4×2×2×2個,其中4表示4個通道,第一個2表示生成2個通道,最後的2×2表示卷積核大小,即將輸入的第i個通道分別於第i個kernel卷積之後疊加,得到第一個輸出通道map。
下圖或許更方便理解:
一般常見的啟用函式relu,這裡不做擴充套件。
Polling層的運算:
一般有max polling, mean polling等。
注意polling層的反向傳遞比FC複雜一些,因為涉及到了下采樣,具體可以參見@迷川浩浩_ZJU的下面這篇博文
https://blog.csdn.net/qq_21190081/article/details/72871704
關於卷積和全連線的比較:
在影象處理方面:
FC的缺點: 1. 引數過多,隨便上億
2. 沒有利用好畫素間的位置關係
3. 網路層數的限制:因為FC很難傳遞過三層,較深的FC難以訓練
CNN的有點:1. 區域性連線,減少引數。
2. 權值共享:一組連線可以共享一個權值,減少引數(廢話)。
3. 下采樣: polling 減少引數,增強魯棒性。減少不重要的引數,提高準確性,降低過擬合。
一般CNN的框架:
接下來以Alexnet為例,解析它的各種引數:
一個非常重要的公式(雖然使用TensorFlow搭建網路時幾乎用不到):
Wo = (Wi - Wk + 2p)/s +1
Wo: 輸出尺度
Wi:輸入尺度
Wk:卷積核尺度
p: Padding 的圈數(輸入外圍補零)
s: stride 步長
TensorFlow 中的尺度運演算法則!
由於內部做了根據引數的適應尺寸運算,變得更為簡單:padding = 'SAME' 輸出為ceil(Wi/s)
padding = 'VAILD' 輸出為ceil((Wi-Wk+1)/s)
ceil()表示向上取整
一個典型的Alexnet 網路(用單GPU訓練的模型,由於現在GPU一般都夠Alexnet用了)
最後FC輸出維度是類的個數。