之前的項目中使用了可形變卷積,感覺有效果,所以就具體看一下。
論文: http://openaccess.thecvf.com/content_ICCV_2017/papers/Dai_Deformable_Convolutional_Networks_ICCV_2017_paper.pdf
代碼: https://github.com/msracver/Deformable-ConvNets
傳統的卷積由於規則形狀固定,不能完全適應目標的形狀,我們期望的應該是一種自適應卷積,或者說可形變(Deformable Convolution )卷積,就像這樣:
首先看頂層的feature map,我們取兩個激活點(分別在大羊和小羊身上),代表的是不同尺度和形狀。中間層:top層的feature map經過3*3的卷積后,需要抽樣的一些點。最底層:再經過一個3*3的卷積,需要采樣的點。通過對比可以明顯的看出,可變形卷積的采樣位置更符合物體本身的形狀和尺寸,而標准卷積的形式卻不能做到這一點。能夠明顯的看到最終的激活點學習了他該學習的特征,這個特征只針對於物體本身,相比原始的卷積它更能排除背景噪聲的干擾。
對卷積核中每個采樣點的位置都增加了一個偏移變量,可以實現在當前位置附近隨意采樣而不局限於之前的規則格點。如下圖所示,是常見的采樣點和可變形卷積采樣的對比:
(a)是常見的3x3卷積核的采樣方式,(b)是采樣可變形卷積,加上偏移量之后的采樣點的變化,其中(c)(d)是可變形卷積的特殊形式
可形變卷積是基於一個平行網絡學習offset(偏移),使得卷積核在input feature map的采樣點發生偏移,集中於我們感興趣的區域或者目標。
他的具體流程是:
所以可形變卷積這種形變不是發生在卷積核,而是發生在原圖產生了offset偏移,在經過正常卷積就達到可變卷積的效果,也就是特征偏移+正常卷積。
相對應可形變卷積還有可形變的roi pooling:
之前我們faster rcnn介紹的roi pooling是通過spp完成的:
這種就是把一張圖分成若干個cell,這種也是規則和形狀很固定,所以有了以下的可形變的roi pooling:
相比普通ROI Pooling,同樣增加了一個offset,下圖為網絡結構:具體操作為,首先,通過普通的ROI Pooling得到一個feature map,如上圖中的綠色塊,通過得到的這個feature map,加上一個全連接層,生成每一個位置的offset,然后處理方式和可形變卷積一樣,為了讓offset的數據和ROI 的尺寸匹配,需要對offset進行微調,此處不是重點。全連接層的參數可以通過反向傳播進行學習。
代碼學習:
在CNN中就是這樣用的,l_offset表示發生位移后的新的圖像,然后用它來進行新的卷積,這個ConvOffset2D是這樣定義的:
x_offset就是輸入x在offsets的偏移上得到的新的圖,這個計算發生在: