深度學習方法(十三):卷積神經網絡結構變化——可變形卷積網絡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)表示旋轉;markdown

這裏寫圖片描述

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

(1)可變形卷積 Deformable Convolution學習

這裏寫圖片描述
圖1 可變性卷積示意圖優化

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

R表明一個receptive field的grid: R={(1,1),(1,0),...,(0,1),(1,1)} ,以3*3爲例。
對於輸出中每個像素position P0,通常的卷積就是.net

這裏寫圖片描述

而可變形卷積作的是:插件

這裏寫圖片描述

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

就是這樣簡單嗎?其實還相差一點,緣由是 Δpn 不是整數像素,而是一個高精度的小數,不能直接獲取像素座標,而若是採用簡單粗暴的取整又會有必定偏差,所以就採用了和STN中同樣的作法——雙線性插值,插出每一個點的像素值。公式上寫成簡潔的:blog

這裏寫圖片描述

實際上作的就是找到小數的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

相關文章
相關標籤/搜索