计算射影新技术:微小动作放大器

2020 年 1 月 19 日 计算机视觉life

点击上方“计算机视觉life”,选择“星标”

快速获得最新干货


本文作者知乎专栏:

https://zhuanlan.zhihu.com/hawkcp‍‍

上一次我给大家提到了延时摄影作品中通常会有随机的短期抖动,我介绍了一种算法可以分离短期和长期的运动,并通过滤除短期抖动、增强长期运动来获取到平滑的视频。而很多时候,我们会对视频中的非常隐晦的时域变化感兴趣。所以这一次我会介绍一个计算摄影技术构成的"动作放大器",它能够高效的将视频中的难以用肉眼察觉的变化分离出来,并在重新渲染过程中进行放大,生成新的视频。我初次接触这个应用方向时大吃一惊,我希望也能够带给你这种感觉。

一. 动作放大 (Video Magnification)

在现实世界中,每时每刻都有一些难以察觉的微小变化,这些运动是如此的轻微,如果不注意观察,很难发现。然而有时候我们却有放大和强调这些轻微动作的需要,这一节讲的就是一种特殊的技术,它能够将原始视频中微小的动作放大成显而易见的样子。这里我给出一些有意思的例子,分别演示了动作放大前后的视频。

  • 随着心脏的跳动,血液流过人的面部导致的脸部肤色的变化

  • 下面视频中,小宝贝酣睡着,她的呼吸使得她的身体轻微的上下运动


  • 下面视频中,经过动作放大,我们可以清晰的看到脉搏的跳动



拉格朗日 vs 欧拉

视频动作放大是如何做到的呢?我们要从看待世界上的物体运动的两种观点讲起。

第一个观点是拉格朗日的观点,这是一种经典力学的还原论的哲学观点,认为物体的运动由每个组成它的粒子的运动构成。所以如果我们能够跟踪并操控每个单个粒子的运动,就能够操控物体的运动。回到视频这个领域,则是认为如果能够跟踪和放大每一个感兴趣的像素的运动,就能够放大最后形成的视频中的动作。



典型的依据拉格朗日的思想进行视频中动作放大的算法是

拉格朗日的思想非常直接易于理解,普通人也能够想到这个方向。然而其实施确实非常的复杂,有时甚至是不可能实现的,因为组成物体的粒子是海量的,如果物体所做的不是刚性运动,很难对物体的运动进行细致的建模和跟踪,更别说放大了。

另外一派观点的代表人物是欧拉,对于视频来说,与其去跟踪每一个粒子的运动,不如去观察视频中每一个固定像素(或区域)的变化。事实上,由于物体的运动,每一个牵涉到的像素点的内容都在随时变化。通过学习这种变化,就可以跟踪到物体的运动规律,通过操控每一个基本单元的值,就可以操控最终视频中物体的运动。


由于视频中感兴趣的像素的个数是很少的,因此欧拉派的观点更容易实现,效果也不错。我们今天要学习的技术就叫做“欧式视频放大”,相关的论文来自2012年SIGGRAPH。它的基本思想是:

  • 每个像素独立看待

  • 视频中每个像素的数据看作是一个时间序列

  • 对每个感兴趣的像素的时间序列信号做标准的1维信号处理

  • 放大特定的频域信号


拿我们最开始提到的血流对脸部颜色的影响来说,如果我们取视频中男子的额头处的一个像素来进行观察,可以看到这个像素的亮度随着时间的变化而变化。由于单个像素容易受到噪声的干扰,因此其时间序列也很难看出什么规律来。但如果我们对该视频的每一帧都做空间上的去噪平滑操作,然后再观察该像素的亮度值的时间序列,我们立马可以观察到一定的规律,即时间序列中出现了一系列局部波峰,而且它们的时间间隔比较规律。


当然,上面说的这种规律也并非那么明显,这是因为有很多因素都会导致中心点的像素亮度变化。如果我们只对心跳导致的面部颜色变化感兴趣,可以在频域上对该视频进行滤波:


这个应用一个很有趣的例子是用来观察电影中明星的心率,下面是蝙蝠侠中的片段

蝙蝠侠的主角的心率变化

正如前面所说,由于心脏的跳动导致血液的循环,我们会发现肤色出现周期性的变化,通过这种变化可以很准确的判断出心脏的跳动频率,精准校正后这种判断甚至可以和专业的设备相媲美。


非接触式婴儿心率判断

上面还仅仅是增强颜色的变化,而这个算法不仅可以增强颜色的变化,还可以增强空间运动动作的变化。下面视频中,上方是一把吉他,中间和下面则是分别对某一根琴弦的振动频率进行放大的结果

增强琴弦振动


二、原理初探

2.1 1维信号模拟

为了理解这个算法的基本原理,我们先来看看1个1维信号随时间发生变化的情况。这一小节主要是想你展示这样一个事实:

为了放大信号的空间运动,我们不用去跟踪画面的每一个像素的运动,只需要去观察画面中每个像素的亮度变化,并且增强这种变化即可

这里我们假设原始信号是I(x, t),用自然语言来描述就是"在t时刻,坐标为x的信号的值是I(x,t)"。

如果我们认为亮度值I是坐标x的函数,可以将I表示为:



其中:



这里δ(t)位移场(我在上一篇文章也提到过),它表示了信号上某一个观察点在t时刻相比0时刻的位置变动。

我们现在需要放大信号的动作,实际上是需要找到这样一种信号:

仔细观察这个式子,你会看到对于特定的观察点,当经过了t时刻后,x方向的坐标相比原有信号多移动了αδ(t)

这个算法的精髓之一,是要找到横坐标x方向上的速度与纵坐标I的速度之间的关系。我们来看看x方向速度会带来什么样的影响,这里我们假设原始信号I(x,t)是一个已知频率的余弦信号(黑色曲线),下图展示了它向右移动一小段时间后的样子(蓝色曲线)


我们将I进行泰勒级数展开,并保留1阶项,可以得到下面公式

通过上述公式,可以看到x方向的移动会导致被观察的像素点的亮度发生变化,而这种亮度的变化速度和信号在x方向的运动速度之间存在直接的关系:


这里稍微说明下,上图三角形中:

  • 绿色线表示B(x,t),是t时刻和t+Δt时刻亮度的变化,当时间变化很小时,代表着亮度变化的速度

  • 蓝色线表示t时刻和t+Δt时刻的位移,当时间变化很小时,代表着x方向速度

  • 红色线表示信号在x点的梯度

如果我们加大亮度的变化速度B(x,t)=I(x,t+Δt)-I(x, t),也就变相的放大了x方向的位移场δ(t),相当于增大了x方向运动速度,当运动变化不是特别大时,这两者之间是线性的关系。因此,我们可以给原有的B(x, t)基础上再叠加一小部分,得到下式:

如果我们认为这个式子依然是某个信号的一阶泰勒级数展开结果,则可以将其近似还原为下面这个信号,这意味着我们找到了动作放大后的新信号(你可以对应到式(1)看看)。

可以看看这个信号被放大时的感觉:

这里要注意,我们之前假设信号只是单一频率的余弦信号,但实际上的原始信号中可能有多种混合的频率,如果只对特定的频率感兴趣,应该对原始信号做带通滤波,滤出感兴趣的频率,这个过程是对I(x,t)中每一个x处做同样的带通滤波来完成的。

这里我们假设δk(t)δ(t)的第k个分量,带通滤波器使得我们对每一个分量分配不同的权重γk,不感兴趣的分量权重为0,则有:

如果放大信号,并对每个特定的频率信号给以不同的放大倍率,αk=αγk, 则有:

好了,到了这里,可能一些读者已经有点模糊了,因此我来总结下对一位信号做欧式动作放大的过程:

1. 首先将原始信号进行时域上的傅里叶变换,可以得到每一个坐标点的亮度变化函数I(x, t)(这里你把t看做自变量)的频域分量
2. 在频域上进行带通滤波,获得感兴趣的分量。
3. 对这些分量的值进行放大,具体过程是将它们乘以(1+αk),并加上t=0时刻的值
4. 将所获得的放大后的分量用反傅里叶变换返回到时域空间,得到放大后的信号

Note: 以上操作对原始信号中每一个坐标点都进行

2.2 2维信号模拟

假设信号是一个已知频率的2维信号时,很容易将上述1维的动作放大原理应用到此2维信号上

可以看下面的视频,分别是对2Hz和3Hz振动进行放大的视频

放大指定频率的振动

2.3 欧式视频动作放大的基本流程

我会在下一篇文章中仔细阐述该算法的实现过程。但这里简单讲讲基本的实现架构:


  1. 将视频看做一个四维信号I(x,y,c,t),第3维是颜色,第4维是时间

  2. 对视频的每一帧进行拉普拉斯金字塔分解(我们前面的章节讲过,参见zhuanlan.zhihu.com/p/53),这样金字塔的每一层也是一个四维信号,并且代表着原始视频中的不同空间频率。例如金字塔的最上一层代表着最细微的边缘、细节、噪声,最下一层代表着直流信号。

  3. 接下来对金字塔的每一层信号中的每一个像素点进行带通滤波,这种带通滤波可以在频域上进行,这样我们可以获取到感兴趣的频段的信号

  4. 滤波后的每一层信号可以乘以特定的放大倍率αk,并与频域滤波前原始信号相加,得到新的金字塔

  5. 合成新的金字塔中的每一层,得到最终的放大后的视频

三、总结

这一篇文章为大家介绍了一个非常有趣的应用:欧式视频动作放大。这个算法不仅可以放大视频中的特点频率颜色变化,还可以放大感兴趣的动作变化。而且这个方法不需要进行特征点的跟踪,或者进行帧间的光流计算,它仅仅只需要利用时空处理方法增强特定的颜色变化即可。之前有读者问我图像的傅里叶变换有哪些应用,我想今天这一个算法就是一个生动的例子。

我在下一篇文章还会用python代码来给大家展示欧式视频动作放大的完整实现过程,敬请期待。

今天所讲的频域处理实现只是欧式视频动作放大的一种方法,它有一些明显的局限性。在我的计划中,还会再撰写一篇文章来阐述这些局限性,并引入另外一种欧式视频动作放大的算法来克服这些局限性,得到更好的结果。当这一个系列的文章介绍完后,我们会开启计算摄影之旅的新的篇章,进入到图像的合成这个领域。

希望我能按时坚持下去,感谢大家的支持与鼓励,请给我点赞^_^

参考资料:

这一篇文章的绝大部分素材来自于以下三份资料:

  1. Michael Rubinstein: Thesis Defense for Analysis and Visualization of Temporal Variations in Video

  2. Michael Rubistein: Analysis and Visualization of Temporal Variations in Video(PDF)

  3. Eulerian Video Magnification for Revealing Subtle Changes in the World


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、Re-id、强化学习、模型压缩剪枝、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


投稿、合作也欢迎联系:simiter@126.com

长按关注计算机视觉life


推荐阅读

计算摄影技术:身怀绝技的扫地僧

计算摄影 |  从入射光到照片:数码相机成像的秘密

计算摄影 | 图像合成与融合

计算摄影 | 摄像机成像原理及参数解析

最全介绍 | 手机上的23种传感器

电影中成千上万的群众演员是怎么来的?

计算射影像素级神操作:运动滤波

可复现的图像降噪算法总结

一行命令搞定图像质量评价

一文综述常用图像评估方法

新型AI美颜技术实现细粒度颜值提升


最新AI干货,我在看  

登录查看更多
0

相关内容

时间序列(或称动态数列)是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列。时间序列分析的主要目的是根据已有的历史数据对未来进行预测。经济数据中大多数以时间序列的形式给出。根据观察时间的不同,时间序列中的时间可以是年份、季度、月份或其他任何时间形式。
【CVPR2020】时序分组注意力视频超分
专知会员服务
30+阅读 · 2020年7月1日
基于视觉的三维重建关键技术研究综述
专知会员服务
154+阅读 · 2020年5月1日
【干货书】数值计算C编程,319页pdf,Numerical C
专知会员服务
66+阅读 · 2020年4月7日
强化学习和最优控制的《十个关键点》81页PPT汇总
专知会员服务
102+阅读 · 2020年3月2日
【浙江大学】对抗样本生成技术综述
专知会员服务
89+阅读 · 2020年1月6日
特征方程的物理意义
算法与数学之美
6+阅读 · 2019年5月13日
可能是讲分布式系统最到位的一篇文章
InfoQ
8+阅读 · 2018年11月19日
强化学习——蒙特卡洛方法介绍
论智
12+阅读 · 2018年6月3日
FlowNet 论文笔记
统计学习与视觉计算组
9+阅读 · 2018年5月9日
基础|人脸识别的十个关键技术组成及原理!
全球人工智能
5+阅读 · 2017年7月27日
Meta-Learning to Cluster
Arxiv
17+阅读 · 2019年10月30日
Viewpoint Estimation-Insights & Model
Arxiv
3+阅读 · 2018年7月3日
Arxiv
5+阅读 · 2018年1月30日
VIP会员
相关资讯
特征方程的物理意义
算法与数学之美
6+阅读 · 2019年5月13日
可能是讲分布式系统最到位的一篇文章
InfoQ
8+阅读 · 2018年11月19日
强化学习——蒙特卡洛方法介绍
论智
12+阅读 · 2018年6月3日
FlowNet 论文笔记
统计学习与视觉计算组
9+阅读 · 2018年5月9日
基础|人脸识别的十个关键技术组成及原理!
全球人工智能
5+阅读 · 2017年7月27日
相关论文
Top
微信扫码咨询专知VIP会员