光流估計——從傳統(tǒng)方法到深度學(xué)習(xí)
點擊左上方藍(lán)字關(guān)注我們

作者 | 肖澤東 Shon
鏈接 | https://zhuanlan.zhihu.com/p/74460341
1.摘要
近年來,深度學(xué)習(xí)技術(shù),作為一把利劍,廣泛地應(yīng)用于計算機(jī)視覺等人工智能領(lǐng)域。如今時常見諸報端的“人工智能時代”,從技術(shù)角度看,是“深度學(xué)習(xí)時代”。光流估計是計算機(jī)視覺研究中的一個重要方向,然而,因為其不容易在應(yīng)用中“顯式”地呈現(xiàn),而未被大眾熟知。隨著計算機(jī)視覺學(xué)界從圖像理解轉(zhuǎn)向視頻理解,互聯(lián)網(wǎng)用戶從發(fā)布圖片朋友圈轉(zhuǎn)向發(fā)布短視頻,人們對視頻的研究和應(yīng)用的關(guān)注不斷增強(qiáng)。光流估計作為視頻理解的隱形戰(zhàn)士,等著我們?nèi)ふ移溘欅E。本文首先介紹了什么是視頻光流估計;再介紹光流估計的算法原理,包括最為經(jīng)典的Lucas-Kanade算法和深度學(xué)習(xí)時代光流估計算法代表FlowNet/FlowNet2;最后,介紹了視頻光流估計的若干應(yīng)用。希望對光流估計的算法和應(yīng)用有個較為全面的介紹。
2.介紹
光流,顧名思義,光的流動。比如人眼感受到的夜空中劃過的流星。在計算機(jī)視覺中,定義圖像中對象的移動,這個移動可以是相機(jī)移動或者物體移動引起的。具體是指,視頻圖像的一幀中的代表同一對象(物體)像素點移動到下一幀的移動量,使用二維向量表示。如圖2-1。
圖2-1 光流示意圖
根據(jù)是否選取圖像稀疏點進(jìn)行光流估計,可以將光流估計分為稀疏光流和稠密光流,如圖2,左圖選取了一些特征明顯(梯度較大)的點進(jìn)行光流估計和跟蹤,右圖為連續(xù)幀稠密光流示意圖。
圖2-2 左圖 稀疏點光流,右圖 稠密光流
稠密光流描述圖像每個像素向下一幀運(yùn)動的光流,為了方便表示,使用不同的顏色和亮度表示光流的大小和方向,如圖2-2右圖的不同顏色。圖2-3展示了一種光流和顏色的映射關(guān)系,使用顏色表示光流的方向,亮度表示光流的大小。

3.算法
最為常用的視覺算法庫OpenCV中,提供光流估計算法接口,包括稀疏光流估計算法cv2.calcOpticalFlowPyrLK(),和稠密光流估計cv2.calcOpticalFlowFarneback()。其中稀疏光流估計算法為Lucas-Kanade算法,該算法為1981年由Lucas和Kanade兩位科學(xué)家提出的,最為經(jīng)典也較容易理解的算法,下文將以此為例介紹傳統(tǒng)光流算法。對于最新的深度學(xué)習(xí)光流估計算法,F(xiàn)lowNet的作者于2015年首先使用CNN解決光流估計問題,取得了較好的結(jié)果,并且在CVPR2017上發(fā)表改進(jìn)版本FlowNet2.0,成為當(dāng)時State-of-the-art的方法。截止到現(xiàn)在,F(xiàn)lowNet和FlowNet2.0依然和深度學(xué)習(xí)光流估計算法中引用率最高的論文,分別引用790次和552次。因此,深度學(xué)習(xí)光流估計算法將以FlowNet/FlowNet2.0為例介紹。
3.1 傳統(tǒng)算法 Lucas-Kanade
為了將光流估計進(jìn)行建模,Lucas-Kanade做了兩個重要的假設(shè),分別是亮度不變假設(shè)和鄰域光流相似假設(shè)。
3.1.1 亮度不變假設(shè)

亮度不變假設(shè)如圖3-1-1,假設(shè)待估計光流的兩幀圖像的同一物體的亮度不變,這個假設(shè)通常是成立的,因為環(huán)境光照通常不會發(fā)生太大的變化。假設(shè)
將等式右邊進(jìn)行一階泰勒展開得:
即有:
寫成矩陣形式有:
其中,
給定兩張圖像,
3.1.2 鄰域光流相似假設(shè)

鄰域光流相似假設(shè)如圖3-1-2,以像素點
上式即為
其中,要求

圖3-1-3 光流求解的孔徑問題
除了基于亮度不變假設(shè)和鄰域光流相似假設(shè),為了解決圖像偏移較大的情況,Lucas-Kanade算法還借助了圖像金字塔(Pyramid)的方式,在高層低分辨率圖像上,大的偏移將變?yōu)樾〉钠?。最終,Lucas-Kanade方法給出了一種求解稀疏(明顯特征的角點)光流的方法。
3.2 深度學(xué)習(xí)算法 FlowNet/FlowNet2.0
ICCV2015提出的FlowNet是最早使用深度學(xué)習(xí)CNN解決光流估計問題的方法,并且在CVPR2017,同一團(tuán)隊提出了改進(jìn)版本FlowNet2.0。FlowNet2.0 是2015年以來光流估計鄰域引用最高的論文。
3.2.1 FlowNet
作者嘗試使用深度學(xué)習(xí)End-to-End的網(wǎng)絡(luò)模型解決光流估計問題,如圖3-2-1,該模型的輸入為待估計光流的兩張圖像,輸出即為圖像每個像素點的光流。我們從Loss的設(shè)計,訓(xùn)練數(shù)據(jù)集和網(wǎng)絡(luò)設(shè)計來分析FlowNet。

對于Loss的設(shè)計,如果給定每個像素groundtruth的光流,那么對于每個像素,loss可以定義為預(yù)測的光流(2維向量)和groundtruth之間的歐式距離,稱這種誤差為EPE(End-Point-Error),如圖

對于訓(xùn)練數(shù)據(jù)集,由于稠密光流的groundtruth為圖像每個像素的光流值,人工標(biāo)注光流值幾乎不可能。因此,作者設(shè)計了一種生成的方式,得到包括大量樣本的訓(xùn)練數(shù)據(jù)集FlyingChairs。其生成方式為對圖像做仿射變換生成對應(yīng)的圖像。為了模擬圖像中存在多種運(yùn)動,比如相機(jī)在移動,同時圖像中的人或物體也在移動。作者將虛擬的椅子疊加到背景圖像中,并且背景圖和椅子使用不同的仿射變換得到對應(yīng)的另一張圖,如圖3-2-3。

對于深度網(wǎng)絡(luò)結(jié)構(gòu),該類網(wǎng)絡(luò)通常包括降維的encoder模塊和升維的decoder模塊。作者設(shè)計了兩種網(wǎng)絡(luò),FlowNetSimple和FlowNetCorr(Correlation)。這兩種網(wǎng)絡(luò)的Encoder模塊不同,Decoder模塊相同。


FlowNetSimple簡單地將兩張圖排列到一起,即將兩張

兩種網(wǎng)絡(luò)的Decoder是一致的(見圖3-2-7),其通過反卷積進(jìn)行升維,各層反卷積運(yùn)算的輸入包括三個部分,第一部分是上一層的反卷積輸出deconv*(高層語義信息),第二部分來之Encoder相關(guān)層的FeatureMap conv*_1(低層局部信息),第三部分由前一層卷積的輸出coarse的光流flow*上采樣得到。從而融合了高層和低層的信息,也引入了coarse-to-fine(由粗到細(xì))的機(jī)制。

基于上述網(wǎng)絡(luò)和訓(xùn)練集,作者基于深度學(xué)習(xí)設(shè)計的FlowNet在實時估計光流算法中取得了state-of-the-art的結(jié)果,但是依然比非實時的傳統(tǒng)方法效果要差。同時,作者對比了FlowNetS和FlowNetCoor,F(xiàn)lowNetCoor的效果更好,證實了人工加入的相關(guān)運(yùn)算是有效的,也符合預(yù)期。
3.2.2 FlowNet2.0
FlowNet2.0是FlowNet團(tuán)隊發(fā)表在CVPR2017的改進(jìn)方法,該方法達(dá)到了state-of-the-art效果(包括非實時的傳統(tǒng)方法),并且計算速度很快,達(dá)到實時的要求。FlowNet2.0的改進(jìn)主要體現(xiàn)在兩個方面,一方面是通過堆疊多個FlowNet網(wǎng)絡(luò),實現(xiàn)Coarse-to-Fine的效果;另一方面是解決FlowNet小偏移(Small Displacement)估計不準(zhǔn)確的問題。FlowNet2.0整體網(wǎng)絡(luò)結(jié)構(gòu)如圖3-2-8,圖上方依次堆疊了FlowNetCoor+FlowNetS+FlowNetS。值得注意的是,后續(xù)FlowNet的輸入不僅僅是兩張圖片(圖1和圖2),還包括前一個網(wǎng)絡(luò)輸入的光流估計Flow,和一張Warped圖,再加一張亮度誤差(Brightness Error)。其中Warped圖為將估計的光流作用在圖2上,即為使用估計的每個像素偏移,偏移圖2的每一個像素,使其與圖1對齊。雖然作用了光流偏移,由于光流估計的不夠準(zhǔn)確,Warped圖和圖1依然存在一定的偏差,圖1的亮度減去Warped圖的亮度,即可得到亮度誤差(BrightnessError)圖。最后,將所有的五項輸入堆疊成輸入的Tensor,輸入到后續(xù)的網(wǎng)絡(luò)中。小偏移即光流偏移較小的情形,作者設(shè)計了適合小偏移的FlowNet-SD(Small-Displacement),其修改FlowNet中卷積核和stride的大小,使其更適合小偏移。具體的變化為,將FlowNet中7x7和5x5的卷積和改為3x3的卷積核(更小的卷積和意味著更加精細(xì)的處理,因此更加適合小偏移估計的問題),并且將stride=2改為stride=1。

作者給出的FlowNet2.0實驗結(jié)果如圖3-2-9,其中給出了5種版本的FlowNet2,FlowNet2、FN2-CSS-ft-sd/FN2-css-ft-sd、FN2-ss、FN2-s, c/C代表Coor網(wǎng)絡(luò),s/S代表Simple網(wǎng)絡(luò),小寫(s,c)代表網(wǎng)絡(luò)參數(shù)較少(縮小了卷積和數(shù)量)的版本。FlowNet2是指FlowNet2的完整網(wǎng)絡(luò)(如圖3-2-8),ft代表在真實數(shù)據(jù)集上進(jìn)行了fine-tune,sd代表包含small-displacement模塊。因此,實驗結(jié)果表明FlowNet2達(dá)到了所有方法State-of-the-are結(jié)果(包括非實時的傳統(tǒng)方法),計算效率要比最好的傳統(tǒng)方法快兩個數(shù)量級,達(dá)到了實時的要求。并且根據(jù)不同的應(yīng)用需求,不同速度和精度的要求,有不同的版本供選擇。

4. 應(yīng)用
光流,從物理意義的角度看,描述了視頻中物體、對象在時間維度上的關(guān)聯(lián)性,從而建立了視頻中連續(xù)圖像之間的關(guān)聯(lián)關(guān)系。因此,最為直接而自然的應(yīng)用就是視頻中物體的跟蹤,在物體跟蹤領(lǐng)域知名的TLD算法便借助了光流估計,圖2中展示了在車輛上的特征點光流跟蹤的效果。在視覺里程計和SLAM同步定位與建圖領(lǐng)域,光流可以作為圖像特征點匹配的一種方式,比如知名的視覺慣性里程計開源算法VINS-Mono。英偉達(dá)也提供了基于其GPU的光流SDK,其中展示了利用光流進(jìn)行視頻動作識別(video action recognition)和視頻插幀的應(yīng)用,如圖4-1,4-2。


5. 總結(jié)
對于稀疏光流,本文提到的Lucas-Kanade是一種經(jīng)典且有效的算法,對于稠密光流估計,傳統(tǒng)方法需要在精度和速度上做出取舍,而最新基于深度學(xué)習(xí)的FlowNet2算法可以實時取得state-of-the-art的精度。
參考文獻(xiàn)
[1] Ilg, Eddy, et al. "Flownet 2.0: Evolution of optical flow estimation with deep networks."Proceedings of the IEEE conference on computer vision and pattern recognition. 2017.
[2] Dosovitskiy, Alexey, et al. "Flownet: Learning optical flow with convolutional networks."Proceedings of the IEEE international conference on computer vision. 2015.
[3] NVIDIA Optical Flow SDK developer.nvidia.com/op , Accessed at 2019/7/20
END
整理不易,點贊三連↓
