論文筆記:空間變換網絡(Spatial Transformer Networks)


2015, NIPS
**Max Jaderberg, Karen Simonyan, Andrew Zisserman, Koray Kavukcuoglu **
Google DeepMind

為什么提出(Why)

  1. 一個理想中的模型:我們希望魯棒的圖像處理模型具有空間不變性,當目標發生某種轉化后,模型依然能給出同樣的正確的結果
  2. 什么是空間不變性:舉例來說,如下圖所示,假設一個模型能准確把左圖中的人物分類為涼宮春日,當這個目標做了放大、旋轉、平移后,模型仍然能夠正確分類,我們就說這個模型在這個任務上具有尺度不變性,旋轉不變性,平移不變性
  3. CNN在這方面的能力是不足的:maxpooling的機制給了CNN一點點這樣的能力,當目標在池化單元內任意變換的話,激活的值可能是相同的,這就帶來了一點點的不變性。但是池化單元一般都很小(一般是2*2),只有在深層的時候特征被處理成很小的feature map的時候這種情況才會發生
  4. Spatial Transformer:本文提出的空間變換網絡STN(Spatial Transformer Networks)可以使得模型具有空間不變性。

STN是什么(What)

  1. STN對feature map(包括輸入圖像)進行空間變換,輸出一張新的圖像。
  2. 我們希望STN對feature map進行變換后能把圖像糾正到成理想的圖像,然后丟進NN去識別,舉例來說,如下圖所示,輸入模型的圖像可能是擺着各種姿勢,擺在不同位置的涼宮春日,我們希望STN把它糾正到圖像的正中央,放大,占滿整個屏幕,然后再丟進CNN去識別。
  3. 這個網絡可以作為單獨的模塊,可以在CNN的任何地方插入,所以STN的輸入不止是輸入圖像,可以是CNN中間層的feature map

STN是怎么做的(How)

  1. 如下圖所示,STN的輸入為U,輸出為V,因為輸入可能是中間層的feature map,所以畫成了立方體(多channel),STN主要分為下述三個步驟
  2. Localisation net:是一個自己定義的網絡,它輸入U,輸出變化參數\(\Theta\),這個參數用來映射U和V的坐標關系
  3. Grid generator:根據V中的坐標點和變化參數\(\Theta\),計算出U中的坐標點。這里是因為V的大小是自己先定義好的,當然可以得到V的所有坐標點,而填充V中每個坐標點的像素值的時候,要從U中去取,所以根據V中每個坐標點和變化參數\(\Theta\)進行運算,得到一個坐標。在sampler中就是根據這個坐標去U中找到像素值,這樣子來填充V
  4. Sampler:要做的是填充V,根據Grid generator得到的一系列坐標和原圖U(因為像素值要從U中取)來填充,因為計算出來的坐標可能為小數,要用另外的方法來填充,比如雙線性插值。

下面針對每個模塊闡述一下
(1) Localisation net
這個模塊就是輸入U,輸出一個變化參數\(\Theta\),那么這個\(\Theta\)具體是指什么呢?
我們知道線性代數里,圖像的平移,旋轉和縮放都可以用矩陣運算來做
舉例來說,如果想放大圖像中的目標,可以這么運算,把(x,y)中的像素值填充到(x',y')上去,比如把原來(2,2)上的像素點,填充到(4,4)上去。
\(\begin{bmatrix}x^{'}\\ y^{'}\end{bmatrix}=\begin{bmatrix}2 &0\\0&2\end{bmatrix}\begin{bmatrix}x\\y\end{bmatrix}+\begin{bmatrix}0\\ 0\end{bmatrix}\)

如果想旋轉圖像中的目標,可以這么運算(可以在極坐標系中推出來,證明放到最后的附錄)
\(\begin{bmatrix}x^{'}\\ y^{'}\end{bmatrix}=\begin{bmatrix}cos \Theta & -sin \Theta\\ sin \Theta& cos\Theta\end{bmatrix} \begin{bmatrix}x\\ y\end{bmatrix}+\begin{bmatrix}0\\ 0\end{bmatrix}\)

這些都是屬於仿射變換(affine transformation)
\(\begin{bmatrix}x^{'}\\ y^{'}\end{bmatrix}=\begin{bmatrix}a & b \\ c& d\end{bmatrix} \begin{bmatrix}x\\ y\end{bmatrix}+\begin{bmatrix}e\\ f\end{bmatrix}\)
在仿射變化中,變化參數就是這6個變量,\(\Theta = \{a,b,c,d,e,f\}\)(此\(\Theta\)跟上述旋轉變化里的角度\(\Theta\)無關)
這6個變量就是用來映射輸入圖和輸出圖之間的坐標點的關系的,我們在第二步grid generator就要根據這個變化參數,來獲取原圖的坐標點。

(2) Grid generator
有了第一步的變化參數,這一步是做個矩陣運算,這個運算是以目標圖V的所有坐標點為自變量,以$ \Theta $為參數做一個矩陣運算,得到輸入圖U的坐標點。

\[ \begin{pmatrix}x_{i}^{s}\\ y_{i}^{s}\end{pmatrix}=\Theta \begin{pmatrix}x_{i}^{t}\\ y_{i}^{t}\\ 1\end{pmatrix} =\begin{bmatrix} \Theta _{11} & \Theta _{12} & \Theta _{13}\\ \Theta _{21} & \Theta _{22} & \Theta _{23} \end{bmatrix}\begin{pmatrix} x_{i}^{t}\\ y_{i}^{t} \\ 1 \end{pmatrix}\]

其中$ {(x_{i}^{t},y_{i}^{t})}\(記為輸出圖V中的第i個坐標點,V中的長寬可以和U不一樣,自己定義的,所以這里用i來標識第幾個坐標點 \) {(x_{i}^{s},y_{i}^{s})}$記為輸入圖U中的點,這里的i是從V中對應過來的,表示V中的第i的坐標點映射的U中坐標,i跟U沒有關系

(3) Sampler
由於在第二步計算出了V中每個點對應到U的坐標點,在這一步就可以直接根據V的坐標點取得對應到U中坐標點的像素值來進行填充,而不需要經過矩陣運算。需要注意的是,填充並不是直接填充,首先計算出來的坐標可能是小數,要處理一下,其次填充的時候往往要考慮周圍的其它像素值。填充根據的公式如下。

\[V_{i}=\sum _n \sum _m U_{nm}*k(x_{i}^{s}-m;\phi _x)*k(y_{i}^{s}-n;\phi _y) \]

其中n和m會遍歷原圖U的所有坐標點,\(U_{nm}\)指原圖U中某個點的像素值,k()為取樣核,兩個\(\phi\)為參數,\((x_{i}^{s},y_{i}^{s})\)表示V中第i個點要到U圖中找的對應點的坐標,表示的坐標是U圖上的,k表示使用不同的方法來填充,通常會使用雙線性插值,則會得到下面的公式

\[V_{i}=\sum _n \sum _m U_{nm}*max(0, 1 - |x_{i}^{s}-m|)*max(0, 1 - |y_{i}^{s}-n|) \]

舉例來說,我要填充目標圖V中的(2,2)這個點的像素值,經過以下計算得到(1.6,2.4)

\[\begin{pmatrix}x_{i}^{s}\\ y_{i}^{s}\end{pmatrix} =\begin{bmatrix} \Theta _{11} & \Theta _{12} & \Theta _{13}\\ \Theta _{21} & \Theta _{22} & \Theta _{23} \end{bmatrix}\begin{pmatrix} x_{i}^{t}\\ y_{i}^{t} \\ 1 \end{pmatrix}\]

\[\begin{pmatrix}1.6\\ 2.4\end{pmatrix} =\begin{bmatrix} 0 & 0.5 & 0.6\\ 1 & 0 & 0.4 \end{bmatrix}\begin{pmatrix} 2\\ 2 \\ 1 \end{pmatrix}\]

如果四舍五入后直接填充,則難以做梯度下降。
我們知道做梯度下降時,梯度的表現就是權重發生一點點變化的時候,輸出的變化會如何。
如果用四舍五入后直接填充,那么(1.6,2.4)四舍五入后變成(2,2)
\(\Theta\)(我們求導的時候是需要對\(\Theta\)求導的)有一點點變化的時候,(1.6,2.4)可能變成了(1.9,2.1)四舍五入后還是變成(2,2),輸出並沒有變化,對\(\Theta\)的梯度沒有改變,這個時候沒法用梯度下降來優化\(\Theta\)

如果采用上面雙線性插值的公式來填充,在這個例子里就會考慮(2,2)周圍的四個點來填充,這樣子,當\(\Theta\)有一點點變化的時,式子的輸出就會有變化,因為$(x_{i}^{s},y_{i}^{s}) $的變化會引起V的變化。注意下式中U的下標,第一個下標是縱坐標,第二個下標才是橫坐標。

\[V = U_{21}(1-0.6)(1-0.4)+ U_{22}(1-0.4)(1-0.4)+ U_{31}(1-0.6)(1-0.6)+ U_{32}(1-0.4)(1-0.6) \]

(4) STN小結
簡單總結一下,如下圖所示

  1. Localization net根據輸入圖,計算得到一個\(\Theta\)
  2. Grid generator根據輸出圖的坐標點和\(\Theta\),計算出輸入圖的坐標點,舉例來說想知道輸出圖上(2,2)應該填充什么坐標點,則跟\(\Theta\)運算,得到(1.6,2.4)
  3. Sampler根據自己定義的填充規則(一般用雙線性插值)來填充,比如(2,2)坐標對應到輸入圖上的坐標為(1.6,2.4),那么就要根據輸入圖上(1.6,2.4)周圍的四個坐標點(1,2),(1,3),(2,2),(2,3)的像素值來填充。

【實驗】Distorted MNIST

【實驗】SVHN: Street View House Numbers

【 實驗】CUB-200-2011 birds dataset

【附錄】旋轉的矩陣運算


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM