Flownet 2.0 閱讀筆記
原論文標題:FlowNet 2.0: Evolution of Optical Flow Estimation with Deep Networks
文章是對FlowNet的進一步改進,主要貢獻為如下三個方面:
- 訓練資料集的排程對於模型的效能有較大的影響。
PS:光流的資料集都比較小,一般需要幾個資料集一起train,故如何使用這些資料集是至關重要的。
- 使用中間光流warp圖片,並以此作為一個監督訊號輔助訓練。
- 用一個子網路處理小位移。
經過這些改進,FlowNet 2.0只比前作慢了一點,卻降低了50%的測試誤差。
1. 資料集排程
最初的FlowNet使用FlyingChairs資料集訓練,這個資料集只有二維平面上的運動。而FlyingThings3D是Chairs的加強版,包含了真實的3D運動和光照的影響,且object models的差異也較大。
作者作了如下設定:
- 使用前作中提出的兩種網路結構:FlowNetS和FlowNetC,S代表simple,C代表complex,具體細節可參閱前作。
- 分別使用Chairs(22k)、Things3D(22k)、兩者混合(從44k中sample出22k)以及用Chairs預訓練再用Things3D finetune這四種資料集排程方案。
- 學習率排程策略使用Sshort和Slong+Sfine兩種策略,如下圖。
得出的實驗結果如下圖,圖中的數字代表模型在Sintel資料集上的EPE,注意,Sintel是一個新的資料集,不包含在訓練資料中。
從實驗結果中可以得出幾個結論:
- 訓練集的使用順序很重要。即使Thins3D包含了更復雜的運動,但得出的結果卻不如Chairs。(PS:根據筆者的經驗,如果要在C資料集上測試的話,A和B資料集訓練的模型哪個效果更好是比較玄學的,不是說哪個資料集更復雜,效果就越好。本質上還是取決於A與C和B與C之間的domain shift哪個更小。)最好的策略是現在Charis上預訓練,再用Things3D fientune,這在筆者之前做過的一個Kaggle比賽中證實過,雖然任務不一樣,但兩種資料mixed同時訓練確實效果極差。作者對此作出了猜測,Chairs幫助網路學習到顏色匹配這樣的一般概念,而更復雜的3D和真實光照等資訊不宜過早地強加給網路。這對於其他基於深度學習的任務也有一定的參考價值。
- FlowNetC比FlowNetS更好。
- 結果的提升。
2. Stacking Networks
傳統的光流演算法都依賴於迭代過程。作者嘗試也使用多個模型stacking,逐步refine的手法來得到更好的結果。首先,stack兩個模型。
第一個網路使用兩張圖片作為輸入,第二個網路使用兩張圖片以及第一個網路預測出的光流場作為輸入。
此外,作者嘗試了另一種方法,如Figure 2所示,第二個網路除了上述的三個輸入之外,又使用Image 2和Flow進行warp,這樣,第二個網路就可以集中學習warped image和Image 1的差別,這是一種增量學習的思想。注意,作者將warped image和Image 1的誤差圖也顯式地輸入給了第二個網路。實驗結果如Table 2所示。需要說明的是,warp的過程是用雙線性插值,是可微的,故整個網路可以e2e訓練。
從表中可以看出,(1)僅stacking模型而不使用wrap後的圖片在Chairs上有更好的結果,但在Sintel則不然;(2)Stacking with warping總是能提高結果;(3)e2e訓練時,在Net1之後加中間loss是比較好的;(4)產生最好結果的做法是固定Net1,只訓練Net2,當然,要加入warp操作。
出現這樣的結果是符合直覺的,若e2e訓練,引數量成倍增加,很容易overfitting,但分開train,引數量就沒有那麼大,能產生比較好的結果。
下面,作者嘗試堆疊多個不同模型,即FlowNetC和FlowNetS混合使用,綜合考慮速度和效能,CSS最為合理。另外,作者作了一些實驗,嘗試共享stacking前後模型的引數,發現沒什麼提升。
3. Small Displacements
上文中所用到的資料集所包含的運動往往比較快,而真實資料集如UCF101,幀間的運動往往比較小,大多在1px左右。所以,基於Chairs,作者按照UCF101的位移直方圖構建了一個小位移資料集,稱之為ChairsSDHom。
作者用FlowNet2-CSS網路在小位移資料上進一步訓練。具體的,作者在Things3D和ChairsSDHom中分別取樣了一些資料,具體的取樣方法參見文章的補充材料,這裡我就不去看了。經過這一輪訓練,網路對於小位移的效果有了提高,而且並沒有傷害大位移的效果。這個網路命名為FlowNet2-CSS-ft-sd。但是,對於subpixel motion(講道理我不知道這是指什麼,姑且理解為小於1px的運動吧),噪聲仍然是個問題,作者猜測FlowNet的網路結構還是不適應這種運動。所以,作者對FlowNetS做了輕微的修改,第一層的步長2改為1,7*7改成5*5,使得網路能夠更好地捕捉小位移,這個網路結構稱為FlowNet2-SD。
最後,作者又設計了一個小網路來fuse FlowNet2-CSS-ft-sd以及FlowNet2-SD的結果,具體的結構沒有說的太清楚,有需要的話可以去看程式碼。總的來看,結構還是非常複雜的,訓練過程也很有講究,改進的餘地應該挺大的。
4. Experiments
這部分沒有太多好說的,總之就是各種SOTA了。值得一提的是,作者還用了Motion Segmentation和Action Recognition兩個任務來衡量光流的好壞,前者我瞭解不太多,後者就是用很常見的Two Stream模型,兩個任務都需要光流作為輸入。最後的結論當然是以FlowNet2得到的光流作為輸入,效果最好嘍!此處不再贅述。
相關文章
- Vue2.0原始碼閱讀筆記(四):nextTickVue原始碼筆記
- 閱讀筆記筆記
- 閱讀筆記4筆記
- 閱讀筆記3筆記
- 閱讀筆記5筆記
- 【閱讀筆記:字典】筆記
- 閱讀筆記2筆記
- 閱讀筆記1筆記
- 閱讀筆記8筆記
- 閱讀筆記03筆記
- 閱讀筆記02筆記
- 閱讀筆記7筆記
- gdbOF閱讀筆記筆記
- GoogleNet閱讀筆記Go筆記
- Vue2.0原始碼閱讀筆記(一):選項合併Vue原始碼筆記
- JDK原始碼閱讀:String類閱讀筆記JDK原始碼筆記
- JDK原始碼閱讀:Object類閱讀筆記JDK原始碼Object筆記
- SiamRPN++閱讀筆記筆記
- 《Clean Code》閱讀筆記筆記
- 《潮騷》閱讀筆記Ⅱ筆記
- 閱讀影片方法筆記筆記
- Dependencies for Graphs 閱讀筆記筆記
- Keys for graphs閱讀筆記筆記
- JDK原始碼閱讀(7):ConcurrentHashMap類閱讀筆記JDK原始碼HashMap筆記
- JDK原始碼閱讀(5):HashTable類閱讀筆記JDK原始碼筆記
- JDK原始碼閱讀(4):HashMap類閱讀筆記JDK原始碼HashMap筆記
- 《Effective DevOps》閱讀筆記 82dev筆記
- Koa 原始碼閱讀筆記原始碼筆記
- 《Effective DevOps》閱讀筆記 59dev筆記
- 《Effective DevOps》閱讀筆記 19dev筆記
- MapReduce 論文閱讀筆記筆記
- The Data Warehouse Toolkit 閱讀筆記筆記
- CopyOnWriteArrayList原始碼閱讀筆記原始碼筆記
- ArrayList原始碼閱讀筆記原始碼筆記
- LinkedList原始碼閱讀筆記原始碼筆記
- 《影響力》閱讀筆記筆記
- 《人月神話》閱讀筆記筆記
- python原始碼閱讀筆記Python原始碼筆記