最后更新时间: 2021年11月22日 12点55分
这一篇文章主要讲Taku Komura课题组基于Learning的方法在motion合成和控制方面所作的研究。具体路径如下,也可以在他们在GitHub的项目,AI4Animation中一窥究竟。
- PFNN: Phase-functioned neural networks for character control
- MANN: Mode-adaptive neural networks for quadruped motion control.
- NSM: Neural state machine for character-scene interactions.
- Local motion phases for learning multi-contact character movements.
每一篇文章都是前者的演进,只要抓住Phase和MoE这两个概念,那么理解起来就会比较容易。
本文将分为四大部分,分别是背景,生成网络,控制模型,讨论和总结。其中涉及到的数据增强等一些细节内容不会在文中赘述,而是另开一篇文章总结这些细节中的技巧。
背景
问题:对于骨骼动画,我们如何在一定的控制条件下,生成自然的动作?
在上面4篇文章之前,已经有一些基于Learning的研究,比如CNN ,RNN 等,在Holden的CNN 这篇中,就已经可以看到phase的出现,即周期函数中相位的在动作中的表述。到了Phase-functioned nerual networks(下称PFNN)这篇文章,Phase被重度地使用。
Phase(相位)具体代表什么呢?这里我们举例说明,考虑一个简单的动作——走路,我们可以将其看成是一个双脚交替前进的周期运动,在一个周期开始时,我们指定Phase在左脚着地为0,右脚着地为 ,周期结束时的左脚着地为 ,双脚交替之间的姿势进行插值。也就是说,Phase代表了一个动作周期中的某刻的姿势。
然而在实际模型运行的时候,动作是多变的,有时快跑、有时慢跑、有时停下、有时拐弯,那么具体Phase的值就不是我们能预先知道的,因此我们让网络学习Phase的变化,然后不断更新Phase即可。
上面介绍了Phase和动作之间的关系,那么具体如何使用Phase来指导动作的生成呢?直觉是将Phase作为网络的输入,同时输出Phase的更新。而作者利用Phase来动态调整网络参数,之后再来用这个调整的网络进行motion的输出。
注意,分号后面的相位不是的输入,而是指相位决定生成网络的网络参数。
生成网络
上面提及的4篇论文,在Phase和动态这两个点上可以依次体现为
- 指出locomotion中的周期性,用显式的方法来指导网络的动态更新,
- 使用gating网络去隐式的学习Phase的概念来动态更新动作预测网络,
- 将Phase和gating网络的输入进行笛卡尔积,然后gating网络决定如何动态更新动作预测网络,
- 用和环境接触的关节进行Phase标记,这些不同的关节对应不同的Phase。
在开始讲解其中的细节之前,我们先对这4篇论文中生成网络的输入和输出做一个简单的分类,以便于体现Phase在这些网络中的影响。
输入
为了比较号的区分一些概念,本文所指的输入是直接喂给给网络的数据,不包括hyper-parameter。当然相位 也不是网络的输入(尽管它参与了网络的运算)
我们可以对输入的特点分为三类:
- Trajectory: 路径信息,如2D平面中的路径位置、速度、朝向,一般会使用过去到未来的一段窗口信息,
- Pose: 姿势相关的信息,关节的位置、速度、旋转角度,等等。一般只使用一帧信息,且坐标位于以根节点为原点的坐标系中,
- Control: 控制信息,根据控制策略的不同有所差异,比如有target位置、想要的速度、朝向、或者action的类型,gait类型等等。有可能使用一段窗口信息、也有可能使用一帧的信息。
注意到,上面使用的窗口包含了未来的信息,这里的未来的信息可以有两种方式确定,
- 直接使用网络输出的预测值,
- 使用网络输出的预测值与外部的预测值做blending后的结果
对于第一点比较好理解,网络的预测值是从数据集中学习出来的。关键在于外部的预测值是怎么得到的,在PFNN这篇文章中,使用下面这个公式计算得出:
以角色运动的路径速度为例,这里 代表当前角色的运动速度, 表示用户摇杆计算出的运动速度,由于自然运动的速度是不能突变的,所以这里使用了blending,将 平滑地过渡到 。这里 作为控制过渡地快慢程度,即控制的响应程度(如角色的朝向可以过渡快一点,使得在视觉上玩家能感受到控制灵敏,尽管速度的过渡没那么快)。
输出
对于网络的输出,我们也可以分为下面这几类:
- Pose:下一帧的姿势信息,这个信息是必需的,
- Trajectory:一段窗口的路径信息,用于计算输入特征,主要是blending,
- Phase的增量:用于更新相位,
- Contact: 接触信息,不仅可以被用于计算输入特征,也可以用于姿势的后处理,IK,
- Control:控制信息。当输入的控制信息依赖于角色的一些状态量时,如和目标的距离等,则一般会有这个控制信息的输出,用于更新下一轮计算的控制信息的输入。
需要注意的是,与输入不同,输出中可能会包含有相位增量 的信息。这是因为这里讲的生成网络都是auto-regressive的,当我们要将网络输出 更新下一轮的输入时,我们还需要 这个姿势下的对应的相位来动态调整网络参数,即 。
网络参数的动态调整与可训练性
前面我们讲到,网络的参数会根据相位动态调整,而动态调整的具体的做法是定义一组网络参数
这里的个数可以变,简单起见,我们只设置4个为一组的网络参数。在MoE中,
被称为专家权重(expert weight), 被称为专家池(experts pool)。
至此,我们就可以对 进行blending(即加权求和),得到我们的生成网络参数,
上式表明,生成网络的参数 是一个关于 的函数,体现在blending因子随相位变化而变化,而专家权重则是我们需要实际要训练的东西。
一般来说一个可训练的简单网络如下
现在,我们对专家权重进行blending后,再接收输入 然后输出 ,即
而不是:
上面这两个过程并不等价,因为激活函数可能不是线性的!即使后一个一看就是可训练的。(但这两种方式在效果上有什么区别,这里先留个坑,以后有机会研究一下)
不等价可以用下式说明:假设网络只有一层
其中 ,即网络的参数。可以看出blending是发生在激活函数之前的!那么可以对左变变一下形
这里 看作是对 的仿射变换的写法。这样子就方便我们进行用PyTorch实现,一层隐藏层的伪代码如下:
class MoE(nn.Module):
def __init__(self, input_dim: int, output_dim: int, num_experts: int):
super(Net, self).__init__()
self.input_dim = input_dim
self.output_dim = output_dim
self.num_experts = num_experts
self.expert_pool: List[nn.Linear] = []
for i in range(self.num_experts):
self.expert_pool.append(
nn.Linear(self.input_dim, self.output_dim))
# 激活函数
self.relu = nn.ReLU()
def forward(self, x: Tensor, blending_coeff: Tensor):
y = torch.zeros(self.output_dim)
for i in range(self.num_experts):
y += blending_coeff[i] * self.expert_pool[i](x)
# blending 完成后再激活
y = self.relu(y)
return y
下面我们将具体讲这几篇文章的生成网络
PFNN
下文所提及的locomotion一词找不到比较好的翻译,个人觉得,比较通俗的理解是:走路、跑步、跳跃、攀爬这些简单运动,同时没有花里胡哨的动作。
PFNN的作者从简单的locomotion出发,提出简单的动作具有周期性,而周期性可以体现在周期函数上的相位变化。因此这篇论文主要研究的是locomotion,以及一些简单的控制和简单的环境交互。个人认为研究目的主要出于以下几点
- 对于locomotion来说Phase很容易标记,即根据左右脚交替着地标记为 ,然后插值,
- 通过一些简单的控制,可以研究动作变化时,Phase是怎么变化的,对于复杂动作中Phase的研究具有很大的参考价值,
- 容易验证Phase对生成locomotion这种简单的动作是否有用,如果有用,那么对比较复杂的motion生成具有启发意义,
上图就是PFNN的生成模型,可以看到左边是一个Phase Function,他会根据不同的相位对四个专家权重进行blending,这里的相位函数是一个三次Catmull-Rom样条函数,形式如下
虽然形式很复杂,但是核心还是根据相位 ,生成blending因子。显然这是个确定的函数,那么blending的方式也是确定的了。我们选择确定函数来blending,需要满足两点
- 关于 的周期函数
- 变化平滑
训练
网络的输入为 ,输出为 ,这里 就代表轨迹信息, 就代表姿势信息,而 就是控制信息(分别是步态,接触)。
可以看出,相位不在输入中, 是相位的变化,出现在输出中。因为我们的相位 并不直接输入到网络中,而是用于确定网络参数的动态变化。为了更新相位 ,我们必须预测下一帧姿势所对应的相位 (这里是因为姿势和相位是一一对应的)。
与之前输入和输出两节所讲基本一致,这里轨迹信息是一个以当前帧为中心、大小为1s的窗口,并在窗口内sample 12个点。而轨迹位置、速度信息如输入(👈戳我)这一节所述那样计算。
网络 的结构为三层,比较简单:
其中 为blending后的网络参数,损失函数为
这个损失函数还是比较好理解的,就是输入和输出,对应信息之间的差值,以及一个正则项。
MANN
Mixture-Of-Experts(下面简称MoE)在MANN这篇文章中被使用。MoE技术和PFNN是很类似的,最大的不同点在于PFNN使用确定的函数来决定blending因子是什么,而MoE则是使用一个gating network来计算blending因子。(本质上我们可以把Phase-Function看作是人为训练好的网络,而MANN是PFNN的泛化模型)。
MANN与PFNN还有一点不同,MANN并没有使用Phase这个信息,而是出于两点,
- 四肢动物的运动不好标记Phase,不同action下,四肢接触的持续时间、间隔不一样,很难找到一个准确的Phase定义,如下图
- Phase与姿势具有很强的关系,干脆直接就使用姿势信息代替Phase,让网络去隐式地学习Phase的这个概念。
训练
预测网络的输入为 ,输出为 ,这里的输入总体上与PFNN相似,只有一些细微的不同:
- 路径信息窗口的后半部分(未来)根据用户期待的速度、朝向外推得到,
- 多了一个期待速度大小 ,用于手柄控制,
- 输出少了相位变化 ,因为MANN没有使用Phase。
gating network部分的输入 是预测网络输入的子集,主要是有脚的速度、当前action类型和期待的速度。这里作者做了一些实验发现,用上面这三种类型就能够很好的work,猜测是Phase和接触点(这里是脚)具有很强的相关性。
个人理解Phase和接触点强相关来源于,接触点给身体提供了一个支撑点,使得身体姿势达成平衡、协调更加容易。而对于没有接触点的姿势来说,比如跳水,达成平衡、协调是困难的。
文中的损失函数定义为,使用 AdamWR 训练(内部实现了正则化)
NSM
NSM (neural state machine) 这篇文章,个人感觉重点更多在于它的控制模型,在于角色交互的物体上放置 sensor 来提供模型需要的交互信息,从而生成更自然的具有交互性的动画。关于控制内容将在控制部分深入说明,这里我们重点关注动画生成部分。
在这篇文章中,Phase被重新引入,但与PFNN有所不同的是,这里的Phase是作用在输入上的,更确切地说,作用在Gating Network的输入上。如下图所示
这里又重新显式的引入相位,相比于MANN更加特化,同时在双足运动中,相位的人为定义更加确切。
具体作用方法是,对于一个输入特征,和MANN一样,我们使用它的子集作为Gating Network的输入特征,但在输入之前,会和Phase做一个张量积得到输入,如下
这里使用Phase的二维向量主要为了有一个连续可微的空间(假设只用一维的factor去乘,那有可能网络的输入是 ),同时采用张量积也能增强Phase的影响。
上图中,黑体加粗部分表示输入特征被使用了张量积、而没有加粗的则是直接将相位和特征拼接在一起。可以看到当所有特征均和二维相位进行张量积后,效果更接近Ground Truth(绿色线)
在上图还可以注意到,相比于MANN,预测网络多了四个东西 ,他们分别代表了帧信息(姿态和路径)编码、目标信息编码、几何接触信息编码、环境中几何信息编码。后三种编码器将在控制模型中进行更详细说明。这里使用编码器的原因主要是为了对预测网络的输入进行降维。红色线(Base line)代表直接使用预测网络,没有gating network 和 blending的一个forward网络。
训练
模型输入被划分成四个部分 对应前面所述的四个编码器。其中 含有路径、姿势信息,和前两篇论文基本保持一致(姿势是上一帧、路径在一个窗口中采样)。而后三个 可以看作为控制部分,详细的设置将在后文的控制模型中说明。
模型输出为 ,输出也能分成三部分:路径信息 、姿势信息 、以及控制信息,如 ,上标代表的action。由于引入了Phase,这里的输出还包括相位的变化 。
以上的数据都能够通过他们的定义由原始的motion数据集中算出来或者标记出来。
这里特殊的地方在于有些信息上带了 tilde(波浪线),比如路径。这就需要讲到这篇论文用到的双向策略了
网络主要分为两个部分,gating network 和 prediction networ,均由三层 fc 组成,其中prediction network的输入由 4 个encoder给出。损失函数和MANN的基本上一样。
Local Motion Phase
到了这篇2020年的这篇文章,进一步加强Phase的影响。和NSM与PFNN不同,这篇文章使用了多个局部 Phase,而非整个角色只用一个 Phase。
想象一下,一个复杂的动作,以我们的视角是很难根据关节去定义一个具体的Phase的,但稍微转变一下视角,我们不必去关注整体的Phase,而是分别关注身体的某几个部分,这样就更容易来定义Phase,最后再将它们一起来表示整体的Phase。而MANN直接通过网络去隐式地学习Phase从而绕过这个问题,但显然这是个更泛化的模型,不见得效果更好。
可以看到,motion的生成模型还是和NSM基本一样的。在生成模型的输入输出上做文章,使得可以控制motion的生成。相比于NSM的生成模型,这篇文章使用了local motion phase来达成更加多变的motion生成。local motion phase的标记方法如下:
- 对四肢和球记录它们与环境的接触,比如脚掌着地时出现高电平信号、未着地为低电平信号,
- 对这些信号进行normalization,
- 进行低通滤波,使得变化更加平滑
- 接着将信号向 拟合, 为第 帧的拟合参数,
- 根据拟合的三角函数,在每一帧提取出相位,
在得到local phase后,我们再生成2D Phase(与NSM)类似
这里 是一个周期窗口 下的最大速率, 是前面拟合三角函数的振幅。这个计算方法使得,不同速度、不同频率下的动作能够区分出来。
训练
模型的输入可以看前面的framework overview那张图,图中分为三块,gating network的输入,预测网络的输入,控制模块的输入。这里gating network的输入是相位信息,与NSM所用的张量积不同,这里是将一个窗口大小为2秒13个采样点的 local phase 作为输入,即 , 表示五个local phase的部位, 表示 的13帧窗口。在更新相位时,同样是输出相位的增量 。
控制模型
当有角色动作生成模型之后,一个很直接的想法就是,怎么控制角色。这里我先简单介绍一下传统的动画系统是如何基于控制信号来控制角色动作。然后从中发现一些可以运用在learing模型上的切入点。
PFNN 和 MANN
这两篇的工作在控制部分基本上在root trajectory上做blending,然指示gait的类型,喂回网络,从而达到控制角色的运动方向、速度以及动作的形态。这种方式基本上限制了角色运动的多变性,同时数据集的标记也使得无法生存不存在于数据集的运动。(下面公式详细解释位于训练
NSM
这篇文章介绍了基于目标的方法来控制角色的运动。在模型输入的控制部分,包含了目标的信息 ,在角色的root-space中分别表示目标的位置、朝向、以及action类型。这些信息在也是在一个窗口内沿着路径采13个样点。控制模式有两种
- goal模式:在一个位置上设置目标点,此时窗口是 跨度 1s
- locomotion模式:根据用户的控制计算出一个目标点,然后使用goal模式,此时窗口是 跨度2s
同时,为了将目标信息更加精确地影响在路径的更新,这里采用了双向策略,简而言之就是blending在root-space和goal-space下的路径信息。那么这里的goal信息就可以生成一个transfrom matrix用于坐标系的变换。
双向策略
这篇文章主要亮点在于和物体交互的动画生成,核心主要是使用双向策略以及交互物体上的sensor。简而言之,双向策略就是在进行路径规划时,分别在根节点坐标系、目标个坐标系下,预测路径的同一个信息。
其内在思想如下
- 如果只有角色中心的路径信息(位置、方向),那么角色将很难接近目标,因为这个值可以看成是一个增量,误差会不断累积
- 如果我们有以目标(goal)为中心的坐标系下的路径信息,那么在计算路径的变化时,就会更加精确。
使用双向策略的量有两个量,一个是角色和目标的接近程度,一个是达到目标后,关节的速度(具有方向性)。在网络的输入上表现为 路径位置、朝向,以及 到达目标后肢体的速度。下面分路径、姿势两个方面讲解双向策略
下一帧路径信息(将作为下一帧的输入)的计算如下
为了更新路径信息,这里使用了 将坐标变回角色中心的坐标系下,这个变换矩阵根据当角色位置和目标角色位置容易计算得出。
这个操作只是对齐两个量而已,并不会影响双向策略的本质。
blending因子 ,其中 随着路径采样窗口左边到右边,从0线性递增到1, 表示路径采样窗口中,每个样点和目标的距离的平方,如下图,表示blending因子中每一项的变化。分析可以知道,当角色接近目标时,在目标坐标系下的 影响程度更大,而在远处时,则是角色中心的 影响更大。
为了更新下一帧的关节速度 ,这里的双向策略就是时间方向上的双向,具体为
这里 表示网络预测未来1s时刻的关节坐标(非窗口), 取两帧间隔(因为我们要更新的下一帧在 ), 将未来1s关节所处的角色中心坐标系transform 到现在的角色坐标系下。(未来和当前的角色中心原点不在同一处,需要对齐)
这里对关节速度也采取双向策略,主要出于这个考虑:在角色抵达目标时,关节的速度方向需要满足我们的朝向,同时变化速度也要平滑。
下图有无双向策略的两种效果比较,可以看到,使用双向策略能够更加使得角色的肢体对齐目标。
和PFNN一起来看,不难发现,路径的重新调整是控制角色运动的一个切入点,根据控制方法的不同,调整的方式也不同。基本思想是当前状态+外界干涉=外界预测,利用这个外界预测和网络预测进行blending,从而达到控制角色。如PFNN中外界预测是手柄输入,在NSM这篇文章中则是,目标坐标系下角色的位置。
Sensor
NSM使用了两种sensor,思想也是双向策略,一种sensor是以角色为中心的,一种是以物体为中心的。分别称为 Environment Sensor(橙色) 和 Interaction Sensor(天蓝色)。
Environment Sensor的具体做法是,以角色为中心,半径为 高度为 的圆柱体中,填充一圈又一圈的球形sensor(类似大葱横截面),然后这些sensor去和场景中的碰撞体(图中绿色部分)进行碰撞测试。每个sensor都会输出一个值喂给 这个Encoder。计算方式如下
其中 表示sensor中心和碰撞体的最短距离, 为sensor的半径。图中可以看到每个sensor输出的值,以明暗程度的方式被可视化。
Interaction Sensor的做法也类似,不同之处在于sensor的形状变成了立方体,并以8x8x8个体素的形式包裹整个物体,如上图的右上角。而sensor的输出不在是一个 值,而是一个4D向量 前面三个分量表示sensor中心到角色中心的距离, 则和Environment Sensor的做法类似,计算时的 为sensor到碰撞体(还是图中间绿色部分)的最短距离, 则是sensor的对角线长度。
可以看到只使用 Environment Sensor 时,角色的关节很难对齐物体,而使用了 Interaction Sensor 后,角色就非常好的对齐物体。这里主要原因是,橙色球形sensor是去探测碰撞体,显然很难得到碰撞体的几何信息。而蓝色体素sensor直接绑定在碰撞体上,那么这种sensor的变化就能很好的体现出碰撞体的几何信息。(如图中蓝色的形状和椅子的形状是重合的)
如果只用Interaction Sensor的话,角色就会比较难定位物体的位置,如上图。总结一下,Environment Sensor 对于物体的位置更加敏感,而Interaction Sensor 则对于接触信息(物体的几何信息)更加敏感。
Local Motion Phase
Local Motion Phase这篇文章中,介绍了一种Generative Control Model,用于控制角色的运动。具体做法如下图
首先对一部分MoCap进行人工标记,将控制信号和motion进行匹配,然后使用 Encoder-Dropout-Decoder,进行编码,在重构信号时,利用Discriminator鉴别Decoder的输出是否真实。这样我们能就得到了一个控制的Latent Space,在玩家实际操控时候,控制信号也会先被Encoder编码成latent vector,在这里额外加入一点噪声,然后在重构出控制信号 ,用于控制人物的动作。
为了在用户控制下的人物动作变化更加平滑,这里还是采用blending的思想,即将网络预测的和用户给出的两个控制信号进行blending。
这里控制信号的内容有路径信息、交互信息、action类型的信息,同样的,这些信息都是在 的窗口中。