深度學習方法(十三):卷積神經網路結構變化——可變形卷積網路deformable convolutional networks

上一篇我們介紹了:深度學習方法(十二):卷積神經網路結構變化——Spatial Transformer Networks,STN創造性地在CNN結構中裝入了一個可學習的仿射變換,目的是增加CNN的旋轉、平移、縮放、剪裁性。為什麼要做這個很奇怪的結構呢?原因還是因為CNN不夠魯棒,比如把一張圖片顛倒一下,可能就不認識了(這裡mark一下,提高CNN的泛化能力,值得繼續花很大力氣,STN是一個思路,讀者以及我自己應該多想想,還有什麼方法?)。

今天介紹的這一篇可變形卷積網路deformable convolutional networks,也算是在STN之後的一個新的變換——STN是說CNN Kernel放死了(比如3*3大小),但是可以通過圖片變換讓CNN效果更好;而deformable是說既然圖片可能各種情況,那我索性CNN的Kernel本身是不規整的,比如可以有dilation,也可以旋轉的,或者看起來完全沒有規則的。如下圖,(a)是常規的一個3*3卷積視窗,(b)藍色點就是原來的卷積視窗加上了一個offset的情況,(c)表示可以對進行視窗進行scale和aspect ratio的變換,(d)表示旋轉;

這裡寫圖片描述

論文引入了兩種新的模組來提高卷積神經網路 (CNN) 對變換的建模能力:可變形卷積 (deformable convolution) 和可變形興趣區域池化 (deformable ROI pooling),下面逐一介紹。

(1)可變形卷積 Deformable Convolution

這裡寫圖片描述
圖1 可變性卷積示意圖

先看傳統卷積的一個定義:

R代表一個receptive field的grid: R={(−1,−1),(−1,0),…,(0,1),(1,1)}R = \{(−1, −1), (−1, 0), . . . , (0, 1), (1, 1)\},以3*3為例。
對於輸出中每一個畫素position P0,一般的卷積就是

這裡寫圖片描述

而可變形卷積做的是:

這裡寫圖片描述

再看圖1,把原來的卷積過程分成兩路,上面一路學習offset Δpn\Delta p_n,得到H*W*2N的輸出(offset),N=|R|表示grid中畫素個數,2N的意思是有x,y兩個方向的offset。有了這個offset以後,對於原始卷積的每一個卷積視窗,都不再是原來規整的sliding window(圖1中的綠框),而是經過平移後的window(藍框),取到資料後計算過程和卷積一致。

就是這樣簡單嗎?其實還相差一點,原因是Δpn\Delta p_n不是整數畫素,而是一個高精度的小數,不能直接獲取畫素座標,而如果採用簡單粗暴的取整又會有一定誤差,因此就採用了和STN中一樣的做法——雙線性插值,插出每個點的畫素值。公式上寫成簡潔的:

這裡寫圖片描述

實際上做的就是找到小數的p所在的影象4畫素grid,然後做雙線性插值。上面公式這樣寫了以後可以和STN(參考上一篇)中做法一樣,就通過BP端到端來訓練了。

(2)可變形興趣區域池化 Deformable RoI Pooling

思路和前面一樣,一路學習offset,一路得到真正的pooling結果。

這裡寫圖片描述

區別在於用的是FC,原因是ROI pooling之後的結果是固定大小的k*k,直接用FC得到k *k個offset。但是這些offset不能直接用,因為ROI區域大小不一,並且input feature map的w和h也是大小不一。作者提出的方法是用一個scale r:

這裡寫圖片描述

下面是roi pooling原來的公式(用的是average?這個比較奇怪,一般都是用max的,當然按照這個邏輯,max pooling也很容易推出)

這裡寫圖片描述

有了offset之後就可以這樣做:

這裡寫圖片描述

和前面一樣,因為offset是帶小數的,不能直接得到畫素,需要用雙線性插值演算法得到每一個畫素值。注意,這裡的offset只有k*k個,而不是每一個畫素一個。

實驗結果

下面貼一些實驗說明圖,看起來有點道理,有點聚焦的意思:

這裡寫圖片描述

這張圖蠻難看懂的,論文也沒有細講,網上還沒有詳細分析的資料,我談下我的理解,希望對讀者有幫助,如果有不對的歡迎指正——做3*3卷積的時候,對任意一個畫素(綠點)都會有9個offset,然後在三層帶deformable的卷積中,就會通過疊乘效應產生9*9*9=729個offset座標,然後畫在圖上。可以看到聚焦的目標周圍。

這裡寫圖片描述

圖6是ROI pooling的結果,可以看到3*3個bin都偏向了目標周圍,而避免了矩形框的backgroud影響,這個還是蠻有道理的。

這裡寫圖片描述

結果看這個deformable的外掛可以用在很多地方,效果也都還OK。


回過頭細想一下,其實所謂的learning offset,這個思想在faster RCNN中已經用過了,這個針對每一個畫素的receptive field得到一個offset,而faster RCNN是對每一個anchor box得到offset,意思是一樣的,就是input大小不一樣罷了。為什麼會偏移向目標呢,原因參與到訓練中,這樣的輸入可以使得loss變小,因此offset就是往loss變小的方向偏移。這個思想在另外一個最新的工作Mask RCNN(作者He Kaiming)中得到了進一步優化,後面有機會總結目標檢測演算法的時候,再具體展開,有興趣的讀者可以去看看,我當是先拋磚引玉了。

參考資料

[1] deformable convolutional networks
[2] Mask RCNN
[3] Spatial Transformer Networks