Atrous Convolution

huahua lu
碼農看論文
Published in
3 min readAug 1, 2018

--

一般用於Classification的網路,在average pooling之前,通常會經過幾次stride為2的max pooling,使得最後在avg pooling之前的feature map的size會是本來圖片的32分之一倍,如此稱為output stride 32。

然而我們知道,當圖片縮小32倍之後,在本來圖片pixel小於32的物件,在這個情況下是無法被放大回本來的樣子的。另外是max pooling會提供一些spatial invariant的能力。

而這些性質對於segmentation上所需要的pixel by pixel的classification是不利的。

然而stride為2的max pooling,可以帶來增加FOV(field of view)的好處,為此在幾篇論文中(例如deeplab),開始使用了Atrous Convolution的作法。

如上圖所示,Atrous Convolution使kernel可以涵蓋的範圍變大,但是不增加kernel的參數量。

若要以此取代stride 2的話,deeplab v3上的作法為將本來stride是2的那層convolution之後都改為Atrous Convolution with dilated rate 2,若其後還有stride 2的地方要改的話,則把其後的dilated rate再乘上2,以此類推。

如此以來便可以維持feature map的resolution,並且同時又加大FOV。而缺點是由於維持了feature map的大小,如此會使用很多記憶體,並且運算速度無法太快。

修改方式的部份,下方連結是我修改pytorch的ResNet,使其output stride從32變成16或8。

而為了處理圖片中 object multiscale 的問題,可以使用Atrous Spatial Pyramid Pooling (ASPP),其作法很簡單,就是把要處理的feature map分別input給幾個dilated rate不同的Atrous Convolution,並且再組合起來。

在deeplab v3的作法,是將要處理的feature map,輸入三個不同dilated rate的3x3 Atrous Convolution,並且同時也輸入給 1x1 的convolution以及average pooling,最後將五個輸出結果concatenate在一起。

--

--