Spatial Transformer Networks (STN 網絡用於對齊目標)

https://www.cnblogs.com/liaohuiqiang/p/9226335.html

https://www.cnblogs.com/liaohuiqiang/p/9226335.html

https://www.cnblogs.com/liaohuiqiang/p/9226335.html

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,輸出變化參數ΘΘ,這個參數用來映射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)上去。
[x′y′]=[2002][xy]+[00][x′y′]=[2002][xy]+[00]

如果想旋轉圖像中的目標,可以這麼運算(可以在極座標系中推出來,證明放到最後的附錄)
[x′y′]=[cosΘsinΘ−sinΘcosΘ][xy]+[00][x′y′]=[cosΘ−sinΘsinΘcosΘ][xy]+[00]

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

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

 

(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沒有關係

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

 

Vi=∑n∑mUnm∗k(xsi−m;ϕx)∗k(ysi−n;ϕ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=∑n∑mUnm∗max(0,1−|xsi−m|)∗max(0,1−|ysi−n|)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(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)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)的像素值來填充。

 

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