2015, NIPS
**Max Jaderberg, Karen Simonyan, Andrew Zisserman, Koray Kavukcuoglu **
Google DeepMind
為什么提出(Why)
- 一個理想中的模型:我們希望魯棒的圖像處理模型具有空間不變性,當目標發生某種轉化后,模型依然能給出同樣的正確的結果
- 什么是空間不變性:舉例來說,如下圖所示,假設一個模型能准確把左圖中的人物分類為涼宮春日,當這個目標做了放大、旋轉、平移后,模型仍然能夠正確分類,我們就說這個模型在這個任務上具有尺度不變性,旋轉不變性,平移不變性
- CNN在這方面的能力是不足的:maxpooling的機制給了CNN一點點這樣的能力,當目標在池化單元內任意變換的話,激活的值可能是相同的,這就帶來了一點點的不變性。但是池化單元一般都很小(一般是2*2),只有在深層的時候特征被處理成很小的feature map的時候這種情況才會發生
- Spatial Transformer:本文提出的空間變換網絡STN(Spatial Transformer Networks)可以使得模型具有空間不變性。
STN是什么(What)
- STN對feature map(包括輸入圖像)進行空間變換,輸出一張新的圖像。
- 我們希望STN對feature map進行變換后能把圖像糾正到成理想的圖像,然后丟進NN去識別,舉例來說,如下圖所示,輸入模型的圖像可能是擺着各種姿勢,擺在不同位置的涼宮春日,我們希望STN把它糾正到圖像的正中央,放大,占滿整個屏幕,然后再丟進CNN去識別。
- 這個網絡可以作為單獨的模塊,可以在CNN的任何地方插入,所以STN的輸入不止是輸入圖像,可以是CNN中間層的feature map
STN是怎么做的(How)
- 如下圖所示,STN的輸入為U,輸出為V,因為輸入可能是中間層的feature map,所以畫成了立方體(多channel),STN主要分為下述三個步驟
- Localisation net:是一個自己定義的網絡,它輸入U,輸出變化參數\(\Theta\),這個參數用來映射U和V的坐標關系
- Grid generator:根據V中的坐標點和變化參數\(\Theta\),計算出U中的坐標點。這里是因為V的大小是自己先定義好的,當然可以得到V的所有坐標點,而填充V中每個坐標點的像素值的時候,要從U中去取,所以根據V中每個坐標點和變化參數\(\Theta\)進行運算,得到一個坐標。在sampler中就是根據這個坐標去U中找到像素值,這樣子來填充V
- 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的坐標點。
其中$ {(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中坐標點的像素值來進行填充,而不需要經過矩陣運算。需要注意的是,填充並不是直接填充,首先計算出來的坐標可能是小數,要處理一下,其次填充的時候往往要考慮周圍的其它像素值。填充根據的公式如下。
其中n和m會遍歷原圖U的所有坐標點,\(U_{nm}\)指原圖U中某個點的像素值,k()為取樣核,兩個\(\phi\)為參數,\((x_{i}^{s},y_{i}^{s})\)表示V中第i個點要到U圖中找的對應點的坐標,表示的坐標是U圖上的,k表示使用不同的方法來填充,通常會使用雙線性插值,則會得到下面的公式
舉例來說,我要填充目標圖V中的(2,2)這個點的像素值,經過以下計算得到(1.6,2.4)
如果四舍五入后直接填充,則難以做梯度下降。
我們知道做梯度下降時,梯度的表現就是權重發生一點點變化的時候,輸出的變化會如何。
如果用四舍五入后直接填充,那么(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的下標,第一個下標是縱坐標,第二個下標才是橫坐標。
(4) STN小結
簡單總結一下,如下圖所示
- Localization net根據輸入圖,計算得到一個\(\Theta\)
- Grid generator根據輸出圖的坐標點和\(\Theta\),計算出輸入圖的坐標點,舉例來說想知道輸出圖上(2,2)應該填充什么坐標點,則跟\(\Theta\)運算,得到(1.6,2.4)
- 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
【附錄】旋轉的矩陣運算