首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >化秋毫为波澜:运动放大算法(深度学习版)

化秋毫为波澜:运动放大算法(深度学习版)

原创
作者头像
SIGAI学习与实践平台
发布2018-10-17 17:04:07
1.9K0
发布2018-10-17 17:04:07
举报

SIGAI特约作者

Fisher Yu

CV在读博士

研究方向:情感计算


什么是运动放大?

运动放大(Motion Magnification),将视频中对应位置的运动进行放大,简单理解的话,就是找到时间段内的运动矢量,进行放大,然后权值叠加回去。

为什么需要运动放大?

因为很多自然界或者生物的 subtle behaviour 不易被肉眼察觉(如飞机翼的震动,受风影响摇晃的建筑,生物皮肤变化等等),这些微变化只有通过运动放大,才能更好地被机器或者人类来做后续的视频视觉任务。

运动放大的难点?

如何在运动放大的同时,尽量保持 apperance 不变?如何不引入大量噪声? 如何保证放大后的动作平滑?没有现存的数据集来训练?

传统方法的发展历程

MIT在2012年首次提出了 Eulerian Video Magnification[1] ,第一次实时且相对鲁棒地应用到一些场景,如远程心率脉搏提取,记得多年前看到宣传的video是非常地震撼~~因为之前做运动放大,都不是用Eulerian方法,而是用Lagrangian视角去做(即运动估计,tracking啥的,非常耗时)

问题描述如下:

\hat{I}(x,t)=f(x+(1+\alpha)\delta(t))

算法的流程如下:

1.对视频每一帧都进行拉普拉斯金字塔处理,得到Multi-scale的边缘及形状描述

2. 对每个scale的特征voxel进行pixel-wise 时间上的带通滤波,增强感兴趣频率上的信号,过滤掉不感兴趣频率的噪声

3. 对filtered完的信号进行运动放大,叠加回滤波前的特征voxel;最后将金字塔重构融合。

Eulerian 运动放大框架[1]
Eulerian 运动放大框架[1]

该方法的cons:

1. 滤波器只能抑制某些频率的噪声,但乘以运动放大系数后,在带通频段的噪声也会放大

2. 若物体本身非静止,而在运动,该放大算法生成的图很模糊

故根据以上不足,后面又有两个经典的变形:

1.2013年MIT又提出了 Phase-based 运动放大[2],使用了complex-valued steerable pyramids 来得到相位图再进行滤波,抗噪能力更强;

2.CVPR2017,Zhang et al.提出了 Acceleration Magnification[3],设计了二阶加速度滤波器,使生成的视频在 large motion 下效果更好。

Learning-based 运动放大

[4] ECCV2018 oral

论文地址:https://arxiv.org/abs/1804.02684

项目地址:https://github.com/12dmodel/deep_motion_mag

难得的好文章,不像很多文章直接设计个网络,设计个loss完事~~作者对传统方法的每个stage认知很深,然后把深度学习只是当成一个工具,来复现改造传统方法的每个stage。

Main Contribution:

1. 第一个使用深度学习端到端地进行运动放大,不需要手工设计特征,从数据里自主学到滤波器。

2. 在无现有数据集训练的情况下,利用COCO和VOC生成数据来训练。

3. 与传统方法的temporal filter相兼容,且在运动系数适中的情况下,效果比单独使用全局Learning的效果还好。

再看回同一条公式:

\tilde{I}(x,t)=f(x+(1+\alpha)\delta(x,T))
整体框架图[4]
整体框架图[4]

算法流程如下:

Stage1: 设计Encoder 进行形状特征和纹理特征的提取,类比文章[1]中的拉普拉斯金字塔提取的多尺度边缘形状特征。给定前后帧(Xa,Xb),通过网络Ge可以得到它们各自的形状特征Ma,Mb和纹理特征Va,Vb。这里的纹理特征不进行运动放大,主要用于后续约束Intensity放大导致的噪声。

Encoder【4】
Encoder【4】

Stage2:把前后帧的形状特征送进 Manipulator,来模拟文章[1]中带通滤波器及运动放大,权值叠加的过程。这里的修改器Gm有线性和非线性两种表达:

而下图网络给出的修改器网络是基于非线性表达,就是加了g(●)和h(●)运算,文中给出的实验结果图是非线性的效果更好,具体也没解释。个人觉得非线性能更好地模拟带通滤波器的功能,能放大部分更感兴趣的,过滤掉一部分不太感兴趣的~

Stage3: Decoder,来模拟文章[1]中金字塔重构融合过程。这里解码器需要用到放大后的形状特征Ma及前帧的纹理特征Va.

Decoder[4]
Decoder[4]

讲完了网络结构,来说说 Loss function,共由4部分loss组成,都用L1距离来作为度量。为了让Encoder能区分地学出形状特征和纹理特征,随机地加了color intensity扰动在某些帧上,这里 perturbed frames 及 其运动放大的 groundtruth 分别为Xb' 和Y'

故总Loss为:

Loss=L1(Y,\tilde{Y})+\lambda(L1(V_{a},V_{b})+L1(V_{b}^{'},V_{Y}^{'})+L1(M_{b},M_{b}^{'}))

两种不同模式 与 基于时间维度滤波的修改器:

Static mode:这是最原始的公式定义的形式,总是拿第一帧作为anchor,则送进网络的两帧为(X0,Xt)

Dynamic mode: 总是把当前帧和上一帧作为网络的输入(Xt-1,Xt)

Temporal filtering based manipulator:

在修改器中,不需要再进行MaMb的特征差异运算;直接类似文章[1]中的 pixel-wise temporal filter 操作,进行时间维度的带通滤波 (这环节不需要训练,是在静态或者动态模式训练好的网络基础上,直接接上filters前向传播即可) 。公式如下:

G_{m},temporal(M(t),\alpha)=M(t)+\alpha\tau(M(t))

具体关于生成的数据集如何carefully designed,感兴趣的同志自己找回原文看了,主要围绕几个因素去设计:多变的前景和背景;低对比度纹理;全局运动;静态场景;不同放大系数的运动;亚像素运动 等等。

实验结果:

如下图,可见放大8倍情况下,基于学习的算法,比Phase-based[2]的结果要少很多artifacts,也不那么blurred

运动放大8倍的结果对比[4]
运动放大8倍的结果对比[4]

再如下图,在不加 Temporal filter 的静态模式下,结果也不错,基本没有人工的噪声和blur;而加了 Temporal filter 后的结果更加平滑稳定。

加上Temporal Filter的效果[4]
加上Temporal Filter的效果[4]

通过可视化encoder中的kernel可以发现,学到的形状特征更多是基于 Gabor-like, Laplacian-like, Corner detector-like滤波器;而纹理特征对应的更多像blur kernel。证明设计的loss约束引导的learning是很有效很成功的~

Encoder形状核[4]
Encoder形状核[4]
Encoder纹理核[4]
Encoder纹理核[4]

总结展望

文中作者也说了,该网络一大惊喜就是,学出来的形状特征是呈线性的,又因为线性 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,ECCV201

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档