ErnestBeckham commited on
Commit
40d388d
·
verified ·
1 Parent(s): 51269a8

Phase 1 checkpoint, epoch None

Browse files
Files changed (1) hide show
  1. phase1_v2/README.md +107 -0
phase1_v2/README.md ADDED
@@ -0,0 +1,107 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ library_name: mmm
3
+ tags:
4
+ - motion-matching
5
+ - character-animation
6
+ - state-space-model
7
+ - mamba
8
+ ---
9
+
10
+ # MMM-versions
11
+
12
+ Retrieval augmented state space model for real time character animation: a
13
+ Mamba backbone that takes a joystick request, its own previous pose, and `k`
14
+ poses retrieved from a motion matching database, and predicts the next pose.
15
+
16
+ This is a **Phase 1** checkpoint (pre-training on mocap).
17
+
18
+ ## This model is not usable on its own
19
+
20
+ The retrieved candidate poses are part of the input, not an optional extra.
21
+ Without the matching database the model is being fed zeros in 371%
22
+ of its input width and will not produce correct motion.
23
+
24
+ The database this checkpoint was trained against:
25
+
26
+ | | |
27
+ | --- | --- |
28
+ | fingerprint | `eb460d0093b66709` |
29
+ | rows (frames) | 962,891 |
30
+ | pose width | 151 |
31
+ | frame time | 0.016666666666666666 s |
32
+ | clips | 77 (aiming1_subject1, aiming1_subject4, aiming2_subject2, aiming2_subject3...) |
33
+
34
+ The database is built from LaFAN1 and is **not** distributed here. Rebuild it
35
+ with `scripts/build_databases.py`; the fingerprint above must match, or the
36
+ retrieved poses are in a different space from the ones the model learned on.
37
+
38
+ ## Architecture
39
+
40
+ | | |
41
+ | --- | --- |
42
+ | backbone | MambaBackbone |
43
+ | n_layers | 4 |
44
+ | d_model | 256 |
45
+ | d_state | 16 |
46
+ | d_conv | 4 |
47
+ | d_inner | 512 |
48
+ | head | full |
49
+ | pose_dim | 151 |
50
+ | joystick_dim | 12 |
51
+ | n_candidates | 4 |
52
+ | input_dim | 163 |
53
+ | output_dim | 153 |
54
+ | predict_contacts | True |
55
+ | parameters | 1,833,625 |
56
+ | use_retrieval | False |
57
+
58
+ ## Training
59
+
60
+ | epoch | train | validation |
61
+ | --- | --- | --- |
62
+ | 1 (first) | 1.1842 | 0.5915 |
63
+ | 55 (best) | 0.2827 | 0.2243 |
64
+ | 56 (last) | 0.2816 | 0.2262 |
65
+
66
+ Trained for 56 epochs.
67
+
68
+ ## Retrieval gain
69
+
70
+ The number this project is actually judged on. It is the validation loss with
71
+ the retrieved candidates zeroed, minus the loss with them present, so positive
72
+ means retrieval is helping.
73
+
74
+ It is reported in two regimes and **only the free running one is meaningful**.
75
+ Under teacher forcing the model is handed the true previous pose every frame,
76
+ and at 60Hz that is a far better predictor than any retrieved candidate --
77
+ measured on this database, copying the previous pose scores 2.29 while copying
78
+ the nearest candidate scores 16.24. A teacher forced model is therefore right
79
+ to ignore retrieval, and its gain sits at zero whatever the model has learned.
80
+
81
+ | regime | with retrieval | without | gain |
82
+ | --- | --- | --- | --- |
83
+ | teacher forced | 0.2243 | 0.2243 | +0.0000 |
84
+ | **free running** | 0.7945 | 0.7945 | **+0.0000** |
85
+
86
+ ## Provenance
87
+
88
+ - Rotation maths cross validated against GenoViewPython's `quat.py`
89
+ (MIT, Copyright (c) 2024 Daniel Holden) to 1e-9.
90
+ - Spring damper after Holden, *Spring-It-On*; inertialization after Bollo,
91
+ GDC 2018; 6D rotations after Zhou et al., CVPR 2019.
92
+ - Learned Motion Matching (Holden et al., SIGGRAPH 2020) is background and
93
+ baseline for this work, not its architecture.
94
+
95
+ See `NOTICE.md` in the source repository for the full attribution.
96
+
97
+ ## Format
98
+
99
+ `safetensors`, with the run's architecture, config and calibrated loss weights
100
+ JSON encoded in the metadata header. No pickle is involved in loading.
101
+
102
+ ```python
103
+ from safetensors import safe_open
104
+
105
+ with safe_open("published.safetensors", framework="pt") as f:
106
+ print(f.metadata()["architecture"])
107
+ ```