上一篇咱們介紹了:深度學習方法(十二):卷積神經網絡結構變化——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)表示旋轉;markdown
論文引入了兩種新的模塊來提升卷積神經網絡 (CNN) 對變換的建模能力:可變形卷積 (deformable convolution) 和可變形興趣區域池化 (deformable ROI pooling),下面逐一介紹。網絡
(1)可變形卷積 Deformable Convolution學習
圖1 可變性卷積示意圖優化
先看傳統卷積的一個定義:spa
R表明一個receptive field的grid:
對於輸出中每個像素position P0,通常的卷積就是.net
而可變形卷積作的是:插件
再看圖1,把原來的卷積過程分紅兩路,上面一路學習offset
就是這樣簡單嗎?其實還相差一點,緣由是
實際上作的就是找到小數的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