zl程序教程

您现在的位置是:首页 >  其他

当前栏目

SIGGRAPH Asia 2021 | 基于关键帧和风格的相机运镜控制

2023-03-14 22:54:05 时间

本文是 ACM SIGGRAPH Asia 2021入选论文《基于关键帧和风格的相机运镜控制(Camera Keyframing with Style and Control)》的解读。该工作由北京大学前沿计算研究中心陈宝权-刘利斌课题组与法国雷恩第一大学、北京通用人工智能研究院等单位合作完成,用于解决动画、影视中的相机轨迹规划问题。该工作通过同时学习相机运镜规则与关键帧约束,实现了兼具风格化与细节的相机控制方法。

作者 |PKU VCL

图文 | 蒋鸿达

知乎原文:

https://zhuanlan.zhihu.com/p/428509082

项目主页:

https://jianghd1996.github.io/publication/siga_2021/

论文地址:

http://cfcs.pku.edu.cn/baoquan/docs/2021-11/20211105111806156100.pdf

数据和代码开源链接:

https://github.com/jianghd1996/Camera-control

1

背景介绍

相机控制是电影、动画、游戏等领域的重要技术。相机视角的选取、相机本身的运动,都会影响拍摄得到的视觉效果。目前业界的相机控制方法大多仍然是“半自动”形式的,如人工给出若干相机关键帧,然后通过算法进行插值,或者人为设计参数化表示的相机运动规则,比如第一人称视角、第三人称视角等。

关键帧是动画领域非常常用的技术,在动画领域被广泛应用。通常情况下,关键帧由用户给定,可以视作控制整个轨迹(动画)的输入,根据这个输入,算法要“自动补全”帧之间的部分,输出完整的轨迹(动画)。而对于不同的场景、约束,这个补全算法通常有所差别,大多数研究也是关注如何快速、高效、合理地实现这个插值。

图1给出了一个 Toric Space 下 [1] 对相机进行插值的例子。Toric Space 是一种基于两名对象的局部相机表达形式,该坐标系下相机被表示为 ,其中 表示对象在屏幕上的 2D 位置, 表示偏航角和俯仰角,在这个 space 上的插值,能保证插值过程中,拍摄目标始终在屏幕上可见,而在笛卡尔坐标系下插值则可能造成目标丢失,甚至发生碰撞。

图1. 对于一个双人对话的场景(左),如果用 Toric Space 坐标描述相机(中),就能实现比线性插值更合理的相机轨迹插值结果(右)。

关键帧技术虽然已经大幅减少了设计相机轨迹所需要的工作量,但设计一条“好”的相机轨迹,仍然需要进行多次调整。这里的“好”是指据有“运镜”的相机轨迹。在电影拍摄中,存在大量的“运镜”规则,这些规则可能和拍摄内容、故事情节、摄影风格等都有关系。

近年来,一些研究工作开始关注,如何从真实的电影数据中去学习到“运镜规则”,并将学到的规则用到新的场景上,实现自动的相机控制。如这篇工作,《基于样例的虚拟摄影和相机控制》[2],将“运镜规则”建模成演员的三维特征和相机 Toric 坐标之间的联系,通过多专家模型,自动区分不同影片中包含的“规则”,用户只需提供带有期望效果的电影片段,该算法就能自动提取出其中包含的“运镜规则”,并用于新场景的拍摄中。但是,这些方法对相机轨迹的建模都是在非常 high-level 的语义层面,缺乏一定的实用性,因为对于用户来说,一个能控制细节的工具(如基于关键帧)肯定更好用。

基于样例的相机控制方法

这篇工作的目标就是将这两者的长处结合起来,用学习的方法,去学习如何进行“智能化插值”。即用户控制关键帧,并给出带有期望相机运动的视频片段,我们从视频片段中学习“运镜规则”,并用该规则生成关键帧之间的相机轨迹。一方面,让“插值”变得“智能化”能让用户只需提供很少的关键帧就能生成一条很合理的相机轨迹;另一方面,用户依然能通过修改关键帧实现精细化的相机控制。

基于样例和关键帧的相机控制

2

实验方法

我们在“基于样例”的方法 [2] 上进行了扩展,同样是采用 gating+predicion 的网络框架,gating 用来提取样例中包含的“运镜规则”,并表示成一个低维向量 style code。prediction 网络根据 style code,对于输入的关键帧,以及拍摄对象信息,生成帧间的相机轨迹。

图2. 方法的框架流程,输入包括样例视频、关键帧、新场景的演员信息,输出

gating 网络的输入是样例视频中的演员和相机运动特征,这两者的提取方法可以参考之前的工作 [2],提取之后,取至少300帧以上,连接之后通过一个 Gating LSTM。这里我们没有采用多专家模型,gating 输出只是单独作为一个向量输入到后面的 prediction 网络,因此 gating 的输出没有加 softmax 约束,我们发现不加约束能更好地学到样例视频中的相机运镜方法。

prediction 网络我们借鉴了 animation 方向的相关工作 [3],并引入了样例视频中的 style,这一部分可以抽象为函数:

其中 是样例视频中相机运镜的低维表达, 是当前的拍摄目标演员信息, 表示下一个关键帧的信息, 表示从当前帧到下一个关键帧的距离编码, 是上一帧的 LSTM 隐变量。

这里的距离编码是关键帧技术里很重要的表示信息,因为关键帧意味着目标要在特定时间到达特定地点,当时间临近时,目标就应该到达关键帧附近,否则可能会出现跳变的效果。一个最直观的表示方式就是线性编码,即离目标还剩1帧,则值为1,但这种离散的编码并不适合网络学习。我们借鉴了 nlp 里编码距离的方法:

其中 tta (time-to-arrival) 表示到下一个关键帧的距离,这里的 sin-cos 函数随着 tta 变化是连续变化的,更适合网络学习。

通过以上框架学习,已经可以实现基于样例和关键帧的相机控制了,为了让用户对生成轨迹有更多的控制,我们给模型增加了速度控制的能力,这样用户不仅可以控制关键帧,还可以控制关键帧附近的相机运动速度。具体做法是学习从局部相机速度到 prediction 网络的 hidden state 的映射,从而可以通过直接替换 prediction 网络的 hidden state 来控制相机速度。这个映射网络是和主体网络一起训练的,否则 hidden state 不一定能有这样的功能。

图3. 从局部相机速度映射到 hidden state,hidden state 可以影响接下来相机的运动方向。

下面给出一个用 hidden state 映射控制相机运动速度的例子,相机从右边开始,给定相同的样例和关键帧(两端的红色相机),通过给出不同的初速度,可以得到蓝色和绿色两条轨迹,然后在中间的时候,黄色是蓝色轨迹正常运动下去的效果,蓝色本身则通过直接速度映射修改 hidden state,实现了相机速度的变化。由于在运动中间直接修改速度可能会造成相机速度的突变,所以一般不建议在中间进行这样的操作。

相机速度控制

3

实验结果

首先展示我们的方法能将不同的运镜手法拟合到相同的关键帧上,并表现出各自的风格,下图中红色相机是预先定义的关键帧,不同颜色的视频和相机表示给定不同样例视频得到的相机轨迹。

相同关键帧不同运镜手法

同样,我们也观察了,对于同一个样例视频,给定不同关键帧时,生成相机轨迹的表现。我们的方法在满足不同关键帧的过程中,仍然较好地满足了相机的运动风格。

相同运镜手法不同关键帧

我们还观察了生成轨迹中包含的相机运镜与关键帧之间的关系,当关键帧与要求的运镜规则发生“冲突”时,很难同时保证两个约束都得到满足。

关键帧与生成轨迹运镜风格变化

为了更好地观察生成相机轨迹的“运镜”,我们重新使用 gating 网络,从生成的轨迹中提取包含的相机运镜。从结果可以看到,生成的相机轨迹仍然满足输入的相机风格。

生成轨迹的运镜可视化

为了方便用户更好地使用我们的方法,我们在 Unity 里开发了一个简易的 UI,在 UI 里,用户可以设置关键帧,调整关键帧的视角、拍摄对象,我们的算法会在关键帧之间生成据有不同运镜风格的轨迹,然后用户可以对这些轨迹进行自由组合,观看,并做进一步调整。

用户相机控制 UI

我们让一位 artist 用我们的工具,对这个场景进行了相机轨迹设计。

artist 设计的相机轨迹

同样,我们尝试将我们的方法用于新的场景——体育赛事的观看,在拍摄过程中,相机需要不断更新拍摄对象,而且方法目前仍然是离线的方法。

生成冰球观赛相机轨迹

完整的结果和细节请观看我们的视频和项目主页:

论文视频

参考文献

[1] Intuitive and Efficient Camera Control with the Toric Space

https://dl.acm.org/doi/abs/10.1145/2766965

[2] Example-driven Virtual Cinematography by Learning Camera Behaviors

https://dl.acm.org/doi/abs/10.1145/3386569.3392427

[3] Robust motion in-betweening

https://dl.acm.org/doi/10.1145/3386569.3392480