8月8日深夜,英伟达CEO黄仁勋,再次登上了世界顶级计算机图形学会议SIGGRAPH的舞台,用一系列重磅更新展示了在AI和元宇宙方向上的野心。
而就在最近,被SIGGRAPH 2023收录的CALM模型的正式开源,也让游戏和动画开发直接飙上了AI加持的快车道。
CALM可以自学「人类的动作」,无需额外训练就能自由合成和控制虚拟角色的动作,效果逼真自然。也许很快整个游戏、动画工业的格局就要彻底改变,而VR场景中的人物和角色也将从此不再生硬,元宇宙可能真的要加速到来了!
具体来说,英伟达联合以色列理工学院、巴伊兰大学和西蒙菲莎大学,共同提出了一种全新的条件对抗潜模型(Conditional Adversarial Latent Models,CALM)。
通过模仿学习,CALM学习到了一种可以捕捉人类动作复杂性和多样性的动作表征,并能直接控制角色的动作。
该方法可以联合学习控制策略和动作编码器,对给定动作的关键特征进行重建,而不仅仅是复制。
结果表明,CALM可以通过学习语义动作表征,对生成的动作进行控制,并且为更高层的任务训练提供风格调整。
训练完成后,用户就可以利用像电脑游戏一样的界面,非常直观地对角色进行控制了。
论文地址:https://arxiv.org/abs/2305.02195
项目地址:https://github.com/NVlabs/CALM
实现方法
CALM以对抗性技能嵌入为基础,并借鉴了其代码。
研究人员利用单张A100 GPU,通过在4096个Isaac Gym环境上进行并行训练,共计50亿步。
为了实现零样本任务解决方案,CALM由3个阶段组成:
(1)动作编码器和底层策略(解码器)联合训练,将动作捕捉序列映射为控制模拟角色的动作。
(2)使用潜空间调节训练高层策略,从而实现对执行动作方向的控制,同时保留所需的风格。
(3)将步骤1和2结合起来,使用简单的有限状态机来解决任务,无需进一步训练,也无需精心设计奖励/终止条件。
阶段1:底层训练
在底层训练阶段,CALM学习了一个编码器和一个解码器。
编码器接收来自动作参考数据集的动作,即关节位置的时间序列,并将其映射到低维潜表征(low-dimensional latent representation)。
解码器是一个底层策略,通过与模拟器进行交互,来生成类似于参考数据集的动作。
这个策略能够按需产生各种行为,但不受动作方向性的影响。例如,它可以被指示走路,但无法本能的地控制行走的方向。
为了评估学习到的动作表征能力,研究人员测试了在潜空间中在动作之间进行插值的能力。
在这里,初始的潜表征是「冲刺」,最终的潜表征是「蹲下不动」。
在整个过程中,潜表征会随着时间进行线性插值,而角色则会通过语义上有意义的转换来平稳过渡,逐渐减慢速度并倾斜上半身。
阶段2:方向控制
为了控制动作方向,研究人员训练了一个高层任务驱动策略来选择潜变量。
其中,这些潜变量被提供给底层策略,并让后者生成所需的动作。
为了实现这一点,研究人员首先通过动作编码器来获取动作潜表征。
然后,根据高层策略所选的潜变量与代表所需风格的潜变量之间的余弦距离成比例,给它一个额外的奖励,从而引导高层策略采用所期望的行为风格。
而训练好的方向控制器,就可以控制角色所执行的动作形式和方向了。
比如下面的「蹲下行走」、「举盾行走」和「奔跑」。
阶段3:推理
最后,把之前训练过的模型结合起来(底层策略和方向控制器),以在没有额外训练的情况下组合出复杂的动作。为此,用户创建一个包含标准规则和指令的有限状态机(finite-state machine,FSM)。这些规则和指令确定要执行哪种动作,类似于用户控制游戏角色的方式。例如,它们决定角色是否应该执行简单的动作,直接使用底层策略进行执行,或者是否需要高层控制来进行定向动作。
比如,FSM可以构建如下的动作流程:
(1)转身,
(2)向着目标蹲行,直到距离<1m,
(3)庆祝。
以下是更多的效果展示:
测试结果
可控动作生成
研究人员首先分析了CALM的三个方面:(1)编码器质量,(2)底层控制器的多样性,以及(3)组合系统的可控性。
编码器质量
使用之前研究中的类别分离性(separability)测试,研究人员在编码器学习的表示上衡量了潜空间内动作类别之间的分离性,将动作类别定义为单个动作文件(motion file)中的子动作。
如上表所示,CALM将动作编码为具有更好分离性的表征。
多样性
研究人员使用参考数据集训练了一个分类器,将动作序列映射到原始动作索引(originating motion index)。
当从随机采样的潜变量𝑧 ∼ Z生成时,研究人员记录了生成动作的Inception Score。
如上表所示,CALM显著改善了生成动作的多样性。
可控性
最后,研究人员通过用户调研来量化了CALM生成所要求动作的能力。
为了进行评估,研究人员给用户提供了一个参考动作和一个文本描述,然后询问用户对生成的动作是否和描述相似进行分类。
对于每个模型,研究人员向用户呈现了40个参考动作,每个参考动作生成了3个版本。
记录下准确性——由控制器生成的准确版本所占的百分比。
结果显示,与ASE相比,CALM使生成的动作更易控制,将感知生成的准确率从35%提高到78%。
这些改进和提高是通过使用条件鉴别性目标来对表示(编码器)和生成动作模型(底层策略)进行端到端学习来实现的。
一系列的结果表明,CALM学习了将动作编码为语义上有意义的表示,能够生成与示范具有类似特征动作的控制器。
在整个过程中,条件动作(conditional motion)发生了改变,从而生成了向被要求的动作之间类似人类动作的过渡。
此外,为了说明潜空间的语义结构,研究人员将两个语义相关的动作「冲刺」和「蹲下空闲」进行编码,并在时间上在编码之间进行插值。
如上图e所示,CALM在两个动作之间平稳过渡,同时不间断地执行连贯的行走动作,同时降低了速度和高度。
解决下游任务
使用编码器和底层策略,研究人员展示了如何使用类似于视频游戏控制的命令来为解决未见过的任务组合动作。
方向运动控制
首先,研究人员展示了在给定一个参考动作𝑀和一个方向𝑑∗的情况下,一个高层策略可以学会控制底层策略。
研究人员将这个任务称为Heading。角色应该在请求的方向上产生具有相似特征的动作。
研究人员在上中展示了学到的动作,并在下表的Heading列中对它们进行了量化。高层策略被设定为同时学习「奔跑」,「持盾行走」和「蹲下行走」的条件。
在评估过程中,高层策略被设定为一个固定的风格,并且在随机时间步骤上更改方向。
研究人员记录了生成请求风格的成功程度,使用人工评估员进行评估,并且测量动作的方向——请求动作方向与实际动作方向之间的余弦距离。
结果表明,通过将潜变量约束在接近参考动作编码(reference motion encoding)的范围内,高层策略能够在指定的风格中生成动作,同时确保它在要求的方向上移动。
在没有进一步训练的情况下解决任务
在研究人员的最终实验中,研究人员将可定向的底层控制器与高层动作策略结合在一起,为新的任务提供零样本解决方案。
研究人员设计了两个任务,位置和攻击。
对于位置任务,人物应该达到并保持在目标位置内——以围绕旗杆的圆圈来表示。
更复杂的任务「攻击」要求人物到达目标并击倒目标。
在这两种任务中,人物都受到一系列参考动作的控制。
为了实现这一点,将方向向量设定到目标位置,在人物的本地坐标框架中表示。
一旦在范围内,底层策略直接提供相应于所请求动作(例如踢、持盾冲刺或剑挥)的潜在变量。
如上图所示,CALM可以用于解决任务,具体数值见之前方向运动控制部分中的表一。
就像一个人类玩家用手柄控制人物一样,由于CALM的可控性很好,在没有任何进一步的训练或设计了任务特定的奖励的条件下,FSM按顺序地命令人物在动作之间进行过渡。
角色以一种类似人类的动作组合,完成了任务。
项目开源
准备工作
下载安装Isaac Gym,并安装外部依赖项:
pip install -r requirements.txt
预训练
首先,可以使用以下命令对CALM模型进行训练,从而模仿数据集中的动作片段:
python calm/run.py --task HumanoidAMPGetup --cfg_env calm/data/cfg/humanoid_calm_sword_shield_getup.yaml --cfg_train calm/data/cfg/train/rlg/calm_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/dataset_reallusion_sword_shield.yaml --headless --track
要测试训练好的模型,请使用以下命令:
python calm/run.py --test --task HumanoidAMPGetup --num_envs 16 --cfg_env calm/data/cfg/humanoid_calm_sword_shield_getup.yaml --cfg_train calm/data/cfg/train/rlg/calm_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/dataset_reallusion_sword_shield.yaml --checkpoint [path_to_calm_checkpoint]
精确训练
在训练完CALM底层控制器之后,就可以使用它来训练运动控制器了。
以下命令将使用预训练的CALM模型执行目标朝向任务:
python calm/run.py --task HumanoidHeadingConditioned --cfg_env calm/data/cfg/humanoid_sword_shield_heading_conditioned.yaml --cfg_train calm/data/cfg/train/rlg/hrl_humanoid_style_control.yaml --motion_file calm/data/motions/reallusion_sword_shield/dataset_reallusion_sword_shield_fsm_movements.yaml --llc_checkpoint [path_to_llc_checkpoint] --headless --track
要测试训练好的模型,请使用以下命令:
python calm/run.py --test --task HumanoidHeadingConditioned --num_envs 16 --cfg_env calm/data/cfg/humanoid_sword_shield_heading_conditioned.yaml --cfg_train calm/data/cfg/train/rlg/hrl_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/dataset_reallusion_sword_shield_fsm_movements.yaml --llc_checkpoint [path_to_llc_checkpoint] --checkpoint [path_to_hlc_checkpoint]
任务解决(只用推理,无需训练)
CALM底层控制器和高层运动控制器可以结合起来,无需进一步训练即可解决任务。
此阶段仅进行推理:
python calm/run.py --test --task HumanoidStrikeFSM --num_envs 16 --cfg_env calm/data/cfg/humanoid_sword_shield_strike_fsm.yaml --cfg_train calm/data/cfg/train/rlg/hrl_humanoid_fsm.yaml --motion_file calm/data/motions/reallusion_sword_shield/dataset_reallusion_sword_shield_fsm_movements.yaml --llc_checkpoint [path_to_llc_checkpoint] --checkpoint [path_to_hlc_checkpoint]
内置任务及其各自的配置文件为:
HumanoidStrikeFSM: calm/data/cfg/humanoid_sword_shield_strike_fsm.yaml
HumanoidLocationFSM: calm/data/cfg/humanoid_sword_shield_location_fsm.yaml
任务训练
除了精确训练外,还可以训练高层控制器直接解决任务。
以下命令将使用预训练的CALM模型执行目标朝向任务:
python calm/run.py --task HumanoidHeading --cfg_env calm/data/cfg/humanoid_sword_shield_heading.yaml --cfg_train calm/data/cfg/train/rlg/hrl_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/RL_Avatar_Idle_Ready_Motion.npy --llc_checkpoint [path_to_llc_checkpoint] --headless --track
内置任务及其各自的配置文件为:
HumanoidReach: calm/data/cfg/humanoid_sword_shield_reach.yaml
HumanoidHeading: calm/data/cfg/humanoid_sword_shield_heading.yaml
HumanoidLocation: calm/data/cfg/humanoid_sword_shield_location.yaml
HumanoidStrike: calm/data/cfg/humanoid_sword_shield_strike.yaml
要测试训练好的模型,请使用以下命令:
python calm/run.py --test --task HumanoidHeading --num_envs 16 --cfg_env calm/data/cfg/humanoid_sword_shield_heading.yaml --cfg_train calm/data/cfg/train/rlg/hrl_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/RL_Avatar_Idle_Ready_Motion.npy --llc_checkpoint [path_to_llc_checkpoint] --checkpoint [path_to_hlc_checkpoint]
AMP
同时,项目还提供了Adversarial Motion Priors的实现。使用以下命令可以训练模型模仿给定的参考动作:
python calm/run.py --task HumanoidAMP --cfg_env calm/data/cfg/humanoid_sword_shield.yaml --cfg_train calm/data/cfg/train/rlg/amp_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/sword_shield/RL_Avatar_Atk_2xCombo01_Motion.npy --headless --track
训练好的模型可以通过以下方式进行测试:
python calm/run.py --test --task HumanoidAMP --num_envs 16 --cfg_env calm/data/cfg/humanoid_sword_shield.yaml --cfg_train calm/data/cfg/train/rlg/amp_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/sword_shield/RL_Avatar_Atk_2xCombo01_Motion.npy --checkpoint [path_to_amp_checkpoint]
动作数据
可以使用以下命令对动作片段进行可视化:
python calm/run.py --test --task HumanoidViewMotion --num_envs 2 --cfg_env calm/data/cfg/humanoid_sword_shield.yaml --cfg_train calm/data/cfg/train/rlg/amp_humanoid.yaml --motion_file calm/data/motions/reallusion_sword_shield/sword_shield/RL_Avatar_Atk_2xCombo01_Motion.npy
参考资料:
https://research.nvidia.com/labs/par/calm/