FlowNet:simple / correlation 與 相關聯操作


FlowNet : simple / correlation 與 相關聯操作

上一篇文章中(還沒來得及寫),已經簡單的講解了光流是什么以及光流是如何求得的。同時介紹了幾個光流領域的經典傳統算法。

​ 從這一章以后,我們從最經典的網絡結構開始,介紹一些基於深度學習的光流預測算法。

1 簡介

​ 提到用深度學習做光流預測,大部分研究都繞不開這篇Flow Net文章,原因很簡單,這個網絡太經典了! (原文傳送門

​ 在FlowNet橫空出世之前,大部分光流預測模型使用的都是傳統的手工計算方法,例如Lucas-Kanade,或者Epic Flow等等。盡管其中一些算法也可以實現稠密光流的預測,有些網絡甚至還有着不錯的算法識別效率,但這些基於手工學習的算法總有各種各樣的缺陷,只能針對特殊的引用場景使用。當然更重要的一點是:ML, DL技術實在是大勢所趨,於是到了2015年,作者大聲喊道:"Let there be FlowNet!"。

​ FlowNet源於一個相當簡單的思路:既然光流是一種針對兩張圖片見對應像素點的映射關系(F(x,y) = u,v),而同時,不少深度學習模型的本質就是提供了一種線性或者非線性的映射關系。那么能否通過深度學習來完成這種從圖片到目標光流的映射,來實現光流預測呢?

​ 這篇FlowNet1.0 證明了這種思路是可行的。

​ FlowNet 同時也是第一個利用CNN實現了光流預測的模型(至少作者是這么說的,hhhh),從這一點來講,FlowNet就已經為現在的光流領域發展留下了不小的貢獻。

​ 當然Flow Net的貢獻不止這些。這篇文章的另一點重大貢獻在於提供了一種相關聯操作,用於對不同特征值進行比較。Somehow,這種相聯操作已經成為了當前不同研究中的基礎(就像特征提取那樣),因此學習它是十分有必要的。

​ 發表於2015年的這篇Flow Net中提出了兩個相似的模型用於實現光流的預測,分別為Flow Net Simple 和Flow Net Correlation。我們先對這兩個模型有一個簡單的overview:

image-20210627172549094

​ 簡單來講,兩個模型的后半部分網絡結構比較相似,只是前半部分稍有區別,都經過了特征提取,再到輸出光流圖的過程。區別在於,FlowNetS把兩張圖片直接堆疊起來進行特征提取,而FlowNet corr稍微復雜一點,兩張圖片分別進行特征提取再通過了一個名為”correlation“的操作,下面展開描述一下兩個網絡的實現思路和細節。

2 Approaches & estimate

2.1 Flow net Simple

​ 各位看官老爺可能已經感覺出來了,FlowNet S是一個相當原始粗暴的網絡。前文已經提到,flow net 1.0企圖利用CNN網絡來擬合這種圖片->光流的映射關系,因此設計者就用了一連串的卷積層來實現這種映射關系。(例如,1*1的卷積核本質上就是一種線性映射)

​ 以任意兩幀在時間上相鄰的畫面作為輸入,模型會首先把這兩張圖片在channel上進行合並,重疊在一起,之后進入上如所描述的若干網絡層。盡管不同網絡層的設計目的不盡相同,但是其大致可以分為以下幾個階段:

​ 首先,模型需要對輸入的張量進行特征提取。特征提取是一個漫長的階段,經過了多次的卷積層。在這個過程中圖片尺寸逐漸縮小,最后變成一個1024channels 的tensor。下一步模型會有特征值向光流做映射,這一步是由一個簡單的卷積層來實現的。最后,經過一個refinement模塊,光流圖片的分辨率會被恢復到合理的大小。

獲取光流

​ 從網絡結構來看,不同卷積層的fliter是一個逐漸縮小的過程。這一點符合常識對模型結構的判斷,也是很多模型會采取的設計方法(盡管在后續研究中已經證明多個33的卷積核足以替代7**7的卷積核)。先用一個大感受野fliter對輸入圖片進行early downsampling,之后逐漸縮小卷積核的大小,同時,通過控制卷積層的步長來不斷的縮小分辨率。

​ 用來實現特征--光流映射的部分反而相對簡單,僅由一層out channel =2 的卷積層構成。

Refinement

​ 在前一個部分中,模型利用卷積層實現了特征的提取與映射,得到了一個低分辨率版的光流信息。之所以是低分辨率,是因為前文中的網絡調整了卷積核的步長、並進行了池化。因此很有必要在經過了這些網絡結構之后,設計一個refinement 部分,將光流恢復至原圖的分辨率大小。這一部分中主要應用到的是一種“反卷積”操作,還是看一下網絡結構圖:

​ 這種反卷積的思路FlowNet之前就已經提出了,如這篇文章 , 有興趣的老哥可以深入了解一下,這里不再詳細展開。簡單來講,反卷積就是一個unpooling + 一個卷積層。現在的pytorch都已經幫我們封裝好了這一操作,直接調用 nn.ConvTranspose2d 就好了(就像調用nn.conv2d那樣)。

​ 重點在於為什么使用反卷積,而不是簡單的上池化操作來還原分辨率。要知道,額外設計卷積層會增加很多參數,拖慢訓練速度。個人覺得很重要一個原因在於單純的上池化是不包含有效信息的。可以看一下下圖:(圖片摘自《Learning Deconvolution Network for Semantic Segmentation》)

img

​ 左圖是簡單的上池化結果,右圖則是反卷積的結果。對於即將得出的稠密光流圖來說,顯然僅僅做到左圖是不夠的。這樣子得到的圖片即便對剩余的分辨率進行了填充,也不能夠符合預期。因此這一步額外的卷積操作是必要的。雖然如此,但從訓練結果來看這部卷積操作並不會對光流的整體預測效果產生巨大影響,因此被稱作“refinement”。

image-20210703184507434

(上圖是我用sintel數據集跑的結果。可以看到整個反卷積中分辨率逐漸擴大的過程)

​ 想法雖然簡單易懂,但是這個模型的缺點同樣十分明顯。

​ 首先,模型的計算量很大。這一點稍加判斷即可得知:在模型的中間設計了很多512in&&512out的卷積層。盡管卷積核大小為3,這些層次結構所帶來的需要迭代的參數和計算量也是巨大的。

​ 同時,網絡不同位置的收斂速度不一樣。由於其思路非常簡單,把很多工作都交給了反向傳播算法來完成。模型往往只能達到局部參數最優點,整個網絡則很難達到一個平衡。

2.2 Flow net correlation

​ 針對上面提出的種種問題,原文作者在同一篇文章中提出了另一種替代性的模型:FlowNet Corr。表面上這一模型的並沒有對模型結構帶來很大的改動,但實際上卻成了FlowNet最重要的貢獻之一。

特征提取&光流生成

​ 同樣先對這個模型給出一個簡單的overview。兩個模型最直觀的區別在於,對Corr來講,模型的特征提取是先分開進行之后再合並的。模型將分別對Img1和Img2進行特征提取(雖然使用了同樣的網絡結構,但區別於現在channel上合並再做卷積,FlowNet Corr中選擇分別對兩個圖片做兩次相應操作),之后利用一步名為“”correlation“的操作對兩個圖片中的特征值進行合並激活,最后再經歷卷積、反卷積的過程,輸出光流結果。

Correlation : 相關聯操作

​ 在模型到達相關聯層之前,已經得到了兩張256channel的特征圖,分別對應Img1和Img2。這時需要一種操作能夠比對並激活兩張特征圖中相關聯的向量,這步操作就是correlation。

​ 毫無疑問,Correlation操作是整個Flow Net Corr最為重要的一步。聽起來很炫酷,但這一步操作本質上就是一步卷積運算而已。只不過相比CNN中使用特定的卷積核進行卷積,這里使用一個數據對另外一個數據做卷積操作。

​ 為什么使用兩個feature map 卷積就可以得到相關聯的向量?我覺得在這方面有一個比較接近的例子,各位讀者可以看看這里,也許可以獲得一些提示。下面給出相關聯操作的數學定義:

​ 對於兩張特征圖f1,f2上的兩個patch來講,這兩個patch在x1,x2處的相關聯值可以表示為:

\[C(x1, x2) = \sum (f1(x1 + o),f2(x2 + o)) \\(o∈[−k,k]×[−k,k]) \]

其中,對應的patch為一個邊長為2K+1大小的正方形。

​ 通過這樣的計算,模型確實可以比較兩張特征圖之間的全部像素點,使相對應的部分的到激活。但問題在於,這樣的計算量是巨大的。在前一篇博客中,我們提到過計算光流時所面臨的計算量過大問題。提出新的模型,理論上需要減少計算量,而不是增加計算量。然而, 在上面這個相關聯計算中,計算一對patchc(x1, x2)需要進行$$ c*K^2 $$次的乘法運算,而計算兩張圖片的所有相關聯值就至少需要$$ (w^2) * (h^2) $$次的乘法運算,這顯然是不合理的。

​ 因此,作者引入了一條新的假設來解決這一問題。這里引入假設的思路其實和傳統的、手工設計的模型思路很相似。作者假設對應像素點的位移只存在於一個固定的范圍內。這樣在真正計算相關聯信息時,模型只需要維持一個固定大小的查找窗,超出這個查找窗范圍之外的東西便不予考慮了。

​ 假設這個最大位移為d,通過限制x2的出現范圍,相關聯操作c(x1, x2)只會在 D=2d+1的領域內進行計算。 同時,模型還可以使用步長來進一步減少計算量。這一計算的最終結果是4維的(w*h*D^2)(這里注意是D而不是d!通常這個位移限制為d=4,因此相關聯向量是w*h*81大小的),因此也經常被后續的論文稱為4D相關聯向量。

​ 另外需要說明的一點是,這一部分操作是不包含可訓練參數的,因此不會對模型的訓練和收斂速度產生非常大的影響。

refinement

​ refinement這一部分的結構和FlowNet S 是一樣的,因此這里不再展開。

2.3 estimate

​ 下面簡單看一下模型在不同數據集下的表現。(源於論文)

image-20210707003005659

image-20210706130513452

image-20210706131207764

​ 上圖是FlowNet與EpicFlow 在Sintel 數據集與Flying Chairs數據集下的結果對比結果(注意Images 中的重影是因為兩幀圖片疊在了一起)。盡管FlowNet 的end point error 不一定完全吊打早期模型,可以還是有一些優點:首先,對於小而快速的運動物體,FlowNet有着更好的識別效果;其次,雖然epe不夠,但是模型的細節保留的更好(盡管我覺得作者有自吹自擂的嫌疑,哈哈哈哈)

3 模型結論與啟發

​ 作為第一篇基於CNN的光流預測模型,FlowNet很出色的完成了自己的任務。盡管在Epe等數據上並沒有完全的壓制其它模型,但FlowNet確實提供了一種很優秀的思路,即:利用correlation 這一操作對相似的圖片特征進行激活, 並利用卷積網絡實現特征-->光流的映射。在領域內后續的一些論文中,很多都使用了相關聯這一操作,甚至繼承了大小為9的這一查找窗大小。因此理解FlowNet顯然是對后續學習至關重要的。

​ FlowNet同樣暴露出了基於深度神經網絡實現光流預測這一方法中的幾個關鍵問題:1,圖片模糊、抖動、遮擋情況下的識別問題(同樣是cv領域大部分算法的共性問題);2,高速運動物體的識別問題。在FlowNet中,模型設計了一個大小為9*9的查找窗,以限定對應像素點的移動范圍。然而當物體移動方向超過這一部分之后,模型便不再能夠提出有效的解。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM