FlowNet到FlowNet2.0:基于卷积神经网络的光流预测算法
其它機器學習、深度學習算法的全面系統講解可以閱讀《機器學習-原理、算法與應用》,清華大學出版社,雷明著,由SIGAI公眾號作者傾力打造。
- 書的購買鏈接
- 書的勘誤,優化,源代碼資源
原創聲明:本文為 SIGAI 原創文章,僅供個人學習使用,未經允許,不能用于商業目的。?
?
導言
光流預測一直都是計算機視覺中的經典問題,同時又是解決很多其他問題的基礎而備受關注,例如,運動估計、運動分割和行為識別。隨著深度神經網絡技術在計算機視覺領域中引發的技術變革,基于深度神經網絡的光流預測算法應運而生。本文中,SIGAI將以FlowNet到FlowNet2.0的演變,來和大家一起領略基于CNN(卷積神經網絡)的光流算法的誕生與發展。
光流(optical flow)是指平面上,光照模式的變化情況。在計算機視覺領域,是指視頻圖像中各點像素隨時間的運動情況。光流具有豐富的運動信息,因而在運動估計、自動駕駛和行為識別方面都有廣泛應用。光流預測通常是從一對時間相關的圖像對中,估計出第一張圖像中各個像素點在相鄰圖像中的位置。
光流問題長久以來,主要被基于變分能量模型的優化算法和基于塊匹配的啟發式算法統治著。隨著深度神經網絡技術在計算機視覺領域取得的成功,科學家們開始嘗試利用深度學習技術的優勢去解決光流問題。
?
FlowNet:新技術的誕生
隨著CNN在圖像分割、深度預測和邊緣預測方面的成功,研究人員思考,同樣是每個像素點都要給出預測結果的光流預測問題能否也利用CNN進行預測呢?
FlowNet[1]是第一個嘗試利用CNN去直接預測光流的工作,它將光流預測問題建模為一個有監督的深度學習問題。模型框架如下:
圖1源自[1]
如圖1輸入端為待求光流的圖像對I_1,I_2,輸出端為預測的光流W。
W=CNN(θ,I_1,I_2)
其中 W,I_1,I_2均為x,y的函數,x,y為圖像中像素的位置坐標。θ為CNN中待學習的參數。通過調節θ,來使網絡具有光流預測的能力。
那么問題來了,什么樣的網絡結構具有光流預測能力呢?
FlowNet[1]中提出了兩種可行的網絡結構.
網絡整體上為編碼模塊接解碼模塊結構,編碼模塊均為9層卷積加ReLU激活函數層,解碼模塊均為4層反卷積加ReLU激活函數層,在文中解碼模塊又被稱為細化模塊。整個網絡結構類似于FCN(全卷機網絡),由卷積和反卷積層構成,沒有全連接層,因此理論上對輸入圖像的大小沒有要求。
根據輸入方式的不同,FlowNet又分為FlowNetSimple和FlowNetCorr。
編碼模塊(如圖2):
圖2源自[1]
FlowNetS(FlowNetSimple) 直接將兩張圖像按通道維重疊后輸入。
FlowNetC (FlowNetCorr)為了提升網絡的匹配性能,人為模仿標準的匹配過程,設計出“互相關層”,即先提取特征,再計算特征的相關性。相關性的計算實際上可以看做是兩張圖像的特征在空間維做卷積運算。
解碼模塊(如圖3):
圖3源自[1]
在解碼細化的過程中,對每層的反卷積ReLU層,不僅輸入前一層的輸出,同時還輸入前一層預測的低尺度的光流和對應編碼模塊中的特征層。這樣使得每一層反卷積層在細化時,不僅可以獲得深層的抽象信息,同時還可以獲得淺層的具象信息,以彌補因特征空間尺度的縮小而損失的信息。
現在另一個問題來了,是否有足夠的數據去訓練網絡呢?
為了訓練網絡,我們需要大量的具有光流真值的數據。而目前已知的具有光流真值的數據庫規模都太小,即使利用數據增加的技術也相差甚遠。另外,要獲得真實世界中,自然圖片的準確光流往往更是難以獲得。
[1]中為解決這個問題,研究員們以犧牲圖片真實性為代價,轉而人為去合成大量的虛擬圖像對。通過將一些3D椅子模型[3]隨機的覆蓋在一些從Flickr上檢索的圖片上合成圖像,再對椅子和背景分別做隨機的仿射變化。圖像雖然看上去不是很自然,但是卻很容易的獲得了約22k帶有光流真值的圖像對。如圖4,其中光流以顏色編碼的形式展示,色調代表方向,強度代表大小。? ?
圖4源自[1]
充足的數據加上設計好的網絡結構,剩下就是訓練測試了。下面我們來定性的看下FlowNet的結果圖。
FlyingChair結果(源自[1])
Sintel結果(源自[1])
最后的結果表明設計出的網絡具有學習和預測光流的能力,證明CNN可以用來解決光流預測問題。并且實驗表明,即使是人工合成的非自然圖像,依然可以用來訓練深度神經網絡來預測光流。
精度方面,FlowNetC結果出現了過擬合,與FlowNetS相比也是難分伯仲,然而在FlowNet2.0中,研究者又更新了結論。速度方面,在NVIDIA GTX Titan上運行時,FlowNetS的運行時間為0.08s,FlowNetC因為加入了互相關層的計算,因此運行時間增加到0.15s。
比較其他算法和FlowNet的性能。在精度方面,雖然在公共數據庫上離最好的傳統算法還有差距,但是在合成的FlyingChair數據庫上,FlowNet的結果精度是最好的。這使我們看到只要擁有合適充足的數據,基于CNN的算法還是非常有前景的。另外,由于FlowNet只需要簡單的卷積運算,加上GPU的加速,在算法速度方面,FlowNet具有很大優勢,遠遠快于目前其他領先的傳統算法,可以實現實時的光流計算系統。以下是一個demo,大家可以欣賞一下:
https://lmb.informatik.uni-freiburg.de/Publications/2015/DFIB15/video-with-authors.mp4
?
?
FlowNet2.0:從追趕到持平
FlowNet提出了第一個基于CNN的光流預測算法,雖然具有快速的計算速度,但是精度依然不及目前最好的傳統方法。這在很大程度上限制了FlowNet的應用。
FlowNet2.0是FlowNet的增強版,在FlowNet的基礎上進行提升,在速度上只付出了很小的代價,使性能大幅度提升,追平了目前領先的傳統方法。
主要有以下改進:
增加了訓練數據,改進了訓練策略。
深度學習算法的一大優勢即是具有學習能力,算法的性能會隨著不斷學習而提升。FlowNet2.0在FlowNet的基礎上,額外增加了具有3維運動的數據庫FlyingThings3D[4]和更加復雜的訓練策略。
?
FlowNet2訓練策略? ? (源自[2])? ? ? FlyingThings3D
S_short即為FlowNet中的訓練策略,FlowNet2中增加S_long策略和S_fine策略。
相比于FlyingChair中的圖像只具有平面變換,FlyingThings3D中的圖像具有真實的3D運動和亮度變化,按理說應該包含著更豐富的運動變換信息,利用它訓練出的網絡模型應該更具魯棒性。然而實驗發現,訓練結果不僅與數據種類有關,還與數據訓練的順序有關。
源自[2]
實驗表明,先在FlyingChair上按S_long策略,再在FlyingThings3D上按S_fine策略后,所得結果最好。單獨在FlyingThing3D上訓練的結果反而下降。文中給出了解釋是盡管FlyingThings3D比較真實,包含更豐富的運動信息,但是過早的學習復雜的運動信息反而不易收斂到更好的結果,而先從簡單的運動信息學起,由易到難反得到了更好的結果。
同時,結果發現FlowNetC的性能要高于FlowNetS.
?
利用堆疊的結構對預測結果進行多級提升。
[2]文中發現所有最好的光流預測算法都利用了循環優化的方法。而基于CNN的像素級預測算法結果往往都含有很多噪聲和模糊。通常的做法都是利用一些后處理方法對結果進行優化,如FlowNet中,利用傳統變分優化方法對FlowNet輸出結果進行再優化。那么是否也能夠利用CNN來代替后處理方法對結果進行再優化呢?文中對這一問題進行了探究,
實驗結果證明在FlowNetC的基礎上堆疊FlowNetS,當以每個FlowNet為單位逐個進行訓練時,得到的結果最優。也就是說在訓練當前FlowNet模塊時,前面的FlowNet模塊參數均為固定狀態。
此外,發現后續的堆疊FlowNet模塊,除了輸入I_1、I_2外,再輸入前一模塊的預測光流W_i,圖像I_2經預測W_i的變換圖像I_2(w_i)以及誤差圖像|I_1-I_2(W_i)|后,可以使新堆疊的FlowNet模塊專注去學習I_1與I_2(W_i)之間剩下的運動變換,從而有效的防止堆疊后的網絡過擬合。
FlowNetC堆疊FlowNetS(源自[2])
實驗表明,當以FlowNetC為基礎網絡,額外堆疊兩個FlowNetS模塊后,所得結果最好,[2]中用FlowNet2-CSS表示。
同時指出,隨著優化模塊的堆疊,FlowNet2的計算速度會有所下降,因此可以通過按比例消減FlowNet各層的特征通道數來減少計算量。[2]推薦保留每層3/8的通道數是一個不錯的選擇。文中將消減后的網絡用FlowNet2-c和FlowNet2-s表示。最快的FlowNet2-s精度與FlowNetS的精度近似,而運算速率可以達到140fps(在Nvidia GTX 1080上測試)。
?
針對小位移的情況引入特定的子網絡進行處理。
最后,由于FlowNet在真實圖片的小位移情況下,結果往往不夠理想。因此[2]中,針對小位移情況改進了FlowNet模塊的結構,首先將編碼模塊部分中大小為7x7和5x5的卷積核均換為多層3x3卷積核以增加對小位移的分辨率。其次,在解碼模塊的反卷積層之間,均增加一層卷積層以便對小位移輸出更加平滑的光流預測。文中將針對小位移改進后的網絡結構命名為FlowNet2-SD。在訓練數據的選擇上,針對小位移,又重新合成了以小位移為主的新的數據庫ChairsSDHom,并將此前的堆疊網絡FlowNet2-CSS在ChairsSDHom和FlyingThings3D的混合數據上繼續微調訓練,將結果網絡表示為FlowNet2-CSS-ft-sd。
最后,再利用一個新的小網絡對FlowNet2-CSS-ft-sd的結果和FlowNet2-SD的結果進行融合,并將整個網絡體系命名為FlowNet2。結構如下:
FlowNet2.0結構圖(源自[2])
從實驗結果來看,FlowNet2在各個公共數據庫上,在精度方面已經追平了目前最好的一些傳統算法。同時,在速度上依然保持著高效快速的優勢。下面我們看一下各種情況下FlowNet2的輸出結果:
FlowNet2小位移情況(源自[2])
小位移情況下,FlowNet2-CSS的光流預測噪聲非常大,而FlowNet2-SD的輸出非常光滑,最后融合結果充分利用了FlowNet2-SD的結果。
FlowNet2大位移情況(源自[2])
大位移情況下,FlowNet2-CSS預測出了大部分運動,而FlowNet2-SD則丟失了大部分運動信息,最后融合結果又很好的利用了FlowNet2-CSS的結果。
綜上,FlowNet2-CSS與FlowNet2-SD做到了很好地互補,共同保證了FlowNet2在各種情況下的預測質量。
文中還通過將FlowNet2的預測結果直接用于運動分割和動作識別的任務中,證明FlowNet2的精度已完全可以和其他傳統算法媲美的程度,已達到可以實際應用的階段。
最后我們再來欣賞一下FlowNet2.0的實時demo:
? ? https://v.qq.com/x/page/c0503q9j8hf.html?
?
小結
相對于傳統方法來看,基于CNN的光流算法沿襲了CNN算法的優勢,即具有由數據驅動的學習能力,也就是說,它的預測能力是可以隨著不斷學習而不斷提升的。從FlowNet2.0的提升中我們可以看到,改變訓練策略和增加數據種類就使結果得到了提升。這也反過來說明了,數據對于深度學習算法的重要性。
另外,基于CNN算法由于主要需要的是簡單的卷積運算,加上GPU的并行加速,往往可以獲得很快運行速度,使得實時的光流預測系統成為可能,促進了光流預測系統的廣泛應用。
因此,目前來看,基于CNN的光流預測算法具有很好的發展前景,超越傳統算法也是指日可待。
?
參考文獻
[1] A. Dosovitskiy et al., "FlowNet: Learning Optical Flow with Convolutional Networks," 2015 IEEE International Conference on Computer Vision (ICCV), Santiago, Chile, 2016, pp. 2758-2766.
doi:10.1109/ICCV.2015.316?
[2] E. Ilg, N. Mayer, T. Saikia, M. Keuper, A. Dosovitskiy and T. Brox, "FlowNet 2.0: Evolution of Optical Flow Estimation with Deep Networks," 2017 IEEE Conference on Computer Vision and Pattern Recognition (CVPR), Honolulu, Hawaii, USA, 2017, pp. 1647-1655.
doi:10.1109/CVPR.2017.179
[3] M. Aubry, D. Maturana, A. Efros, B. Russell, and J. Sivic.
Seeing 3d chairs: exemplar part-based 2d-3d alignment using a large dataset of cad models. In CVPR, 2014
[4] N.Mayer, E.Ilg, P.H?usser, P.Fischer, D.Cremers, A.Dosovitskiy, and T.Brox. A large dataset to train convolutional networks for disparity, optical flow, and scene flow estimation. In IEEE Conference on Computer Vision and Pattern Recognition (CVPR), 2016.
?
?
原創聲明:本文為 SIGAI 原創文章,僅供個人學習使用,未經允許,不能用于商業目的。?
推薦閱讀
[1]??機器學習-波瀾壯闊40年?SIGAI 2018.4.13.
[2]??學好機器學習需要哪些數學知識?SIGAI 2018.4.17.
[3]??人臉識別算法演化史?SIGAI 2018.4.20.
[4]??基于深度學習的目標檢測算法綜述?SIGAI 2018.4.24.
[5]??卷積神經網絡為什么能夠稱霸計算機視覺領域??SIGAI 2018.4.26.
[6]?用一張圖理解SVM的脈絡?SIGAI 2018.4.28.
[7]?人臉檢測算法綜述?SIGAI 2018.5.3.
[8]?理解神經網絡的激活函數?SIGAI 2018.5.5.
[9]?深度卷積神經網絡演化歷史及結構改進脈絡-40頁長文全面解讀?SIGAI 2018.5.8.
[10]?理解梯度下降法?SIGAI 2018.5.11
[11]?循環神經網絡綜述—語音識別與自然語言處理的利器?SIGAI 2018.5.15
[12]?理解凸優化??SIGAI 2018.5.18
[13]【實驗】理解SVM的核函數和參數?SIGAI 2018.5.22
[14]【SIGAI綜述】 行人檢測算法?SIGAI 2018.5.25
[15] 機器學習在自動駕駛中的應用—以百度阿波羅平臺為例(上) SIGAI 2018.5.29?
[16]?理解牛頓法?SIGAI 2018.5.31
[17]【群話題精華】5月集錦—機器學習和深度學習中一些值得思考的問題?SIGAI 2018.6.1
[18] 大話Adaboost算法 SIGAI 2018.6.1
?
?
?
?
?
?
?
?
?
?
總結
以上是生活随笔為你收集整理的FlowNet到FlowNet2.0:基于卷积神经网络的光流预测算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python3安装(Linux)
- 下一篇: 聚焦和增强卷积神经网络