基于学习的动作匹配


动作匹配是一种简单而强大的为游戏角色添加动画的方法。和其他方案相比,动作匹配有了基本配置就不需要太多的人力工作:无需在图形中进行结构剪辑、精确剪辑或同步,也不用在状态转换之间去单独制作新的过渡动画。
然而,动作匹配在与大量运动捕捉数据结合使用时效果最佳,但也要付出代价:占用大量内存,且随着系统和应用增多会占用更多内存。在这里,我们提出了一个解决这个问题的方案,称为学习动作匹配,它利用机器学习来大幅减少基于动作匹配的动画系统的内存使用。
Motion Matching
首先让我们理解一下动作匹配的工作原理。我们最好从数据开始研究 —— 长段的、非结构化的动画 —— 通常来自动作捕捉数据集。这是这种数据集中的一个典型动画:

思考一下这个问题:如何使用这个源数据构建一个新的动画,让角色跟随这个路径?

有好的动画数据集,动作匹配就可以解决这个问题。动作匹配的原理是,在数据集中重复搜索一个满足这个条件的片段:该片段能从当前位置开始播放,且比当前片段更好的满足需求。原始结果就是一些动画片段的拼凑,大概就是这样:

这里的关键是,决定什么时候开始播放新的动画而不是继续当前已经播放的动画。选择新的片段意味着跳到数据集里某个动画的某个帧,这要求系统能衡量这一行为带来的后果优劣。要确定具体如何做到这一点并不容易,因为一个动画中的单独一个帧包含了很多信息 —— 有些信息可能对做出这个决定帮不上忙。

一个好的解决方案是手动挑选一些信息----特征,之后使用这些特征去判断一个动画的某一帧匹配当前任务的效果如何。在这个情形中,我们需要特征表达两个信息:
首先,角色将要跟随的路径,这样我们就能看到和需要的路径相似程度
其次,当前角色的姿势,这样如果我们播放新的片段,角色姿势不会发生太大的变化。
通过一些实验,可以发现仅仅需要双脚位置、双脚速度、臀部位置、未来轨迹和方向的一些采样,就可以完成这个路径跟随的工作:

这些信息就更加简单、易于管理,对人类以及要在运行环境中不停搜索匹配的算法来说也是。如果将每个动画帧的所有特征值收集到一个数组中,我们将获得一个向量,称之为特征向量(上图中的彩色数组)。这是该框架执行任务的能力的简单数字表示。我们对数据集中的所有帧都提取这些特征,并将结果向量堆叠成一个大矩阵。我们把它称之为匹配特征数据库。当要决定是否切换新片段时,算法从当前动作和路径的未来片段生成一个查询特征向量,之后从数据库中查询匹配最佳结果。找到后,在动画数据集中查找相应的完整动作,开始播放。搜索以及找到的最佳匹配可视化是这样的:

切换到下个片段时出现烦人的抖动咋办?尽管我们有一些可以捕捉当前姿势的特征,我们也有一些要体现未来轨迹的特征。接受了这些轨迹特征,就像接受一些运动不连续性,以换取对路径的跟随。如果姿势变化不是太剧烈,这种不连续性可以使用一些常用技术轻松消除,比如一个短的淡入淡出混合,或者通过衰减过渡动画的源和目标帧中的差异,也叫做惯性化技术。惯性化混合应用之后,效果是这样的:

最后,通过脚部锁定和反向动力学来制作出一个漂亮、顺滑的动画:

通过选择不同的特征进行匹配,我们可以开发出能完成不同任务的动画系统,比如和道具交互的、在崎岖地面上行走的,甚至对其他角色产生反应的。这是当今很多游戏中杰出动画系统的背后的秘密武器。
The Scalability Problem
现在你已经了解了动作匹配的原理了,那考虑一下一个 AAA 游戏的制作可能需要多少数据。取决于设计,有很多因素需要考虑,比如需要支持的运动类型(空闲、走、小跑、跑、疾跑、慢速下身移动、快速下身移动、跳跃、跳步、下蹲……),可用的动作和他们的参数(开门、坐在椅子上、拿起物品、上马……),组合(行走,拿着轻武器行走,拿着双持重武器行走),这些运动类型可能还因为原型风格(比如平民版,士兵版)和游戏状态(受伤、醉酒,等等)要进一步合成。可能你还没反应过来,系统里面就已经有了几百 MB 甚至 GB 的数据。现在,让我们强调一下关于动作匹配特别重要的一点:动作匹配为你进行数据组合。如果你有两个动画,一个在走路,一个在喝酒,动作匹配是不会帮你生产出一个角色一边走路一边喝酒的场景的。动作匹配只会播放你提供的数据。
而且,我们在内存中要存的不仅仅是动画数据,还有匹配特征数据库,而这个数据库的大小和特征的数量、动画数据量成正比。自然而然,在更大的数据库中进行搜索,就意味着运行性能会有所下降。这就是我们为什么说,动作匹配在数据方面,扩展性很差。
我们这项研究的目标很简单:用其他方法替代动作匹配机制,在产生同样的结果的同时,不要求在内存中存这么多的数据。动画师的工作流程应该不变:动画师应该使用动作匹配和系统和尽可能多的数据,来制作他们喜欢的任何系统。在动画师完成工作之后,接入一个新的系统,该系统能生成相同的结果,但内存消耗更低,CPU 消耗恒定。这就是基于学习的动作匹配。
3 基于学习的动作匹配
首先,我们要更抽象地思考我们的动画系统,把动画系统作为一个逻辑系统,这个系统接收的输入是一些控制查询(可能是想要跟随的路径,或者摇杆位置、按键按下等等),产生的输出是连续的、流畅的动画。如我们所见,一个基于动作匹配的动画系统,是通过提供给他的动画数据以及定期搜索特征数据库来完成这项任务的。
更具体地说,动画是由一系列完整姿势描述的,每一个姿势都由一个帧索引来进行引用,帧索引指向的是在动画数据集中姿势存储的地点。播放一个片段,意味着每过一帧,就对当前索引进行递增,并在动画数据集中查询匹配的完整姿势。动作匹配搜索每隔几帧进行一次,并把查询特征和匹配特征数据库中的每一个条目比较,来找到最佳匹配的帧索引。最佳匹配的帧索引替换掉当前索引,然后从这里继续播放。下图总结了这个逻辑:

让我们首先考虑能简化掉此图中的动画数据集。一种思路是尝试并重新使用为在搜索中使用而计算出的匹配特征数据库。毕竟,存储在该数据库中的特征涵盖了动画的许多重要方面的信息。我们训练一个称为解压缩器的神经网络,将匹配特征数据库中的特征向量作为输入,并生成相应的完整姿势作为输出。有了这个网络,每帧逻辑现在看起来像这样:

让我们看看与标准姿势查找相比,它的表现如何。下面的对比视频中,可以看到灰色是使用姿势查找生成的姿势,红色是使用解压缩器生成的姿势。

可以看出,虽然动画相似,有时候会看出一些错误(看左边线骨架上手的位置)。这是因为匹配特征没有携带足够的信息,我们无法在所有情况下重建姿势。尽管如此,重建动画的质量还是出奇地好。如果我们给解压缩器一些额外的信息,比如多一些附加的特征,而不是仅仅依赖匹配的特征数据库呢?
事实上,我们可以使用自动编码网络自动提取附加特征,而不是手动选择(更多信息请参见论文)。训练这个自动编码器为我们提供了每帧的附加特征向量,这些附加特征是自动选择的,以提高解压缩器的准确性。我们必须将所有帧的附加特征,和匹配特征数据库一起,存进一个附加特征数据库。让我们看看这对我们的逻辑意味着什么:

下面就是有了这些附加特征带来的质量提升,姿势查询的结果为灰色,解压缩器和解压缩器的结果是绿色。

非常好!现在的输出结果和原始动画几乎完全一样了。在这个过程中我们节约了多少内存?

现在动画数据集不需要存在内存中了,我们大幅减少了内存消耗,而输出结果的质量变化几乎无法察觉。同时,我们也让原始的动作匹配行为不变。
不尽如人意的是,扩展性问题并没有完全消失:剩余的匹配和附加特征数据库的大小,依然会和动画数据集的大小一起增长。首先,我们通过把匹配特征数据库和附加特征数据库合并在一起,组成合并特征数据库,来简化我们的流程图。这样,一个给定的帧的合并特征向量,就是匹配和附加特征向量的结合。

下一步就是解决在每一帧上对于合并特征数据库的依赖。这里,我们不对当前帧进行递增然后再进行特征查找,而是训练一个新的神经网络,叫做步骤器,用步骤器去通过当前帧的合并特征向量,去预测下一帧的合并特征向量。因为我们希望能够提供更高频率的过渡(比如每秒 5 次),步骤器仅需要学习短时间的预测即可,这样,步骤器的大小可以很小,但预测依然准确。使用步骤器的新逻辑如下所示:

非常好!现在我们不再需要每一帧都用合并特征数据集了。但在过渡阶段,还有两个最终的操作依赖于内存中的合并特征数据库:实际的动作匹配搜索和紧接着的特征查询。这里,我们不再搜索最佳匹配的特征、查询相应的附加特征、返回合并向量,而是训练第三个,也是最后一个神经网络 —— 叫做投射器 —— 来直接通过查询向量来预测合并特征,本质上是模拟搜索和查找。现在我们可以完全不依赖任何数据库了:

训练完所有这些网络之后,完整的基于学习的动作匹配逻辑是这样的:

这个逻辑不仅非常简单,而且正如我们在解压缩器中发现的那样,如果每一个单独的神经网络训练的地精确度都足够高,基于学习的动作匹配和基本的动作匹配的区别非常难以察觉。我们展示一下基于学习的动作匹配应用到我们一直使用的路径跟随的例子中的效果:

这是内存使用:

在这个例子中,基于学习的动作匹配将内存消耗缩小到了十分之一 —— 不错!
不过,如果我们想看到巨大的收益,我们需要大幅增加动画数据集的内容。在实验中,我们为角色添加了 47 个新的关节,包括手和手指,还向数据集添加了三十多种新的运动风格,所有这些都可以通过开关进行控制。下面是在我们添加所有数据和所有神经网络后,互动式的基于学习的动作匹配动作控制器的样子:
这是内存使用:

尽管我们添加了大量的数据,包括很多的关节和特征,并让动作匹配的内存消耗达到了半个 GB,基于学习的动作匹配的内存消耗依然相对较小。最后,我们需要存储的仅仅是大概 17MB 的神经网络权重。我们甚至发现神经网络权重也可以通过量化为 16 位整数,进一步压缩一倍到两倍,而不会对结果产生任何可见的影响。如果把这个压缩也包括在内,我们可以将内存消耗降低到原先的 1/70 ——将 590MB 的控制器压缩成 8.5MB!
因此,基于学习的动作匹配是一种非常强大的、可通用的、系统化的方法,可以将基于动画系统的动作匹配进行压缩,并可为非常大的数据集进行扩展。使用基于学习的动作匹配,可以在制作预算有限的情况下,实现非常复杂的、需要大量数据的动画控制器,比如如下视频中,角色在不平的地面上行走,并且和其他角色、道具无缝地进行交互。这个场景中的每一个角色的动画都使用了基于学习的动作匹配。
我们希望基于学习的动作匹配,能从根本上扩展基于动画系统的动作匹配的可能性,让美术、设计师、程序员完全发挥自己的创造力,开发出能够对游戏中各种情形做出上千种真实、独特反馈的角色,而不用担心对内存或者性能的影响。
有关详细信息和结果,请在这里查看这个补充视频:

以及这里的完整论文:https://static-wordpress.akamaized.net/montreal.ubisoft.com/wp-content/uploads/2020/07/09154101/Learned_Motion_Matching.pdf
Other Animation Research
Ubisoft La Forge 的其他研究:
Automatic In-Betweening for Faster Animation Authoring
Making Machine Learning Work: From Ideas to Production Tools
Ubisoft La Forge Animation Dataset