視頻光流估計
1.摘要
近年來,深度學習技術,作為一把利劍,廣泛地應用於計算機視覺等人工智能領域。如今時常見諸報端的“人工智能時代”,從技術角度看,是“深度學習時代”。光流估計是計算機視覺研究中的一個重要方向,然而,因為其不容易在應用中“顯式”地呈現,而未被大眾熟知。隨着計算機視覺學界從圖像理解轉向視頻理解,互聯網用戶從發布圖片朋友圈轉向發布短視頻,人們對視頻的研究和應用的關注不斷增強。光流估計作為視頻理解的隱形戰士,等着本文去尋找其蹤跡。本文介紹了什么是視頻光流估計和算法原理。
2.介紹
光流,顧名思義,光的流動。比如人眼感受到的夜空中划過的流星。在計算機視覺中,定義圖像中對象的移動,這個移動可以是相機移動或者物體移動引起的。具體是指,視頻圖像的一幀中的代表同一對象(物體)像素點移動到下一幀的移動量,使用二維向量表示。如圖1。
圖1. 光流示意圖
根據是否選取圖像稀疏點進行光流估計,可以將光流估計分為稀疏光流和稠密光流,如圖2,左圖選取了一些特征明顯(梯度較大)的點進行光流估計和跟蹤,右圖為連續幀稠密光流示意圖。
圖2. 左圖 稀疏點光流,右圖 稠密光流
稠密光流描述圖像每個像素向下一幀運動的光流,為了方便表示,使用不同的顏色和亮度表示光流的大小和方向,如圖2右圖的不同顏色。
3.算法
最為常用的視覺算法庫OpenCV中,提供光流估計算法接口,包括稀疏光流估計算法
cv2.calcOpticalFlowPyrLK(),和稠密光流估計cv2.calcOpticalFlowFarneback()。其中稀疏光流估計算法為Lucas-Kanade算法,該算法為1981年由Lucas和Kanade兩位科學家提出的,最為經典也較容易理解的算法,下面將以此為例介紹傳統光流算法。對於最新的深度學習光流估計算法,FlowNet的作者於2015年首先使用CNN解決光流估計問題,取得了較好的結果,並且在CVPR2017上發表改進版本FlowNet2.0,成為當時State-of-the-art的方法。截止到現在,FlowNet和FlowNet2.0依然和深度學習光流估計算法中引用率最高的論文,分別引用790次和552次。因此,深度學習光流估計算法將以FlowNet/FlowNet2.0為例介紹。
3.1 傳統算法 Lucas-Kanade:鄰域光流相似假設
孔徑問題(Aperture Problem),如圖3,從圓孔中觀察三種移動的條紋的變化,是一致的,從而無法通過圓孔得到條紋的真實移動方向(光流方向)。因此,Lucas-Kanade方法將選取一些 可逆的像素點估計光流,這些點是一些亮度變化明顯的角點,知名的角點檢測算法Harris角點檢測算法正是借助了可逆的相關性質。
圖3. 光流求解的孔徑問題
除了基於亮度不變假設和鄰域光流相似假設,為了解決圖像偏移較大的情況,Lucas-Kanade算法還借助了圖像金字塔(Pyramid)的方式,在高層低分辨率圖像上,大的偏移將變為小的偏移。最終,Lucas-Kanade方法給出了一種求解稀疏(明顯特征的角點)光流的方法。
3.2 深度學習算法 FlowNet/FlowNet2.0
ICCV2015提出的FlowNet是最早使用深度學習CNN解決光流估計問題的方法,並且在CVPR2017,同一團隊提出了改進版本FlowNet2.0。FlowNet2.0 是2015年以來光流估計鄰域引用最高的論文。
作者嘗試使用深度學習End-to-End的網絡模型解決光流估計問題,如圖4,該模型的輸入為待估計光流的兩張圖像,輸出即為圖像每個像素點的光流。本文從Loss的設計,訓練數據集和網絡設計來分析FlowNet。
圖4. 深度學習End-to-End 光流估計模型
對於Loss的設計,如果給定每個像素groundtruth的光流,那么對於每個像素,loss可以定義為預測的光流(2維向量)和groundtruth之間的歐式距離,稱這種誤差為EPE(End-Point-Error),如圖
圖5. End Point Error
對於訓練數據集,由於稠密光流的groundtruth為圖像每個像素的光流值,人工標注光流值幾乎不可能。因此,作者設計了一種生成的方式,得到包括大量樣本的訓練數據集FlyingChairs。其生成方式為對圖像做仿射變換生成對應的圖像。為了模擬圖像中存在多種運動,比如相機在移動,同時圖像中的人或物體也在移動。作者將虛擬的椅子疊加到背景圖像中,並且背景圖和椅子使用不同的仿射變換得到對應的另一張圖,如圖6。
圖6. FlyingChairs數據集生成
對於深度網絡結構,該類網絡通常包括降維的encoder模塊和升維的decoder模塊。作者設計了兩種網絡,FlowNetSimple和FlowNetCorr(Correlation)。這兩種網絡的Encoder模塊不同,Decoder模塊相同。
圖7. FlowNetSimple
圖8. FlowNetCoor
FlowNetSimple簡單地將兩張圖排列到一起,即將兩張圖,合並成的Tensor,作為CNN encoder的輸入(如圖7),這是最為簡單的將兩張圖的信息整合到一起的方式,也因此命名為FlowNetSimple。FlowNetCoor則先對兩張圖像分別進行卷積,獲得較為高層的feature后,再進行相關運算(引入人為定義的規則),將信息合並,如圖8。其中,相關運算借鑒了傳統視覺算法中,找圖像匹配的思想。
兩種網絡的Decoder是一致的(見圖9),其通過反卷積進行升維,各層反卷積運算的輸入包括三個部分,第一部分是上一層的反卷積輸出deconv*(高層語義信息),第二部分來之Encoder相關層的FeatureMap conv*_1(低層局部信息),第三部分由前一層卷積的輸出coarse的光流flow*上采樣得到。從而融合了高層和低層的信息,也引入了coarse-to-fine(由粗到細)的機制。
圖9. Decoder網絡結構
基於上述網絡和訓練集,作者基於深度學習設計的FlowNet在實時估計光流算法中取得了state-of-the-art的結果,但是依然比非實時的傳統方法效果要差。同時,作者對比了FlowNetS和FlowNetCoor,FlowNetCoor的效果更好,證實了人工加入的相關運算是有效的,也符合預期。
4. 應用
光流,從物理意義的角度看,描述了視頻中物體、對象在時間維度上的關聯性,從而建立了視頻中連續圖像之間的關聯關系。因此,最為直接而自然的應用就是視頻中物體的跟蹤,在物體跟蹤領域知名的TLD算法便借助了光流估計,圖2中展示了在車輛上的特征點光流跟蹤的效果。在視覺里程計和SLAM同步定位與建圖領域,光流可以作為圖像特征點匹配的一種方式,比如知名的視覺慣性里程計開源算法VINS-Mono。英偉達也提供了基於其GPU的光流SDK,其中展示了利用光流進行視頻動作識別(video action recognition)和視頻插幀的應用,如圖10,11。
圖10. 光流應用於動作識別
圖11. 光流應用於視頻插幀
5. 總結
對於稀疏光流,本文提到的Lucas-Kanade是一種經典且有效的算法,對於稠密光流估計,傳統方法需要在精度和速度上做出取舍,而最新基於深度學習的FlowNet2算法可以實時取得state-of-the-art的精度。
參考文獻
[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 https://developer.nvidia.com/opticalflow-sdk , Accessed at 2019/7/20