【Tensorflow】如何使用PWC-Net網絡輸出運動中的光流圖像

對應的項目:PWC-Net
對應的論文:PWC-Net: CNNs for Optical Flow Using Pyramid, Warping, and Cost Volume, CVPR 2018 (Oral)
在這裏由於原項目是使用pytorch和caffee的,所以我找的是一個tensorflow版本
項目地址

PWC-net是一個能夠根據兩張圖像來輸出對應的光流圖,光流是一種矢量

概念介紹

  • 對於光流

    • 矢量方向代表色相
    • 矢量長度代表飽和度
  • 評估光流估計的質量方法——angular error 和 endpoint error

    • angular error(AE) :arccos((u0,v0)*(u1,v1))
    • endpoint error:(PE) sqrt((u0-u1)^2)
    • (u0,v0),(u1,v1)爲兩個光流矢量
    • AE*PE越小,質量越好

基本思想

PWC在FlowNet2的基礎上添加了domain knowledge

光流估計的基本思路是像素在從frame 1切換到frame 2的過程中,儘管位置發生了改變,但是大部分亮度依舊保持。我們能夠在frame 1抓取一個小的patch,在frame 2找到另一個小的patch,最大化兩個patches之間的一些關係

在frame 1中滑動patch,尋找到一個peak,生成cost volume,這樣的結果非常robust,但是計算代價太大。一些情況下,需要一個更大的patch來減少frame 1中的false positives數量,進一步提升複雜性

爲了減少生成的cost volume,

第一步優化 ,pyramidal processing ,使用一個低分辨率圖像滑動更小的patch,在較小版本上執行從frame 1到 frame 2的搜索。因此返回一個更小的運動矢量,再將這個運動矢量作爲hint到下一層金字塔去執行更有針對性的搜索

這樣的“多層運動估算”能夠在圖像域或者特徵域(使用convnet生成的縮減特徵圖)中執行。

PWC將使用 以較低分辨率估算的運動流的上採樣版本來warps frame1,因爲這樣可以在金字塔的下一個更高分辨率的層中搜索一個較小的運動增量

這裏是2層金字塔說明的過程
在這裏插入圖片描述

相對於SpyNet,FlowNet2,PWC-Net的下面三種方法都不是針對圖像的

在這裏插入圖片描述
這裏的Pyramid,Warping,Cost volume都是優化方法。

除此之外,數據擴充可以得到更好的性能,訓練多個數據集(Sintel+KITTI+HD1K)可以提升robustness

因爲算法僅僅在兩個連續的frames中運行,所以這個算法與僅僅使用圖像對的方法有相同的侷限性。也就是說,如果一個物體移出了幀,那麼預測流很可能有很大的EPE.所以,使用較大數量的frames可以提高容錯性,但是有時候對於較小較快的運動物體,模型會失敗

代碼使用

使用的代碼在pwcnet_predict_from_img_pairs.ipynb文件中
對於這段代碼

# Build a list of image pairs to process
img_pairs = []
for pair in range(1, 4):
    image_path1 = f'./samples/mpisintel_test_clean_ambush_1_frame_00{pair:02d}.png'
    image_path2 = f'./samples/mpisintel_test_clean_ambush_1_frame_00{pair+1:02d}.png'
    image1, image2 = imread(image_path1), imread(image_path2)
    img_pairs.append((image1, image2))

修改其中的文件位置,比如將其改爲兩張圖片的位置

注意,兩張圖片一定要相同大小,否則報錯

運行即可得到最後的光流圖
在這裏插入圖片描述
當然,還可以將一個視頻截取爲很多的圖像文件,放入文件夾中,通過

files=os.listdir(srcPath)

獲得這個文件夾的所有圖片,然後執行循環兩兩配對,就可以得到整個視頻的光流運動了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章