Deformable Convolutional Networks(可變形卷積網絡)
文章:https://arxiv.org/abs/1703.06211 link.
概述
這項工作中,作者引入了兩個新子產品來增強CNN的模組化能力:deformable convolution (可變形卷積)和deformable RoI pooling(可變形ROI池化)。 兩者均基于以下思路:在子產品中增加具有額外偏移量的空間采樣位置,并從目标任務中學習偏移量,而無需額外的監督。 新子產品可以簡單地替換現有CNN中的對應子產品,并且可以通過反向傳播進行端到端訓練,進而産生可變形的卷積網絡(由于非深度學習架構的層的存在,需要單獨編譯該模型)。深度CNN中學習密集的空間變換對于複雜的視覺任務(例如對象檢測和語義分割)是有效的。使用該子產品的卷積模型稱為Deformable Convolutional Networks,文章都是以二維卷積和池化為例子,在通道次元上進行擴充就可以得到正常情況。
deformable convolution
以3×3卷積層為例說明:

(a)标準卷積的采樣點(3×3網格)(綠點)。(b)可變形卷積中具有額外偏移量(淺藍色箭頭)的采樣位置(深藍色點)。(c)(d)是(b)的特例,即規則分布的采樣點。
這說明可變形卷積包含了比例、(各向異性的)長寬比和旋轉等變換。偏移量是通過其他卷積層從前面的特征圖中得到。是以,可變形卷積的采樣方式(局部、密集、自适應)取決于輸入特征。
二維的卷積操作可以分為兩步:在輸入feature map的規則的網格 R \mathcal{R} R中進行采樣;通過權重 W \mathcal{W} W計算權重和;如
R = { ( − 1 , − 1 ) , ( − 1 , 0 ) , … , ( 0 , 1 ) , ( 1 , 1 ) } \mathcal{R}=\{\left(-1,-1\right),\left(-1,0\right),\ldots,\left(0,1\right),\left(1,1\right)\} R={(−1,−1),(−1,0),…,(0,1),(1,1)}
定義了3×3的卷積核和1的膨脹範圍。對于輸出的feature map y的每個位置 p 0 p_0 p0有
y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ x ( p 0 + p n ) \mathbf{y}\left(\mathbf{p}_{0}\right)=\sum_{\mathbf{p}_{n} \in \mathcal{R}} \mathbf{w}\left(\mathbf{p}_{n}\right) \cdot \mathbf{x}\left(\mathbf{p}_{0}+\mathbf{p}_{n}\right) y(p0)=pn∈R∑w(pn)⋅x(p0+pn)
p n p_n pn對應于規則的采樣點位置。但在可變形卷積中,規則的網格 R \mathcal{R} R采樣點附加了一個偏移量 { Δ p n ∣ n = 1 , 2 , … , N } , N = ∣ R ∣ \left\{\Delta p_{n} | n=1,2, \ldots, N\right\}, N=|\mathcal{R}| {Δpn∣n=1,2,…,N},N=∣R∣: y ( p 0 ) = ∑ p n ∈ R w ( p n ) ⋅ x ( p 0 + p n + Δ p n ) \mathbf{y}\left(\mathbf{p}_{0}\right)=\sum_{\mathbf{p}_{n} \in \mathcal{R}} \mathbf{w}\left(\mathbf{p}_{n}\right) \cdot \mathbf{x}\left(\mathbf{p}_{0}+\mathbf{p}_{n}+\Delta \mathbf{p}_{n}\right) y(p0)=pn∈R∑w(pn)⋅x(p0+pn+Δpn)
現在采樣點的分布不規則了: p n + ∆ p n p_n+∆p_n pn+∆pn,上式通過雙線性插值實作:
x ( p ) = ∑ q G ( q , p ) ⋅ x ( q ) \mathbf{x}(\mathbf{p})=\sum_{\mathbf{q}} G(\mathbf{q}, \mathbf{p}) \cdot \mathbf{x}(\mathbf{q}) x(p)=q∑G(q,p)⋅x(q)
p表示任意(分數)位置( p = p 0 + p n + ∆ p n p=p_0+p_n+∆p_n p=p0+pn+∆pn);q窮舉特征圖x中的所有整數的空間位置, G ( ∙ , ∙ ) G\left(\bullet,\bullet\right) G(∙,∙)是雙線性插值,雖然是在二維上操作,但其可以分為x,y方向上的兩個一維函數:
G ( q , p ) = g ( q x , p x ) ⋅ g ( q y , p y ) G(\mathbf{q}, \mathbf{p})=g\left(q_{x}, p_{x}\right) \cdot g\left(q_{y}, p_{y}\right) G(q,p)=g(qx,px)⋅g(qy,py)
其中 g ( a , b ) = m a x ( 0 , 1 − ∣ a − b ∣ ) g\left(a,b\right)=max\left(0,1-\left|a-b\right|\right) g(a,b)=max(0,1−∣a−b∣),得益于 G ( ∙ , ∙ ) G\left(\bullet,\bullet\right) G(∙,∙)對于多數q是零值,是以能夠快速完成 x ( p ) x\left(p\right) x(p)的計算。
偏移量是通過在同一張feature map上通過卷積得到;卷積核和目前卷積層的核尺寸相同。輸出的偏移量具有與輸入相同的空間分辨率;2N個通道對應于N個2D(X,Y方向)偏移。在訓練期間,同時學習輸出特征的卷積核和偏移量,通過雙線性運算對梯度進行反向傳播。
deformable RoI pooling
該池化層為前面RoI pooling的每個位置添加一個偏移量;偏移量從前面的feature maps 和RoIs中學習。目标檢測中ROI pooling将任意大小的輸入矩形區域轉換為固定大小的feature。
RoI Pooling:
(https://blog.csdn.net/H_hei/article/details/89791176)
對于給定輸入feature map X、ROI(w×h)和左上角點 p 0 p_0 p0,RoI Pooling将ROI區域劃分為k×k個子區域bin,輸出k×k的feature map y,對于每個子區域中的位置 ( i , j ) \left(i,j\right) (i,j)有
y ( i , j ) = ∑ p ∈ bin ( i , j ) x ( p 0 + p ) / n i j \mathbf{y}(i, j)=\sum_{\mathbf{p} \in \operatorname{bin}(i, j)} \mathbf{x}\left(\mathbf{p}_{0}+\mathbf{p}\right) / n_{i j} y(i,j)=p∈bin(i,j)∑x(p0+p)/nij
n i j n_{ij} nij是bin區域的元素數量,第 ( i , j ) \left(i,j\right) (i,j)個bin跨度 ⌊ i w k ⌋ ≤ p x < ⌈ ( i + 1 ) w k ⌉ \left\lfloor i \frac{w}{k}\right\rfloor \leq p_{x}<\left\lceil(i+1) \frac{w}{k}\right\rceil ⌊ikw⌋≤px<⌈(i+1)kw⌉、 ⌊ j h k ⌋ ≤ p y < ⌈ ( j + 1 ) h k ⌉ \left\lfloor j \frac{h}{k}\right\rfloor \leq p_{y}<\left\lceil(j+1) \frac{h}{k}\right\rceil ⌊jkh⌋≤py<⌈(j+1)kh⌉,是以在deformable RoI pooling中增加對每個bin的偏移量 { Δ p i j ∣ 0 ≤ i , j < k } \left\{\Delta \mathbf{p}_{i j} | 0 \leq i, j<k\right\} {Δpij∣0≤i,j<k}:
y ( i , j ) = ∑ p ∈ b i n ( i , j ) x ( p 0 + p + Δ p i j ) / n i j \mathbf{y}\left(i,j\right)=\sum_{\mathbf{p}\in b i n\left(i,j\right)}{\mathbf{x}\left(\mathbf{p}_\mathbf{0}+\mathbf{p}+\Delta\mathbf{p}_{\mathbf{ij}}\right)/}n_{ij} y(i,j)=p∈bin(i,j)∑x(p0+p+Δpij)/nij
Δ p i j \Delta\mathbf{p}_{\mathbf{ij}} Δpij是分數形式。
上圖說明了如何獲得偏移量:首先,ROI pooling生成池化的特征圖; fc層根據這些圖生成歸一化的偏移量 Δ p ^ i j \Delta \hat{p}_{i j} Δp^ij,和RoI的寬度w和高度h相乘得到上式的偏移量 Δ p i j = γ ⋅ Δ p ^ i j ∘ ( w , h ) \Delta \mathbf{p}_{i j}=\gamma \cdot \Delta \widehat{\mathbf{p}}_{i j} \circ(w, h) Δpij=γ⋅Δp
ij∘(w,h),其中γ(0.1)是預定義的标量,用于調制偏移量。
Position-Sensitive (PS) RoI Pooling:
R-FCN中提出的池化方式PS RoI Pooling:
為了引入平移敏感性,R-FCN在全卷積網絡的最後層之後添加了一個1×1卷積層輸出position-sensitive score map,具有k×k×(C+1)的次元,其中C代表類别數(+1背景),k是之後的ROI Pooling中對ROI區域要劃分的小格數,論文中k=3就是對ROI在長寬方向各三等分形成9個小區域,每張score map中存放的是所有目标的某一部位的特征圖。
在後續的ROI pooling時,對RoI的k×k個區域(3×3 = 9)分别進行pooling,但不是對score map所有的次元進行pooling,每個小區域隻會在對應的(C+1)個次元上作pooling,比如ROI左上角的區域就在前C+1個次元上pooling,左中位置的區域就在C+2到2C+2的區間次元上作pooling,依次類推得到C+1維的k×k特征圖,對應于C+1類别的得分,對每個類别的得分進行求和(或者平均)作為每個類别的得分(上圖中的vote過程),再經過softmax得分最大值類别輸出。
在deformable PS RoI pooling中,仍然遵照下式,差別是 x → x i , j \mathbf{x}\rightarrow\mathbf{x}_{i,j} x→xi,j:
y ( i , j ) = ∑ p ∈ b i n ( i , j ) x i , j ( p 0 + p + Δ p i j ) / n i j \mathbf{y}\left(i,j\right)=\sum_{\mathbf{p}\in b i n\left(i,j\right)}{\mathbf{x}_{i,j}\left({p}_{0}+{p}+\Delta{p}_{{ij}}\right)/}n_{ij} y(i,j)=p∈bin(i,j)∑xi,j(p0+p+Δpij)/nij
但是偏移量的學習是不同的,如上圖所示。在上面的分支中,卷積層生成完整的空間偏移場。 然後對于每個RoI,都使用PS RoI pooling以獲得歸一化的偏移量∆pij,然後和deformable RoI pooling一樣轉換為實際偏移 Δ p i j \Delta\mathbf{p}_{\mathbf{ij}} Δpij。
Deformable ConvNets
Deformable Convolution for Feature Extraction:
文章使用ResNet-101和Inception-ResNet進行實驗。去掉平均池化和全連接配接層,在最後添加随機初始化的1×1卷積,将通道數減小到1024。最後一個block塊的有效步長從32減小到16(增加feature map分辨率)。
Segmentati on and Detection Networks:DeepLab、Category-Aware RPN、Faster R-CNN、R-FCN
在ResNet-101中正常卷積替換為可變形卷積的效果如下表所示:
将Deformable RoI Pooling應用到Faster RCNN 和R-FCN上,得到明顯的效果提升,特别是[email protected]上:
模型複雜度和運作時間的比較:
對于原模型來說,隻增加了少量的參數和運作時間(前傳、包含預處理和後處理的完整運作時間)。
在COCO資料集上的效果比較如下,M表示多尺度測試,B表示疊代bbox平均值。
Understanding Deformable ConvNets
核心思路就是在卷積和RoI pooling中增加額外的偏移量,并從目标任務中學習偏移量,進而改變空間采樣位置。
(a)、(b)分别表示了正常卷積中的感受野和可變形卷積中的自适應感受野。正常卷積中的感受野和采樣位置在整個特征圖(左)上都是固定的。可變形卷積根據對象的比例和形狀進行自适應調整(右)。
上圖展示了729個采樣點,在同一張圖分别考慮背景(左)、較小目标(中)、較大目标(右)的采樣情況,可以看到采樣點對目标的聚集效應。
deformable RoI pooling的效果類似,R-FCN 中使用deformable (PS)RoI pooling效果:
其中3×3的池化區域(紅色框)和ROI(黃色)。