2022年4月30日 星期六

利用深度學習解決 optical flow 的問題

本文將介紹兩篇利用深度學習解決 optical flow 的文章:

  1. FlowNet: Learning Optical Flow with Convolutional Networks
  2. RAFT: Recurrent All-Pairs Field Transforms for Optical Flow

關於 optical flow 的介紹可以參考前文:

FlowNet

FlowNet 是相當早期(2015)的文章,主要的想法是將 CNN 串接在一起來預測每個像素的 optical flow;其中加入了一些設計巧思:

FlowNet

上半部為第一個架構 FlowNetSimple,就是將數層 CNN 串聯起來預測 optical flow。下半部的架構運用了 correlation layer 將兩個 view 的資訊混合在一起,其計算方法如下:

Correlation layer

也就是直接計算兩張圖的 correlation。本文比較了兩種架構,並且提到了 FlowNetCorr 架構比較容易 overfitting。

最後稍微介紹一下 refinement layer:

refinement layer

可以看出主要的概念是 1*1 convolution、deconvolution 及將原始的 feature map 拿過來一起計算。

RAFT

Recurrent All-Pairs Field Transforms for Optical Flow (RAFT) 這篇文章的模型架構包含了 feature map、多個 scale 的 correlation map、以及運用 GRU (Gate Recurrent Unit) 來迭代更新 dense optical flow map。以下是架構圖:

RAFT

首先是 feature encoder 與 context encoder 都用 CNN 與 residual block 建構而成,其中 feature encoder 對於兩張圖是共用同一個網路,而 context encoder 是用來提供 GRU 的 optical flow 預測,雖然架構相同但不共用網路的參數。

第二部分是計算兩個 feature map 的 correlation volume,為 H*W*H*W 的張量。物理上的意義為左圖每一個像素至右圖每一個像素的 correlation。接下來是將此方法建構在不同 scale 的 pyramid 上,可以處理比較大的 displacements。為了加速查詢 correlation map,本文提出了 Correlation Lookup 的方法來建構 local grid:

correlation lookup

GRU 的迭代更新

首先將 dense flow map 都設為 0,並產生 GRU 的初始狀態 \(h_0\),再用以下式子更新:

其中 \(x_t\) 為將現在的 flow map、經由 correlation lookup 產生的 correlation map、context encoder 產生的 context 接在一起,而輸出的 \(h_t\) 一方面會成為下一回合 GRU 的輸入,同時經由兩層 CNN 產生這一回合的 delta flow \(\Delta f\),再將 \(f\) 與 \(\Delta f\) 相加當成目前為止的 flow map。最後經過十回合後再輸出 upsample 過後的 flow map 即為這兩張圖片的 optical flow map。

參考資料

[1] FlowNet: Learning Optical Flow with Convolutional Networks

[2] RAFT: Recurrent All-Pairs Field Transforms for Optical Flow