Deformable Convolutional Networks 可變形卷積網絡解析

Deformable Convolutional Networks

1. 什麼是可變形卷積?

Deformable Convolutional Networks 中提出了一種可以變形的卷積核和池化核,也就是不使用原來的正方形卷積核,而且一個多邊形。這樣可以讓卷積核更多地聚集在目標的輪廓上。

下面對比兩種圖片:

卷積核聚集在人的身上:
在這裏插入圖片描述
卷積核聚集在羊的身上:
在這裏插入圖片描述
所以論文中的核心思想就是:將固定形狀的卷積過程改造成了能適應物體形狀的可變的卷積過程,從而使結構適應物體形變的能力更強

2. 可形變卷積解決了什麼問題?

傳統的CNN只能靠一些簡單的方法(比如max pooling)來適應物體的形變,如果形變的太厲害就無能爲力了。爲了改變這種情況專家們想了很多方法,最常見的有兩種:

  1. 使用大量的數據進行訓練。 比如用ImageNet數據集,再在其基礎上做翻轉等變化來擴展數據集,通俗地說就是通過窮舉的方法使模型能夠適應各種形狀的物體,這種方法收斂較慢而且要設計複雜的網絡結構才能達到理想的結果,但是,如果用訓練中沒有遇到過的新形狀物體(但同屬於一類)來做測試,由於新形狀沒有訓練過,會造成測試不準確,而且靠數據集來適應形變的訓練過程太耗時,網絡結構也必須設計的很複雜
  2. 設計一些特殊的算法來適應形變。 比如SIFT,目標檢測時用滑動窗口法來適應目標在不同位置上的分類也屬於這類;但是,如果物體的形狀極其複雜,要設計出能適應這種複雜結構的算法就更困難了。

傳統的方法都不行,那要怎麼辦呢?

思路很清晰就是:我預定爲正方形的感知野,但是感受野上的每一個點加一個偏移量,偏移的大小是通過學習得來的,偏移後感受野不再是個正方形,而是和物體的實際形狀相匹配。這麼做的好處就是無論物體怎麼形變,卷積的區域始終覆蓋在物體形狀的周圍。

下面用論文中的一個圖來演示一下變化過程:
在這裏插入圖片描述

3. 可變形卷積的具體實現細節

在說明具體實現細節之前我現在這樣說明一下雙線性插值的概念

3.1 雙線性插值

想要理解雙線性查找,那我們想來說一下什麼是線性插值。

線性插值的概念非常簡單粗暴,就是兩個點A,B,要在AB中間插入一個點C(點C座標在AB連線上),就直接讓C的值落在AB的值的連線上就可以了。

如A點座標(0,0),值爲3,B點座標(0,2),值爲5,那要對座標爲(0,1)的點C進行插值,就讓C落在AB線上,值爲4就可以了。當然前提是C在AB的連線上,如果C不在AB的連線上要怎麼辦呢,很簡單分別沿x軸和y軸進行線性插值,然後給他加起來就ok啦,這個過程就叫做雙線性插值

舉個栗子:

如圖,已知Q12,Q22,Q11,Q21,但是要插值的點爲P點,這就要用雙線性插值了,首先在x軸方向上,對R1和R2兩個點進行插值,這個很簡單,然後根據R1和R2對P點進行插值。
在這裏插入圖片描述
有興趣的可以去維基百科看看推導的公式

說了那麼多這個公式究竟是用來幹什麼的呢?在cv中主要是用來改變圖像的大小,但是在這裏並不是這個用法。你需要知道雙線性插值是更加座標系中已知量的值去得到一個未知座標的值。下面的公式就會對其進行一個運用

3.2 可變形卷積 Deformable Convolution

傳統的卷積結構可以定義成如下公式:

y(p0)=pnRw(pn)x(p0+pn+Δpn)\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)
pn是卷積輸出每一個點相對感受野上的每一個點的偏移量,取整數。

採用全新的可變形卷積後要在公式1基礎上給每個點再增加一個偏移量Δpn,這個新的偏移量是由另一個卷積得出,所以一般是小數

y(p0)=pnRw(pn)x(p0+pn+Δpn)\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)

x(p0+pn+Δpn)的取值位置非整數,並不對應feature map上實際存在的點,所以必須用插值來得到,這裏我們就用雙線性插值的方法來獲取。然後我們可以得到這個公式
x(p)=qG(q,p)x(q)=qg(qx,px)g(qy,py)x(q)=qmax(0,1qxpx)max(0,1qypy)x(q)\begin{array}{l} x(\mathrm{p})=\sum_{q} G(\mathrm{q}, \mathrm{p}) \cdot x(\mathrm{q}) \\ =\sum_{q} \mathrm{g}\left(\mathrm{q}_{\mathrm{x}}, \mathrm{p}_{\mathrm{x}}\right) \cdot g\left(\mathrm{q}_{\mathrm{y}}, \mathrm{p}_{\mathrm{y}}\right) \cdot x(\mathrm{q}) \\ =\sum_{q} \max \left(0,1-\left|\mathrm{q}_{\mathrm{x}}-\mathrm{p}_{\mathrm{x}}\right|\right) \cdot \max \left(0,1-\left|\mathrm{q}_{\mathrm{y}}-\mathrm{p}_{\mathrm{y}}\right|\right) \cdot x(\mathrm{q}) \end{array}
x(q)表示feature map上所有整數位置上的點的取值

這裏雙線性插值的公式我就不在多做說明了。原理我在上面已經說過了。通過這樣的可變形卷積層我們就完成了可變形卷積啦

下面放上論文中的可變形卷積的網絡結構:
在這裏插入圖片描述
其中上方的卷積用於輸出偏移量,該輸出的長寬和輸入特徵圖的長寬一致,維度則是輸入的2倍(因爲同時輸出了x方向和y方向的偏移量,要用2個維度分開存儲)。

3.3 可變形的ROI Pooling

ROI Pooling 的改進和卷積核的改進方式基本相同都是再增加一個偏移量

改進前:

y(i,j)=p bin (i,j)x(p0+p)/nij\mathbf{y}(i, j)=\sum_{\mathbf{p} \in \text { bin }(i, j)} \mathbf{x}\left(\mathbf{p}_{0}+\mathbf{p}\right) / n_{i j}
改進後:

y(i,j)=pbin(i,j)x(p0+p+Δpij)/nij\mathbf{y}(i, j)=\sum_{\mathbf{p} \in \operatorname{bin}(i, j)} \mathbf{x}\left(\mathbf{p}_{0}+\mathbf{p}+\Delta \mathbf{p}_{i j}\right) / n_{i j}

其中Δpij\Delta p_{i j}是每個bin的偏移量,要注意這個偏移量是針對整個bin的,也就是說一個bin中的每一個點該值都相同。

下面放上網絡結構:
在這裏插入圖片描述
可以看到,需要做ROI Pooling處理的區域首先完成沒有偏移下的pooling過程,輸出kkchannel個數據,再用一個全連接層輸出kk2*channel個點表示在x和y方向上的偏移pnp^n,再對它按如下公式進行處理處理得到真正的偏移量pn。公式中γ\gamma是個增益,作者建議取0.1,與(w,h)進行點乘是爲了讓偏移量的調整幅度能適配ROI的尺寸。pn也是個小數,需要通過雙線性插值來得到真正的值,插值的方法和可變卷積相同,不再重複描述。

Δpij=γΔp^ij(w,h)\Delta \mathbf{p}_{i j}=\gamma \cdot \Delta \widehat{\mathbf{p}}_{i j} \circ(w, h)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章