1. 程式人生 > >深度學習經典目標檢測例項分割語義分割網路的理解之一 CNN

深度學習經典目標檢測例項分割語義分割網路的理解之一 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)例項分割

這個有意思,什麼叫例項分割呢?它與語義分割有什麼區別與聯絡呢? 
顧名思義,畫素級別的語義分割,對影象中的每個畫素都劃分出對應的類別,即實現畫素級別的分類; 
而類的具體物件,即為例項,那麼例項分割不但要進行畫素級別的分類,還需在具體的類別基礎上區別開不同的例項。比如說影象有多個人甲、乙、丙,那邊他們的語義分割結果都是人,而例項分割結果卻是不同的物件,具體如下圖所示: 
這裡寫圖片描述

解釋來自:https://blog.csdn.net/lanyuxuan100/article/details/70800246

1. 卷積

卷積操作的示意圖: 

CSDN圖示

藍色影象為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數目相等。 
卷積操作的計算方式如下: 
已知:

  • input size
  • kernel size k
  • stride s
  • padding size p

則輸出大小為: 卷積計算公式

特殊的卷積操作

  • Half(same) padding 
    輸出size與輸入size相同(i.e., o = i) 
    Half(same) padding for i = 5, k = 3 and p = 1 
  • Full padding 
    輸出size大於輸入size
     
    Half(same) padding for i = 5, k = 3 and p = 2 

卷積中的矩陣操作

二維卷積數學表示式:

矩陣A(ma, na)矩陣B(mb, nb)則:


Half(same) padding for i = 4, k = 3 and p = 0 

將大小為(3,3)的卷積核表示成如下圖所示的(16,4)矩陣C.T(表示矩陣C的轉置):

Half(same) padding for i = 4, k = 3 and p = 0 

其中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輸出維度是類的個數。