公众号/将门创投
From: arxiv; 编译: T.R.
随着音乐节奏的响起,乐感不错的人会随着节拍不由自主地摇动双手、扭动身体。但要跳出富有感染力的舞蹈动作需要长时间的练习和对美学韵律的深入理解,即使对于训练有素、经验丰富的编舞师来说,为一段音乐编出符合节奏、情绪和flow的舞蹈也是掉头发的创造性工作。
于是,科学家们想训练AI来进行编舞。虽然面临着动作连续性、节奏匹配性、风格一致性等等一系列复杂的挑战,但通过详细的分析与细致的观察,来自加州大学默赛德分校和英伟达的研究人员们提出了一套从音乐生成舞蹈的深度学习框架,实现了动作真实、舞姿多样、内容连续、韵律合拍的舞蹈生成算法。
下面的舞蹈就是AI闻乐起舞的生成结果:
那么这个神奇的“闻歌起舞”算法是怎么实现的呢?
回想一下你在学跳舞的时候是怎样学习的呢?观察老师的动作或者反复研究教学视频,而后一个动作接一个动作地重复练习基本功,然后逐渐将动作进行恰当的连接、最后形成完整的舞蹈。这一算法也采用了相同的思路,提出了一种解构——重构的技术框架,首先从舞蹈动作中学习出舞蹈的基本动作元素,而后在根据音乐再创造将不同的动作单元合成为连续的舞蹈。
在自上而下的动作解构过程中,不仅需要将对舞蹈节奏进行识别,同时还需要利用识别出的节奏将舞蹈序列分解为动作单元,每一个动作单元还会被解耦到初始位姿空间和运动空间中去;在自下而上的动作合成过程中,研究人员提出了一种基于输入音乐生成舞蹈序列的生成器。在实际使用时,通过给定的音乐输入,模型将首先抽取其中的节奏和音乐风格、随后映射到舞蹈动作单元,并通过递归的方法生成最终的结果。
整个模型框架如下图所示,其中包含了负责解构动作的DU-VAE(dance unit VAE)和将音乐生成动作的MM-GAN(music-to-movement GAN),下面我们将详细剖析每一部分的具体实现:
就像音乐节拍追踪一样,对于动作的分解需要追踪动作的节拍。研究人员将动作的节奏定义为运动的突然减速,并将这作为运动学的节拍开发出了运动学节拍检测器,从而检测出舞蹈视频中节拍的变化情况。在具体实现中通过构建矩阵D来捕捉不同关节运动的变化。
下式代表了不同位姿p中关节i的变化加总情况,其中Q为量化关节角度的指示器函数。随后通过计算不同时刻全身动作的变化差值D_diff,超过阈值就意味着检测到一个动作发生改变的运动节拍。
下图中显示了从音乐和舞蹈中抽取节拍的不同。对于音乐来说,可以通过初始强度的变化抽取出周期性的节奏,而对于舞蹈来说需要计算关节动作的偏移强度随后抽取出运动节奏。下图中显示了推出侧面的手(红色部分)、抬起手来(黄色部分)以及推出肘关节(紫色部分)的动作。
在抽取运动节律的基础上,就可以对舞蹈动作单元进行定义和抽取了。舞蹈单元(dance unit)是时域标准化的短动作片段,由固定数目的动作组成,并可以由一系列特定的常数节奏时间来进行归一化。下图表示了接下来要抽取的舞蹈动作单元,每一行在特定的位置都显示出了运动节奏。
舞蹈单元捕捉了基本的运动模式,并可以构建出完整的舞蹈序列,通过与音乐节律的配合,可以大幅度降低生成对应舞蹈的难度。
在得到基本的舞蹈单元后,需要模型学习如何分解舞蹈单元的基本动作。在这一部分,研究人员将舞蹈单元分解到了初始位姿空间和运动空间两个隐含维度上:其中初始位置空间Zini捕捉单个初始动作,运动空间Zmov则编码舞蹈单元内动作的运动变化。这种机制使得长时间的舞蹈生成成为可能,上一个单元的最后一帧可以初始化下一个单元。
为了学习初始空间和运动空间的特征,研究人员提出了DU-VAE模型来处理舞蹈单元的解耦过程,其中包括了初始位姿编码器Eini,运动编码器Emov,同时还包括一个可以从初始位姿编码zini和运动编码zmov重建出舞蹈单元的生成器Guni,通过充分训练后就可以得到能够生成舞蹈单元的生成器Gini了。下图显示了舞蹈分解模块的具体结构。
在学会了舞蹈单元的生成后,下一步就要将这些动作有机地结合起来,毕竟舞蹈富含着人类情感的动作表达。基于上文中学习出解耦的动作空间Zmov,合成模型需要学习如何在输入音乐的条件下将基本的动作组合为优美的舞蹈。这其中主要部分就是对于音乐特征的抽取和对于舞蹈序列的生成了。下图显示了合成器的基本结构,其中包含了对于音乐特征的抽取和将运动转为舞蹈编码器及对应的生成器。
为了衔接起底层动作特征和高层语义特征,研究人员提出了将音乐转为运动的生成器MM-GAN。给定一段舞蹈时,首先将舞蹈归一化到一个个舞蹈单元,而后利用编码器将舞蹈单元编码到动作空间Zmov,随后利用运动到舞蹈的编码器将动作编码转换为连续的舞蹈编码zdan,最后在训练生成器GANdan递归地将舞蹈编码重新转换回动作编码。针对输入的音乐,首先利用风格抽取器获取音乐的风格特征s,而后训练了将风格转换为舞蹈编码的编码器Estd。
在实际使用的时候,基于抽取的音乐特征就可以编码为对应的舞蹈编码,而后利用动作生成器将舞蹈编码zdan转换为动作序列zmov。为了在训练过程中获得更为准确的动作编码,这一部分还引入了运动判别器Dmov,为了匹配音乐风格生成的舞蹈和实际动作的舞蹈编码,还引入了舞蹈编码判别器Ddan用来对其两种特征。具体的损失函数定义可以参考论文中的详细推导。
在训练好了上述的各类编码器、解码器和生成器后,就可以根据音乐生成动作序列啦。在实际使用时,主要应用到的初始动作编码器Eini,舞蹈单元解码器Guni,风格编码器Esty和递归舞蹈解码器Gdan。
当给定一段音乐时,首先追踪其节奏并抽取其风格特征s,随后利用Estd将风格特征s与一定分布的噪声编码成舞蹈编码,而后利用Gdan解码成一系列动作序列。为了生成完整连续的舞蹈,上一个舞蹈单元的动作将被用于初始化下一个舞蹈单元,最终形成与音乐匹配的长时间连续舞蹈。
与其他方法相比,这种方法在生成质量和动作的连续性上取得了大幅提高。
同时针对相同的输入音乐和初始位姿,生成的舞蹈还具有多模态多样性的特点,舞姿丰富多彩变化万千。
从下图中还可以看到舞姿和音乐节奏对应非常准确,节奏起伏与音乐合拍而动:
如果想要了解详细的实验细节和理论公式,论文中提供了详细的描述:
https://arxiv.org/abs/1911.02001
最后让我们一起欣赏AI编舞大师的创造力: