music-to-dance系列论文之AI Choreographer: Music Conditioned 3D Dance Generation with AIST++

摘要

1)提出了AIST++多模态数据集,包括3D舞蹈动作及其音乐;
2)提出了FACT(a full-attention cross modal)模型,基于transformer结构解决与输入音乐关联问题。
3)代码和数据集获取地址:https://google.github.io/aichoreographer

介绍

舞蹈成为互联网上传播信息的强大工具。对人类来说,需要经过专业训练和拥有丰富舞蹈工作的舞者才能创造出富有表现力的舞蹈。这对人工智能提供了挑战性,因为该任务需要生成具有高运动复杂性的连续运动,并且捕捉与伴随音乐之间的非线性关系。
为了解决这些挑战,作者提出了一个Full Attention Cross-modal Transformer(FACT)模型,以及一个大规模3D舞蹈动作数据集AIST++。给定一段音乐和起始动作,FACT能够生成长时序的具有真实感的3D舞蹈动作。FACT模型利用一个audio transformer和一个初始动作transformer分别对两个模态的输入数据进行编码,而后通过一个cross-modal transformer来建模声音和动作间的分布 。该模型用于预测N个未来的动作序列,在测试时通过自回归的方式生成连续的动作。其中有三个关键设计:1)在自回顾模型中利用full-attention;2)future-N监督;3)两个模态的早期融合。

相关工作

3D Human Motion Synthesis
Audio To Human Motion Generation
Cross-Modal Sequence-to-Sequence Generation

AIST++ Dataset

数据获取

从AIST Dance Database数据集中生成的AIST++。因为AIST中一个舞者的多个相机拍摄的视频时相机并未对准。AIST++根据SMPL参数恢复了相机的校准参数和3D人体运动。

数据集描述

AIST++是最大的3D人类舞蹈数据集,有1408个帧序列,30个主题和10种舞蹈风格。每一帧包含了 1)9个视图的相机内在和外在参数;2)17个COCO形式的2D和3D人体关键点位置;3)24个SMPL的姿态参数以及全局的缩放和平移参数。

基于音乐的3D舞蹈生成

问题描述

给定2s的初始动作 X = ( x 1 , . . . , x T ) X=(x_1, ..., x_T) X=(x1,...,xT)和一个长期音乐序列 Y = ( y 1 , . . . , y T ′ ) Y=(y_1, ..., y_{T^{'}}) Y=(y1,...,yT),目标是生成一系列未来动作 X = ( x T + 1 , . . . , x T ′ ) X=(x_{T+1}, ..., x_{T^{'}}) X=(xT+1,...,xT)

全注意力的跨模态Transformer

在这里插入图片描述

与以往Transformer不同之处在于:
1)在attention部分不使用mask机制,即不遮挡未来部分的信息,因此训练模型时只预测当前上下文窗口的T帧未来,而不仅仅是1个未来帧,这使得网络更多地关注时间背景,并且保证了训练一个模型在几代步骤后不会收到运动冻结或发散的影响。即 X = ( x 1 , . . . , x T ) X=(x_1, ..., x_T) X=(x1,...,xT) X = ( x T + 1 , . . . , x 2 T ) X=(x_{T+1}, ..., x_{2T}) X=(xT+1,...,x2T)
2)将生成的motion embedding和audio embedding拼接起来,在输入cross-modal transformer,经验证发现,深度跨模态模块对于训练一个真正注意输入音乐的模型是必不可少的。

实验

AIST++运动质量验证

对3D动作重构进行验证,使用的方法是2D mean per joint position error(MPJPE-2D),来验证预测的3D关键点和利用估计的相机参数重构后的3D关键点之间的像素差。

基于音乐的3D舞蹈生成
数据划分方式

在构建测试集时,作者先从每一个不同舞蹈类型中挑选一个音乐片段,然后对每一个音乐片段随机挑选两个舞者,每个舞者都有两种不同的编排与该音乐对应,因此测试集中总共有40种不同的舞蹈编排。构建训练集时将测试机中使用的音乐和舞蹈编排排除掉。

实现细节

120帧初始动作序列和240帧音乐序列
音乐特征:基于Librosa提取1维envelop,20维MFCC,12维Chroma,1维one-hot peaks以及1维one-hot节拍,总共是35维音乐特征
舞蹈特征:24个关节点的9维旋转矩阵,以及3维全局平移向量,总共219维运动特征

定量分析

1)运动质量
利用Frechet Inception Distance(FID)来计算生成动作和真实动作之间的距离分布(越小越好)。
F I D g FID_g FIDg F I D k FID_k FIDk指标:利用几何特征提取器生成一个布尔向量用以表达在运动序列中某些身体关键点之间的几何关系;一个运动学特征提取器将速度和加速度信息映射到运动序列。
2)生成多样性
作者计算了在AIST++测试集上生成的40个运动的特征空间中的平均欧氏距离(越大越好)。
3)运动和音乐之间的关联性
节拍对齐评分(BeatAlign)用于评估运动节拍和音乐节拍之间的运动-音乐关联性。利用librosa提取音乐节拍,利用运动速度的局部最小值提取运动节拍。节拍对齐评分计算每个运动节拍与其最近的音乐节拍之间的平均距离。
其中,x代表运动节拍,y代表音乐节拍

消融实验

1)Full-Attention Future-N Supervision:
对比配置:causal-attention shift-by-1 supervision; full attention with future 1 supervision; full attention with future 10 supervision; full attention with future 20 supervision
实验结果证实短期的监督会在后期生成过程中产生较大的运动漂移,当10个或20个未来帧监督时,模型更关注时间上下文可以产生高质量的长期运动序列。
2)Early Cross-Modal Fusion:
对比配置:
No-Fusion:14层运动transformer
Late-Fusion:13层motion/audio transformer,以及1层cross-modal transformer
Early-Fusion:2层motion/audio transformer,以及12层cross-modal transformer
实验结果证实早期融合允许跨模型变压器更多地关注音乐,而晚期融合则倾向于忽略条件反射音乐

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Choreographer::postCallbackDelayedInternal 是 Android 系统中一个非常重要的方法,用于将一个 Runnable 对象投递给 Choreographer ,以便在下一次 VSync 信号到来时执行该 Runnable 对象。该方法源码如下: ```java private void postCallbackDelayedInternal(int callbackType, Runnable action, Object token, long delayMillis) { synchronized (mLock) { // 如果 Choreographer 已经停止工作,则直接返回 if (mCallbacks == null) { return; } final long now = SystemClock.uptimeMillis(); final long when = now + delayMillis; // 将任务封装成 ChoreographerCallback 对象 final CallbackRecord callbacks = obtainCallbackLocked(callbackType, action, token, when); // 将 ChoreographerCallback 对象添加到任务队列中 addCallbackLocked(when, callbacks); // 如果任务队列中的任务数量超过了阈值,则向 Choreographer 发送消息 if (mFrameScheduled || (mFrameScheduled = mLooper.getQueue().isPolling())) { mTraversalScheduled = false; mChoreographer.postCallback(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null); } else if (!mTraversalScheduled) { mTraversalScheduled = true; // 如果任务队列中的任务数量未超过阈值,则将提交遍历任务的操作延迟一段时间 mChoreographer.postCallbackDelayed(Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null, FRAME_TIMEOUT_MS - delayMillis); } } } ``` 该方法主要有以下几个步骤: 1. 判断 Choreographer 是否已经停止工作,如果已经停止,则直接返回。 2. 将任务封装成 ChoreographerCallback 对象。 3. 将 ChoreographerCallback 对象添加到任务队列中。 4. 判断任务队列中的任务数量是否超过阈值,如果超过则向 Choreographer 发送消息,否则将提交遍历任务的操作延迟一段时间。 其中,步骤 2 和步骤 3 的实现比较简单,这里不再赘述,主要介绍一下步骤 4。 在 Android 系统中,Choreographer 是一个用于协调应用程序 UI 绘制和动画的系统组件,它的主要作用是通过 VSync 信号来同步应用程序的 UI 绘制和动画,保证帧率的稳定性和流畅性。Choreographer 在初始化时会创建一个 Handler 对象,并且在 Handler 中注册了一个消息回调函数,当 Handler 接收到消息时,就会执行该消息回调函数。 在 Choreographer 中,有两个回调函数,一个是 CALLBACK_TRAVERSAL,另一个是 CALLBACK_COMMIT。其中 CALLBACK_TRAVERSAL 用于执行应用程序的 UI 绘制操作,CALLBACK_COMMIT 用于执行应用程序的动画操作。Choreographer 会根据任务队列中的任务类型来决定将任务添加到哪个回调函数中。 在步骤 4 中,如果任务队列中的任务数量超过了阈值,Choreographer 就会向 Handler 发送 CALLBACK_TRAVERSAL 消息,并执行 CALLBACK_TRAVERSAL 回调函数中的任务。如果任务队列中的任务数量未超过阈值,Choreographer 就会将提交遍历任务的操作延迟一段时间,并延迟执行 CALLBACK_TRAVERSAL 回调函数中的任务。这样做的目的是为了尽量保证应用程序的帧率稳定性和流畅性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值