空洞卷積


參考:https://www.cnblogs.com/houjun/p/10275215.html

https://www.jianshu.com/p/f743bd9041b3

一、含義
空洞卷積是在標准的卷積核里注入空洞,以此來增加感受野/接受域。相比原來的正常卷積運算,空洞卷積 多了一個 超參數稱之為 dilation rate 指的是kernel的間隔數量(e.g. 正常的 convolution 是 dilatation rate 1)。
 
空洞卷積

 

正常卷積運算

 二、提出的原因

Deep CNN 對於其他任務還有一些致命性的缺陷。較為著名的是 up-sampling 和 pooling layer 的設計。
主要問題有:

1、Up-sampling / pooling layer (e.g. bilinear interpolation) is deterministic. (參數不可學習)

2、內部數據結構丟失;空間層級化信息丟失。

3、小物體信息無法重建 (假設有四個pooling layer 則 任何小於 2^4 = 16 pixel 的物體信息將理論上無法重建。)
在這樣問題的存在下,語義分割問題一直處在瓶頸期無法再明顯提高精度, 而 dilated convolution 的設計就良好的避免了這些問題。


 

三、膨脹卷積的好處是不做pooling損失信息的情況下,加大了感受野,讓每個卷積輸出都包含較大范圍的信息。在圖像需要全局信息或者自然語言處理中需要較長的sequence信息依賴的問題中,都能很好的應用。

1 tf.nn.atrous_conv2d(value,filters,rate,padding,name=None)

  value:輸入的卷積圖像,[batch, height, width, channels]。

     filters:卷積核,[filter_height, filter_width, channels, out_channels],通常NLP相關height設為1。

  rate:正常的卷積通常會有stride,即卷積核滑動的步長,而膨脹卷積通過定義卷積和當中穿插的rate-1個0的個數,實現對原始數據采樣間隔變大。

  padding:”SAME”:補零   ; ”VALID”:丟棄多余的

膨脹后的卷積核尺寸:

膨脹的卷積核尺寸 = 膨脹系數 * (原始卷積核尺寸 - 1) + 1

kd = k +(k-1)·(r-1),其中kd是膨脹后的卷積核大小,k是原卷積核大小,r是膨脹系數

膨脹卷積感受野:

[(n-1)*(ksize+1)+ksize]×[(n-1)*(ksize+1)+ksize],n = 膨脹系數

空洞卷積的疊加感受野計算方法,下面來介紹一下空洞卷積的感受野變化(卷積核大小為 3\times3 ,stride=1,下面的卷積過程后面的以前面的為基礎):

1-dilated conv:rate=1的卷積其實就是普通 3\times3 因此 r=(1-1)\times1+3=3r=2^{(1/2)+2}-1=3 )卷積因此感受野為 3\times3

2-dilated conv:rate=2可以理解為將卷積核變成了 5\times5 ,因此 r=(3-1)*1+5=7r=2^{(2/2)+2}-1=7 )感受野大小為 7\times7

4-dilated conv:rate=4可以理解為將卷積核變成了 9\times9 因此 r=(7-1)\times1+9=15r=2^{(4/2)+2}-1=15 )感受野大小為 15×15

可以看到將卷積以上面的過程疊加感受野變化會指數增長,感受野公式為 2i+21,for i = 0,1,2,3,4

 

四、空洞卷積工作原理

二維

(a)圖對應3x3的1-dilated conv,和普通的卷積操作一樣,(b)圖對應3x3的2-dilated conv,實際的卷積kernel size還是3x3,但是空洞為1,也就是對於一個7x7的圖像patch,

只有9個紅色的點和3x3的kernel發生卷積操作,其余的點略過。也可以理解為kernel的size為7x7,但是只有圖中的9個點的權重不為0,其余都為0。 可以看到雖然kernel size只有3x3,

但是這個卷積的感受野已經增大到了7x7(如果考慮到這個2-dilated conv的前一層是一個1-dilated conv的話,那么每個紅點就是1-dilated的卷積輸出,所以感受野為3x3,

所以1-dilated和2-dilated合起來就能達到7x7的conv),(c)圖是4-dilated conv操作,同理跟在兩個1-dilated和2-dilated conv的后面,能達到15x15的感受野。

對比傳統的conv操作,3層3x3的卷積加起來,stride為1的話,只能達到(kernel-1)*layer+1=7的感受野,也就是和層數layer成線性關系,而dilated conv的感受野是指數級的增長。

a,b,c三張圖都是以前面結果為基礎,a的感受野是3x3,b以a圖進行卷積,b本身感受野為5x5(以原圖進行卷積,圖b示黑色正方形區域)加上以a的3x3感受野變成7x7,即,b圖的紅點對應a圖的卷積結果,對應原圖9x9像素。
一維

(a)為k=3,stride=2 的普通卷積;(b)為k=3,stride=1的卷積;(c)為k=3,stride=1,dilation=2的空洞卷積這里雖然卷積核長度仍為3,但每隔2個點采樣一次(也可以理解為長度為5但其中兩個位置權重為0)

以一維圖b紅色筆所示k=3,stride=1,dilation=1的卷積 + k=3,stride=1,dilation=2的空洞卷積之后每個feature maps像素對應疊加感受野是7x7。同理二維也一樣。
五、問題
1、格網問題

圖2.網格問題的圖示。 從左到右:像素(用藍色標記)有助於通過三個內核大小為3×3的卷積層計算中心像素(用紅色標記)。 (a)所有卷積層都具有膨脹率= 2.(b)隨后的卷積層的膨脹率分別為r = 1,2,3。

我們發現我們的 kernel 並不連續,也就是並不是所有的 pixel 都用來計算了,因此這里將信息看做 checker-board 的方式會損失信息的連續性。這對 pixel-level dense prediction 的任務來說是致命的。

我們將其稱為“網格化”(圖2):對於空洞卷積層L中的像素p,對像素p有貢獻的信息來自來自以p為中心的層L-1中的附近kd×kd區域。。由於擴張卷積在卷積核中引入零,因此從kd×kd區域參與計算的實際像素僅為k×k,

它們之間的間隙為r-1。如果k = 3,r = 2,則該區域中僅25個像素中的9個用於計算(圖2(a))。由於所有層具有相等的膨脹率r,那么對於頂部擴張卷積層L中的像素p,有助於計算p值的最大可能位置數是(w'×h')/ r2

其中w' ,h'分別是底部擴張卷積層的寬度和高度。結果,像素p只能以棋盤方式查看信息,並且在信息中丟失大部分(當r = 2時至少75%)。當由於額外的下采樣操作而在較高層中變大時,來自輸入可能非常稀疏,

這可能不利於學習,因為1)本地信息完全丟失; 2)信息可能在很遠的距離上無關緊要。網格效應的另一個結果是第L層的r×r區域附近的像素從完全不同的“網格”集接收信息,這可能損害本地信息的一致性。

2、Long-ranged information might be not relevant.

我們從 dilated convolution 的設計背景來看就能推測出這樣的設計是用來獲取 long-ranged information。然而 光采用大 dilation rate 的信息或許只對一些大物體分割有效果,而對小物體來說可能則有弊無利了
如何同時處理不同大小的物體的關系,則是設計好 dilated convolution 網絡的關鍵。

六、解決辦法-通向標准化設計:Hybrid Dilated Convolution (HDC)
在這里,我們提出一個簡單的解決方案 - 混合擴張卷積(HDC),以解決這個理論問題。 假設我們有N個卷積層,內核大小為K×K,擴展率為[r1,...,ri,...,rn],HDC的目標是讓一系列卷積運算的感受野的最終大小完全覆蓋一個正方形 區域沒有任何孔或缺少邊緣。

第一個特性是,疊加卷積的 dilation rate 不能有大於1的公約數。比如 [2, 4, 6] 則不是一個好的三層卷積,依然會出現 gridding effect。

第二個特性是,我們將 dilation rate 設計成 鋸齒狀結構,例如 [1, 2, 5, 1, 2, 5] 循環結構。

第三個特性是,我們需要滿足一下這個式子: M_i=\max[M_{i+1}-2r_i,M_{i+1}-2(M_{i+1}-r_i),r_i]

其中 r_i 是 i 層的 dilation rate 而 M_i 是指在 i 層的最大dilation rate,那么假設總共有n層的話,默認 M_n=r_n 。假設我們應用於 kernel 為 k x k 的話,我們的目標則是 M_2 \leq k ,這樣我們至少可以用 dilation rate 1 即 standard convolution 的方式來覆蓋掉所有洞。

實際上,在下采樣發生后,不是對所有層使用相同的擴張速率,我們對每一層使用不同的擴張速率。在我們的網絡中,膨脹率的分配遵循鋸齒波式啟發式:將多個層組合在一起以形成具有增加的膨脹率的波的“上升沿”,並且下一組重復相同的模式。例如,對於具有膨脹率= 2的所有層,
我們將3個后續層組成一組,並將它們的膨脹率分別改變為1,2和3。通過這樣做,頂層可以從與原始配置相同的區域中的更寬范圍的像素訪問信息(圖2(b))。這個過程在所有層中重復,從而使得感知域在頂層不變。
HDC的另一個好處是它可以在整個過程中使用任意的擴張速率,從而自然地擴大了網絡的接收區域,而無需添加額外的模塊,這對於識別相對較大的對象非常重要。 然而,需要注意的一件重要事情是,組內的膨脹率不應該具有共同的因子關系(如2,4,8等),否則網格問題仍將適用於頂層。
這是我們的HDC方法與atrous空間金字塔池(ASPP)模塊或上下文聚合模塊之間的關鍵差異,其中使用了具有通用因子關系的擴張因子。 此外,HDC自然地與網絡的原始層集成,而不需要像ASPP上下文聚合模塊那樣添加額外的模塊。
七、多尺度分割的另類解:Atrous Spatial Pyramid Pooling( ASPP)
在處理多尺度物體分割時,我們通常會有以下幾種方式來操作:

僅僅在一個卷積分支網絡下使用 dilated convolution 去抓取多尺度物體是一個不正統的方法。比方說,我們用一個 HDC 的方法來獲取一個大(近)車輛的信息,然而對於一個小(遠)車輛的信息都不再受用。假設我們再去用小 dilated convolution 的方法重新獲取小車輛的信息,則這么做非常的冗余。基於港中文和商湯組的 PSPNet 里的 Pooling module (其網絡同樣獲得當年的SOTA結果),ASPP 則在網絡 decoder 上對於不同尺度上用不同大小的 dilation rate 來抓去多尺度信息,每個尺度則為一個獨立的分支,在網絡最后把他合並起來再接一個卷積層輸出預測 label。這樣的設計則有效避免了在 encoder 上冗余的信息的獲取,直接關注與物體之間之內的相關性。

對於在DeepLabv2中提出的ASPP模塊,其在特征頂部映射圖並行使用了四種不同采樣率的空洞卷積。這表明以不同尺度采樣是有效的,我們在DeepLabv3中向ASPP中添加了BN層。
不同采樣率的空洞卷積可以有效的捕獲多尺度信息,但是,我們發現隨着采樣率的增加,濾波器的有效權重(權重有效的應用在特征區域,而不是填充0)逐漸變小。當采用具有不同atrous rates的3×3 filter應用到65×65 feature map時,在rate值接近於feature map 大小的極端情況,該3×3 filter不能捕獲整個圖像內容嘻嘻,而退化成了一個簡單的1×1 filter, 因為只有中心 filter 權重才是有效的。
針對上面的問題,並將全局內容信息整合進模型中,則采用圖像級特征。采用全局平均池化(global average pooling)對模型的feature map進行處理,將得到的圖像級特征輸入到一個1×1 convolution with 256 filters(加入 batch normalization)中,然后將特征進行雙線性上采樣(bilinearly upsample)到特定的空間維度。
改進了ASPP包含:
即,當output_stride=16時,包括一個1×1 convolution和3×3 convolutions,其中3×3 convolutions的rates=(6,12,18),(所有的filter個數為256,並加入batch normalization)。需要注意的是,當output_stride=8時,rates將加倍;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM