导读:关于REACT2024.首先,挑战赛官网如下:https://sites.google.com/cam.ac.uk/react2024/home.这个挑战赛的任务是:建立一个机器学习模型,在双人交互的背景下,通过说话者的视频、音频、表情等数据,生成听者的面部反应并要保证反应的合理
首先,挑战赛官网如下:https://sites.google.com/cam.ac.uk/react2024/home
这个挑战赛的任务是:建立一个机器学习模型,在双人交互的背景下,通过说话者的视频、音频、表情等数据,生成听者的面部反应并要保证反应的合理性(FRDist
and FRCorr)、多样性(FRVar, FRDiv, and FRDvs)、同步性(FRSyn)、真实性(FRRea)。
数据集主要分为以下四部分:
为便于网络读取,加快训练速度,我将mp4数据打包成npy数据[seq_len, img_size[0], img_size[1]],其他不变。
输入:说话者的audio_clips和video_cilps, 实际seq_len=751,训练时随机从中裁切256帧作为patch
输出:listener_emotion, listener_3dmm, distribution
(latend_dim的分布,这个涉及VAE,暂时对其还不是很了解)
输入:说话者的audio_clips和video_cilps,实际seq_len=751,训练时随机从中裁切256帧作为patch
输出:listener_emotion, listener_3dmm, distribution
以TransVAE (baseline之一,官方参考TEACH)为例
1、将video、audio、emotion、3dmm随机从751帧里抽取256帧 作为patch,包括speaker_video_clip [B, 256, 224, 224], speaker_audio_clip [B, 256, 78], speaker_emotion [B, 256, 25], speaker_3dmm [B, 256, 58], listener_video_clip , listener_audio_clip , listener_emotion , listener_3dmm , listener_reference (listener_video[0],是原751帧的第一帧) [B, 1, 224, 224];
2、将speaker_video_clip通过Conv3D得到x[B, 256, 128],speaker_audio_clip通过Linear得到y[B, 256, 128],将x和y拼接cat在一起再通过Linear得到speaker_behaviour_feature[B, 256, 128];
3、speaker_behaviour_feature通过Linear得到x, shape不变,同时创建两个可学习参数mu_token和logvar_token, shape和x一样,并随机初始化torch.randn,然后拼接cat在一起得到x [B, 2+256, 128], 再通过一层TransformerEncoder (mask全为0,不遮蔽),得到z [B, 2+256, 128], 令mu和logvar分别等于z[0]和z[1],logvar再exp()和pow(0.5)得到std,对mu和std取正态分布dist [B, 128],然后rsample一个值motion_sample [B, 128] (mu + eps*std, eps随机从标准正态分布中采样);
4、创建time_queries(zeros[B, 256, 128])并加上positionembedding得到tgt,并创建tgt_mask[n_head*B, 256, 256],上三角矩阵,然后升维motion_sample至[B, 1, 128]并令其为memory,将三者送入一层TransformerDecoder得到listener_reaction,令其作为tgt和memory再加上tgt_mask送入一层TransformerDecoderTransformerDecoder得到listener_reaction [B, 256, 128];
5、listener_reaction通过Linear得到listener_3dmm_out[B, 256, 58],最后将listener_reaction和listener_3dmm_out拼接cat在一起得到x[B, 256, 128+58],通过两层Linear(128+58 -> 128 -> 25)得到listener_emotion_out [B, 256, 25];
6、最后输出listener_3dmm_out、listener_emotion_out、dist
1、将video、audio、emotion、3dmm随机从751帧里抽取256帧 作为patch(与offline task一致);
2、设置window_size(16),将256帧划分为256//16=16个时间段
3、第一次创建listener_reaction_3dmm(zeros[B, window_size, 224, 224])和listener_reaction_emotion(zeros[B, window_size, 25]);
4、当计算第i(i=1,2,..16)个时间段的listener_reaction时,先取前i个时间段(包括第i个)的speaker_video[B, (i *16), 58]和speaker_audio[B, (i *16), 78],然后得到speaker_behaviour_feature[B, (i *16), 128],同时注意第1个时间段后续计算与offline一样,也就是说不使用下面5-8的方法 ;
5、将speaker_behaviour_feature、listener_reaction_3dmm和listener_reaction_emotion拼接cat得到fuse [B, (i *16), 128+58+78],通过Linear得到encoded_feature [B, (i *16), 128];
6、令past_reaction_3dmm和past_reaction_emotion为前i-1个时间段的listener_reaction_3dmm[B, (i-1 *16), 58]和listener_reaction_emotion[B, (i-1 *16), 25];
7、将encoded_feature按offline的第3点处理方法得到motion_sample [B, 128]和dist [B, 128],然后再将motion_sample通过offline的第4点处理方法得到listener_reaction [B, 16, 128],然后将past_reaction_3dmm通过Linear得到past_reaction_3dmm[B, (i-1 *16), 128]并令past_reaction_3dmm_last = past_reaction_3dmm:, -1,也就是最接近第i个时间段的那帧;
8、创建tgt_mask [n_head*B, (i *16), (i *16)],将listener_reaction通过Linear得到listener_reaction,shape不变,然后将listener_reaction与past_reaction_3dmm拼接cat得到all_3dmm [B, i *16, 128],令all_3dmm为tgt和memory,加上tgt_mask通过一层TransformerDecoder得到listener_3dmm_out [B, i *16, 128],然后再取第i段的16帧为新的listener_3dmm_out [B, 16, 128],再将其送入LSTM(input = listener_3dmm_out, (h_0 = past_reaction_3dmm_last, c_0 = past_reaction_3dmm_last)),得到listener_3dmm_out [B, 16, 128],最后通过Linear得到最终listener_3dmm_out [B, 16, 58];
9、与offline第5点类似,通过listener_3dmm_out得到最终的listener_3dmm_out [B, 16, 58]和listener_emotion_out [B, 16, 25];
10、将listener_reaction_3dmm和listener_reaction_emotion逐段cat,dist逐段append,最后得到[B, 16*16, 58⁄25]和[128]的数据。
online和offline评估过程基本一致。
两个子任务的官方pth可视化结果(README):
Results
上一篇:软件工程快速入门(下)
下一篇:质量保障体系建设演进案例