CVPR 2018 論文原文:

Occlusion Aware Unsupervised Learning of Optical Flow?

arxiv.org

用Unsupervised的方法估計視頻的optimal flaw。通過逆求光流生成遮罩層,一定程度上解決了Occlusion的問題。通過擴大搜索區域,一定程度上結果了large motion的問題。

Preliminary

FlowNet :一個用於預測光流的CNN網路。Supervised。

Learning Optical Flow with Convolutional Networks?

arxiv.org

Unsupervised Learning of Optimal Flow: 在 FlowNetS 後面加上Unsupervised 模塊。但是沒有解決Occlusion和 large motion 的問題。

Unsupervised Learning of Optical Flow via Brightness Constancy and Motion Smoothness?

arxiv.org

演算法框架

演算法分為兩層。上層為主要的訓練層,下層為遮罩層。

上層

FlowNetS 輸出 Forward Flow F_{12}。 理想情況下, I_1(x_1,y_1) 位置上的像素值應該跑到 I_2(x_1+F_{12}^x(x_1,y_1), y_1+F_{12}^y(x_1,y_1)) 位置。因此我們藉助 F_{12}I_2 就能構建出一張warping得到的 hat{I}_1hat{I}_1(x_1,y_1)=I_2(x_1+F_{12}^x(x_1,y_1), y_1+F_{12}^y(x_1,y_1))=I_2(x_2,y_2) 。通過對比 hat{I}_1I_1 ,我們就能訓練 FlowNetS 了。

不過, x_2=x_1+F_{12}^x(x_1,y_1)y_2=y_1+F_{12}^y(x_1,y_1) 可不一定是整數,因此我們取 (x_2,y_2) 周圍4個像素的雙線性插值後的結果[1]:

hat{I}_1(x_1,y_1)=sum_n^H sum_m^W I_2(n,m)max (0, 1-left| x_2-m 
ight|)max (0, 1-left| y_2-n 
ight|)

求導得

frac{partial hat{I}_1(x_1,y_1)}{partial x_2} =sum_n^H sum_m^W I_2(n,m)max (0, 1-left| y_2-n 
ight|) egin{cases} 0& 	ext{if} left| x_2 - m 
ight| geq1 \ 1 & 	ext{if } mgeq x_2 \ -1& 	ext{if } m< x_2 end{cases}

類似的,我們可以求出 frac{partial hat{I}_1(x_1,y_1)}{partial y_2}

我們可以見到導數會促使 (x_2, y_2) 向它周圍四個點中像素值最接近 I(x_1,y_1) 的那個點移動。而如果它周圍的四個點都和 I(x_1,y_1) 的像素值差別都比較大的時候,求導會得出錯誤的方向。為了解決這個問題,這篇文章在 bilinear 的基礎上提出了新的 sampling 方法:

演算法在 (x_2,y_2) 周圍創造了一個更大的取值範圍,在這個範圍里選取一個像素值與_ I_1(x_1,y_1) 最接近的點 (hat{x},hat{y}) ,並以(hat{x},hat{y})和它相對於(x_2,y_2)的三個鏡像點做 bilinear interpolation。比如上圖中,如果採用基本的 bilinear 方法,應該選擇四個黑色的點。而論文提出的方法則是選用四個帶有紅色加號的點做 bilinear interpolation,從而計算出(x_2,y_2)的像素值,接著便能求導,從而逐漸靠近 (hat{x},hat{y})

下層

輸入時先將 I_2I_1 調換,FlowNetS 輸出 Backward Flow F_{21}F_{21} 用來生成一個遮罩層: F_{21} 可以將 I_2 回退到 I_1 的狀態,這是圖像上必然有一些空缺的地方,這些地方就是 I_1 因為視角變化而被遮擋的像素。網路就不用費勁在 I_2 中匹配這些像素了,因為這些像素在 I_2 根本就不存在。

上圖就是一個例子。我們從左上角開始看, I_1 中的B像素在 I_2 中是被遮擋的,A像素從 (1,1) 移動到了 (1,2) , 所以 F_{21}(1,2)=-1 。我們根據 F_{21}I_2 回退到 I_1 的狀態,可以發現A被移回了 (1,1) , 同時 (1,1) 的位置上還有E像素,所以 V(1,1)=2 。而 V(1,2)=0 ,說明 I_2 中沒有任何像素是由 I_1(1,2) 而來。對 V 取一個閾值,便得到了遮罩層 O

數學表達:

V(x_1,y_1)=sum_{x_2}^W sum_{y_2}^H max(0,1-left| x_1-(x_2+F_{21}^x(x_2,y_2) 
ight|) \ cdot max(0,1-left| y_1-(y_2+F_{21}^y(x_2,y_2) 
ight|)

因為  x_2+F_{21}^x(x_2,y_2) 不一定是一個整數,所以還需要用上文中的 bilinear interpolation方法。

Loss Function

Photometric Loss

用 Charbonnier penalty formula Psi (s)=sqrt{s^2+0.001^2} 來計算Photometric Loss。L_p^1 用來衡量image brightness的loss, L_p^2 用來衡量image gradient的 loss。

L_p^1=frac{sum_{i,j} Psi (hat{I}_1(i,j)-I_1(i,j)) cdot O(i,j)}{sum_{i,j}O(i,j)}

L_p^2=frac{sum_{i,j} Psi (	riangledown hat{I}_1(i,j)-	riangledown I_1(i,j)) cdot O(i,j)}{sum_{i,j}O(i,j)}

Smoothness Loss

Photomatric loss 只有在非遮擋區域才有效。而對於被遮擋的區域,我們用Smoothness Loss來進行優化。一般來說,一個物體的光流是比較smooth的,所以光流圖像中的邊緣要和原圖中的邊緣基本一致。所謂邊緣,其實就是圖像的一階導數 partial_d

L_s^1=sum_{i,j} sum_{din{x,y}} Psi(left| partial_d F_{12}(i,j)
ight| e^{-alpha left| partial_d I_1(i,j) 
ight|})

L_s^2=sum_{i,j} sum_{din{x,y}} Psi(left| partial_d^2 F_{12}(i,j)
ight| e^{-alpha left| partial_d I_1(i,j) 
ight|})

Smooth Loss 最早被用於[2]. 我是這樣理解這個式子的: left| partial_d F_{12}(i,j)
ight| 代表光流的平滑程度,這個值越小,光流越平滑。可是我們只希望物體內部的光流儘可能平滑,物體邊緣地方的光流大一些也沒有所謂,因此我們就成一個係數 e^{-alpha left| partial_d I_1(i,j) 
ight|}) 。在物體邊緣, e^{-alpha left| partial_d I_1(i,j) 
ight|} 很小,在物體內部, e^{-alpha left| partial_d I_1(i,j) 
ight|} 趨近於1。

除此之外,這篇文章還對FlowNetS的結構進行了一些小調整。

參考文獻

[1] Jaderberg, Max, Karen Simonyan, and Andrew Zisserman. "Spatial transformer networks."Advances in neural information processing systems. 2015.

[2] Heise P, Klose S, Jensen B, et al. Pm-huber: Patchmatch with huber regularization for stereo matching[C]//Proceedings of the IEEE International Conference on Computer Vision. 2013: 2360-2367.


推薦閱讀:
相关文章