← 返回

⚓{0x01} 关于PFNN一些看法

发布于
·
更新于
·
Blog

背景

在角色动画领域中,骨骼的动画是最重要的一种动画,一般称之为motion。受动物运动的启发,人们将角色动画简化为两步,骨骼的姿势变化(骨骼动画),以及皮肤受到骨骼的变化而变化(蒙皮)。

本文所介绍的这篇文章则是研究如何利用深度学习来生成和控制骨骼动画。生成的骨骼动画的好坏可以由下面几点来评判:

  1. 动画是否连续
  2. 动画是否自然

第一个点是最基础的,它限定骨骼的姿势变化不能太大,比如角色正在跑步,下一帧的骨骼姿势不应该突然变成非跑步姿势(比如站立)。那么这一点就可以基本上决定了这类生成模型大体都是自回归模型,那么就需要考虑误差累积的问题,减少误差累积有很多方法,有些方法还是场景特点的,在这就不一一介绍。

第二个点就比较主观,好在我们在使用深度学习研究时,一般是有数据集的,而数据集大都采自真实世界,我们可以设计一些距离函数来评判生成的动画是否和ground truth足够接近,从而来评判生成的动画是否自然。

此外为了加入控制,我们会在自回归的途中对输入进行一定的修改,以达到控制生成的动画。因此大致的流程可以由下图表示

在我们所讲的这篇文章中,有两个主要的工作:

  • 为动作捕捉数据生成虚拟的地形,这是由于动作捕捉设备只捕捉人体mark点的空间运动,并不会扫描动捕场景的地形,因此需要为虚拟场景生成与动捕数据对应的地形。
  • 提出所谓的Phase-Functioned Neural Network,即PFNN来生成自然的locomotion

前者工作属于数据增强的方法,其大致思路是:根据现有的虚拟场景高度图,切割出大量地块,然后将这些地块去fit每个locomotion,选出最匹配的地块,之后再微调这些地块的高度,让其更匹配locomotion。这个方法比较暴力,论文中介绍了三种误差来表示地块和locomotion的匹配程度,这里不再赘述。

PFNN

上图就是PFNN的模型示意图,分成两个部分:

  • 生成网络,即左侧的MLP,
  • 用于动态调整MLP参数的一个模块——Phase Function。

现在我们先来看左半边的网络,即 motion 的生成网络。它的结构比较简单,由三层全连接层组 成,隐藏层的输出由 ELU 激活。

在讨论网络的输入输出之前,我们先整理一下需求是什么:

  • 生成下一帧的 Pose,即关节点的位置,
  • 能够有一定的控制,即控制角色的运动方向、运动速度、以及运动的形态(gait),
  • 能够适应具有地形的场景,而不是一个平地场景。

现在我们可以开始说明输入输出的具体设计

网络输入

对于第i+1i+1帧的motion生成,输入如下

  • 在平面上的路径信息,我们一般通过这几个量来控制角色的运动。这些量也是定义于根节点空间
    • pR2,tipR2t,p​\in R^{2}, \mathbf{t}_i^p \in \mathbb{R}^{2t}, , 路径位置
    • dR2,tidR2td∈R^2,\mathbf{t}_i^d \in \mathbb{R}^{2t}, 路径方向
    • gR5,tigR5tg\in R^5, \mathbf{t}_i^g \in \mathbb{R}^{5t}, 步态(gait), 包括走路、慢跑、奔跑、蹲伏走、跳跃。one hot 编码。
  • 关节信息,定义于第 ii 帧根节点的坐标系下,其中 $j$ 表示关节数
    • pR3,jipR3jp∈R^3,\mathbf{j}_i^p \in \mathbb{R}^{3j} , 关节位置
    • vR3,jivR3jv\in R^3,\mathbf{j}_i^v \in \mathbb{R}^{3j}, 关节速度
  • hR3,tihR3th\in R^3,\mathbf{t}_i^{h} \in \mathbb{R}^{3t}, 路径上的地形高度。由于场景是具有地形的,我们将路径投影到地形高度图,得到路径的高度。为了让网络能够感受到周围地形的变化,还在路径两边额外取了两个点。

在上面的路径信息一共有t=12t=12个样点,这tt个样点来自如下图所示的一个大小为 2s 的窗口。这个窗口的前半部分是历史路径信息,而后半部分由网络预测得出。当没有玩家控制时,网络就会沿着它的预测自回归地生成运动。当要控制角色的运动时(test阶段),我们就可以使用玩家的控制值来混合这个窗口。下图表示第i帧的控制混合,并作为网络的输入。

网络输出

我们需要的必要信息就是网络的输出。显然它包括下面几部分:

  • 姿势信息,也就是关节的朝向,速度等,
  • 路径信息,如之前所述,这是一个网络预测角色运动的信息窗口
  • 相位更新,或者说,相位的增量

当得到网络输出后,我们就可以更新角色的状态,以及准备下一帧的网络输入。

损失函数

一个直觉的想法,我们需要网络能够完美的预测实际的motion,也就是说在训练过程中,我们需要网络的输出能够匹配上数据集中的motion。因此,Loss是一个欧式距离,且包含一个正则项。对于这类motion的预测生成模型,欧式距离基本都作为Loss的主要项。

Phase

Phase——相位,意思是指:阶段,时期,时刻,时间上的位置。打个比方,一段武术动作可以被分解为多个招式的序列,每个招式可以用来指代武术家所处的阶段。当然也可以直接以时间点来定义相位;比如三角函数,周期性使得我们可以用相位来指代当前三角函数处在一个周期中的哪个时刻。本质来说,Phase其实就是指代序列(sequence)的当前位置(position)。phase is a position at sequence.

由于 locomotion 一般具有周期性,那么我们就可以用相位来表示 姿势位于周期的哪一刻。举个例子,我们可以对走路定义一个周期(如上图),以左脚着地开始,Phase 为 0,接着右脚着地时,Phase 为 π,左脚再次着地时,Phase 为 2π,期间的姿势所对应的 Phase 进行线性插值。这样我们就得到了一个相位和姿势之间的对应关系。通过这样的表达,使得比较抽象的动作序列的“变化”能够数值化,从而为网络提供先验知识。

介绍完Phase后,我们需要回过头来看,作者是如何利用这种先验?

作者的想法是,生成网络的参数能够根据Phase动态调整。具体而言,作者通过一个闭合三次样条函数的参数化表达,由Phase映射到一个四维坐标。举一个简单的例子,在复平面上的一个单位圆,我们可以将幅角映射到二维坐标。

回到上图右侧,这个样条函数上的一个点可以由Phase得出一个四维坐标,而坐标基向量是用一个网络来表示(和生成网络的shape相同),利用这个坐标的四个分量,和四个坐标基向量(网络),加权求和得出生成网络(上图左侧)。总而言之,生成网络就是三次样条函数上的一个点,由Phase驱动生成网络的参数变化。

总结

这篇论文的工作算是比较早使用深度学习来生成motion的工作,但在当时与其它learning based文章的拿来主义相比,它的亮点在:简单的网络(MLP)上加入了phase的先验,而且并不是简单的将phase作为网络的输入,而是用于动态调整网络的参数。当然,作者使用的这种方法在deep learning早就出现过(Mixture of Expert),不过后者是使用网络来生成混合因子(也就是上面说到的四维坐标)。在这篇论文之后的工作,也就正式使用MoE这种结构的网络,Phase Function就变成了一个gating network。

想法

至于为何这种动态调整网络参数能够更好地生成动作,就我了解,MoE所给出的解释是这种方法能够增大网络的容量。然而,根据我之后读了一些其它文章后的思考,这里的原因可能不止“动态调整网络参数”,而更有可能是Phase的这一个先验知识的使用。其实在前面Phase的一节开头,我有解释animation中phase的另一个视角解释——position at sequence,有了解过Transformer的同学可能知道,position encoding,这里有何种关联,会在之后的系列文章中介绍我的一些理解。

结语

由于一直在摸鱼,攒了好多的阅读笔记没有整理发出来,『航海日志』攒了有十来篇的样子。而且由于每读多几篇paper,总会发现前面的笔记有些地方需要修订,也常常有一些新的理解。之后会尽力分享一些在motion animation上的一些想法和经验。

预告一下,下篇应该是这篇论文后续的两篇工作。

  • Daniel Holden, Taku Komura, and Jun Saito. 2017. Phase-functioned neural networks for character control. ACM Trans. Graph. 36, 4 (July 2017), 42:1-42:13. DOI:https://doi.org/10.1145/3072959.3073663
  • Eigen, D., Ranzato, M., and Sutskever, I. 2014. Learning Factored Representations in a Deep Mixture of Experts. arXiv:1312.4314 [cs]