尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
出於節省空間等方面的考慮,手機、普通錄影機錄制的視頻單位時間包含的幀數往往較少,慢放時幀率進一步下降,無法還原太多細節。高速錄影機的出現彌補了這一不足,但成本較高。那麼,只擁有普通設備的人要如何獲取高幀率視頻呢?
今年 6 月份,英偉達發布了一篇生成高質量慢動作視頻的論文——《Super SloMo: High Quality Estimation of Multiple Intermediate Frames for Video Interpolation》,探討了如何將普通設備錄制的視頻轉換為高幀率慢動作視頻。這項工作的原理是在臨近的兩幀之間補充額外的畫面幀。讓我們先來看一下效果:
額… 英偉達給出的視頻中展示了一個用網球拍快速打破水球的例子,正常速度下的視頻如下:
下圖分別是用原始 SloMo 和 Super SloMo 軟件製作的慢速視頻。
從圖中可以可出,用原始 SloMo 軟件製作出的慢速視頻雖然也讓我們看到了一些肉眼無法捕捉到的細節,但相比之下,用 Super SloMo 製作的慢速視頻還原的細節更多,畫面也更加流暢。這是因為二者有著本質的區別,前者並沒有生成新的視頻幀,而後者則利用神經網路生成了新的視頻幀,使得畫麵包含的幀數更多,從而增加了視頻細節和流暢度。
在看看下方的賽車甩尾,原視頻為 30FPS。看起來沒毛病吧,那慢速播放之後呢?
看下圖上方,原來流暢的甩尾變得像是一張張照片擺拍湊出來的定格動畫(P 水花比甩尾簡單多了吧),但經過算法補幀變成 240FPS 之後,下方的片段立刻有了 Fast & Furious 即視感。
遺憾的是,作者發布論文的時候並沒有放出數據集和代碼,讓想要做到這一炫酷技術的 geek 們大失所望。但是(劃重點),群眾的力量是偉大的。最近,GitHub 一位名為 avinashpaliwal 的用戶開源了自己對 Super SloMo 的 PyTorch 做到:
Github 地址:https://github.com/avinashpaliwal/Super-SloMo
Super SloMo 的 PyTorch 做到
結果
使用作者提供的評估腳本在 UCF101 數據集上的結果。用的腳本是 et_results_bug_fixed.sh。它在計算 PSNR、SSIM 和 IE 時使用了運動掩碼(motions mask)。
先決條件
該代碼庫是用 pytorch 0.4.1 和 CUDA 9.2 進行開發測試的。
訓練
準備訓練數據
要使用提供的代碼訓練模型,首先需要以某種方式格式化數據。
create_dataset.py 腳本使用 ffmpeg 從視頻中提取幀。
至於 adobe240fps,下載下面這個數據集,解壓並運行以下命令:
python datacreate_dataset.py –ffmpeg_dir pathtoffmpeg –videos_folder pathtoadobe240fpsvideoFolder –dataset_folder pathtodataset –dataset adobe240fps
數據集:http://www.cs.ubc.ca/labs/imager/tr/2017/DeepVideoDeblurring/DeepVideoDeblurring_Dataset_Original_High_FPS_Videos.zip
評估
預訓練模型
你可以從以下地址下載在 adobe240fps 數據集上訓練的預訓練模型:
https://drive.google.com/open?id=1IvobLDbRiBgZr3ryCRrWL8xDbMZ-KnpF
這個模型怎麼玩才好玩呢?拿出過去渣手機拍攝的珍藏片段,慢動作回放一下是不是更有味道?
那些為自制電影設備費用發愁的是不是來勁了?
還有,那些每次一到高速戰鬥情節就經費嚴重不足的動畫製作組是不是覺得相見恨晚?
有了它,一些動畫是不是能多更新半年了?
論文
(adsbygoogle = window.adsbygoogle || []).push({});
- 項目鏈接:https://people.cs.umass.edu/~hzjiang/projects/superslomo/
- 論文鏈接:https://arxiv.org/pdf/1712.00080.pdf
摘要:給定兩個連續的幀,視頻插值旨在生成中間幀,以形成空間和時間相乾的視頻序列。大多已有的方法都集中於單幀插值上,本文提出了一種用於可變長度多幀視頻插值的端到端卷積神經網路,其中運動解釋(motion interpretation)和遮擋推理(occlusion reasoning)是聯合建模的。該研究從使用 U-Net 架構計算輸入圖像之間的雙向光流開始。隨後,這些流在每個時間步被線性組合,以近似中間雙向光流。然而,這些近似流僅在局部平滑區域有用,且在運動邊界周圍產生偽影。
為了解決這個不足,作者利用另一個 U-Net 來細化近似流並預測軟可視圖(soft visibility map)。最終,兩個輸入圖像被變形並線性融合以形成每個中間幀。通過在融合之前把可視圖應用於變形的圖像上,作者排除了遮擋像素對插值中間幀的貢獻,以避免偽影。由於所學到的網路參數都不依賴於時間,所以本文的方法能夠根據需要產生很多中間幀。作者使用 1132 個每秒 240 幀的視頻片段(包含 30 萬個單獨的視頻幀)來訓練其網路。在多個數據集上的實驗(預測不同數量的插值幀)結果表明本文的方法比現有的方法性能更好。
方法
研究者使用了光流插值的方法來合成中間幀,基於兩個關鍵要素:時間一致性和遮擋推斷。
時間一致性是指:中間幀 I_t 可以通過初始幀 I_0 結合光流(optic flow,F)的轉換 g(·) 而成,也可以通過結束幀 I_1 結合光流 F 轉換而成,一般形式是兩者的線性組合。
一般而言,隨著時間流動,I_t 的圖像特徵會從更接近 I_0 變得更接近 I_1,所以α_0 應該是 t 的線性函數(不考慮遮擋時)。當 t=0 時,α_0=1;當 t=1 時,α_0=0。
如圖 2 所示:
圖 2:光流插值結果的示例,其中 t=0.5。完整的場景向左移動(錄影頭平移),摩托車也向左移動。最後一行展示了光流插值 CNN 的微調主要在運動邊界處進行(像素越白,微調程度越高)。
遮擋推斷是指:在 I_0 中出現的像素(或物體),在 I_1 中可能不出現,反之亦然。那麼就要考慮 I_t 在遮擋情況下對兩個輸入幀的權重,用可視圖(visibility maps,V)表示。
所以,最終的中間幀合成等式為(Z 是歸一化因子):
如圖 3 所示:
圖 3:預測可視圖的樣本,其中 t=0.5。運動員的手從 T=0 到 T=1 往上舉。因此手臂右上方區域在 T=0 時是可見的,在 T=1 時是不可見的(被遮擋)。第四行的可視圖清晰地展示了這個現象。V_t←0 中手臂周圍的白色區域表示 I_0 中的這些像素對合成ˆI_t 的貢獻最大,黑色區域表示這些像素對合成ˆI_t 的貢獻最小。V_t←1 也是同樣的道理。
由於中間幀本身是需要預測的,不是預先存在的,因此需要用 I_0 和 I_1 之間的光流對 I_t 和 I_0、I_1 之間的光流進行近似:
此外關於遮擋推斷,同樣很自然地假設:當 t 接近 0 的時候,I_t 更接近 I_0;當 t 接近 1 的時候,I_t 更接近 I_1。
所以,最終的架構設計如下:其分為兩個階段,第一個階段將 I_0、I_1 輸入到光流計算 CNN 中,得到兩者之間正向和反向的光流;第二個階段再以 I_0 和 I_1 之間的光流、I_0 和 I_1、I_0 和 I_1 到 I_t 的變換函數、I_0 和 I_1 到 I_t 的近似光流為輸入,得到可視圖以及 I_0 和 I_1 到 I_t 的近似光流的增量。結合這些量,就可以直接算出最終的 I_t,如下圖所示。
損失函數分為四個項:重建損失(Reconstruction loss),合成幀和數據集中間幀的 L1 損失;感知損失(perceptual loss),減少圖像模糊;轉換損失(Warping loss.),圖像幀和經其它幀光流變換輸出之間的 L1 損失;平滑度損失(Smoothness loss),限制光流函數的梯度。
圖 9:主要 CNN 架構為 U-Net。
圖 8:在高幀數 Sintel 數據集上生成 31 張中間幀時每個時間步的 PSNR 值對比。
讀者還可以查看論文在 CVPR 2018 spotlight video 的論文講解:
本文為機器之心報導,轉載請聯繫本公眾號獲得授權。