羊驼是如何动捕的?从NKN简单入门Motion Retargeting CVPR2018 Oral

Xsens动作捕捉 2022-11-27 9356

最近Asoul恰逢嘉然100w粉纪念回,放出的直播视频里的一幕很有意思。嘉然跳着一曲舞蹈,羊驼则以相似的动作为嘉然伴舞。要是我问嘉然的动作是怎么得到的?答案肯定呼之欲出,动捕,都可以捕。但是,如果我要问羊驼的动作怎么来的,你可能就会犹豫一下了。羊驼的动作是动捕得到的吗?难道是真的有个羊驼真的在跳舞吗?肯定不对。那么,难道说是用嘉然舞蹈的数据输入到羊驼的骨架上吗?骨架的坐标直接摁到羊驼上肯定是不行的,怎么看都觉得这数据塞不进去。难道映射量是骨骼间的夹角吗?就像mmd的动作数据映射那样?也好像不对,羊驼腿短得很,夹角一看也不能直接放。那怎么办?

羊驼是如何动捕的?从NKN简单入门Motion Retargeting  CVPR2018 Oral  第1张
然然和阿草骨架差异巨大

这个问题的答案就是我们今天要说的motion retargeting,翻译成中文就叫做动作重定向。什么叫做动作重定向呢?一个很简单的解释就是,当一套骨骼的骨长和另外一套完全不一样的时候,如何做到让动作迁移得优雅自然。就比如上面提到的问题,嘉然和羊驼的骨架差异是巨大的,怎么使得嘉然上的动作数据迁移到羊驼身上显得优雅自然。又或者,假如然然的中之人真的身高一米八,那怎么让180然然的动捕数据应用到150模型上时显得自然,这个问题也属于motion retargeting。(当然,长期的观测可以确定,这个假设的问题显然是不存在的。)

确定了问题的定义,那我们怎么解决这个问题呢?其实,一个简单的思路就是把骨骼动作理解为一种身体的神态,或者说一种抽象的风格,而非视作具体死板的数据,这样我们就可以用风格迁移来解决这个问题啦。(值得注意的是,真正的动作风格迁移又是另外一个问题了,比如让一组原本有的动作数据变得“粗犷”或者“文静”。这里只是为了方便理解,打了这样一个理解上的比方。)

羊驼是如何动捕的?从NKN简单入门Motion Retargeting  CVPR2018 Oral  第2张
图像到图像的风格迁移

可以看到,连上面的图像风格迁移,我们都做的有模有样。那是不是至少可以期待一下这个思路在动作重定向问题上的效果呢?Neural Kinematic NetworksNKN)就是围绕着这个思路,开展了一系列先锋的工作。


一,风格迁移?用什么做?

说起风格迁移,那自然不得不提到其鼻祖CycleGAN了。2017年,朱俊彦在其大名鼎鼎的Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks中创造了CycleGAN,该论文至今已经10000+引用,是使用大量数据产生风格迁移的第一部作品(例如用上所有梵高作品训练,而不单单像J.Johnson一样使用一幅星月夜的纹理)。

羊驼是如何动捕的?从NKN简单入门Motion Retargeting  CVPR2018 Oral  第3张
风格迁移

为什么这项工作影响如此深远呢?这是因为CycleGAN创造性地提出了不需要配对数据的图图转换方法,而是让电脑自己在两个大类下五花八门的图片里,自动学习风格迁移的诀窍。在这篇论文之前有没有图图转换的方法?自然是有的。pix2pix就是一例,它可以通过简笔画图片生成真实图片。但是pix2pix的训练集需要大量的图片组,每组图片则是由一张简笔画和一张真实图片组合而成的。所以pix2pix需要大量配对数据来开展训练。

羊驼是如何动捕的?从NKN简单入门Motion Retargeting  CVPR2018 Oral  第4张
需要匹配数据的pix2pix,需要两类间有一一对应的图片组

那为什么CycleGAN不需要配对数据的特性如此重要呢?很简单,一副梵高的画摆在那里,我们是找不到对应的真实风景图的。拿到一只马的图片,要复现出对应场景下斑马的图片也是无比困难。我们可以得到的只有两个包含大量图片的类别。大量的梵高画和大量的风景画是可以得到的,大量的马图和斑马图也是可以得到的。两个类别的图片之间没有一一对应的关系,而我们则要据此训练出风格迁移的生成器,这就是CycleGAN最重要的贡献。

羊驼是如何动捕的?从NKN简单入门Motion Retargeting  CVPR2018 Oral  第5张
不需要匹配数数据的CycleGAN,只需要两个大类的图片集

讲了这么多CycleGAN,可这和我NKN有什么关系?现在让我们想想,要完成骨骼间的动作迁移,训练集得是什么?上上之策肯定是有大量的动作数据集,数据集里面不一样骨架的所有动作都一一对应。但想想也知道这是很难做的。即使数据集是找两个专业演员动捕制作,怎么保证他们每一帧的动作都匹配?因为motion retargeting的训练是逐帧训练的,因此会对视频的时序匹配提出及其苛刻的要求,因此制作完美一一对应的视频集是极困难的。那我们不妨放低一点要求,找几个动捕演员,各跳各的。最终,制作出很多视频集,再利用CycleGAN不需配对数据的特性,不就训练好了?这也即是NKN的核心思想。你说好巧不巧,正好有个Mixamo数据集,里面有上千个的不同骨架的运动数据,直接拿来开始训练:

羊驼是如何动捕的?从NKN简单入门Motion Retargeting  CVPR2018 Oral  第6张
mixamo,来自adobe,正好NKN也是adobe的工作


而具体到CycleGAN怎么搭建到motion retargeting上,其实反而是比较简单的一件事情了。传统的说,GAN需要一个鉴别器生成器。NKN里生成器就负责把骨骼A的动作迁移到骨骼B上,鉴别器就鉴别一下这个骨骼B的动作自不自然,这个自然程度计入Adversarial loss。那CycleGAN的Cycle在哪里呢?也很简单,我们再重新把生成的骨骼B的动作迁移回骨骼A,看看来回倒之后,骨骼A的动作改变了多少,这个改变程度计入Cycle consistency loss. 事实上,Adversarial loss和Cycle consistency loss这两个损失函数都是CycleGAN本身有的思想,这里只需要针对motion问题在数学上重新设计一下形式即可。同时,身为骨骼,其弯曲程度有现实的要求,太扭曲了要做惩罚,因此设置一个Twist loss惩罚过度的弯曲。身为时序运动,生成的骨骼动作要连贯一些,因此设置一个Smoothing loss平滑生成的动作,也合情合理。具体流程如下图所示:

羊驼是如何动捕的?从NKN简单入门Motion Retargeting  CVPR2018 Oral  第7张
CycleGAN在NKN

其中 x1:TAx^A_{1:T} 代表输入的骨骼A在1到T秒的完整动作坐标集, s^A/s^B\hat{s}^A/\hat{s}^B 代表A/B的骨骼长度信息, q^1:TB\hat{q}^B_{1:T} 代表A的动作经过RNN生成器得到的旋转四元数(Quaterion)。FK代表前向动力学过程(Forward Kinematics), x^1:TB\hat{x}^B_{1:T} 代表四元数 q^1:TB\hat{q}^B_{1:T} 经过B骨架的动力学计算后生成的具体坐标值。Cycle过程中,反向生成骨骼A动作的符号大致意思也是类似的。


二,前向动力学过程FK和循环神经网络RNN

如果你足够细心,应该能发现上面NKN的介绍中出现了两个名词:前向动力学过程FK循环神经网络RNN。这两个名词的细节在上文中并没有怎么描述,所以你可以把他们看成两个黑盒子,FK负责从生成器的输出四元数 q^1:TB\hat{q}^B_{1:T} 计算出最终骨架坐标值 x^1:TB\hat{x}^B_{1:T} ,还有RNN负责从时序中提取信息,生成骨架信息的隐变量。但如果你还是想要具体了解他们的实现细节,这里也帮你打开这个黑盒子来一探究竟。

(1)前向动力学过程FK

这是数字人/机器人学里经典的知识之一了。所谓前向动力学,就是根据骨骼间的夹角每块骨骼的长度,直接计算出每个身体节点的坐标值。要类比的话,可能有点像极坐标系转化普通坐标系的过程的在骨骼树上的不断迭代,因为二者都是根据角度和长度来算坐标的一种模式。但是,作者这里的前向动力学过程并非是单纯的矩阵计算或者四元数计算,而是利用神经网络来实现前向动力学计算的,称作Forward kinematic layer. 其输入是生成器的输出四元数 q^1:TB\hat{q}^B_{1:T}以及骨架信息 s^B\hat{s}^B ,输出为最终骨架动作值 x^1:TB\hat{x}^B_{1:T} 。这么做的原因作者也在Ablation部分解释了,这是因为如果用RNN直接生成xyz坐标,RNN极有可能会忽视骨架信息。这一特征在CycleGAN的循环迭代中更是尤其明显。因此必须加上Forward kinematic layer层来加以矫正。

羊驼是如何动捕的?从NKN简单入门Motion Retargeting  CVPR2018 Oral  第8张
加入FK层和单纯RNN的Ablation(前五行)

可以看到,对于含FK层的RNN(前三行),加入了Adv. Cycle Consistency会大幅提升模型效果。在不含FK层的时候(四、五行), 加入了Adv. Cycle Consistency反而效果更差。论文中归因为直接回归坐标时对于骨架信息的忽视,也没有更加详细的推演。FK层为什么work?RNN直接加上CycleGAN架构为什么会劣化?这些问题背后的原因其实值得我们进行更加深入的思考和挖掘。

(2)循环神经网络RNN

既然动作序列是一种时间序列,那么很自然地思路便是采用循环神经网络RNN来处理时序信息。值得注意的是,文章中的RNN并不是直接回归目标,而是存在两个配对的RNN, 一个先作为Encoder将信息 xtAx^A_t 压缩成隐变量 htench^{enc}_{t} ,另一个再作为Decoder把隐变量 htench^{enc}_{t} 及一些其他信息(如骨架信息 sBs^B ,前一刻的估计结果 x^t?1B\hat{x}_{t-1}^B ,前一刻的解压隐变量 ht?1dech^{dec}_{t-1} )译成t时刻的解压隐变量 htdech^{dec}_{t} ,通过 htdech^{dec}_{t} 计算四元数 q^tB\hat{q}^B_{t} 。最后FK层读取四元数 q^tB\hat{q}^B_{t} ,才生成坐标信息 x^tB\hat{x}^B_{t} 。论文中的流程图如下:

羊驼是如何动捕的?从NKN简单入门Motion Retargeting  CVPR2018 Oral  第9张

至于为什么这里的RNN要设计成Encoder和Decoder, 可能是因为本质上输入输出的信息复杂程度是相当的,所以采用一种降维升维的结构也是自然的。可以想想图像分割,或者VAE, 都是在输入输出信息复杂度相当的情况下,使用的Encoder/Decoder架构。因此这里也就不难理解了。


三,总结

CycleGAN发表于2017年,而NKN则是2018年的工作,也可以看出后者是深刻地建立在了前者的启迪之上的。说到底,如果不是CycleGAN提供了一种无需数据配对的训练方式,在难以寻找合适训练集的情况下,可能也很难开展Motion Retargeting的相关工作。因此,在奠定CycleGAN的基调下,整篇文章的思路基本就是天然去雕饰的了。当然,作者也一定是在直接利用RNN回归失败后,百般尝试,最终开辟了FK层的路径,从而让网络能更好的把握住骨架本身的信息。作为motion retargeting在神经网络领域的开山之作,这篇论文已经做了相当多富有成效的尝试与探索了,因此2018 CVPR的Oral也是实至名归。

最后总结一下本文的内容:

  1. 怎么获得羊驼的动作数据?答案是我motion retargeting哒!
  2. 数据难配对怎么办?用CycleGAN即可。
  3. 怎么强化骨架信息的吸收?只要额外设置FK层便可以解决。
  4. RNN为什么采用Encoder/Decoder架构?因为输入输出信息复杂程度是相当的。


最后,写作不易,喜欢的话点个赞吧。我后续也会接着更新姿态动作领域的更多内容,有兴趣的话点个关注也可以喔。

The End