化秋毫為波瀾:運動放大演算法(深度學習版)
什麼是運動放大(Motion Magnification)?
將視訊中對應位置的運動進行放大,簡單理解的話,就是找到時間段內的運動向量,進行放大,然後權值疊加回去。
為什麼需要運動放大?
因為很多自然界或者生物的 subtle behaviour 不易被肉眼察覺(如飛機翼的震動,受風影響搖晃的建築,生物面板變化等等),這些微變化只有通過運動放大,才能更好地被機器或者人類來做後續的視訊視覺任務。
運動放大的難點?
如何在運動放大的同時,儘量保持 apperance 不變?如何不引入大量噪聲? 如何保證放大後的動作平滑?沒有現存的資料集來訓練?
傳統方法的發展歷程:
MIT在2012年首次提出了 Eulerian Video Magnification[1] ,第一次實時且相對魯棒地應用到一些場景,如遠端心率脈搏提取,記得多年前看到宣傳的video是非常地震撼~~因為之前做運動放大,都不是用Eulerian方法,而是用Lagrangian視角去做(即運動估計,tracking啥的,非常耗時)
問題描述如下:
原始訊號 表示影象在位置 和時刻 t的亮度值,而 表示運動偏差。目標就是通過調整運動放大係數 來生成放大後的訊號
文中通過實驗發現,temporal filter可以模擬 spatial translation,故問題就簡化為 提空間特徵+設計時間維度上的濾波器。
演算法的流程如下:
1.對視訊每一幀都進行拉普拉斯金字塔處理,得到Multi-scale的邊緣及形狀描述
2. 對每個scale的特徵voxel進行pixel-wise 時間上的帶通濾波,增強感興趣頻率上的訊號,過濾掉不感興趣頻率的噪聲
3. 對filtered完的訊號進行運動放大,疊加回濾波前的特徵voxel;最後將金字塔重構融合。
該方法的cons:
1. 濾波器只能抑制某些頻率的噪聲,但乘以運動放大係數後,在帶通頻段的噪聲也會放大
2. 若物體本身非靜止,而在運動,該放大演算法生成的圖很模糊
故根據以上不足,後面又有兩個經典的變形:
-
2013年MIT又提出了 Phase-based 運動放大[2],使用了complex-valued steerable pyramids 來得到相點陣圖再進行濾波,抗噪能力更強;
-
CVPR2017,Zhang et al.提出了 Acceleration Magnification[3],設計了二階加速度濾波器,使生成的視訊在 large motion 下效果更好。
Learning-based 運動放大[4] ECCV2018 oral
難得的好文章,不像很多文章直接設計個網路,設計個loss完事~~作者對傳統方法的每個stage認知很深,然後把深度學習只是當成一個工具,來複現改造傳統方法的每個stage。
Main Contribution:
1. 第一個使用深度學習端到端地進行運動放大,不需要手工設計特徵,從資料裡自主學到濾波器。
2. 在無現有資料集訓練的情況下,利用COCO和VOC生成資料來訓練。
3. 與傳統方法的temporal filter相相容,且在運動係數適中的情況下,效果比單獨使用全域性Learning的效果還好。
再看回同一條公式:
同一個目標:通過網路來學習前後幀( 的空間特徵,然後通過兩幀特徵差異來得到 ;接著通過對感興趣部分的運動特徵進行放大 疊加回前幀 ;最後生成運動放大的後幀 (即 的集合)。整體架構如下圖所示:
演算法流程如下:
Stage1: 設計Encoder 進行形狀特徵和紋理特徵的提取,類比文章[1]中的拉普拉斯金字塔提取的多尺度邊緣形狀特徵。給定前後幀( ),通過網路 可以得到它們各自的形狀特徵 , 和紋理特徵 , 。這裡的紋理特徵不進行運動放大,主要用於後續約束Intensity放大導致的噪聲。
Stage2: 把前後幀的形狀特徵送進 Manipulator,來模擬文章[1]中帶通濾波器及運動放大,權值疊加的過程。這裡的修改器 G_{m} 有線性和非線性兩種表達:
而下圖網路給出的修改器網路是基於非線性表達,就是加了 和 運算,文中給出的實驗結果圖是非線性的效果更好,具體也沒解釋。個人覺得非線效能更好地模擬帶通濾波器的功能,能放大部分更感興趣的,過濾掉一部分不太感興趣的~~
Stage3: Decoder,來模擬文章[1]中金字塔重構融合過程。這裡解碼器需要用到放大後的形狀特徵 及前幀的紋理特徵
講完了網路結構,來說說 Loss function,共由4部分loss組成,都用L1距離來作為度量。為了讓Encoder能區分地學出形狀特徵和紋理特徵,隨機地加了color intensity擾動在某些幀上,這裡 perturbed frames 及 其運動放大的 groundtruth 分別為 和
-
約束生成的運動放大圖 與 groundtruth 儘量一致
-
約束前後幀的紋理表達儘量一致
-
約束運動放大前後的擾動幀的紋理表達儘量一致
-
約束擾動前後的形狀表達儘量一致
故總Loss為:
兩種不同模式 與 基於時間維度濾波的修改器:
Static mode:這是最原始的公式定義的形式,總是拿第一幀作為anchor,則送進網路的兩幀為 ( , )
Dynamic mode: 總是把當前幀和上一幀作為網路的輸入 ( )
Temporal filtering based manipulator:
在修改器中,不需要再進行 和 的特徵差異運算;直接類似文章[1]中的 pixel-wise temporal filter 操作,進行時間維度的帶通濾波 (這環節不需要訓練,是在靜態或者動態模式訓練好的網路基礎上,直接接上filters前向傳播即可) 。公式如下:
具體關於生成的資料集如何carefully designed,感興趣的同志自己找回原文看了,主要圍繞幾個因素去設計:多變的前景和背景;低對比度紋理;全域性運動;靜態場景;不同放大係數的運動;亞畫素運動 等等。
實驗結果:
如下圖,可見放大8倍情況下,基於學習的演算法,比Phase-based[2]的結果要少很多artifacts,也不那麼blurred
再如下圖,在不加 Temporal filter 的靜態模式下,結果也不錯,基本沒有人工的噪聲和blur;而加了 Temporal filter 後的結果更加平滑穩定。
通過視覺化encoder中的kernel可以發現,學到的形狀特徵更多是基於 Gabor-like, Laplacian-like, Corner detector-like濾波器;而紋理特徵對應的更多像blur kernel。證明設計的loss約束引導的learning是很有效很成功的~~
總結展望:
文中作者也說了,該網路一大驚喜就是,學出來的形狀特徵是呈線性的,又因為線性 temporal filter 與運動偏移是相容的,故形狀特徵也能相容 temporal filter。但是在 放大倍數很大的情況下 (如50倍),使用 temporal filter 的效果並不好,影象質量退化嚴重。
故未來方向之一是,如何使temporal filter更好地相容網路。從我個人來看,是否可以直接在manipulator 裡設計個temporal pooling的小網路來自適應地實現 temporal filter 的功能?當然啦,這樣輸入的話就很多幀,而不是 two frames 了。。。
Reference:
[1] Hao-Yu Wu, Eulerian Video Magnification for Revealing Subtle Changes in the World, 2012
[2]Neal Wadhwa, Phase-Based Video Motion Processing, 2013
[3]Yichao Zhang, Video Acceleration Magnification,CVPR2017
[4]Tae-Hyun Oh, Learning-based Video Motion Magnification,ECCV2018