hanseeul commited on
Commit
5dffa26
·
verified ·
1 Parent(s): 6b22f0a

Add personalised track models (frozen backbones + PRA adapters, offline/online x 3 conditions)

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. personalised/code/configs/README.md +27 -0
  2. personalised/code/configs/data/emotion_autoencoder.yaml +29 -0
  3. personalised/code/configs/data/motion_diffusion.yaml +122 -0
  4. personalised/code/configs/data/motion_transvae.yaml +125 -0
  5. personalised/code/configs/data/perfrdiff_rewrite_weight.yaml +135 -0
  6. personalised/code/configs/g2p_delta.yaml +88 -0
  7. personalised/code/configs/generic_offline/data/motion_diffusion.yaml +122 -0
  8. personalised/code/configs/generic_offline/data/motion_transvae.yaml +125 -0
  9. personalised/code/configs/generic_offline/model/losses/motion_diffusion.yaml +11 -0
  10. personalised/code/configs/generic_offline/model/losses/motion_transvae.yaml +8 -0
  11. personalised/code/configs/generic_offline/model/motion_diffusion.yaml +116 -0
  12. personalised/code/configs/generic_offline/model/motion_diffusion/audio_embedder.yaml +4 -0
  13. personalised/code/configs/generic_offline/model/motion_transvae.yaml +24 -0
  14. personalised/code/configs/generic_offline/motion_diffusion.yaml +23 -0
  15. personalised/code/configs/generic_offline/motion_transvae.yaml +23 -0
  16. personalised/code/configs/generic_offline/trainer/motion_diffusion.yaml +48 -0
  17. personalised/code/configs/generic_offline/trainer/motion_transvae.yaml +42 -0
  18. personalised/code/configs/generic_online/data/motion_diffusion.yaml +122 -0
  19. personalised/code/configs/generic_online/data/motion_transvae.yaml +125 -0
  20. personalised/code/configs/generic_online/model/losses/motion_diffusion.yaml +11 -0
  21. personalised/code/configs/generic_online/model/losses/motion_transvae.yaml +8 -0
  22. personalised/code/configs/generic_online/model/motion_diffusion.yaml +116 -0
  23. personalised/code/configs/generic_online/model/motion_diffusion/audio_embedder.yaml +4 -0
  24. personalised/code/configs/generic_online/model/motion_transvae.yaml +24 -0
  25. personalised/code/configs/generic_online/motion_diffusion.yaml +23 -0
  26. personalised/code/configs/generic_online/motion_transvae.yaml +23 -0
  27. personalised/code/configs/generic_online/trainer/motion_diffusion.yaml +48 -0
  28. personalised/code/configs/generic_online/trainer/motion_transvae.yaml +42 -0
  29. personalised/code/configs/logger/none.yaml +4 -0
  30. personalised/code/configs/main.yaml +26 -0
  31. personalised/code/configs/model/emotion_autoencoder.yaml +17 -0
  32. personalised/code/configs/model/losses/emotion_autoencoder.yaml +6 -0
  33. personalised/code/configs/model/losses/motion_diffusion.yaml +11 -0
  34. personalised/code/configs/model/losses/motion_diffusion_causal.yaml +9 -0
  35. personalised/code/configs/model/losses/motion_transvae.yaml +8 -0
  36. personalised/code/configs/model/losses/perfrdiff_rewrite_weight.yaml +8 -0
  37. personalised/code/configs/model/motion_diffusion.yaml +116 -0
  38. personalised/code/configs/model/motion_diffusion/audio_embedder.yaml +4 -0
  39. personalised/code/configs/model/motion_diffusion_causal.yaml +20 -0
  40. personalised/code/configs/model/motion_diffusion_velocity.yaml +116 -0
  41. personalised/code/configs/model/motion_transvae.yaml +24 -0
  42. personalised/code/configs/model/optim/adam.yaml +5 -0
  43. personalised/code/configs/model/optim/adamw.yaml +7 -0
  44. personalised/code/configs/model/optim/sgd.yaml +5 -0
  45. personalised/code/configs/model/scheduler/cosine_annealing.yaml +4 -0
  46. personalised/code/configs/path.yaml +5 -0
  47. personalised/code/configs/pers_offline_causal.yaml +20 -0
  48. personalised/code/configs/pers_online_causal.yaml +19 -0
  49. personalised/code/configs/personalized_offline/data/perfrdiff_rewrite_weight.yaml +135 -0
  50. personalised/code/configs/personalized_offline/model/losses/motion_diffusion.yaml +11 -0
personalised/code/configs/README.md ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Config Organization
2
+
3
+ The task-facing Hydra configs are organized by challenge setting. Use these files with `python main.py --config-name <section>/<method> ...`.
4
+
5
+ | Section | Entry config | Training / evaluation entry | Model config files | Model code | Checkpoints |
6
+ | --- | --- | --- | --- | --- | --- |
7
+ | Generic online | `generic_online/motion_diffusion.yaml` | `main.py` with `stage=fit` or `stage=test` | `generic_online/model/motion_diffusion.yaml`, `generic_online/model/losses/motion_diffusion.yaml` | `trainer/motion_diffusion.py`, `framework/motion_diffusion/` | `save/motion_diffusion/react_2025/online/checkpoints/<run_id>/` |
8
+ | Generic online | `generic_online/motion_transvae.yaml` | `main.py` with `stage=fit` or `stage=test` | `generic_online/model/motion_transvae.yaml`, `generic_online/model/losses/motion_transvae.yaml` | `trainer/motion_transvae.py`, `framework/motion_transvae/` | `save/motion_transvae/react_2025/online/checkpoints/<run_id>/` |
9
+ | Generic offline | `generic_offline/motion_diffusion.yaml` | `main.py` with `stage=fit` or `stage=test` | `generic_offline/model/motion_diffusion.yaml`, `generic_offline/model/losses/motion_diffusion.yaml` | `trainer/motion_diffusion.py`, `framework/motion_diffusion/` | `save/motion_diffusion/react_2025/offline/checkpoints/<run_id>/` |
10
+ | Generic offline | `generic_offline/motion_transvae.yaml` | `main.py` with `stage=fit` or `stage=test` | `generic_offline/model/motion_transvae.yaml`, `generic_offline/model/losses/motion_transvae.yaml` | `trainer/motion_transvae.py`, `framework/motion_transvae/` | `save/motion_transvae/react_2025/offline/checkpoints/<run_id>/` |
11
+ | Generic offline | RegNN | `regnn/train.py`; add `--test` for evaluation | RegNN uses command-line arguments instead of Hydra YAML | `regnn/models/`, `regnn/trainers.py` | `regnn/<logs-dir>/mhp-*-seed<seed>.pth` or `regnn/<logs-dir>/mhp-eeg-head-*-seed<seed>.pth` |
12
+ | Personalized online | `personalized_online/perfrdiff_rewrite_weight.yaml` | `main.py` with `stage=fit` or `stage=test` | `personalized_online/model/motion_diffusion.yaml`, `personalized_online/model/losses/perfrdiff_rewrite_weight.yaml` | `trainer/perfrdiff_rewrite_weight.py`, `framework/perfrdiff_rewrite_weight/` | `save/perfrdiff_rewrite_weight/react_2025/online/checkpoints/<run_id>/` |
13
+ | Personalized offline | `personalized_offline/perfrdiff_rewrite_weight.yaml` | `main.py` with `stage=fit` or `stage=test` | `personalized_offline/model/motion_diffusion.yaml`, `personalized_offline/model/losses/perfrdiff_rewrite_weight.yaml` | `trainer/perfrdiff_rewrite_weight.py`, `framework/perfrdiff_rewrite_weight/` | `save/perfrdiff_rewrite_weight/react_2025/offline/checkpoints/<run_id>/` |
14
+
15
+ ## Directory Notes
16
+
17
+ - `data/`, `trainer/`, `model/`, and `model/losses/` under each section contain the task-specific YAML used by that section.
18
+ - `shared/` contains global support configs: `data/`, `logger/`, `model/`, `trainer/`, and `path.yaml`.
19
+ - `configs/shared/path.yaml` exposes resolver-based paths such as the code root and current working directory, so it is kept with the other shared configs.
20
+ - `configs/shared/model/emotion_autoencoder.yaml` is intentionally kept as a shared config because the post-processor loads it by this path.
21
+
22
+ ## Running
23
+
24
+ - Hydra training: `python main.py --config-name <section>/<method> stage=fit data_dir=<dataset-root>`
25
+ - Hydra evaluation: `python main.py --config-name <section>/<method> stage=test data_dir=<dataset-root> resume_id=<run-id>`
26
+ - RegNN training: run `python train.py ...` from the `regnn/` directory.
27
+ - RegNN evaluation: run `python train.py --test ...` from the `regnn/` directory.
personalised/code/configs/data/emotion_autoencoder.yaml ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ data_name: react_2025
2
+ _target_: dataset.react_2025.ReactionDataloader
3
+
4
+ train_dataset:
5
+ _target_: dataset.react_2025.ReactionAutoEncoderDataset
6
+ batch_size: ${trainer.batch_size}
7
+ shuffle: True
8
+ num_workers: 2
9
+ root_dir: ${data_dir}
10
+ split: train
11
+ clip_length: ${trainer.clip_length}
12
+
13
+ validation_dataset:
14
+ _target_: dataset.react_2025.ReactionAutoEncoderDataset
15
+ batch_size: ${trainer.batch_size}
16
+ shuffle: False
17
+ num_workers: 2
18
+ root_dir: ${data_dir}
19
+ split: val
20
+ clip_length: ${trainer.clip_length}
21
+
22
+ test_dataset:
23
+ _target_: dataset.react_2025.ReactionAutoEncoderDataset
24
+ batch_size: 1
25
+ shuffle: False
26
+ num_workers: 2
27
+ root_dir: ${data_dir}
28
+ split: test
29
+ clip_length: ${trainer.clip_length}
personalised/code/configs/data/motion_diffusion.yaml ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ data_name: react_2025
2
+ _target_: dataset.react_2025.ReactionDataloader
3
+
4
+ train_dataset:
5
+ _target_: dataset.react_2025.ReactionDataset
6
+ batch_size: ${trainer.batch_size}
7
+ shuffle: True
8
+ num_workers: 8
9
+ root_dir: ${data_dir}
10
+ split: train
11
+ clip_length: 750 # 256 (transvae)
12
+ target_size: 224
13
+ crop_size: 224
14
+ fps: 30
15
+ audio_feature_type: wav2vec
16
+ load_video_s: False
17
+ load_video_l: False
18
+ load_audio: True
19
+ load_emotion_s: True
20
+ load_emotion_l: True
21
+ load_3dmm_s: True
22
+ load_3dmm_l: True
23
+ load_eeg_l: True
24
+ eeg_dir_name: eeg_processed
25
+ eeg_target_cols:
26
+ - TP9
27
+ - AF7
28
+ - AF8
29
+ - TP10
30
+ - Delta_TP9
31
+ - Theta_TP9
32
+ - Alpha_TP9
33
+ - Beta_TP9
34
+ - Gamma_TP9
35
+ - Delta_TP10
36
+ - Theta_TP10
37
+ - Alpha_TP10
38
+ - Beta_TP10
39
+ - Gamma_TP10
40
+ eeg_channel_scale: 1000.0
41
+ eeg_use_tar_fallback: True
42
+ bidirectional: ${trainer.generic.bidirectional}
43
+
44
+ validation_dataset:
45
+ _target_: dataset.react_2025.ReactionDataset
46
+ batch_size: ${trainer.batch_size}
47
+ shuffle: False
48
+ num_workers: 8
49
+ root_dir: ${data_dir}
50
+ split: val
51
+ target_size: 224
52
+ crop_size: 224
53
+ clip_length: 750 # 256 (transvae)
54
+ fps: 30
55
+ audio_feature_type: wav2vec
56
+ load_video_s: False
57
+ load_video_l: False
58
+ load_audio: True
59
+ load_emotion_s: True
60
+ load_emotion_l: True
61
+ load_3dmm_s: True
62
+ load_3dmm_l: True
63
+ load_eeg_l: True
64
+ eeg_dir_name: eeg_processed
65
+ eeg_target_cols:
66
+ - TP9
67
+ - AF7
68
+ - AF8
69
+ - TP10
70
+ - Delta_TP9
71
+ - Theta_TP9
72
+ - Alpha_TP9
73
+ - Beta_TP9
74
+ - Gamma_TP9
75
+ - Delta_TP10
76
+ - Theta_TP10
77
+ - Alpha_TP10
78
+ - Beta_TP10
79
+ - Gamma_TP10
80
+ eeg_channel_scale: 1000.0
81
+ eeg_use_tar_fallback: True
82
+ bidirectional: ${trainer.generic.bidirectional}
83
+
84
+ test_dataset:
85
+ _target_: dataset.react_2025.ReactionDataset
86
+ batch_size: ${trainer.batch_size}
87
+ shuffle: False
88
+ num_workers: 4
89
+ root_dir: ${data_dir}
90
+ split: test
91
+ target_size: 224
92
+ crop_size: 224
93
+ clip_length: 750 # 256 (transvae)
94
+ fps: 30
95
+ audio_feature_type: wav2vec # mfcc | wav2vec
96
+ load_video_s: False
97
+ load_video_l: False
98
+ load_audio: True
99
+ load_emotion_s: True
100
+ load_emotion_l: True
101
+ load_3dmm_s: True
102
+ load_3dmm_l: True
103
+ load_eeg_l: ${trainer.generic.eval_eeg}
104
+ eeg_dir_name: eeg_processed
105
+ eeg_target_cols:
106
+ - TP9
107
+ - AF7
108
+ - AF8
109
+ - TP10
110
+ - Delta_TP9
111
+ - Theta_TP9
112
+ - Alpha_TP9
113
+ - Beta_TP9
114
+ - Gamma_TP9
115
+ - Delta_TP10
116
+ - Theta_TP10
117
+ - Alpha_TP10
118
+ - Beta_TP10
119
+ - Gamma_TP10
120
+ eeg_channel_scale: 1000.0
121
+ eeg_use_tar_fallback: True
122
+ bidirectional: ${trainer.generic.bidirectional}
personalised/code/configs/data/motion_transvae.yaml ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ data_name: react_2025
2
+ _target_: dataset.react_2025.ReactionDataloader
3
+
4
+ train_dataset:
5
+ _target_: dataset.react_2025.ReactionDataset
6
+ batch_size: ${trainer.batch_size}
7
+ shuffle: True
8
+ num_workers: 8
9
+ root_dir: ${data_dir}
10
+ split: train
11
+ clip_length: ${trainer.max_seq_len}
12
+ target_size: 224
13
+ crop_size: 224
14
+ fps: 30
15
+ audio_feature_type: wav2vec
16
+ load_video_s: True
17
+ load_video_l: False
18
+ load_audio: True
19
+ load_emotion_s: True
20
+ load_emotion_l: True
21
+ load_3dmm_s: True
22
+ load_3dmm_l: True
23
+ load_eeg_l: True
24
+ eeg_dir_name: eeg_processed
25
+ eeg_target_cols:
26
+ - TP9
27
+ - AF7
28
+ - AF8
29
+ - TP10
30
+ - Delta_TP9
31
+ - Theta_TP9
32
+ - Alpha_TP9
33
+ - Beta_TP9
34
+ - Gamma_TP9
35
+ - Delta_TP10
36
+ - Theta_TP10
37
+ - Alpha_TP10
38
+ - Beta_TP10
39
+ - Gamma_TP10
40
+ eeg_channel_scale: 1000.0
41
+ eeg_use_tar_fallback: True
42
+ bidirectional: ${trainer.bidirectional}
43
+ normalize_3dmm: ${trainer.data_transform}
44
+
45
+ validation_dataset:
46
+ _target_: dataset.react_2025.ReactionDataset
47
+ batch_size: ${trainer.batch_size}
48
+ shuffle: False
49
+ num_workers: 8
50
+ root_dir: ${data_dir}
51
+ split: val
52
+ target_size: 224
53
+ crop_size: 224
54
+ clip_length: ${trainer.max_seq_len}
55
+ fps: 30
56
+ audio_feature_type: wav2vec
57
+ load_video_s: True
58
+ load_video_l: False
59
+ load_audio: True
60
+ load_emotion_s: True
61
+ load_emotion_l: True
62
+ load_3dmm_s: True
63
+ load_3dmm_l: True
64
+ load_eeg_l: True
65
+ eeg_dir_name: eeg_processed
66
+ eeg_target_cols:
67
+ - TP9
68
+ - AF7
69
+ - AF8
70
+ - TP10
71
+ - Delta_TP9
72
+ - Theta_TP9
73
+ - Alpha_TP9
74
+ - Beta_TP9
75
+ - Gamma_TP9
76
+ - Delta_TP10
77
+ - Theta_TP10
78
+ - Alpha_TP10
79
+ - Beta_TP10
80
+ - Gamma_TP10
81
+ eeg_channel_scale: 1000.0
82
+ eeg_use_tar_fallback: True
83
+ bidirectional: ${trainer.bidirectional}
84
+ normalize_3dmm: ${trainer.data_transform}
85
+
86
+ test_dataset:
87
+ _target_: dataset.react_2025.ReactionDataset
88
+ batch_size: 1
89
+ shuffle: True
90
+ num_workers: 0
91
+ root_dir: ${data_dir}
92
+ split: test
93
+ target_size: 224
94
+ crop_size: 224
95
+ clip_length: ${trainer.max_seq_len}
96
+ fps: 30
97
+ audio_feature_type: wav2vec # mfcc | wav2vec
98
+ load_video_s: True
99
+ load_video_l: ${trainer.renderer.do_render}
100
+ load_audio: True
101
+ load_emotion_s: True
102
+ load_emotion_l: ${trainer.eval_facial_metrics}
103
+ load_3dmm_s: True
104
+ load_3dmm_l: False
105
+ load_eeg_l: ${trainer.eval_eeg}
106
+ eeg_dir_name: eeg_processed
107
+ eeg_target_cols:
108
+ - TP9
109
+ - AF7
110
+ - AF8
111
+ - TP10
112
+ - Delta_TP9
113
+ - Theta_TP9
114
+ - Alpha_TP9
115
+ - Beta_TP9
116
+ - Gamma_TP9
117
+ - Delta_TP10
118
+ - Theta_TP10
119
+ - Alpha_TP10
120
+ - Beta_TP10
121
+ - Gamma_TP10
122
+ eeg_channel_scale: 1000.0
123
+ eeg_use_tar_fallback: True
124
+ bidirectional: ${trainer.bidirectional}
125
+ normalize_3dmm: ${trainer.data_transform}
personalised/code/configs/data/perfrdiff_rewrite_weight.yaml ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ data_name: react_2025
2
+ _target_: dataset.perfrdiff_rewrite_weight.PerFRDiffRewriteWeightDataModule
3
+
4
+ train_dataset:
5
+ _target_: dataset.perfrdiff_rewrite_weight.PerFRDiffRewriteWeightDataset
6
+ batch_size: ${trainer.batch_size}
7
+ shuffle: True
8
+ num_workers: 8
9
+ root_dir: ${data_dir}
10
+ split: train
11
+ clip_length: 750
12
+ target_size: 224
13
+ crop_size: 224
14
+ fps: 30
15
+ audio_feature_type: wav2vec
16
+ load_video_s: False
17
+ load_video_l: False
18
+ load_audio: True
19
+ load_emotion_s: True
20
+ load_emotion_l: True
21
+ load_3dmm_s: True
22
+ load_3dmm_l: True
23
+ load_ref: True
24
+ load_personality_l: True
25
+ personal_condition_mode: ${trainer.main_model.args.personal_condition_mode}
26
+ load_eeg_l: ${trainer.generic.train_eeg}
27
+ eeg_dir_name: eeg_processed
28
+ eeg_target_cols:
29
+ - TP9
30
+ - AF7
31
+ - AF8
32
+ - TP10
33
+ - Delta_TP9
34
+ - Theta_TP9
35
+ - Alpha_TP9
36
+ - Beta_TP9
37
+ - Gamma_TP9
38
+ - Delta_TP10
39
+ - Theta_TP10
40
+ - Alpha_TP10
41
+ - Beta_TP10
42
+ - Gamma_TP10
43
+ eeg_channel_scale: 1000.0
44
+ eeg_use_tar_fallback: True
45
+ bidirectional: ${trainer.generic.bidirectional}
46
+ normalize_3dmm: standard
47
+
48
+ validation_dataset:
49
+ _target_: dataset.perfrdiff_rewrite_weight.PerFRDiffRewriteWeightDataset
50
+ batch_size: ${trainer.batch_size}
51
+ shuffle: False
52
+ num_workers: 8
53
+ root_dir: ${data_dir}
54
+ split: val
55
+ clip_length: 750
56
+ target_size: 224
57
+ crop_size: 224
58
+ fps: 30
59
+ audio_feature_type: wav2vec
60
+ load_video_s: False
61
+ load_video_l: False
62
+ load_audio: True
63
+ load_emotion_s: True
64
+ load_emotion_l: True
65
+ load_3dmm_s: True
66
+ load_3dmm_l: True
67
+ load_ref: True
68
+ load_personality_l: True
69
+ personal_condition_mode: ${trainer.main_model.args.personal_condition_mode}
70
+ load_eeg_l: ${trainer.generic.train_eeg}
71
+ eeg_dir_name: eeg_processed
72
+ eeg_target_cols:
73
+ - TP9
74
+ - AF7
75
+ - AF8
76
+ - TP10
77
+ - Delta_TP9
78
+ - Theta_TP9
79
+ - Alpha_TP9
80
+ - Beta_TP9
81
+ - Gamma_TP9
82
+ - Delta_TP10
83
+ - Theta_TP10
84
+ - Alpha_TP10
85
+ - Beta_TP10
86
+ - Gamma_TP10
87
+ eeg_channel_scale: 1000.0
88
+ eeg_use_tar_fallback: True
89
+ bidirectional: ${trainer.generic.bidirectional}
90
+ normalize_3dmm: standard
91
+
92
+ test_dataset:
93
+ _target_: dataset.perfrdiff_rewrite_weight.PerFRDiffRewriteWeightDataset
94
+ batch_size: ${trainer.batch_size}
95
+ shuffle: False
96
+ num_workers: 4
97
+ root_dir: ${data_dir}
98
+ split: test
99
+ clip_length: 750
100
+ target_size: 224
101
+ crop_size: 224
102
+ fps: 30
103
+ audio_feature_type: wav2vec
104
+ load_video_s: False
105
+ load_video_l: False
106
+ load_audio: True
107
+ load_emotion_s: True
108
+ load_emotion_l: True
109
+ load_3dmm_s: True
110
+ load_3dmm_l: True
111
+ load_ref: False
112
+ load_personality_l: True
113
+ personal_condition_mode: ${trainer.main_model.args.personal_condition_mode}
114
+ load_eeg_l: ${trainer.generic.eval_eeg}
115
+ eeg_dir_name: eeg_processed
116
+ eeg_target_cols:
117
+ - TP9
118
+ - AF7
119
+ - AF8
120
+ - TP10
121
+ - Delta_TP9
122
+ - Theta_TP9
123
+ - Alpha_TP9
124
+ - Beta_TP9
125
+ - Gamma_TP9
126
+ - Delta_TP10
127
+ - Theta_TP10
128
+ - Alpha_TP10
129
+ - Beta_TP10
130
+ - Gamma_TP10
131
+ eeg_channel_scale: 1000.0
132
+ eeg_use_tar_fallback: True
133
+ bidirectional: ${trainer.generic.bidirectional}
134
+ normalize_3dmm: standard
135
+ num_test_gts: ${num_gts}
personalised/code/configs/g2p_delta.yaml ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ defaults:
2
+ - /personalized_offline/data/perfrdiff_rewrite_weight@data
3
+ - /personalized_offline/trainer/perfrdiff_rewrite_weight@trainer
4
+ - /shared/logger: none
5
+ - /shared/path@path
6
+ - _self_
7
+
8
+ seed: 1234
9
+ logger_level: INFO
10
+ task: offline
11
+ stage: ???
12
+ data_dir: ???
13
+ resume: false
14
+ run_id: ${generate_id:}
15
+ resume_id: ""
16
+ num_gts: 10
17
+
18
+ trainer:
19
+ _target_: trainer.g2p_delta.Trainer
20
+ model_name: g2p_delta
21
+ batch_size: 2
22
+ pretrained:
23
+ diffusion_decoder: pretrained_models/generic_offline_final_submission_model/CausalTransformerDenoiser/checkpoint_120.pth
24
+ diffusion_prior: pretrained_models/generic_offline_final_submission_model/DiffusionPriorNetwork/checkpoint_120.pth
25
+ modifier_checkpoint: ""
26
+ eeg_head_checkpoint: pretrained_models/generic_offline_final_submission_model/EEGPredictionHead/checkpoint_120.pth
27
+ model:
28
+ diff_model:
29
+ _target_: framework.motion_diffusion.diffusion.matchers_causal.CausalLatentMatcher
30
+ eeg_head:
31
+ enabled: true
32
+ diffusion_decoder:
33
+ args:
34
+ use_lag_bias: true
35
+ lag_max: 60
36
+ lag_lookahead: 0
37
+ use_coarse: true
38
+ coarse_classes: 8
39
+ coarse_hidden: 256
40
+ coarse_emo_start: 17
41
+ criterion:
42
+ args:
43
+ eeg_loss_weight: 0.25
44
+ generic:
45
+ epochs: 30
46
+ save_period: 5
47
+ val_period: 5
48
+ clip_grad: true
49
+ train_eeg: true
50
+ train_eeg_head_only: false
51
+ eval_eeg: true
52
+ num_workers: 8
53
+ num_preds: 1
54
+ max_train_batches: 0
55
+ max_val_batches: 0
56
+ # Short-triage control only: matched (default) | shuffled | identity.
57
+ # See trainer/g2p_delta.py::_apply_personalization and
58
+ # scripts/build_subset_eval_root.py. Never used during training.
59
+ eval_condition_mode: matched
60
+ main_model:
61
+ args:
62
+ personal_condition_mode: personality_only
63
+ embed_dim: 256
64
+ history_hidden_dim: 128
65
+ personality_hidden_dim: 128
66
+ condition_dropout: 0.1
67
+ delta_rank: 128
68
+ delta_max_scale: 0.15
69
+ personalize_coarse: true
70
+ anchor_weight: 0.001
71
+ coarse_weight: 0.5
72
+ ccc_weight: 0.1
73
+ dynamics_weight: 0.02
74
+ counterfactual_weight: 0.1
75
+ counterfactual_margin: 0.02
76
+ eeg_lr: 0.00001
77
+ optimizer_hypernet:
78
+ type: adamw
79
+ args:
80
+ lr: 0.0002
81
+ weight_decay: 0.0001
82
+ momentum: 0.0
83
+
84
+ hydra:
85
+ run:
86
+ dir: outputs/${trainer.model_name}/${data.data_name}/${task}/${run_id}
87
+ job:
88
+ chdir: true
personalised/code/configs/generic_offline/data/motion_diffusion.yaml ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ data_name: react_2025
2
+ _target_: dataset.react_2025.ReactionDataloader
3
+
4
+ train_dataset:
5
+ _target_: dataset.react_2025.ReactionDataset
6
+ batch_size: ${trainer.batch_size}
7
+ shuffle: True
8
+ num_workers: 8
9
+ root_dir: ${data_dir}
10
+ split: train
11
+ clip_length: 750 # 256 (transvae)
12
+ target_size: 224
13
+ crop_size: 224
14
+ fps: 30
15
+ audio_feature_type: wav2vec
16
+ load_video_s: False
17
+ load_video_l: False
18
+ load_audio: True
19
+ load_emotion_s: True
20
+ load_emotion_l: True
21
+ load_3dmm_s: True
22
+ load_3dmm_l: True
23
+ load_eeg_l: True
24
+ eeg_dir_name: eeg_processed
25
+ eeg_target_cols:
26
+ - TP9
27
+ - AF7
28
+ - AF8
29
+ - TP10
30
+ - Delta_TP9
31
+ - Theta_TP9
32
+ - Alpha_TP9
33
+ - Beta_TP9
34
+ - Gamma_TP9
35
+ - Delta_TP10
36
+ - Theta_TP10
37
+ - Alpha_TP10
38
+ - Beta_TP10
39
+ - Gamma_TP10
40
+ eeg_channel_scale: 1000.0
41
+ eeg_use_tar_fallback: True
42
+ bidirectional: ${trainer.generic.bidirectional}
43
+
44
+ validation_dataset:
45
+ _target_: dataset.react_2025.ReactionDataset
46
+ batch_size: ${trainer.batch_size}
47
+ shuffle: False
48
+ num_workers: 8
49
+ root_dir: ${data_dir}
50
+ split: val
51
+ target_size: 224
52
+ crop_size: 224
53
+ clip_length: 750 # 256 (transvae)
54
+ fps: 30
55
+ audio_feature_type: wav2vec
56
+ load_video_s: False
57
+ load_video_l: False
58
+ load_audio: True
59
+ load_emotion_s: True
60
+ load_emotion_l: True
61
+ load_3dmm_s: True
62
+ load_3dmm_l: True
63
+ load_eeg_l: True
64
+ eeg_dir_name: eeg_processed
65
+ eeg_target_cols:
66
+ - TP9
67
+ - AF7
68
+ - AF8
69
+ - TP10
70
+ - Delta_TP9
71
+ - Theta_TP9
72
+ - Alpha_TP9
73
+ - Beta_TP9
74
+ - Gamma_TP9
75
+ - Delta_TP10
76
+ - Theta_TP10
77
+ - Alpha_TP10
78
+ - Beta_TP10
79
+ - Gamma_TP10
80
+ eeg_channel_scale: 1000.0
81
+ eeg_use_tar_fallback: True
82
+ bidirectional: ${trainer.generic.bidirectional}
83
+
84
+ test_dataset:
85
+ _target_: dataset.react_2025.ReactionDataset
86
+ batch_size: ${trainer.batch_size}
87
+ shuffle: False
88
+ num_workers: 4
89
+ root_dir: ${data_dir}
90
+ split: test
91
+ target_size: 224
92
+ crop_size: 224
93
+ clip_length: 750 # 256 (transvae)
94
+ fps: 30
95
+ audio_feature_type: wav2vec # mfcc | wav2vec
96
+ load_video_s: False
97
+ load_video_l: False
98
+ load_audio: True
99
+ load_emotion_s: True
100
+ load_emotion_l: True
101
+ load_3dmm_s: True
102
+ load_3dmm_l: True
103
+ load_eeg_l: ${trainer.generic.eval_eeg}
104
+ eeg_dir_name: eeg_processed
105
+ eeg_target_cols:
106
+ - TP9
107
+ - AF7
108
+ - AF8
109
+ - TP10
110
+ - Delta_TP9
111
+ - Theta_TP9
112
+ - Alpha_TP9
113
+ - Beta_TP9
114
+ - Gamma_TP9
115
+ - Delta_TP10
116
+ - Theta_TP10
117
+ - Alpha_TP10
118
+ - Beta_TP10
119
+ - Gamma_TP10
120
+ eeg_channel_scale: 1000.0
121
+ eeg_use_tar_fallback: True
122
+ bidirectional: ${trainer.generic.bidirectional}
personalised/code/configs/generic_offline/data/motion_transvae.yaml ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ data_name: react_2025
2
+ _target_: dataset.react_2025.ReactionDataloader
3
+
4
+ train_dataset:
5
+ _target_: dataset.react_2025.ReactionDataset
6
+ batch_size: ${trainer.batch_size}
7
+ shuffle: True
8
+ num_workers: 8
9
+ root_dir: ${data_dir}
10
+ split: train
11
+ clip_length: ${trainer.max_seq_len}
12
+ target_size: 224
13
+ crop_size: 224
14
+ fps: 30
15
+ audio_feature_type: wav2vec
16
+ load_video_s: True
17
+ load_video_l: False
18
+ load_audio: True
19
+ load_emotion_s: True
20
+ load_emotion_l: True
21
+ load_3dmm_s: True
22
+ load_3dmm_l: True
23
+ load_eeg_l: True
24
+ eeg_dir_name: eeg_processed
25
+ eeg_target_cols:
26
+ - TP9
27
+ - AF7
28
+ - AF8
29
+ - TP10
30
+ - Delta_TP9
31
+ - Theta_TP9
32
+ - Alpha_TP9
33
+ - Beta_TP9
34
+ - Gamma_TP9
35
+ - Delta_TP10
36
+ - Theta_TP10
37
+ - Alpha_TP10
38
+ - Beta_TP10
39
+ - Gamma_TP10
40
+ eeg_channel_scale: 1000.0
41
+ eeg_use_tar_fallback: True
42
+ bidirectional: ${trainer.bidirectional}
43
+ normalize_3dmm: ${trainer.data_transform}
44
+
45
+ validation_dataset:
46
+ _target_: dataset.react_2025.ReactionDataset
47
+ batch_size: ${trainer.batch_size}
48
+ shuffle: False
49
+ num_workers: 8
50
+ root_dir: ${data_dir}
51
+ split: val
52
+ target_size: 224
53
+ crop_size: 224
54
+ clip_length: ${trainer.max_seq_len}
55
+ fps: 30
56
+ audio_feature_type: wav2vec
57
+ load_video_s: True
58
+ load_video_l: False
59
+ load_audio: True
60
+ load_emotion_s: True
61
+ load_emotion_l: True
62
+ load_3dmm_s: True
63
+ load_3dmm_l: True
64
+ load_eeg_l: True
65
+ eeg_dir_name: eeg_processed
66
+ eeg_target_cols:
67
+ - TP9
68
+ - AF7
69
+ - AF8
70
+ - TP10
71
+ - Delta_TP9
72
+ - Theta_TP9
73
+ - Alpha_TP9
74
+ - Beta_TP9
75
+ - Gamma_TP9
76
+ - Delta_TP10
77
+ - Theta_TP10
78
+ - Alpha_TP10
79
+ - Beta_TP10
80
+ - Gamma_TP10
81
+ eeg_channel_scale: 1000.0
82
+ eeg_use_tar_fallback: True
83
+ bidirectional: ${trainer.bidirectional}
84
+ normalize_3dmm: ${trainer.data_transform}
85
+
86
+ test_dataset:
87
+ _target_: dataset.react_2025.ReactionDataset
88
+ batch_size: 1
89
+ shuffle: True
90
+ num_workers: 0
91
+ root_dir: ${data_dir}
92
+ split: test
93
+ target_size: 224
94
+ crop_size: 224
95
+ clip_length: ${trainer.max_seq_len}
96
+ fps: 30
97
+ audio_feature_type: wav2vec # mfcc | wav2vec
98
+ load_video_s: True
99
+ load_video_l: ${trainer.renderer.do_render}
100
+ load_audio: True
101
+ load_emotion_s: True
102
+ load_emotion_l: ${trainer.eval_facial_metrics}
103
+ load_3dmm_s: True
104
+ load_3dmm_l: False
105
+ load_eeg_l: ${trainer.eval_eeg}
106
+ eeg_dir_name: eeg_processed
107
+ eeg_target_cols:
108
+ - TP9
109
+ - AF7
110
+ - AF8
111
+ - TP10
112
+ - Delta_TP9
113
+ - Theta_TP9
114
+ - Alpha_TP9
115
+ - Beta_TP9
116
+ - Gamma_TP9
117
+ - Delta_TP10
118
+ - Theta_TP10
119
+ - Alpha_TP10
120
+ - Beta_TP10
121
+ - Gamma_TP10
122
+ eeg_channel_scale: 1000.0
123
+ eeg_use_tar_fallback: True
124
+ bidirectional: ${trainer.bidirectional}
125
+ normalize_3dmm: ${trainer.data_transform}
personalised/code/configs/generic_offline/model/losses/motion_diffusion.yaml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _target_: framework.utils.losses.DiffusionLoss
2
+
3
+ losses_type: MSELossApt
4
+ losses_multiplier: 1.0
5
+ n_preds: ${trainer.${trainer.trainer_mode}.num_preds}
6
+ temporal_loss_w: 0.0
7
+ prior_loss_weight: 1.0
8
+ eeg_loss_weight: 0.25
9
+ w_au: 1.0 # action unit
10
+ w_va: 5.0 # valence and arousal
11
+ w_em: 5.0 # emotion
personalised/code/configs/generic_offline/model/losses/motion_transvae.yaml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ _target_: framework.utils.losses.VAELoss
2
+
3
+ kl_p: 0.00001 # kl div loss
4
+ w_emo: 2.0
5
+ w_exp: 2.0 # facial expression
6
+ w_rot: 4.0 # rotation
7
+ w_tran: 4.0 # translation
8
+ eeg_loss_weight: 0.25
personalised/code/configs/generic_offline/model/motion_diffusion.yaml ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ diff_model:
2
+ model_name: LatentMLPMatcher
3
+ _target_: framework.motion_diffusion.diffusion.matchers.LatentMatcher
4
+
5
+ eeg_head:
6
+ enabled: True
7
+ output_dim: 14
8
+ hidden_dim: 256
9
+ dropout: 0.5
10
+ pooling: mean
11
+ detach_prediction_emotion: True
12
+ use_speaker_audio: True
13
+ use_speaker_emotion: True
14
+ use_speaker_3dmm: True
15
+ use_prediction_emotion: True
16
+
17
+ diffusion_prior:
18
+ type:
19
+ DiffusionPriorNetwork
20
+ args:
21
+ emb_preprocessing: normalize
22
+ freeze_encoder: True
23
+ audio_dim: 768
24
+ window_size: ${trainer.${trainer.trainer_mode}.window_size}
25
+ s_ratio: ${trainer.${trainer.trainer_mode}.s_ratio}
26
+ token_len: 750
27
+ _3dmm_dim: 58
28
+ speaker_emb_dim: 512
29
+ latent_dim: 512
30
+ depth: 4
31
+ num_time_layers: 2
32
+ num_time_embeds: 1
33
+ num_time_emb_channels: 64
34
+ time_last_act: False
35
+ use_learned_query: True
36
+ s_audio_cond_drop_prob: 0.2
37
+ s_latentemb_cond_drop_prob: 1.0
38
+ s_3dmm_cond_drop_prob: 0.2
39
+ guidance_scale: 1.0
40
+ dim_head: 64
41
+ heads: 8
42
+ ff_mult: 4
43
+ norm_in: False
44
+ norm_out: True
45
+ attn_dropout: 0.0
46
+ ff_dropout: 0.0
47
+ final_proj: True
48
+ normformer: False
49
+ rotary_emb: True
50
+ scheduler:
51
+ noise_schedule: cosine
52
+ timestep_spacing: leading
53
+ num_train_timesteps: 1000
54
+ num_inference_timesteps: 50
55
+ predict: start_x
56
+ var_type: fixed_large
57
+ rescale_timesteps: False
58
+ noise_std: 1
59
+ num_preds: ${trainer.${trainer.trainer_mode}.num_preds}
60
+
61
+ diffusion_decoder:
62
+ type:
63
+ TransformerDenoiser
64
+ args:
65
+ emb_preprocessing: normalize
66
+ freeze_encoder: True
67
+ window_size: ${trainer.${trainer.trainer_mode}.window_size}
68
+ s_ratio: ${trainer.${trainer.trainer_mode}.s_ratio}
69
+ token_len: 750
70
+ encode_emotion: False
71
+ encode_3dmm: False
72
+ ablation_skip_connection: True
73
+ nfeats: 25
74
+ latent_dim: 512
75
+ ff_size: 1024
76
+ num_layers: 9 # 7 | 9
77
+ num_heads: 8 # 4 | 8
78
+ dropout: 0.1
79
+ normalize_before: False
80
+ activation: gelu
81
+ flip_sin_to_cos: True
82
+ return_intermediate_dec: False
83
+ position_embedding: learned
84
+ arch: trans_dec
85
+ freq_shift: 0
86
+ time_encoded_dim: 64
87
+ s_audio_dim: 768
88
+ s_audio_scale: 1.0
89
+ s_emotion_dim: 25
90
+ l_embed_dim: 512
91
+ s_embed_dim: 512
92
+ personal_emb_dim: 512
93
+ s_3dmm_dim: 58
94
+ concat: concat_first
95
+ guidance_scale: 1.0 # 7.5
96
+ s_audio_enc_drop_prob: 0.2
97
+ s_latent_embed_drop_prob: 1.0
98
+ s_3dmm_enc_drop_prob: 0.2
99
+ s_emotion_enc_drop_prob: 0.2
100
+ past_l_emotion_drop_prob: 1.0
101
+ use_past_frames: False
102
+ scheduler:
103
+ noise_schedule: cosine
104
+ timestep_spacing: leading
105
+ num_train_timesteps: 1000
106
+ num_inference_timesteps: 50
107
+ predict: start_x
108
+ var_type: fixed_large
109
+ rescale_timesteps: False
110
+ noise_std: 1
111
+ num_preds: ${trainer.${trainer.trainer_mode}.num_preds}
112
+
113
+ defaults:
114
+ - /generic_offline/model/losses/motion_diffusion@loss
115
+ - /generic_offline/model/motion_diffusion/audio_embedder@audio_encoder
116
+ #- /model/latent_embedder@latent_embedder
personalised/code/configs/generic_offline/model/motion_diffusion/audio_embedder.yaml ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ type: AudioEmbedder
2
+ _target_: dataset.modules.audio_embedder.AudioEmbedder
3
+ checkpoint_path: ""
4
+ skip_norm: True
personalised/code/configs/generic_offline/model/motion_transvae.yaml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ model_name: TransformerVAE
2
+ _target_: framework.motion_transvae.TransformerVAE.TransformerVAE
3
+
4
+ img_size: 224
5
+ audio_dim: 768
6
+ output_3dmm_dim: 58
7
+ output_emotion_dim: 25
8
+ feature_dim: 128
9
+ seq_len: ${data.train_dataset.clip_length}
10
+ task: ${task}
11
+ window_size: ${trainer.window_size}
12
+ device: cuda
13
+
14
+ eeg_head:
15
+ enabled: True
16
+ output_dim: 14
17
+ hidden_dim: 256
18
+ dropout: 0.5
19
+ pooling: mean
20
+ detach_prediction_emotion: True
21
+ use_speaker_audio: True
22
+ use_speaker_emotion: True
23
+ use_speaker_3dmm: True
24
+ use_prediction_emotion: True
personalised/code/configs/generic_offline/motion_diffusion.yaml ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ hydra:
2
+ run:
3
+ dir: outputs/${trainer.model_name}/${data.data_name}/${task}/${run_id}
4
+ job:
5
+ chdir: true
6
+
7
+ seed: 1234
8
+ logger_level: INFO
9
+
10
+ task: offline
11
+ stage: ???
12
+ data_dir: ???
13
+ resume: false
14
+ run_id: ${generate_id:}
15
+ resume_id: ""
16
+ num_gts: 10
17
+
18
+ defaults:
19
+ - /generic_offline/data/motion_diffusion@data
20
+ - /generic_offline/trainer/motion_diffusion@trainer
21
+ - /shared/logger: none
22
+ - /shared/path@path
23
+ - _self_
personalised/code/configs/generic_offline/motion_transvae.yaml ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ hydra:
2
+ run:
3
+ dir: outputs/${trainer.model_name}/${data.data_name}/${task}/${run_id}
4
+ job:
5
+ chdir: true
6
+
7
+ seed: 1234
8
+ logger_level: INFO
9
+
10
+ task: offline
11
+ stage: ???
12
+ data_dir: ???
13
+ resume: false
14
+ run_id: ${generate_id:}
15
+ resume_id: ""
16
+ num_gts: 10
17
+
18
+ defaults:
19
+ - /generic_offline/data/motion_transvae@data
20
+ - /generic_offline/trainer/motion_transvae@trainer
21
+ - /shared/logger: none
22
+ - /shared/path@path
23
+ - _self_
personalised/code/configs/generic_offline/trainer/motion_diffusion.yaml ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ model_name: motion_diffusion
2
+ _target_: trainer.motion_diffusion.Trainer
3
+
4
+ trainer_mode: generic # generic facial reaction generator
5
+ folder: save/${trainer.model_name}/${data.data_name}/${task}
6
+ ckpt_dir: ${get_last_checkpoint:${trainer.folder}}
7
+ resumed_training: ${resume} # true | false
8
+ current_runid: ${run_id}
9
+ resume_runid: ${resume_id}
10
+ batch_size: 4
11
+ post_config_name: configs/shared/model/emotion_autoencoder.yaml
12
+ post_clip_length: 1000 # ground-truths alignment
13
+ data_clamp: True
14
+
15
+ generic:
16
+ seed: 1234
17
+ start_epoch: 0
18
+ epochs: 500
19
+ lr: 0.0001
20
+ model: LatentMatcher
21
+ clip_grad: False
22
+ num_workers: 16
23
+ log_dir: log
24
+ tb_dir: tb_logs
25
+ out_dir: results
26
+ save_period: 10
27
+ val_period: 10
28
+ num_preds: 10
29
+ clip_length: 750
30
+ window_size: 30
31
+ s_ratio: 2
32
+ train_eeg_head_only: False
33
+ pretrained_decoder_checkpoint: ""
34
+ pretrained_prior_checkpoint: ""
35
+ pretrained_load_prior: True
36
+ eval_eeg: True
37
+ bidirectional: False
38
+
39
+ renderer: # face animation based on predicted 3DMM coefficients
40
+ name: PIRenderer
41
+ _target_: utils.render.Render
42
+ do_render: False
43
+
44
+ defaults:
45
+ - /generic_offline/model/motion_diffusion@model
46
+ - /shared/model/optim/adamw@optim
47
+ - /shared/model/scheduler/cosine_annealing@scheduler
48
+ - /generic_offline/model/losses/motion_diffusion@criterion # loss func
personalised/code/configs/generic_offline/trainer/motion_transvae.yaml ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ model_name: motion_transvae
2
+ _target_: trainer.motion_transvae.Trainer
3
+
4
+ folder: save/${trainer.model_name}/${data.data_name}/${task}
5
+ ckpt_dir: ${get_last_checkpoint:${trainer.folder}}
6
+ resumed_training: ${resume} # true | false
7
+ current_runid: ${run_id}
8
+ resume_runid: ${resume_id}
9
+
10
+ epochs: 100
11
+ gpu_ids: 0
12
+ lr: 0.00001
13
+ j: 12 # num_workers
14
+ batch_size: 4
15
+ max_seq_len: 750
16
+ window_size: 8
17
+ div_p: 10
18
+ post_config_name: configs/shared/model/emotion_autoencoder.yaml
19
+ post_clip_length: 1000 # ground-truths alignment
20
+ data_clamp: True
21
+ data_transform: zero_center # standard | zero_center
22
+ train_eeg_head_only: False
23
+ pretrained_model_checkpoint: ""
24
+ eval_eeg: True
25
+ num_preds: 10
26
+ bidirectional: False
27
+ save_results: True
28
+ eval_facial_metrics: True
29
+ eval_eeg_metrics: True
30
+ metric_threads: 1
31
+ eval_clip_batch_size: 1
32
+
33
+ renderer: # face animation based on predicted 3DMM coefficients
34
+ name: PIRenderer
35
+ _target_: utils.render.Render
36
+ do_render: True
37
+ transform_reverse: ${trainer.data_transform}
38
+
39
+ defaults:
40
+ - /generic_offline/model/motion_transvae@model
41
+ - /shared/model/optim/adamw@optim
42
+ - /generic_offline/model/losses/motion_transvae@criterion # loss func
personalised/code/configs/generic_online/data/motion_diffusion.yaml ADDED
@@ -0,0 +1,122 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ data_name: react_2025
2
+ _target_: dataset.react_2025.ReactionDataloader
3
+
4
+ train_dataset:
5
+ _target_: dataset.react_2025.ReactionDataset
6
+ batch_size: ${trainer.batch_size}
7
+ shuffle: True
8
+ num_workers: 8
9
+ root_dir: ${data_dir}
10
+ split: train
11
+ clip_length: 750 # 256 (transvae)
12
+ target_size: 224
13
+ crop_size: 224
14
+ fps: 30
15
+ audio_feature_type: wav2vec
16
+ load_video_s: False
17
+ load_video_l: False
18
+ load_audio: True
19
+ load_emotion_s: True
20
+ load_emotion_l: True
21
+ load_3dmm_s: True
22
+ load_3dmm_l: True
23
+ load_eeg_l: True
24
+ eeg_dir_name: eeg_processed
25
+ eeg_target_cols:
26
+ - TP9
27
+ - AF7
28
+ - AF8
29
+ - TP10
30
+ - Delta_TP9
31
+ - Theta_TP9
32
+ - Alpha_TP9
33
+ - Beta_TP9
34
+ - Gamma_TP9
35
+ - Delta_TP10
36
+ - Theta_TP10
37
+ - Alpha_TP10
38
+ - Beta_TP10
39
+ - Gamma_TP10
40
+ eeg_channel_scale: 1000.0
41
+ eeg_use_tar_fallback: True
42
+ bidirectional: ${trainer.generic.bidirectional}
43
+
44
+ validation_dataset:
45
+ _target_: dataset.react_2025.ReactionDataset
46
+ batch_size: ${trainer.batch_size}
47
+ shuffle: False
48
+ num_workers: 8
49
+ root_dir: ${data_dir}
50
+ split: val
51
+ target_size: 224
52
+ crop_size: 224
53
+ clip_length: 750 # 256 (transvae)
54
+ fps: 30
55
+ audio_feature_type: wav2vec
56
+ load_video_s: False
57
+ load_video_l: False
58
+ load_audio: True
59
+ load_emotion_s: True
60
+ load_emotion_l: True
61
+ load_3dmm_s: True
62
+ load_3dmm_l: True
63
+ load_eeg_l: True
64
+ eeg_dir_name: eeg_processed
65
+ eeg_target_cols:
66
+ - TP9
67
+ - AF7
68
+ - AF8
69
+ - TP10
70
+ - Delta_TP9
71
+ - Theta_TP9
72
+ - Alpha_TP9
73
+ - Beta_TP9
74
+ - Gamma_TP9
75
+ - Delta_TP10
76
+ - Theta_TP10
77
+ - Alpha_TP10
78
+ - Beta_TP10
79
+ - Gamma_TP10
80
+ eeg_channel_scale: 1000.0
81
+ eeg_use_tar_fallback: True
82
+ bidirectional: ${trainer.generic.bidirectional}
83
+
84
+ test_dataset:
85
+ _target_: dataset.react_2025.ReactionDataset
86
+ batch_size: ${trainer.batch_size}
87
+ shuffle: False
88
+ num_workers: 4
89
+ root_dir: ${data_dir}
90
+ split: test
91
+ target_size: 224
92
+ crop_size: 224
93
+ clip_length: 750 # 256 (transvae)
94
+ fps: 30
95
+ audio_feature_type: wav2vec # mfcc | wav2vec
96
+ load_video_s: False
97
+ load_video_l: False
98
+ load_audio: True
99
+ load_emotion_s: True
100
+ load_emotion_l: True
101
+ load_3dmm_s: True
102
+ load_3dmm_l: True
103
+ load_eeg_l: ${trainer.generic.eval_eeg}
104
+ eeg_dir_name: eeg_processed
105
+ eeg_target_cols:
106
+ - TP9
107
+ - AF7
108
+ - AF8
109
+ - TP10
110
+ - Delta_TP9
111
+ - Theta_TP9
112
+ - Alpha_TP9
113
+ - Beta_TP9
114
+ - Gamma_TP9
115
+ - Delta_TP10
116
+ - Theta_TP10
117
+ - Alpha_TP10
118
+ - Beta_TP10
119
+ - Gamma_TP10
120
+ eeg_channel_scale: 1000.0
121
+ eeg_use_tar_fallback: True
122
+ bidirectional: ${trainer.generic.bidirectional}
personalised/code/configs/generic_online/data/motion_transvae.yaml ADDED
@@ -0,0 +1,125 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ data_name: react_2025
2
+ _target_: dataset.react_2025.ReactionDataloader
3
+
4
+ train_dataset:
5
+ _target_: dataset.react_2025.ReactionDataset
6
+ batch_size: ${trainer.batch_size}
7
+ shuffle: True
8
+ num_workers: 8
9
+ root_dir: ${data_dir}
10
+ split: train
11
+ clip_length: ${trainer.max_seq_len}
12
+ target_size: 224
13
+ crop_size: 224
14
+ fps: 30
15
+ audio_feature_type: wav2vec
16
+ load_video_s: True
17
+ load_video_l: False
18
+ load_audio: True
19
+ load_emotion_s: True
20
+ load_emotion_l: True
21
+ load_3dmm_s: True
22
+ load_3dmm_l: True
23
+ load_eeg_l: True
24
+ eeg_dir_name: eeg_processed
25
+ eeg_target_cols:
26
+ - TP9
27
+ - AF7
28
+ - AF8
29
+ - TP10
30
+ - Delta_TP9
31
+ - Theta_TP9
32
+ - Alpha_TP9
33
+ - Beta_TP9
34
+ - Gamma_TP9
35
+ - Delta_TP10
36
+ - Theta_TP10
37
+ - Alpha_TP10
38
+ - Beta_TP10
39
+ - Gamma_TP10
40
+ eeg_channel_scale: 1000.0
41
+ eeg_use_tar_fallback: True
42
+ bidirectional: ${trainer.bidirectional}
43
+ normalize_3dmm: ${trainer.data_transform}
44
+
45
+ validation_dataset:
46
+ _target_: dataset.react_2025.ReactionDataset
47
+ batch_size: ${trainer.batch_size}
48
+ shuffle: False
49
+ num_workers: 8
50
+ root_dir: ${data_dir}
51
+ split: val
52
+ target_size: 224
53
+ crop_size: 224
54
+ clip_length: ${trainer.max_seq_len}
55
+ fps: 30
56
+ audio_feature_type: wav2vec
57
+ load_video_s: True
58
+ load_video_l: False
59
+ load_audio: True
60
+ load_emotion_s: True
61
+ load_emotion_l: True
62
+ load_3dmm_s: True
63
+ load_3dmm_l: True
64
+ load_eeg_l: True
65
+ eeg_dir_name: eeg_processed
66
+ eeg_target_cols:
67
+ - TP9
68
+ - AF7
69
+ - AF8
70
+ - TP10
71
+ - Delta_TP9
72
+ - Theta_TP9
73
+ - Alpha_TP9
74
+ - Beta_TP9
75
+ - Gamma_TP9
76
+ - Delta_TP10
77
+ - Theta_TP10
78
+ - Alpha_TP10
79
+ - Beta_TP10
80
+ - Gamma_TP10
81
+ eeg_channel_scale: 1000.0
82
+ eeg_use_tar_fallback: True
83
+ bidirectional: ${trainer.bidirectional}
84
+ normalize_3dmm: ${trainer.data_transform}
85
+
86
+ test_dataset:
87
+ _target_: dataset.react_2025.ReactionDataset
88
+ batch_size: 1
89
+ shuffle: True
90
+ num_workers: 0
91
+ root_dir: ${data_dir}
92
+ split: test
93
+ target_size: 224
94
+ crop_size: 224
95
+ clip_length: ${trainer.max_seq_len}
96
+ fps: 30
97
+ audio_feature_type: wav2vec # mfcc | wav2vec
98
+ load_video_s: True
99
+ load_video_l: ${trainer.renderer.do_render}
100
+ load_audio: True
101
+ load_emotion_s: True
102
+ load_emotion_l: ${trainer.eval_facial_metrics}
103
+ load_3dmm_s: True
104
+ load_3dmm_l: False
105
+ load_eeg_l: ${trainer.eval_eeg}
106
+ eeg_dir_name: eeg_processed
107
+ eeg_target_cols:
108
+ - TP9
109
+ - AF7
110
+ - AF8
111
+ - TP10
112
+ - Delta_TP9
113
+ - Theta_TP9
114
+ - Alpha_TP9
115
+ - Beta_TP9
116
+ - Gamma_TP9
117
+ - Delta_TP10
118
+ - Theta_TP10
119
+ - Alpha_TP10
120
+ - Beta_TP10
121
+ - Gamma_TP10
122
+ eeg_channel_scale: 1000.0
123
+ eeg_use_tar_fallback: True
124
+ bidirectional: ${trainer.bidirectional}
125
+ normalize_3dmm: ${trainer.data_transform}
personalised/code/configs/generic_online/model/losses/motion_diffusion.yaml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _target_: framework.utils.losses.DiffusionLoss
2
+
3
+ losses_type: MSELossApt
4
+ losses_multiplier: 1.0
5
+ n_preds: ${trainer.${trainer.trainer_mode}.num_preds}
6
+ temporal_loss_w: 0.0
7
+ prior_loss_weight: 1.0
8
+ eeg_loss_weight: 0.25
9
+ w_au: 1.0 # action unit
10
+ w_va: 5.0 # valence and arousal
11
+ w_em: 5.0 # emotion
personalised/code/configs/generic_online/model/losses/motion_transvae.yaml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ _target_: framework.utils.losses.VAELoss
2
+
3
+ kl_p: 0.00001 # kl div loss
4
+ w_emo: 2.0
5
+ w_exp: 2.0 # facial expression
6
+ w_rot: 4.0 # rotation
7
+ w_tran: 4.0 # translation
8
+ eeg_loss_weight: 0.25
personalised/code/configs/generic_online/model/motion_diffusion.yaml ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ diff_model:
2
+ model_name: LatentMLPMatcher
3
+ _target_: framework.motion_diffusion.diffusion.matchers.LatentMatcher
4
+
5
+ eeg_head:
6
+ enabled: True
7
+ output_dim: 14
8
+ hidden_dim: 256
9
+ dropout: 0.5
10
+ pooling: mean
11
+ detach_prediction_emotion: True
12
+ use_speaker_audio: True
13
+ use_speaker_emotion: True
14
+ use_speaker_3dmm: True
15
+ use_prediction_emotion: True
16
+
17
+ diffusion_prior:
18
+ type:
19
+ DiffusionPriorNetwork
20
+ args:
21
+ emb_preprocessing: normalize
22
+ freeze_encoder: True
23
+ audio_dim: 768
24
+ window_size: ${trainer.${trainer.trainer_mode}.window_size}
25
+ s_ratio: ${trainer.${trainer.trainer_mode}.s_ratio}
26
+ token_len: 750
27
+ _3dmm_dim: 58
28
+ speaker_emb_dim: 512
29
+ latent_dim: 512
30
+ depth: 4
31
+ num_time_layers: 2
32
+ num_time_embeds: 1
33
+ num_time_emb_channels: 64
34
+ time_last_act: False
35
+ use_learned_query: True
36
+ s_audio_cond_drop_prob: 0.2
37
+ s_latentemb_cond_drop_prob: 1.0
38
+ s_3dmm_cond_drop_prob: 0.2
39
+ guidance_scale: 1.0
40
+ dim_head: 64
41
+ heads: 8
42
+ ff_mult: 4
43
+ norm_in: False
44
+ norm_out: True
45
+ attn_dropout: 0.0
46
+ ff_dropout: 0.0
47
+ final_proj: True
48
+ normformer: False
49
+ rotary_emb: True
50
+ scheduler:
51
+ noise_schedule: cosine
52
+ timestep_spacing: leading
53
+ num_train_timesteps: 1000
54
+ num_inference_timesteps: 50
55
+ predict: start_x
56
+ var_type: fixed_large
57
+ rescale_timesteps: False
58
+ noise_std: 1
59
+ num_preds: ${trainer.${trainer.trainer_mode}.num_preds}
60
+
61
+ diffusion_decoder:
62
+ type:
63
+ TransformerDenoiser
64
+ args:
65
+ emb_preprocessing: normalize
66
+ freeze_encoder: True
67
+ window_size: ${trainer.${trainer.trainer_mode}.window_size}
68
+ s_ratio: ${trainer.${trainer.trainer_mode}.s_ratio}
69
+ token_len: 750
70
+ encode_emotion: False
71
+ encode_3dmm: False
72
+ ablation_skip_connection: True
73
+ nfeats: 25
74
+ latent_dim: 512
75
+ ff_size: 1024
76
+ num_layers: 9 # 7 | 9
77
+ num_heads: 8 # 4 | 8
78
+ dropout: 0.1
79
+ normalize_before: False
80
+ activation: gelu
81
+ flip_sin_to_cos: True
82
+ return_intermediate_dec: False
83
+ position_embedding: learned
84
+ arch: trans_dec
85
+ freq_shift: 0
86
+ time_encoded_dim: 64
87
+ s_audio_dim: 768
88
+ s_audio_scale: 1.0
89
+ s_emotion_dim: 25
90
+ l_embed_dim: 512
91
+ s_embed_dim: 512
92
+ personal_emb_dim: 512
93
+ s_3dmm_dim: 58
94
+ concat: concat_first
95
+ guidance_scale: 1.0 # 7.5
96
+ s_audio_enc_drop_prob: 0.2
97
+ s_latent_embed_drop_prob: 1.0
98
+ s_3dmm_enc_drop_prob: 0.2
99
+ s_emotion_enc_drop_prob: 0.2
100
+ past_l_emotion_drop_prob: 1.0
101
+ use_past_frames: False
102
+ scheduler:
103
+ noise_schedule: cosine
104
+ timestep_spacing: leading
105
+ num_train_timesteps: 1000
106
+ num_inference_timesteps: 50
107
+ predict: start_x
108
+ var_type: fixed_large
109
+ rescale_timesteps: False
110
+ noise_std: 1
111
+ num_preds: ${trainer.${trainer.trainer_mode}.num_preds}
112
+
113
+ defaults:
114
+ - /generic_online/model/losses/motion_diffusion@loss
115
+ - /generic_online/model/motion_diffusion/audio_embedder@audio_encoder
116
+ #- /model/latent_embedder@latent_embedder
personalised/code/configs/generic_online/model/motion_diffusion/audio_embedder.yaml ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ type: AudioEmbedder
2
+ _target_: dataset.modules.audio_embedder.AudioEmbedder
3
+ checkpoint_path: ""
4
+ skip_norm: True
personalised/code/configs/generic_online/model/motion_transvae.yaml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ model_name: TransformerVAE
2
+ _target_: framework.motion_transvae.TransformerVAE.TransformerVAE
3
+
4
+ img_size: 224
5
+ audio_dim: 768
6
+ output_3dmm_dim: 58
7
+ output_emotion_dim: 25
8
+ feature_dim: 128
9
+ seq_len: ${data.train_dataset.clip_length}
10
+ task: ${task}
11
+ window_size: ${trainer.window_size}
12
+ device: cuda
13
+
14
+ eeg_head:
15
+ enabled: True
16
+ output_dim: 14
17
+ hidden_dim: 256
18
+ dropout: 0.5
19
+ pooling: mean
20
+ detach_prediction_emotion: True
21
+ use_speaker_audio: True
22
+ use_speaker_emotion: True
23
+ use_speaker_3dmm: True
24
+ use_prediction_emotion: True
personalised/code/configs/generic_online/motion_diffusion.yaml ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ hydra:
2
+ run:
3
+ dir: outputs/${trainer.model_name}/${data.data_name}/${task}/${run_id}
4
+ job:
5
+ chdir: true
6
+
7
+ seed: 1234
8
+ logger_level: INFO
9
+
10
+ task: online
11
+ stage: ???
12
+ data_dir: ???
13
+ resume: false
14
+ run_id: ${generate_id:}
15
+ resume_id: ""
16
+ num_gts: 10
17
+
18
+ defaults:
19
+ - /generic_online/data/motion_diffusion@data
20
+ - /generic_online/trainer/motion_diffusion@trainer
21
+ - /shared/logger: none
22
+ - /shared/path@path
23
+ - _self_
personalised/code/configs/generic_online/motion_transvae.yaml ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ hydra:
2
+ run:
3
+ dir: outputs/${trainer.model_name}/${data.data_name}/${task}/${run_id}
4
+ job:
5
+ chdir: true
6
+
7
+ seed: 1234
8
+ logger_level: INFO
9
+
10
+ task: online
11
+ stage: ???
12
+ data_dir: ???
13
+ resume: false
14
+ run_id: ${generate_id:}
15
+ resume_id: ""
16
+ num_gts: 10
17
+
18
+ defaults:
19
+ - /generic_online/data/motion_transvae@data
20
+ - /generic_online/trainer/motion_transvae@trainer
21
+ - /shared/logger: none
22
+ - /shared/path@path
23
+ - _self_
personalised/code/configs/generic_online/trainer/motion_diffusion.yaml ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ model_name: motion_diffusion
2
+ _target_: trainer.motion_diffusion.Trainer
3
+
4
+ trainer_mode: generic # generic facial reaction generator
5
+ folder: save/${trainer.model_name}/${data.data_name}/${task}
6
+ ckpt_dir: ${get_last_checkpoint:${trainer.folder}}
7
+ resumed_training: ${resume} # true | false
8
+ current_runid: ${run_id}
9
+ resume_runid: ${resume_id}
10
+ batch_size: 4
11
+ post_config_name: configs/shared/model/emotion_autoencoder.yaml
12
+ post_clip_length: 1000 # ground-truths alignment
13
+ data_clamp: True
14
+
15
+ generic:
16
+ seed: 1234
17
+ start_epoch: 0
18
+ epochs: 500
19
+ lr: 0.0001
20
+ model: LatentMatcher
21
+ clip_grad: False
22
+ num_workers: 16
23
+ log_dir: log
24
+ tb_dir: tb_logs
25
+ out_dir: results
26
+ save_period: 10
27
+ val_period: 10
28
+ num_preds: 10
29
+ clip_length: 750
30
+ window_size: 30
31
+ s_ratio: 2
32
+ train_eeg_head_only: False
33
+ pretrained_decoder_checkpoint: ""
34
+ pretrained_prior_checkpoint: ""
35
+ pretrained_load_prior: True
36
+ eval_eeg: True
37
+ bidirectional: False
38
+
39
+ renderer: # face animation based on predicted 3DMM coefficients
40
+ name: PIRenderer
41
+ _target_: utils.render.Render
42
+ do_render: False
43
+
44
+ defaults:
45
+ - /generic_online/model/motion_diffusion@model
46
+ - /shared/model/optim/adamw@optim
47
+ - /shared/model/scheduler/cosine_annealing@scheduler
48
+ - /generic_online/model/losses/motion_diffusion@criterion # loss func
personalised/code/configs/generic_online/trainer/motion_transvae.yaml ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ model_name: motion_transvae
2
+ _target_: trainer.motion_transvae.Trainer
3
+
4
+ folder: save/${trainer.model_name}/${data.data_name}/${task}
5
+ ckpt_dir: ${get_last_checkpoint:${trainer.folder}}
6
+ resumed_training: ${resume} # true | false
7
+ current_runid: ${run_id}
8
+ resume_runid: ${resume_id}
9
+
10
+ epochs: 100
11
+ gpu_ids: 0
12
+ lr: 0.00001
13
+ j: 12 # num_workers
14
+ batch_size: 4
15
+ max_seq_len: 750
16
+ window_size: 8
17
+ div_p: 10
18
+ post_config_name: configs/shared/model/emotion_autoencoder.yaml
19
+ post_clip_length: 1000 # ground-truths alignment
20
+ data_clamp: True
21
+ data_transform: zero_center # standard | zero_center
22
+ train_eeg_head_only: False
23
+ pretrained_model_checkpoint: ""
24
+ eval_eeg: True
25
+ num_preds: 10
26
+ bidirectional: False
27
+ save_results: True
28
+ eval_facial_metrics: True
29
+ eval_eeg_metrics: True
30
+ metric_threads: 1
31
+ eval_clip_batch_size: 1
32
+
33
+ renderer: # face animation based on predicted 3DMM coefficients
34
+ name: PIRenderer
35
+ _target_: utils.render.Render
36
+ do_render: True
37
+ transform_reverse: ${trainer.data_transform}
38
+
39
+ defaults:
40
+ - /generic_online/model/motion_transvae@model
41
+ - /shared/model/optim/adamw@optim
42
+ - /generic_online/model/losses/motion_transvae@criterion # loss func
personalised/code/configs/logger/none.yaml ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ logger_name: none
2
+ version: ${run_id}
3
+ logger_dir: tb_logs
4
+ project: null
personalised/code/configs/main.yaml ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ hydra:
3
+ run:
4
+ dir: outputs/${trainer.model_name}/${data.data_name}/${task}/${run_id}
5
+ job: # automatically go to the job folder (needed for hydra > 1.2 with new behavior)
6
+ chdir: true
7
+
8
+ # Global configurations shared between different modules
9
+ seed: 1234
10
+ logger_level: INFO
11
+
12
+ task: ??? # online | offline (* mandatory)
13
+ stage: ??? # fit | test (* mandatory)
14
+ data_dir: ???
15
+ # e.g., /lustre/projects/Research_Project-T127204/xk219/projects/datasets/react2026
16
+ resume: false
17
+ run_id: ${generate_id:} # function defined in prepare.py
18
+ resume_id: "" # specified if resume
19
+ num_gts: 10 # ground-truths
20
+
21
+ defaults:
22
+ - data: ??? # react_2025 (* mandatory)
23
+ - trainer: ??? # motion_diffusion | motion_transvae (* mandatory)
24
+ - logger: none
25
+ - /path@path # path configuration (loaded from configs/path.yaml)
26
+ - _self_
personalised/code/configs/model/emotion_autoencoder.yaml ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ type: EmotionVAE
2
+ _target_: framework.modules.emotion_autoencoder.EmotionVAE
3
+
4
+ in_channels: 25
5
+ out_channels: 25
6
+ feature_dim: 512
7
+ nhead: 8
8
+ dropout: 0.1
9
+ num_encoder_layers: 6
10
+ num_decoder_layers: 6
11
+ mlp_dist: False # expand mu & logvar
12
+ in_proj_type : linear # linear | mlp
13
+ out_proj_type : separate # separate | shared
14
+ pe_type : absolute # learnable | absolute
15
+ query_type : zero
16
+ max_seq_len: 5000
17
+ global_token_len: 64
personalised/code/configs/model/losses/emotion_autoencoder.yaml ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ _target_: framework.utils.losses.EmotionVAELoss
2
+
3
+ w_au: 1.0
4
+ w_va: 10.0
5
+ w_em: 1.0
6
+ w_kld: 0.001
personalised/code/configs/model/losses/motion_diffusion.yaml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _target_: framework.utils.losses.DiffusionLoss
2
+
3
+ losses_type: MSELossApt
4
+ losses_multiplier: 1.0
5
+ n_preds: ${trainer.${trainer.trainer_mode}.num_preds}
6
+ temporal_loss_w: 0.0
7
+ prior_loss_weight: 1.0
8
+ eeg_loss_weight: 0.25
9
+ w_au: 1.0 # action unit
10
+ w_va: 5.0 # valence and arousal
11
+ w_em: 5.0 # emotion
personalised/code/configs/model/losses/motion_diffusion_causal.yaml ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ # Loss with the explicit coarse-to-fine cross-entropy term added.
2
+ defaults:
3
+ - motion_diffusion
4
+ - _self_
5
+
6
+ _target_: framework.utils.losses_causal.DiffusionLossCoarse
7
+ w_coarse: 0.5 # weight of the coarse 8-class CE term
8
+ coarse_emo_start: 17
9
+ coarse_classes: 8
personalised/code/configs/model/losses/motion_transvae.yaml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ _target_: framework.utils.losses.VAELoss
2
+
3
+ kl_p: 0.00001 # kl div loss
4
+ w_emo: 2.0
5
+ w_exp: 2.0 # facial expression
6
+ w_rot: 4.0 # rotation
7
+ w_tran: 4.0 # translation
8
+ eeg_loss_weight: 0.25
personalised/code/configs/model/losses/perfrdiff_rewrite_weight.yaml ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ type: DiffusionLoss
2
+ args:
3
+ losses_type: [MSELoss, MSELoss]
4
+ losses_multipliers: [0, 1]
5
+ losses_decoded: [False, True]
6
+ k: ${trainer.${trainer.trainer_mode}.num_preds}
7
+ temporal_loss_w: 0.0
8
+ eeg_loss_weight: 1.0
personalised/code/configs/model/motion_diffusion.yaml ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ diff_model:
2
+ model_name: LatentMLPMatcher
3
+ _target_: framework.motion_diffusion.diffusion.matchers.LatentMatcher
4
+
5
+ eeg_head:
6
+ enabled: True
7
+ output_dim: 14
8
+ hidden_dim: 256
9
+ dropout: 0.5
10
+ pooling: mean
11
+ detach_prediction_emotion: True
12
+ use_speaker_audio: True
13
+ use_speaker_emotion: True
14
+ use_speaker_3dmm: True
15
+ use_prediction_emotion: True
16
+
17
+ diffusion_prior:
18
+ type:
19
+ DiffusionPriorNetwork
20
+ args:
21
+ emb_preprocessing: normalize
22
+ freeze_encoder: True
23
+ audio_dim: 768
24
+ window_size: ${trainer.${trainer.trainer_mode}.window_size}
25
+ s_ratio: ${trainer.${trainer.trainer_mode}.s_ratio}
26
+ token_len: 750
27
+ _3dmm_dim: 58
28
+ speaker_emb_dim: 512
29
+ latent_dim: 512
30
+ depth: 4
31
+ num_time_layers: 2
32
+ num_time_embeds: 1
33
+ num_time_emb_channels: 64
34
+ time_last_act: False
35
+ use_learned_query: True
36
+ s_audio_cond_drop_prob: 0.2
37
+ s_latentemb_cond_drop_prob: 1.0
38
+ s_3dmm_cond_drop_prob: 0.2
39
+ guidance_scale: 1.0
40
+ dim_head: 64
41
+ heads: 8
42
+ ff_mult: 4
43
+ norm_in: False
44
+ norm_out: True
45
+ attn_dropout: 0.0
46
+ ff_dropout: 0.0
47
+ final_proj: True
48
+ normformer: False
49
+ rotary_emb: True
50
+ scheduler:
51
+ noise_schedule: cosine
52
+ timestep_spacing: leading
53
+ num_train_timesteps: 1000
54
+ num_inference_timesteps: 50
55
+ predict: start_x
56
+ var_type: fixed_large
57
+ rescale_timesteps: False
58
+ noise_std: 1
59
+ num_preds: ${trainer.${trainer.trainer_mode}.num_preds}
60
+
61
+ diffusion_decoder:
62
+ type:
63
+ TransformerDenoiser
64
+ args:
65
+ emb_preprocessing: normalize
66
+ freeze_encoder: True
67
+ window_size: ${trainer.${trainer.trainer_mode}.window_size}
68
+ s_ratio: ${trainer.${trainer.trainer_mode}.s_ratio}
69
+ token_len: 750
70
+ encode_emotion: False
71
+ encode_3dmm: False
72
+ ablation_skip_connection: True
73
+ nfeats: 25
74
+ latent_dim: 512
75
+ ff_size: 1024
76
+ num_layers: 9 # 7 | 9
77
+ num_heads: 8 # 4 | 8
78
+ dropout: 0.1
79
+ normalize_before: False
80
+ activation: gelu
81
+ flip_sin_to_cos: True
82
+ return_intermediate_dec: False
83
+ position_embedding: learned
84
+ arch: trans_dec
85
+ freq_shift: 0
86
+ time_encoded_dim: 64
87
+ s_audio_dim: 768
88
+ s_audio_scale: 1.0
89
+ s_emotion_dim: 25
90
+ l_embed_dim: 512
91
+ s_embed_dim: 512
92
+ personal_emb_dim: 512
93
+ s_3dmm_dim: 58
94
+ concat: concat_first
95
+ guidance_scale: 1.0 # 7.5
96
+ s_audio_enc_drop_prob: 0.2
97
+ s_latent_embed_drop_prob: 1.0
98
+ s_3dmm_enc_drop_prob: 0.2
99
+ s_emotion_enc_drop_prob: 0.2
100
+ past_l_emotion_drop_prob: 1.0
101
+ use_past_frames: False
102
+ scheduler:
103
+ noise_schedule: cosine
104
+ timestep_spacing: leading
105
+ num_train_timesteps: 1000
106
+ num_inference_timesteps: 50
107
+ predict: start_x
108
+ var_type: fixed_large
109
+ rescale_timesteps: False
110
+ noise_std: 1
111
+ num_preds: ${trainer.${trainer.trainer_mode}.num_preds}
112
+
113
+ defaults:
114
+ - /model/losses/motion_diffusion@loss
115
+ - /model/motion_diffusion/audio_embedder@audio_encoder
116
+ #- /model/latent_embedder@latent_embedder
personalised/code/configs/model/motion_diffusion/audio_embedder.yaml ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ type: AudioEmbedder
2
+ _target_: dataset.modules.audio_embedder.AudioEmbedder
3
+ checkpoint_path: ""
4
+ skip_norm: True
personalised/code/configs/model/motion_diffusion_causal.yaml ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Causal / coarse-to-fine variant of the generic motion_diffusion model.
2
+ # Inherits the full baseline model config and only swaps the matcher target
3
+ # and adds the causal-decoder hyperparameters. Non-invasive: originals untouched.
4
+ defaults:
5
+ - motion_diffusion
6
+ - _self_
7
+
8
+ diff_model:
9
+ _target_: framework.motion_diffusion.diffusion.matchers_causal.CausalLatentMatcher
10
+ diffusion_decoder:
11
+ args:
12
+ # causal lead-lag cross-attention bias
13
+ use_lag_bias: True
14
+ lag_max: 60 # max past speaker offset with its own learned bias bucket
15
+ lag_lookahead: 0 # 0 = strict causal (no future speaker frames)
16
+ # coarse-to-fine 8-class facial-expression plan
17
+ use_coarse: True
18
+ coarse_classes: 8
19
+ coarse_hidden: 256
20
+ coarse_emo_start: 17 # emotion 25-d layout: [0:15]=AU, [15:17]=VA, [17:25]=8 expr
personalised/code/configs/model/motion_diffusion_velocity.yaml ADDED
@@ -0,0 +1,116 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ diff_model:
2
+ model_name: LatentMLPMatcher
3
+ _target_: framework.motion_diffusion.diffusion.matchers_velocity.VelocityLatentMatcher
4
+
5
+ eeg_head:
6
+ enabled: True
7
+ output_dim: 14
8
+ hidden_dim: 256
9
+ dropout: 0.5
10
+ pooling: mean
11
+ detach_prediction_emotion: True
12
+ use_speaker_audio: True
13
+ use_speaker_emotion: True
14
+ use_speaker_3dmm: True
15
+ use_prediction_emotion: True
16
+
17
+ diffusion_prior:
18
+ type:
19
+ DiffusionPriorNetwork
20
+ args:
21
+ emb_preprocessing: normalize
22
+ freeze_encoder: True
23
+ audio_dim: 768
24
+ window_size: ${trainer.${trainer.trainer_mode}.window_size}
25
+ s_ratio: ${trainer.${trainer.trainer_mode}.s_ratio}
26
+ token_len: 750
27
+ _3dmm_dim: 58
28
+ speaker_emb_dim: 512
29
+ latent_dim: 512
30
+ depth: 4
31
+ num_time_layers: 2
32
+ num_time_embeds: 1
33
+ num_time_emb_channels: 64
34
+ time_last_act: False
35
+ use_learned_query: True
36
+ s_audio_cond_drop_prob: 0.2
37
+ s_latentemb_cond_drop_prob: 1.0
38
+ s_3dmm_cond_drop_prob: 0.2
39
+ guidance_scale: 1.0
40
+ dim_head: 64
41
+ heads: 8
42
+ ff_mult: 4
43
+ norm_in: False
44
+ norm_out: True
45
+ attn_dropout: 0.0
46
+ ff_dropout: 0.0
47
+ final_proj: True
48
+ normformer: False
49
+ rotary_emb: True
50
+ scheduler:
51
+ noise_schedule: cosine
52
+ timestep_spacing: leading
53
+ num_train_timesteps: 1000
54
+ num_inference_timesteps: 50
55
+ predict: start_x
56
+ var_type: fixed_large
57
+ rescale_timesteps: False
58
+ noise_std: 1
59
+ num_preds: ${trainer.${trainer.trainer_mode}.num_preds}
60
+
61
+ diffusion_decoder:
62
+ type:
63
+ TransformerDenoiser
64
+ args:
65
+ emb_preprocessing: normalize
66
+ freeze_encoder: True
67
+ window_size: ${trainer.${trainer.trainer_mode}.window_size}
68
+ s_ratio: ${trainer.${trainer.trainer_mode}.s_ratio}
69
+ token_len: 750
70
+ encode_emotion: False
71
+ encode_3dmm: False
72
+ ablation_skip_connection: True
73
+ nfeats: 25
74
+ latent_dim: 512
75
+ ff_size: 1024
76
+ num_layers: 9 # 7 | 9
77
+ num_heads: 8 # 4 | 8
78
+ dropout: 0.1
79
+ normalize_before: False
80
+ activation: gelu
81
+ flip_sin_to_cos: True
82
+ return_intermediate_dec: False
83
+ position_embedding: learned
84
+ arch: trans_dec
85
+ freq_shift: 0
86
+ time_encoded_dim: 64
87
+ s_audio_dim: 768
88
+ s_audio_scale: 1.0
89
+ s_emotion_dim: 25
90
+ l_embed_dim: 512
91
+ s_embed_dim: 512
92
+ personal_emb_dim: 512
93
+ s_3dmm_dim: 58
94
+ concat: concat_first
95
+ guidance_scale: 1.0 # 7.5
96
+ s_audio_enc_drop_prob: 0.2
97
+ s_latent_embed_drop_prob: 1.0
98
+ s_3dmm_enc_drop_prob: 0.2
99
+ s_emotion_enc_drop_prob: 0.2
100
+ past_l_emotion_drop_prob: 1.0
101
+ use_past_frames: False
102
+ scheduler:
103
+ noise_schedule: cosine
104
+ timestep_spacing: leading
105
+ num_train_timesteps: 1000
106
+ num_inference_timesteps: 50
107
+ predict: start_x
108
+ var_type: fixed_large
109
+ rescale_timesteps: False
110
+ noise_std: 1
111
+ num_preds: ${trainer.${trainer.trainer_mode}.num_preds}
112
+
113
+ defaults:
114
+ - /model/losses/motion_diffusion@loss
115
+ - /model/motion_diffusion/audio_embedder@audio_encoder
116
+ #- /model/latent_embedder@latent_embedder
personalised/code/configs/model/motion_transvae.yaml ADDED
@@ -0,0 +1,24 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ model_name: TransformerVAE
2
+ _target_: framework.motion_transvae.TransformerVAE.TransformerVAE
3
+
4
+ img_size: 224
5
+ audio_dim: 768
6
+ output_3dmm_dim: 58
7
+ output_emotion_dim: 25
8
+ feature_dim: 128
9
+ seq_len: ${data.train_dataset.clip_length}
10
+ task: ${task}
11
+ window_size: ${trainer.window_size}
12
+ device: cuda
13
+
14
+ eeg_head:
15
+ enabled: True
16
+ output_dim: 14
17
+ hidden_dim: 256
18
+ dropout: 0.5
19
+ pooling: mean
20
+ detach_prediction_emotion: True
21
+ use_speaker_audio: True
22
+ use_speaker_emotion: True
23
+ use_speaker_3dmm: True
24
+ use_prediction_emotion: True
personalised/code/configs/model/optim/adam.yaml ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ _target_: torch.optim.Adam
2
+
3
+ betas: [0.9, 0.98]
4
+ eps: 1e-09
5
+ #lr: 1e-05
personalised/code/configs/model/optim/adamw.yaml ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ _target_: torch.optim.AdamW
2
+
3
+ #args:
4
+ #lr: 0.0001
5
+ weight_decay: 1e-4
6
+ betas: [0.9, 0.999] # [0.9, 0.98]
7
+ # eps: 1e-09
personalised/code/configs/model/optim/sgd.yaml ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ _target_: torch.optim.SGD
2
+
3
+ #lr: 0.001
4
+ weight_decay: 1e-4
5
+ momentum: 0.9
personalised/code/configs/model/scheduler/cosine_annealing.yaml ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ _target_: torch.optim.lr_scheduler.CosineAnnealingLR
2
+
3
+ eta_min: 0
4
+ last_epoch: -1
personalised/code/configs/path.yaml ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ # path to additional modules, defined in prepare.py
2
+ deps: ${code_path:./deps}
3
+ datasets: ${code_path:./datasets}
4
+ code_dir: ${code_path:}
5
+ working_dir: ${working_path:""}
personalised/code/configs/pers_offline_causal.yaml ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Root-level top config for OFFLINE personalized (perfrdiff rewrite-weight) so it
2
+ # composes at the global package (the in-tree personalized_*/ configs get packaged
3
+ # under their subdir name when loaded via --config-name, which breaks overrides).
4
+ # Non-invasive: originals untouched; this only re-hosts the same defaults at root.
5
+ defaults:
6
+ - /personalized_offline/data/perfrdiff_rewrite_weight@data
7
+ - /personalized_offline/trainer/perfrdiff_rewrite_weight@trainer
8
+ - /shared/logger: none
9
+ - /shared/path@path
10
+ - _self_
11
+
12
+ seed: 1234
13
+ logger_level: INFO
14
+ task: offline
15
+ stage: ???
16
+ data_dir: ???
17
+ resume: false
18
+ run_id: ${generate_id:}
19
+ resume_id: ""
20
+ num_gts: 10
personalised/code/configs/pers_online_causal.yaml ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Root-level top config for ONLINE personalized (perfrdiff rewrite-weight), mirror of
2
+ # pers_offline_causal.yaml: re-hosts the personalized_online defaults at the global
3
+ # package so --config-name overrides compose correctly. Non-invasive.
4
+ defaults:
5
+ - /personalized_online/data/perfrdiff_rewrite_weight@data
6
+ - /personalized_online/trainer/perfrdiff_rewrite_weight@trainer
7
+ - /shared/logger: none
8
+ - /shared/path@path
9
+ - _self_
10
+
11
+ seed: 1234
12
+ logger_level: INFO
13
+ task: online
14
+ stage: ???
15
+ data_dir: ???
16
+ resume: false
17
+ run_id: ${generate_id:}
18
+ resume_id: ""
19
+ num_gts: 10
personalised/code/configs/personalized_offline/data/perfrdiff_rewrite_weight.yaml ADDED
@@ -0,0 +1,135 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ data_name: react_2025
2
+ _target_: dataset.perfrdiff_rewrite_weight.PerFRDiffRewriteWeightDataModule
3
+
4
+ train_dataset:
5
+ _target_: dataset.perfrdiff_rewrite_weight.PerFRDiffRewriteWeightDataset
6
+ batch_size: ${trainer.batch_size}
7
+ shuffle: True
8
+ num_workers: 8
9
+ root_dir: ${data_dir}
10
+ split: train
11
+ clip_length: 750
12
+ target_size: 224
13
+ crop_size: 224
14
+ fps: 30
15
+ audio_feature_type: wav2vec
16
+ load_video_s: False
17
+ load_video_l: False
18
+ load_audio: True
19
+ load_emotion_s: True
20
+ load_emotion_l: True
21
+ load_3dmm_s: True
22
+ load_3dmm_l: True
23
+ load_ref: True
24
+ load_personality_l: True
25
+ personal_condition_mode: ${trainer.main_model.args.personal_condition_mode}
26
+ load_eeg_l: ${trainer.generic.train_eeg}
27
+ eeg_dir_name: eeg_processed
28
+ eeg_target_cols:
29
+ - TP9
30
+ - AF7
31
+ - AF8
32
+ - TP10
33
+ - Delta_TP9
34
+ - Theta_TP9
35
+ - Alpha_TP9
36
+ - Beta_TP9
37
+ - Gamma_TP9
38
+ - Delta_TP10
39
+ - Theta_TP10
40
+ - Alpha_TP10
41
+ - Beta_TP10
42
+ - Gamma_TP10
43
+ eeg_channel_scale: 1000.0
44
+ eeg_use_tar_fallback: True
45
+ bidirectional: ${trainer.generic.bidirectional}
46
+ normalize_3dmm: standard
47
+
48
+ validation_dataset:
49
+ _target_: dataset.perfrdiff_rewrite_weight.PerFRDiffRewriteWeightDataset
50
+ batch_size: ${trainer.batch_size}
51
+ shuffle: False
52
+ num_workers: 8
53
+ root_dir: ${data_dir}
54
+ split: val
55
+ clip_length: 750
56
+ target_size: 224
57
+ crop_size: 224
58
+ fps: 30
59
+ audio_feature_type: wav2vec
60
+ load_video_s: False
61
+ load_video_l: False
62
+ load_audio: True
63
+ load_emotion_s: True
64
+ load_emotion_l: True
65
+ load_3dmm_s: True
66
+ load_3dmm_l: True
67
+ load_ref: True
68
+ load_personality_l: True
69
+ personal_condition_mode: ${trainer.main_model.args.personal_condition_mode}
70
+ load_eeg_l: ${trainer.generic.train_eeg}
71
+ eeg_dir_name: eeg_processed
72
+ eeg_target_cols:
73
+ - TP9
74
+ - AF7
75
+ - AF8
76
+ - TP10
77
+ - Delta_TP9
78
+ - Theta_TP9
79
+ - Alpha_TP9
80
+ - Beta_TP9
81
+ - Gamma_TP9
82
+ - Delta_TP10
83
+ - Theta_TP10
84
+ - Alpha_TP10
85
+ - Beta_TP10
86
+ - Gamma_TP10
87
+ eeg_channel_scale: 1000.0
88
+ eeg_use_tar_fallback: True
89
+ bidirectional: ${trainer.generic.bidirectional}
90
+ normalize_3dmm: standard
91
+
92
+ test_dataset:
93
+ _target_: dataset.perfrdiff_rewrite_weight.PerFRDiffRewriteWeightDataset
94
+ batch_size: ${trainer.batch_size}
95
+ shuffle: False
96
+ num_workers: 4
97
+ root_dir: ${data_dir}
98
+ split: test
99
+ clip_length: 750
100
+ target_size: 224
101
+ crop_size: 224
102
+ fps: 30
103
+ audio_feature_type: wav2vec
104
+ load_video_s: False
105
+ load_video_l: False
106
+ load_audio: True
107
+ load_emotion_s: True
108
+ load_emotion_l: True
109
+ load_3dmm_s: True
110
+ load_3dmm_l: True
111
+ load_ref: False
112
+ load_personality_l: True
113
+ personal_condition_mode: ${trainer.main_model.args.personal_condition_mode}
114
+ load_eeg_l: ${trainer.generic.eval_eeg}
115
+ eeg_dir_name: eeg_processed
116
+ eeg_target_cols:
117
+ - TP9
118
+ - AF7
119
+ - AF8
120
+ - TP10
121
+ - Delta_TP9
122
+ - Theta_TP9
123
+ - Alpha_TP9
124
+ - Beta_TP9
125
+ - Gamma_TP9
126
+ - Delta_TP10
127
+ - Theta_TP10
128
+ - Alpha_TP10
129
+ - Beta_TP10
130
+ - Gamma_TP10
131
+ eeg_channel_scale: 1000.0
132
+ eeg_use_tar_fallback: True
133
+ bidirectional: ${trainer.generic.bidirectional}
134
+ normalize_3dmm: standard
135
+ num_test_gts: ${num_gts}
personalised/code/configs/personalized_offline/model/losses/motion_diffusion.yaml ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ _target_: framework.utils.losses.DiffusionLoss
2
+
3
+ losses_type: MSELossApt
4
+ losses_multiplier: 1.0
5
+ n_preds: ${trainer.${trainer.trainer_mode}.num_preds}
6
+ temporal_loss_w: 0.0
7
+ prior_loss_weight: 1.0
8
+ eeg_loss_weight: 0.25
9
+ w_au: 1.0 # action unit
10
+ w_va: 5.0 # valence and arousal
11
+ w_em: 5.0 # emotion