Deformable ConvNet簡介
關於Deformable Convolutional Networks的論文解讀,共分爲5個部分,本章是第二部分:
- [ ] Part1: 快速學習實現仿射變換
- [x] Part2: Spatial Transfomer Networks論文解讀
- [ ] Part3: TenosorFlow實現STN
- [ ] Part4: Deformable Convolutional Networks論文解讀
- [ ] Part5: TensorFlow實現Deformable ConvNets
本章解讀Spatial Transfomer Networks論文,看STN是如何將仿射變換加入到現有CNN架構上,並使之支持端對端訓練。
Spatial Transformer Networks
STN:Spatial Transformer Networks
收錄:NIPS 2015(Advances in Neural Information Processing Systems 28)
原文地址:STN
代碼:
Motivation
數據問題
在實際場景,不同的場景下目標會存在不同狀態,如下圖:
對於相同目標物,不一樣的尺度縮放、形變、背景干擾、觀察視角,獲取到的目標信息都是不同的,這極大的增加了目標檢測等任務的難度。
針對這一問題,大多數先進系統的解決辦法是,對模型的訓練數據做數據增強,例如隨機的crop(裁剪)、平移、放縮、旋轉等操作,通過增加數據量,進而增加模型的泛化能力。
池化存在的問題
先引Hinton對池化操作的評價:
The pooling operation used in convolutional neural networks is a big mistake and the fact that it works so well is a disaster. (Geoffrey Hinton, Reddit AMA)
池化層在接收復雜輸入的基礎上,將複雜輸入分成若干cell,提取成簡單的cell,目標簡單的旋轉或平移,經過幾層的池化提取的信息就比較相似了,通過不斷簡化輸入聚合像素值,模型內部重複的池化操作,可讓模型對目標有內在不變性:
關於池化層存在的問題,在前面的blog裏面已經講了很多遍。池化操作是破壞性的,丟棄了75%的輸入信息,雖然模型增加了健壯性但也丟棄了細節信息。
除了這一問題,池化層受限於自身架構上的限制,只能獲取局部信息和固定的變換結構,這隻有很小的感受野,通過不斷加深網絡層次,獲得更大的感受野。我們不能隨意的調整池化層的大小,因爲這會急劇的降低特徵映射的空間分辨率。
Spatial Transformer Networks
針對上面提到的問題,DeepMind的STN:Spatial Transformer Networks工作開創性的在CNN中引入通過加入空間變換層達到仿射變換目的。STN模型優點在於:
- 模塊化:STN可以很方便的集成到現存的CNN架構中
- 可微分:STN可通過BP優化參數,支持end-2-end訓練
- 動態性:STN相比於池化等操作,可動態的將仿射變換應用於採樣點上
仿射變換示意圖:
- 圖(a)是常規的恆等變換,在輸入 上採樣網格,得到輸出
- 圖(b)是採樣是做了仿射變換,輸入 上採樣使用的仿射變換後的網格,最終得到
由Part1可知,當 是2D方式變換,座標變換爲:
是源特徵映射(Source)中採樣點, 是仿射變換目標輸出。 是仿射變換矩陣。注意到上式是從目標通過變換矩陣就計算出源輸入。
仿射變換層
STN中核心的Spatial Transformer
變換如下:
整個Spatial Transformer分爲以下幾個部分:
Localisation net
,用於獲取仿射矩陣,即各個 值。Grid generator
,用於生成採樣座標Sampler
,實際對 的採樣
注意一下:在Part1中,講解使用雙線性插值實現仿射變換,這是仿射變換層的核心基礎。
Localisation net
localisation network
的目標是在輸入特徵映射上應用卷積或FC層,獲取到仿射變換矩陣參數 ,結構如下:
- input: 特徵映射 ,shape爲
- output: 仿射矩陣參數 ,shape爲
- architecture: 全連接層或卷積層
Localisation net
在實際訓練過程中不斷學習變換的參數。
Grid generator
Grid generator
乾的事就是輸出採樣網格,即在輸入中採樣的點生成期望的轉換輸出。
普通的變換:
輸入和輸出的採樣點是相同的。
仿射變換:
我們想通過目標採樣網格經過仿射變換獲取到實際在輸入上採樣網格點。
具體來講,Grid generator
和Part1中講的使用雙線性插值實現仿射變換過程類似:
- 首先,創建和輸入 等同空間大小 的棋盤網格( 覆蓋了所有輸入的點,這表示了輸出特徵中的目標座標點)
- 因爲我們要在上述創建的棋盤網格做仿射變換,故對上述網格座標做向量化處理,即 形式
- 將仿射矩陣的參數reshape成 的矩陣形式,並使用下面計算得到我們期望的採樣點
注意到這裏的仿射變換:
如圖所示:實際上是通過目標網格找到實際採樣網格~
表示我們在輸入特徵上應該採樣的點。想想,上一節我們講過,如果採樣的點是分數該怎麼辦,是的,使用雙線性插值來搞定~
Sampler
注意到,仿射矩陣參數是可學習的,這要求採樣是可微分的,實際中用雙線性插值實現仿射變換,剛好雙線性插值是可微分的,這剛好符合要求。
任何採樣核:
對於 對應的仿射變換 在輸入 上應用採樣核得到輸出 :
其中 是採樣核 的參數, 在通道 上(n,m)座標的值。 是像素 的輸出值,具體指的是通道 中位置 。注意這樣的採樣應用於每個通道上。
integer sampling
理論上,任何採樣核都可以使用,只要可微分即可,即可通過 定義出梯度,例如使用integer sampling kernel:
其中 表示 最近的整數值, 是Kronecker delta function。這樣採樣核等同於複製 最近的像素值,直接輸出爲 。
雙線性採樣
對比雙線性插值:
在STN中使用雙線性採樣核的表達式總結如下:
這個表達式和雙線性插值是一樣的。 同樣是遍歷周圍的四個點(上述公式是遍歷所有點,實際上是處理點周圍的點),分母省去了,將一堆旁邊項目使用 函數代替了。
雙線性插值的反向傳播
這樣的雙線性插值函數是支持反向傳播,我們看看上述雙線性採樣的偏導數:
同理 類似。
雙線性插值支持微分操作,允許梯度流回傳到feature map上(2),並且回傳到採樣座標上(1),這樣就能調整學習到的變換參數 ,因爲localisation net
中 和 可幫助修正矩陣。示意圖如下:
雙線性採樣實現了整個BP,注意上述的公式是迭代所有輸入位置,實際操作是指看周圍的像素點。
在輸入 上雙線性採樣得到shape爲 的輸出 ,這意味着我們可以指定shape大小,達到上採樣或下采樣的目的。我們的設計不受限於雙線性採樣,其他的採樣核也可以使用,重要的是支持可微分,這樣才能反向傳播訓練localisation net
。
空間變換案例
Distorted MNIST
在Disturted MNIST上使用空間變換得到的結果:
可以看到這是如何精準的學習到健壯的分類模型,通過放縮和消除背景影響,定位的關鍵信息,再做標準化操作。
German Traffic Sign Recognition Benchmark (GTSRB) dataset
可以看到空間變換集中於關鍵信息上,移除了背景信息。
參考資料
常見的仿射變換
平移變換:
縮放變換:
旋轉操作: