空間變換網絡

轉自https://www.cnblogs.com/liaohuiqiang/p/9226335.htmlhtml

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)ui

  1. STN對feature map(包括輸入圖像)進行空間變換,輸出一張新的圖像。
  2. 咱們但願STN對feature map進行變換後能把圖像糾正到成理想的圖像,而後丟進NN去識別,舉例來講,以下圖所示,輸入模型的圖像多是擺着各類姿式,擺在不一樣位置的涼宮春日,咱們但願STN把它糾正到圖像的正中央,放大,佔滿整個屏幕,而後再丟進CNN去識別。
  3. 這個網絡能夠做爲單獨的模塊,能夠在CNN的任何地方插入,因此STN的輸入不止是輸入圖像,能夠是CNN中間層的feature map

STN是怎麼作的(How)atom

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

下面針對每一個模塊闡述一下
(1) Localisation net
這個模塊就是輸入U,輸出一個變化參數ΘΘ,那麼這個ΘΘ具體是指什麼呢?
咱們知道線性代數裏,圖像的平移,旋轉和縮放均可以用矩陣運算來作
舉例來講,若是想放大圖像中的目標,能夠這麼運算,把(x,y)中的像素值填充到(x',y')上去,好比把原來(2,2)上的像素點,填充到(4,4)上去。
[xy]=[2002][xy]+[00][x′y′]=[2002][xy]+[00]
spa

若是想旋轉圖像中的目標,能夠這麼運算(能夠在極座標系中推出來,證實放到最後的附錄)
[xy]=[cosΘsinΘsinΘcosΘ][xy]+[00][x′y′]=[cosΘ−sinΘsinΘcosΘ][xy]+[00]3d

這些都是屬於仿射變換(affine transformation)
[xy]=[acbd][xy]+[ef][x′y′]=[abcd][xy]+[ef]
在仿射變化中,變化參數就是這6個變量,Θ={a,b,c,d,e,f}Θ={a,b,c,d,e,f}(此ΘΘ跟上述旋轉變化裏的角度ΘΘ無關)
這6個變量就是用來映射輸入圖和輸出圖之間的座標點的關係的,咱們在第二步grid generator就要根據這個變化參數,來獲取原圖的座標點。
orm

(2) Grid generator
有了第一步的變化參數,這一步是作個矩陣運算,這個運算是以目標圖V的全部座標點爲自變量,以ΘΘ爲參數作一個矩陣運算,獲得輸入圖U的座標點。
xml

(xsiysi)=Θ⎛⎝⎜xtiyti1⎞⎠⎟=[Θ11Θ21Θ12Θ22Θ13Θ23]⎛⎝⎜xtiyti1⎞⎠⎟(xisyis)=Θ(xityit1)=[Θ11Θ12Θ13Θ21Θ22Θ23](xityit1)

 

其中(xti,yti)(xit,yit)記爲輸出圖V中的第i個座標點,V中的長寬能夠和U不同,本身定義的,因此這裏用i來標識第幾個座標點
(xsi,ysi)(xis,yis)記爲輸入圖U中的點,這裏的i是從V中對應過來的,表示V中的第i的座標點映射的U中座標,i跟U沒有關係
htm

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

Vi=nmUnmk(xsim;ϕx)k(ysin;ϕy)Vi=∑n∑mUnm∗k(xis−m;ϕx)∗k(yis−n;ϕy)


其中n和m會遍歷原圖U的全部座標點,UnmUnm指原圖U中某個點的像素值,k()爲取樣核,兩個ϕϕ爲參數,(xsi,ysi)(xis,yis)表示V中第i個點要到U圖中找的對應點的座標,表示的座標是U圖上的,k表示使用不一樣的方法來填充,一般會使用雙線性插值,則會獲得下面的公式

Vi=nmUnmmax(0,1|xsim|)max(0,1|ysin|)Vi=∑n∑mUnm∗max(0,1−|xis−m|)∗max(0,1−|yis−n|)

 

舉例來講,我要填充目標圖V中的(2,2)這個點的像素值,通過如下計算獲得(1.6,2.4)

(xsiysi)=[Θ11Θ21Θ12Θ22Θ13Θ23]⎛⎝⎜xtiyti1⎞⎠⎟(xisyis)=[Θ11Θ12Θ13Θ21Θ22Θ23](xityit1)

 

 

(1.62.4)=[010.500.60.4]⎛⎝⎜221⎞⎠⎟(1.62.4)=[00.50.6100.4](221)


若是四捨五入後直接填充,則難以作梯度降低。
咱們知道作梯度降低時,梯度的表現就是權重發生一點點變化的時候,輸出的變化會如何。
若是用四捨五入後直接填充,那麼(1.6,2.4)四捨五入後變成(2,2)
ΘΘ(咱們求導的時候是須要對ΘΘ求導的)有一點點變化的時候,(1.6,2.4)可能變成了(1.9,2.1)四捨五入後仍是變成(2,2),輸出並無變化,對ΘΘ的梯度沒有改變,這個時候無法用梯度降低來優化ΘΘ

 

若是採用上面雙線性插值的公式來填充,在這個例子裏就會考慮(2,2)周圍的四個點來填充,這樣子,當ΘΘ有一點點變化的時,式子的輸出就會有變化,由於(xsi,ysi)(xis,yis)的變化會引發V的變化。注意下式中U的下標,第一個下標是縱座標,第二個下標纔是橫座標。

V=U21(10.6)(10.4)+U22(10.4)(10.4)+U31(10.6)(10.6)+U32(10.4)(10.6)V=U21(1−0.6)(1−0.4)+U22(1−0.4)(1−0.4)+U31(1−0.6)(1−0.6)+U32(1−0.4)(1−0.6)

 

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

  1. Localization net根據輸入圖,計算獲得一個ΘΘ
  2. Grid generator根據輸出圖的座標點和ΘΘ,計算出輸入圖的座標點,舉例來講想知道輸出圖上(2,2)應該填充什麼座標點,則跟ΘΘ運算,獲得(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

【附錄】旋轉的矩陣運算

 

 

相關文章
相關標籤/搜索