天天看點

光流估計——從傳統方法到深度學習

1.摘要

近年來,深度學習技術,作為一把利劍,廣泛地應用于計算機視覺等人工智能領域。如今時常見諸報端的“人工智能時代”,從技術角度看,是“深度學習時代”。光流估計是計算機視覺研究中的一個重要方向,然而,因為其不容易在應用中“顯式”地呈現,而未被大衆熟知。随着計算機視覺學界從圖像了解轉向視訊了解,網際網路使用者從釋出圖檔朋友圈轉向釋出短視訊,人們對視訊的研究和應用的關注不斷增強。光流估計作為視訊了解的隐形戰士,等着我們去尋找其蹤迹。本文首先介紹了什麼是視訊光流估計;再介紹光流估計的算法原理,包括最為經典的Lucas-Kanade算法和深度學習時代光流估計算法代表FlowNet/FlowNet2;最後,介紹了視訊光流估計的若幹應用。希望對光流估計的算法和應用有個較為全面的介紹。

2.介紹

光流,顧名思義,光的流動。比如人眼感受到的夜空中劃過的流星。在計算機視覺中,定義圖像中對象的移動,這個移動可以是相機移動或者物體移動引起的。具體是指,視訊圖像的一幀中的代表同一對象(物體)像素點移動到下一幀的移動量,使用二維向量表示。如圖2-1。

光流估計——從傳統方法到深度學習

圖2-1 光流示意圖

根據是否選取圖像稀疏點進行光流估計,可以将光流估計分為稀疏光流和稠密光流,如圖2,左圖選取了一些特征明顯(梯度較大)的點進行光流估計和跟蹤,右圖為連續幀稠密光流示意圖。

光流估計——從傳統方法到深度學習

圖2-2 左圖 稀疏點光流,右圖 稠密光流

稠密光流描述圖像每個像素向下一幀運動的光流,為了友善表示,使用不同的顔色和亮度表示光流的大小和方向,如圖2-2右圖的不同顔色。圖2-3展示了一種光流和顔色的映射關系,使用顔色表示光流的方向,亮度表示光流的大小。

光流估計——從傳統方法到深度學習

圖2-3 稠密光流表示顔色空間

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

為了将光流估計進行模組化,Lucas-Kanade做了兩個重要的假設,分别是亮度不變假設和鄰域光流相似假設。

3.1.1 亮度不變假設

光流估計——從傳統方法到深度學習

圖3-1-1 - Lucas-Kanade 亮度不變假設

亮度不變假設如圖3-1-1,假設待估計光流的兩幀圖像的同一物體的亮度不變,這個假設通常是成立的,因為環境光照通常不會發生太大的變化。假設

光流估計——從傳統方法到深度學習

時刻,位于

光流估計——從傳統方法到深度學習

像素位置的物體,在

光流估計——從傳統方法到深度學習

時刻位于

光流估計——從傳統方法到深度學習

位置,基于亮度不變假設,有:

光流估計——從傳統方法到深度學習

将等式右邊進行一階泰勒展開得:

光流估計——從傳統方法到深度學習

即有:

光流估計——從傳統方法到深度學習

寫成矩陣形式有:

光流估計——從傳統方法到深度學習

其中,

光流估計——從傳統方法到深度學習

分别為

光流估計——從傳統方法到深度學習

像素點處圖像亮度在x方向和y方向的偏導數,即圖像x和y方向的梯度。

光流估計——從傳統方法到深度學習

為t時刻,

光流估計——從傳統方法到深度學習

處像素亮度對時間的導數,

光流估計——從傳統方法到深度學習

即為兩圖之間的

光流估計——從傳統方法到深度學習

坐标位置的亮度差,表示為

光流估計——從傳統方法到深度學習

。即:

光流估計——從傳統方法到深度學習

給定兩張圖像,

光流估計——從傳統方法到深度學習

均為已知量,

光流估計——從傳統方法到深度學習

即為待求的光流。式(3-1-5)中建立了一個等式,存在兩個未知數(

光流估計——從傳統方法到深度學習

),無法得到唯一解。是以,需要借助鄰域光流相似假設。

3.1.2 鄰域光流相似假設

光流估計——從傳統方法到深度學習

圖3-1-2 - 領域光流相似假設

鄰域光流相似假設如圖3-1-2,以像素點

光流估計——從傳統方法到深度學習

為中心,設定3x3的鄰域(以3x3舉例,也可以是其他的大小),假設該鄰域内的所有像素點光流值一緻,通常,一個小的圖像區域裡像素移動方向和大小是基本一緻的,是以,這個假設也是合理的。借助該假設,領域内的所有像素都有式(3-1-5),得:

光流估計——從傳統方法到深度學習

上式即為

光流估計——從傳統方法到深度學習

的形式,可求得光流

光流估計——從傳統方法到深度學習

的最小二乘解:

光流估計——從傳統方法到深度學習

其中,要求

光流估計——從傳統方法到深度學習

可逆,如果

光流估計——從傳統方法到深度學習

不可逆,式3-1-6将出現多解,即出現孔徑問題(Aperture Problem),如圖3-1-3,從圓孔中觀察三種移動的條紋的變化,是一緻的,進而無法通過圓孔得到條紋的真實移動方向(光流方向)。是以,Lucas-Kanade方法将選取一些

光流估計——從傳統方法到深度學習

可逆的像素點估計光流,這些點是一些亮度變化明顯的角點,知名的角點檢測算法Harris角點檢測算法正是借助了

光流估計——從傳統方法到深度學習

可逆的相關性質。

光流估計——從傳統方法到深度學習

圖3-1-3 光流求解的孔徑問題

除了基于亮度不變假設和鄰域光流相似假設,為了解決圖像偏移較大的情況,Lucas-Kanade算法還借助了圖像金字塔(Pyramid)的方式,在高層低分辨率圖像上,大的偏移将變為小的偏移。最終,Lucas-Kanade方法給出了一種求解稀疏(明顯特征的角點)光流的方法。

3.2 深度學習算法 FlowNet/FlowNet2.0

ICCV2015提出的FlowNet是最早使用深度學習CNN解決光流估計問題的方法,并且在CVPR2017,同一團隊提出了改進版本FlowNet2.0。FlowNet2.0 是2015年以來光流估計鄰域引用最高的論文。

3.2.1 FlowNet

作者嘗試使用深度學習End-to-End的網絡模型解決光流估計問題,如圖3-2-1,該模型的輸入為待估計光流的兩張圖像,輸出即為圖像每個像素點的光流。我們從Loss的設計,訓練資料集和網絡設計來分析FlowNet。

光流估計——從傳統方法到深度學習

圖3-2-1 深度學習End-to-End 光流估計模型

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

光流估計——從傳統方法到深度學習

圖3-2-2 End Point Error

對于訓練資料集,由于稠密光流的groundtruth為圖像每個像素的光流值,人工标注光流值幾乎不可能。是以,作者設計了一種生成的方式,得到包括大量樣本的訓練資料集FlyingChairs。其生成方式為對圖像做仿射變換生成對應的圖像。為了模拟圖像中存在多種運動,比如相機在移動,同時圖像中的人或物體也在移動。作者将虛拟的椅子疊加到背景圖像中,并且背景圖和椅子使用不同的仿射變換得到對應的另一張圖,如圖3-2-3。

光流估計——從傳統方法到深度學習

圖3-2-3 FlyingChairs資料集生成

對于深度網絡結構,該類網絡通常包括降維的encoder子產品和升維的decoder子產品。作者設計了兩種網絡,FlowNetSimple和FlowNetCorr(Correlation)。這兩種網絡的Encoder子產品不同,Decoder子產品相同。

光流估計——從傳統方法到深度學習

圖3-2-4 FlowNetSimple

光流估計——從傳統方法到深度學習

圖3-2-5 FlowNetCoor

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

光流估計——從傳統方法到深度學習

圖,合并成

光流估計——從傳統方法到深度學習

的Tensor,作為CNN encoder的輸入(如圖3-2-4),這是最為簡單的将兩張圖的資訊整合到一起的方式,也是以命名為FlowNetSimple。FlowNetCoor則先對兩張圖像分别進行卷積,獲得較為高層的feature後,再進行相關運算(引入人為定義的規則),将資訊合并,如圖3-2-5。其中,相關運算借鑒了傳統視覺算法中,找圖像比對的思想。如圖3-2-6,為了尋找上圖紅框椅子角在下圖中對應得位置,在下圖對應像素位置周圍依次滑動,做相關運算(即對應位置像素相乘求和)。得到的值越大,代表越相關,即圖像越接近。FlowNetCoor網絡中的相關運算類似,不同點是其不在圖像本身做相關,在卷積得到的FeatureMap上做相關運算,圖3-2-6上圖FeatureMap與下圖FeatureMap對應像素附近區域做相關,上圖(u,v)坐标圖塊與下圖對應區域的鄰域内(綠框)滑動做相關運算,得到的值在輸出FeatureMap通道方向上依次排開,圖3-2-4中相關運算的輸出通道數為441,即下圖做相關運算的鄰域範圍為

光流估計——從傳統方法到深度學習

光流估計——從傳統方法到深度學習

圖3-2-6 相關運算示意圖

兩種網絡的Decoder是一緻的(見圖3-2-7),其通過反卷積進行升維,各層反卷積運算的輸入包括三個部分,第一部分是上一層的反卷積輸出deconv*(高層語義資訊),第二部分來之Encoder相關層的FeatureMap conv*_1(低層局部資訊),第三部分由前一層卷積的輸出coarse的光流flow*上采樣得到。進而融合了高層和低層的資訊,也引入了coarse-to-fine(由粗到細)的機制。

光流估計——從傳統方法到深度學習

圖3-2-7 Decoder網絡結構

基于上述網絡和訓練集,作者基于深度學習設計的FlowNet在實時估計光流算法中取得了state-of-the-art的結果,但是依然比非實時的傳統方法效果要差。同時,作者對比了FlowNetS和FlowNetCoor,FlowNetCoor的效果更好,證明了人工加入的相關運算是有效的,也符合預期。

3.2.2 FlowNet2.0

FlowNet2.0是FlowNet團隊發表在CVPR2017的改進方法,該方法達到了state-of-the-art效果(包括非實時的傳統方法),并且計算速度很快,達到實時的要求。FlowNet2.0的改進主要展現在兩個方面,一方面是通過堆疊多個FlowNet網絡,實作Coarse-to-Fine的效果;另一方面是解決FlowNet小偏移(Small Displacement)估計不準确的問題。FlowNet2.0整體網絡結構如圖3-2-8,圖上方依次堆疊了FlowNetCoor+FlowNetS+FlowNetS。值得注意的是,後續FlowNet的輸入不僅僅是兩張圖檔(圖1和圖2),還包括前一個網絡輸入的光流估計Flow,和一張Warped圖,再加一張亮度誤差(Brightness Error)。其中Warped圖為将估計的光流作用在圖2上,即為使用估計的每個像素偏移,偏移圖2的每一個像素,使其與圖1對齊。雖然作用了光流偏移,由于光流估計的不夠準确,Warped圖和圖1依然存在一定的偏差,圖1的亮度減去Warped圖的亮度,即可得到亮度誤差(BrightnessError)圖。最後,将所有的五項輸入堆疊成輸入的Tensor,輸入到後續的網絡中。小偏移即光流偏移較小的情形,作者設計了适合小偏移的FlowNet-SD(Small-Displacement),其修改FlowNet中卷積核和stride的大小,使其更适合小偏移。具體的變化為,将FlowNet中7x7和5x5的卷積和改為3x3的卷積核(更小的卷積和意味着更加精細的處理,是以更加适合小偏移估計的問題),并且将stride=2改為stride=1。

光流估計——從傳統方法到深度學習

圖3-2-8 FlowNet2.0 整體框圖

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

光流估計——從傳統方法到深度學習

圖3-2-9 FlowNet2.0 對比結果

4. 應用

光流,從實體意義的角度看,描述了視訊中物體、對象在時間次元上的關聯性,進而建立了視訊中連續圖像之間的關聯關系。是以,最為直接而自然的應用就是視訊中物體的跟蹤,在物體跟蹤領域知名的TLD算法便借助了光流估計,圖2中展示了在車輛上的特征點光流跟蹤的效果。在視覺裡程計和SLAM同步定位與建圖領域,光流可以作為圖像特征點比對的一種方式,比如知名的視覺慣性裡程計開源算法VINS-Mono。英偉達也提供了基于其GPU的光流SDK,其中展示了利用光流進行視訊動作識别(video action recognition)和視訊插幀的應用,如圖4-1,4-2。

光流估計——從傳統方法到深度學習

圖4-1 光流應用于動作識别

光流估計——從傳統方法到深度學習

圖4-2 光流應用于視訊插幀

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

本文轉載部落客知乎專欄騰訊大佬“肖澤東”投稿:https://zhuanlan.zhihu.com/p/74460341,未經授權不得二次轉載。

部落客:菜鳥程式員

初衷:學習資料,程式設計,視覺算法,求職經驗,工作心得