FlowNet: Learning Optical Flow with Convolutional Networks


作者:嫩芽33
出處:http://www.cnblogs.com/nenya33/p/7122701.html
版權:本文版權歸作者和博客園共有 
轉載:歡迎轉載,但未經作者同意,必須保留此段聲明;必須在文章中給出原文連接;否則必究法律責任

 

 

 

 

學習了一篇用CNN做光流的paper,簡稱FlowNet。

1. 論文題目  FlowNet: Learning Optical Flow with Convolutional Networks

2.背景

  • 為什么想到用CNN做光流:最近提出的CNN架構可以做逐像素預測,比如,語義分割和從單圖估計深度。所以本文提出end-to-end訓練CNNs用於從圖像對中預測光流場。
  • 光流和其他任務的區別:光流估計需要精確的逐像素定位,也需要找到兩個輸入圖像的對應。這不僅涉及到學習圖像特征表達,也要學習在兩個圖像的不同位置匹配這些特征表達。所以從這方面來看,光流估計和CNNs的以前應用基本上不一樣。

3. 本文提出構建CNNs,以有監督的學習方式解決光流估計任務。提出兩種架構,並做了對比實驗:

  • 一種是通用的架構
  • 另外一種是包含一個不同圖像位置的特征向量關聯層。因為不確定用標准的CNN架構能否解決這個問題,就提出了一個有關聯層的架構,用來顯式地提供匹配功能。這個架構采用end-to-end訓練。思想是利用卷積網絡學習多級尺度和抽象化的強大特征的能力,然后幫助他基於這些特征找到實際的對應。關聯層上面學習如何從這些匹配中來預測流。令人驚訝的是,用這種方式幫助網絡並不是 必要的,甚至是原始的網絡都能學會以具有競爭力的准確性來預測光流。

4. 已有光流數據集太小,很多沒有標注真實值,本文創建了一個新的光流數據集Flying Chairs,用來充分訓練CNN。

5. 網絡架構

給定足夠的有標簽數據,CNN 擅長學習輸入-輸出關系。所以我們采用end-to-end的學習方法預測光流:給定一個包含圖像對真實流的數據集,我們訓練一個網絡直接從圖像中預測x-y流場。但是需要設計合適的架構來實現這個目的。

一個簡單的選擇是把輸入圖像堆疊起來,把他們通過一個相當普通網絡,讓網絡自己決定怎樣處理圖像對從而抽取出運動信息,如圖2(top)所示,這個只有卷積組成的架構稱為“FlowNetSimple

 原則上,如果這個網絡足夠大,就能學習預測光流,然而,我們無法保證像SGD那樣的局部梯度優化能讓網絡達到全局最優點,因此,手工設計一個不那么通用、但能用給定數據和優化技巧得到好的性能的架構是有好處的。

一個直接的想法就是:針對兩個圖像,創建兩個獨立但相同的處理流,然后在后續進程中把他們結合到一起,如圖2(bottom)。在這個架構中,網絡需要要先分別產生兩個圖像的有意義的表達,然后在更高級別把他們結合,這類似於標准的匹配方法中一個先從兩個圖像的patches抽取特征,然后結合這些特征向量。然而,得到兩個圖像的特征表達后,網絡怎么找二者的對應呢?

在匹配進程,我們在網絡中引入了一個“correlation layer”(關聯層),在兩個特征圖中做乘法patch比較,包含這個層的網絡結構在圖2(bottom)中。給定兩個多通道的特征圖f1、f2,w、h和c是他們的寬度、高度和通道數,我們的關聯層就是讓網絡比較f1中的每個patch和f2中的每個patch。

現在我們只考慮兩個patch的單獨比較。第一個圖的以x1為中心的patch和第二個圖的以x2位中心的patch之間的關聯就定義為:

方形patch的尺寸為K=2k+1  (k=0)。公式1等同於神經網絡中的一個卷積,但不是用濾波器卷積數據,而是用數據卷積數據,所以,沒有可訓練的權重。

計算c(x1,x2)涉及到cKK次乘法,比較所有的patch組合涉及到wwhh次計算,所以很難處理前向后向過程。為了計算,我們限制最大位移d用於比較,而且在兩個特征圖中也引入了步長stride。這樣通過限制x2的范圍,只在D=2d+1 (d=20)的鄰域中計算關聯c(x1,x2)。我們用步長s1(1)和s2(2),來全局quantize x1,在以x1為中心的鄰域內quantize x2。

理論上,關聯的結果是4D的:對兩個2D位置的每個組合,我們得到一個關聯值,即兩個分別包含截取patches值的向量的內積。實際上,我們把相對位置用通道表示,這就意味着我們得到了w*h*D*D大小的輸出。在反向過程中,我們求關於每個對應底層blob的導數。

6. Refinement

Pooling會導致分辨率減少,為了提供密集的像素預測,我們需要一種方法來refine  pool后的coarse表達。我們refine的方法如圖3所示,主要的是upconvolutional 上卷積層,由unpooling(與pooling相反,擴展特征圖)和卷積組成。為了做refinement,我們在特征圖上用上卷積,然后把它和網絡的收縮部分’contractive’ 得到的對應特征圖、以及一個上采樣的coarses流預測連接起來。這樣就能既保留coarser特征圖的高層信息,又能保留低層特征圖的好的局部信息。每個步驟兩次增加分辨率,我們重復這個過程4次,得到預測的流,此時的特征圖還是原圖的四分之一。

我們發現,與對全圖像分辨率做計算量更少的雙線性上采樣相比,從這個分辨率上做更多的refinement並不能顯著提升結果,這個雙線性上采樣的結果就是網絡的最終流預測。

我們替換雙線性上采樣,采用沒有匹配項的變分方法:我們在4次下采樣分辨率后開始,迭代20次做coarse-to-fine,把流場變為全分辨率。最后,在全圖像分辨率上又做了5次迭代。然后把平滑系數換為,用文獻【26】的方法計算圖像邊界和對應的檢測邊界,b(x,y)是各自尺度和像素之間的重采樣的thin邊界的strength。這種放大方法比簡單的雙線性上采樣計算量大,但是增加了變分方法的優點,得到平滑和亞像素准確的流場。在下文中,用變分法refine的結果加后綴+v。變分結果見圖4

 7. 訓練的參數設置

  • k=0  d=20  s1=1  s2=2  
  • loss: endpoint error (EPE) ,是光流估計中標准的error measure,是預測光流向量與真實光流向量的歐氏距離在所有像素上的均值。
  • 優化方法:Adam ,無需momentum就能比SGD快速收斂。固定了一些參數: 
  • mini-batches :8
  • learning rate:開始 λ = 1e-4,在第300k次迭代后,每100k次迭代除以2。在FlowNetCorr中λ = 1e-4 會出現梯度爆炸,從較小的學習率λ = 1e-6開始, 在10k次迭代后慢慢增加
    達到 λ = 1e-4 ,然后再按照剛剛說的減少。

  • 發現測試過程中擴大輸入圖像能提升性能,盡管最優尺度取決於數據集,我們在所有的任務的每個網絡固定了尺度,FlowNetS 沒做擴大,FlowNetC 選擇1:25的參數

 


免責聲明!

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



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