ljchang commited on
Commit
2fa5435
·
verified ·
1 Parent(s): cf58516

Initial v2 release: 512-256-128 LayerNorm+GELU MLP distilled from img2pose on CelebV-HQ

Browse files
Files changed (3) hide show
  1. README.md +194 -0
  2. pose_mlp_v2.json +368 -0
  3. pose_mlp_v2.safetensors +3 -0
README.md ADDED
@@ -0,0 +1,194 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ tags:
3
+ - pytorch
4
+ - safetensors
5
+ - pose-estimation
6
+ - head-pose
7
+ - landmark-to-pose
8
+ - distillation
9
+ - py-feat
10
+ library_name: py-feat
11
+ pipeline_tag: image-feature-extraction
12
+ license: mit
13
+ ---
14
+
15
+ # Py-Feat Pose-MLP v2 — Landmark-to-6DoF Head Pose
16
+
17
+ A small distilled MLP that takes 68 face landmarks (the dlib-68 / OpenFace
18
+ layout produced by `mobilefacenet`, OpenFace, etc.) and emits 6DoF head
19
+ pose calibrated to img2pose's coordinate frame. Designed for `py-feat`
20
+ pipelines that use a face detector without a built-in pose head (e.g.
21
+ RetinaFace in `py-feat ≥ 0.7`).
22
+
23
+ ## Model Description
24
+
25
+ `py-feat`'s v0.6 production pipeline used `img2pose` as its face detector,
26
+ which multi-tasks face localization with 6DoF head pose regression — so
27
+ pose came "for free" from the detector. In v0.7 the default face detector
28
+ became `RetinaFace` (much higher WIDERFACE Hard AP) which only detects
29
+ faces. To preserve the `Fex` schema (`pitch`, `roll`, `yaw`, `x`, `y`,
30
+ `z` columns), `py-feat` distills img2pose's pose regression into a small
31
+ MLP that operates entirely on already-computed landmarks.
32
+
33
+ The MLP is bbox-free: it normalizes incoming landmarks by their centroid
34
+ and inter-eye distance, so the same model works regardless of whether
35
+ the upstream detector produced loose (img2pose) or tight (RetinaFace)
36
+ face crops.
37
+
38
+ ## Model Details
39
+
40
+ - **Model type**: Multi-layer perceptron (MLP)
41
+ - **Architecture**: `Linear(136→512) → LayerNorm → GELU → Dropout(0.15)
42
+ → Linear(512→256) → LayerNorm → GELU → Dropout → Linear(256→128) →
43
+ LayerNorm → GELU → Dropout → Linear(128→6)`
44
+ - **Parameter count**: 236,934 (~0.9 MB safetensors)
45
+ - **Input**: 68 2D landmarks, normalized by landmark centroid and
46
+ inter-eye distance (`feat.utils.face_pose_mlp.normalize_landmarks`).
47
+ - **Output**: 6 values — `[Pitch, Roll, Yaw, X, Y, Z]`. The MLP emits
48
+ z-scored values; the loader de-normalizes using `mean`/`std` stored in
49
+ the sidecar `pose_mlp_v2.json`. Angles are radians, calibrated to
50
+ img2pose's coordinate frame.
51
+ - **Framework**: PyTorch (safetensors weight file, no pickle).
52
+ - **Inference cost**: ~10 µs / face on CPU (batched), negligible vs.
53
+ the upstream face/landmark stages.
54
+
55
+ ## Training Details
56
+
57
+ - **Teacher**: `img2pose` (Albiero et al., 2021). The MLP is trained to
58
+ match img2pose's regressed `[Pitch, Roll, Yaw, X, Y, Z]` outputs.
59
+ - **Training corpus**: CelebV-HQ — `n_clips = 35,445`,
60
+ `n_train_frames = 2,783,134`, `n_val_frames = 154,619`. Frames with
61
+ `FaceScore < 0.8` or `|pose| > 75°` are dropped (filters bad teacher
62
+ signal on degenerate poses).
63
+ - **Loss**: MSE on z-scored 6D output.
64
+ - **Optimizer**: Adam, `lr=1e-3`, `batch_size=1024`.
65
+ - **Epochs**: 40 (best val loss at last epoch — see `pose_mlp_v2.json`
66
+ for per-epoch history).
67
+ - **Hardware**: single GPU (training takes ~2 hr).
68
+ - **Seed**: 42.
69
+
70
+ ### Held-out validation MAE on CelebV-HQ (clip-disjoint split)
71
+
72
+ | Axis | MAE (°) |
73
+ |---|---|
74
+ | Pitch | 2.66 |
75
+ | Roll | 2.34 |
76
+ | Yaw | 1.58 |
77
+
78
+ For reference, img2pose's reported MAE on the AFLW2000-3D / BIWI test
79
+ sets is ~4° average. The MLP cannot exceed its teacher; values here are
80
+ the gap between the MLP and the teacher's predictions, not against a
81
+ ground-truth motion-capture rig.
82
+
83
+ ### v1 → v2 changelog
84
+
85
+ | Aspect | v1 | v2 |
86
+ |---|---|---|
87
+ | Hidden | 256→128→64 | 512→256→128 |
88
+ | Activation | Linear → ReLU → Dropout | Linear → LayerNorm → GELU → Dropout |
89
+ | Dropout | 0.10 | 0.15 |
90
+ | Training frames | 569,678 | 2,783,134 |
91
+ | Epochs | 30 | 40 |
92
+ | Best val loss | 0.0809 | 0.0777 |
93
+ | Roll MAE (°) | 2.530 | 2.335 |
94
+
95
+ ## Intended Use
96
+
97
+ - **Primary**: Drop-in replacement for img2pose's pose head when using
98
+ `py-feat` with a face detector that doesn't predict pose
99
+ (`face_model='retinaface'` in `feat.Detector`, MediaPipe in
100
+ `feat.MPDetector`).
101
+ - **Secondary**: Any pipeline that produces 68 dlib-style face landmarks
102
+ and wants img2pose-compatible head pose without re-running img2pose.
103
+
104
+ ### Out of scope
105
+
106
+ - Eye / gaze direction — use `L2CS-Net` for gaze.
107
+ - Mediapipe-478 landmarks — translate to 68 dlib landmarks first.
108
+ - Static head-pose inference from a single landmark (less than 68 pts).
109
+
110
+ ## Usage
111
+
112
+ The MLP is loaded automatically by `feat.Detector` when
113
+ `face_model != 'img2pose'`. To call it directly:
114
+
115
+ ```python
116
+ import torch
117
+ from feat.utils.face_pose_mlp import pose_from_landmarks_mlp
118
+
119
+ # 68 (x, y) landmarks in image-pixel coordinates, e.g. from mobilefacenet.
120
+ landmarks = torch.tensor([
121
+ # ... [68, 2] ...
122
+ ], dtype=torch.float32).unsqueeze(0) # [1, 68, 2]
123
+
124
+ pose = pose_from_landmarks_mlp(landmarks) # [1, 6]: (Pitch, Roll, Yaw, X, Y, Z)
125
+ print(pose)
126
+ ```
127
+
128
+ Weights resolve from (in order):
129
+ 1. `FEAT_POSE_MLP_PATH` environment variable
130
+ 2. `models/pose_mlp_v2.safetensors` in the repo
131
+ 3. This HuggingFace repo (`py-feat/pose_mlp_v2`)
132
+
133
+ ## Limitations
134
+
135
+ - The MLP cannot improve on img2pose's accuracy — it only matches it
136
+ more efficiently with bbox-free input. Use img2pose directly if you
137
+ need img2pose's exact behavior (a tiny ~1° distillation gap may remain).
138
+ - Trained on CelebV-HQ — performance on non-frontal, occluded, or
139
+ heavily-rotated faces (>75°) is degraded by both the teacher and the
140
+ data filter.
141
+ - Output coordinates are img2pose's frame, not a standard FACS / BIWI
142
+ frame. Pose values are interpretable across the `py-feat` pipeline
143
+ but may need recalibration to compare with other tools.
144
+
145
+ ## Citation
146
+
147
+ If you use `py-feat` and this pose-MLP, please cite both `py-feat` and
148
+ img2pose:
149
+
150
+ ```bibtex
151
+ @article{cheong2023pyfeat,
152
+ title={Py-Feat: Python Facial Expression Analysis Toolbox},
153
+ author={Cheong, Jin Hyun and Jolly, Eshin and Xie, Tiankang and Byrne, Sophie and Kenney, Matthew and Chang, Luke J.},
154
+ journal={Affective Science},
155
+ volume={4},
156
+ pages={781--796},
157
+ year={2023}
158
+ }
159
+
160
+ @inproceedings{albiero2021img2pose,
161
+ title={img2pose: Face Alignment and Detection via 6DoF, Face Pose Estimation},
162
+ author={Albiero, Vítor and Chen, Xingyu and Yin, Xi and Pang, Guan and Hassner, Tal},
163
+ booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
164
+ pages={7617--7627},
165
+ year={2021}
166
+ }
167
+
168
+ @inproceedings{zhu2022celebvhq,
169
+ title={CelebV-HQ: A Large-Scale Video Facial Attributes Dataset},
170
+ author={Zhu, Hao and Wu, Wayne and Zhu, Wentao and Jiang, Liming and Tang, Siwei and Zhang, Li and Liu, Ziwei and Loy, Chen Change},
171
+ booktitle={Proceedings of the European Conference on Computer Vision (ECCV)},
172
+ year={2022}
173
+ }
174
+ ```
175
+
176
+ ## License
177
+
178
+ MIT (this distillation). The teacher (`img2pose`) is BSD-3, and the
179
+ training corpus (CelebV-HQ) is released for non-commercial research
180
+ use — please honor each upstream license if you re-train or
181
+ re-distribute.
182
+
183
+ ## Files
184
+
185
+ - `pose_mlp_v2.safetensors` — model weights (1 MB)
186
+ - `pose_mlp_v2.json` — architecture, output-normalization stats, training
187
+ history, validation MAE per epoch
188
+ - `README.md` — this card
189
+
190
+ ## Acknowledgments
191
+
192
+ Distilled from img2pose by Vítor Albiero et al. (Meta AI / NVIDIA),
193
+ trained on CelebV-HQ by Hao Zhu et al. (CUHK / S-Lab NTU). Built and
194
+ maintained by [Cosanlab](https://cosanlab.com) at Dartmouth.
pose_mlp_v2.json ADDED
@@ -0,0 +1,368 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architecture": {
3
+ "type": "PoseMLP",
4
+ "hidden": [
5
+ 512,
6
+ 256,
7
+ 128
8
+ ],
9
+ "dropout": 0.15,
10
+ "input_dim": 136,
11
+ "output_dim": 6,
12
+ "input_description": "68 (x, y) face landmarks normalized to face bbox [0,1]^2",
13
+ "output_description": "Pitch, Roll, Yaw (rad), X, Y, Z (units of img2pose template)",
14
+ "output_normalization": {
15
+ "mean": [
16
+ 0.047110091894865036,
17
+ 1.6245392531200054e-10,
18
+ -1.0606995282103071e-09,
19
+ -4.56669946302668e-09,
20
+ 0.17980565130710602,
21
+ 7.046011924743652
22
+ ],
23
+ "std": [
24
+ 0.19027948379516602,
25
+ 0.3928057849407196,
26
+ 0.17927488684654236,
27
+ 0.5255976915359497,
28
+ 0.40686145424842834,
29
+ 2.5513007640838623
30
+ ]
31
+ }
32
+ },
33
+ "training": {
34
+ "data": "/Storage/Projects/mp_blendshapes/data/bbox_pose/*_img2pose.csv (CelebV-HQ extraction)",
35
+ "n_clips": 35445,
36
+ "n_train_frames": 2783134,
37
+ "n_val_frames": 154619,
38
+ "face_score_threshold": 0.8,
39
+ "pose_clip_deg": 75.0,
40
+ "epochs": 40,
41
+ "batch_size": 1024,
42
+ "lr": 0.001,
43
+ "seed": 42
44
+ },
45
+ "best_val_loss": 0.0777415705746726,
46
+ "history": [
47
+ {
48
+ "epoch": 1,
49
+ "train": 0.11315019997803054,
50
+ "val": 0.104828848552547,
51
+ "pitch_mae_deg": 3.152665853500366,
52
+ "roll_mae_deg": 2.792881488800049,
53
+ "yaw_mae_deg": 2.13679838180542
54
+ },
55
+ {
56
+ "epoch": 2,
57
+ "train": 0.1065590488611336,
58
+ "val": 0.09961274236832794,
59
+ "pitch_mae_deg": 2.9992449283599854,
60
+ "roll_mae_deg": 2.6430251598358154,
61
+ "yaw_mae_deg": 1.9946171045303345
62
+ },
63
+ {
64
+ "epoch": 3,
65
+ "train": 0.10402416926071958,
66
+ "val": 0.09787551097963985,
67
+ "pitch_mae_deg": 2.9984378814697266,
68
+ "roll_mae_deg": 2.6911206245422363,
69
+ "yaw_mae_deg": 1.8750346899032593
70
+ },
71
+ {
72
+ "epoch": 4,
73
+ "train": 0.10253555926057764,
74
+ "val": 0.09612164048379973,
75
+ "pitch_mae_deg": 3.0127367973327637,
76
+ "roll_mae_deg": 2.6305713653564453,
77
+ "yaw_mae_deg": 1.8552767038345337
78
+ },
79
+ {
80
+ "epoch": 5,
81
+ "train": 0.10148297401859183,
82
+ "val": 0.09552087193649066,
83
+ "pitch_mae_deg": 2.9490880966186523,
84
+ "roll_mae_deg": 2.6785519123077393,
85
+ "yaw_mae_deg": 1.8824330568313599
86
+ },
87
+ {
88
+ "epoch": 6,
89
+ "train": 0.10051884218458308,
90
+ "val": 0.09247205514264734,
91
+ "pitch_mae_deg": 2.8985040187835693,
92
+ "roll_mae_deg": 2.477334976196289,
93
+ "yaw_mae_deg": 1.7141964435577393
94
+ },
95
+ {
96
+ "epoch": 7,
97
+ "train": 0.0995787868469493,
98
+ "val": 0.09395237100359641,
99
+ "pitch_mae_deg": 2.931995391845703,
100
+ "roll_mae_deg": 2.6331541538238525,
101
+ "yaw_mae_deg": 1.7413336038589478
102
+ },
103
+ {
104
+ "epoch": 8,
105
+ "train": 0.09886222485949048,
106
+ "val": 0.09294345720033896,
107
+ "pitch_mae_deg": 2.970853567123413,
108
+ "roll_mae_deg": 2.5920379161834717,
109
+ "yaw_mae_deg": 1.7464535236358643
110
+ },
111
+ {
112
+ "epoch": 9,
113
+ "train": 0.09830612088659829,
114
+ "val": 0.09182092106263888,
115
+ "pitch_mae_deg": 2.8500523567199707,
116
+ "roll_mae_deg": 2.511044502258301,
117
+ "yaw_mae_deg": 1.784227728843689
118
+ },
119
+ {
120
+ "epoch": 10,
121
+ "train": 0.09737222732988414,
122
+ "val": 0.09004505537450314,
123
+ "pitch_mae_deg": 2.873867988586426,
124
+ "roll_mae_deg": 2.472165107727051,
125
+ "yaw_mae_deg": 1.7860360145568848
126
+ },
127
+ {
128
+ "epoch": 11,
129
+ "train": 0.09690498495700607,
130
+ "val": 0.08976648708707408,
131
+ "pitch_mae_deg": 2.879437208175659,
132
+ "roll_mae_deg": 2.561363697052002,
133
+ "yaw_mae_deg": 1.6688872575759888
134
+ },
135
+ {
136
+ "epoch": 12,
137
+ "train": 0.09630656271153201,
138
+ "val": 0.08980230604739566,
139
+ "pitch_mae_deg": 2.838160514831543,
140
+ "roll_mae_deg": 2.4794445037841797,
141
+ "yaw_mae_deg": 1.7088587284088135
142
+ },
143
+ {
144
+ "epoch": 13,
145
+ "train": 0.09569354373427154,
146
+ "val": 0.08851547088277967,
147
+ "pitch_mae_deg": 2.856058120727539,
148
+ "roll_mae_deg": 2.5598247051239014,
149
+ "yaw_mae_deg": 1.7351120710372925
150
+ },
151
+ {
152
+ "epoch": 14,
153
+ "train": 0.09516716494366823,
154
+ "val": 0.08757703378796577,
155
+ "pitch_mae_deg": 2.800903558731079,
156
+ "roll_mae_deg": 2.4999215602874756,
157
+ "yaw_mae_deg": 1.7200062274932861
158
+ },
159
+ {
160
+ "epoch": 15,
161
+ "train": 0.09462323989595799,
162
+ "val": 0.08703844112000968,
163
+ "pitch_mae_deg": 2.810861110687256,
164
+ "roll_mae_deg": 2.425896167755127,
165
+ "yaw_mae_deg": 1.7037086486816406
166
+ },
167
+ {
168
+ "epoch": 16,
169
+ "train": 0.09410698983524984,
170
+ "val": 0.08680682148980468,
171
+ "pitch_mae_deg": 2.833448648452759,
172
+ "roll_mae_deg": 2.535163402557373,
173
+ "yaw_mae_deg": 1.7124162912368774
174
+ },
175
+ {
176
+ "epoch": 17,
177
+ "train": 0.09365605068138805,
178
+ "val": 0.08569933728952157,
179
+ "pitch_mae_deg": 2.8009047508239746,
180
+ "roll_mae_deg": 2.5543301105499268,
181
+ "yaw_mae_deg": 1.6394764184951782
182
+ },
183
+ {
184
+ "epoch": 18,
185
+ "train": 0.09323946791999124,
186
+ "val": 0.0869463943925343,
187
+ "pitch_mae_deg": 2.83258318901062,
188
+ "roll_mae_deg": 2.469459056854248,
189
+ "yaw_mae_deg": 1.6592215299606323
190
+ },
191
+ {
192
+ "epoch": 19,
193
+ "train": 0.09272424481134804,
194
+ "val": 0.0835315509650268,
195
+ "pitch_mae_deg": 2.7636806964874268,
196
+ "roll_mae_deg": 2.4162306785583496,
197
+ "yaw_mae_deg": 1.668568730354309
198
+ },
199
+ {
200
+ "epoch": 20,
201
+ "train": 0.09233342655512934,
202
+ "val": 0.08383207366262611,
203
+ "pitch_mae_deg": 2.770354747772217,
204
+ "roll_mae_deg": 2.4920639991760254,
205
+ "yaw_mae_deg": 1.6237024068832397
206
+ },
207
+ {
208
+ "epoch": 21,
209
+ "train": 0.09185766826731216,
210
+ "val": 0.08318848182496272,
211
+ "pitch_mae_deg": 2.7563376426696777,
212
+ "roll_mae_deg": 2.4593088626861572,
213
+ "yaw_mae_deg": 1.712731122970581
214
+ },
215
+ {
216
+ "epoch": 22,
217
+ "train": 0.09151670299443013,
218
+ "val": 0.08192426515252967,
219
+ "pitch_mae_deg": 2.74179744720459,
220
+ "roll_mae_deg": 2.418275833129883,
221
+ "yaw_mae_deg": 1.71445631980896
222
+ },
223
+ {
224
+ "epoch": 23,
225
+ "train": 0.09108457101112871,
226
+ "val": 0.0820473910946595,
227
+ "pitch_mae_deg": 2.7692880630493164,
228
+ "roll_mae_deg": 2.402466058731079,
229
+ "yaw_mae_deg": 1.641359806060791
230
+ },
231
+ {
232
+ "epoch": 24,
233
+ "train": 0.0906762100339506,
234
+ "val": 0.08174176327884197,
235
+ "pitch_mae_deg": 2.733238458633423,
236
+ "roll_mae_deg": 2.4820797443389893,
237
+ "yaw_mae_deg": 1.6439942121505737
238
+ },
239
+ {
240
+ "epoch": 25,
241
+ "train": 0.09034998959712985,
242
+ "val": 0.08133541057376485,
243
+ "pitch_mae_deg": 2.7302887439727783,
244
+ "roll_mae_deg": 2.4201176166534424,
245
+ "yaw_mae_deg": 1.6617894172668457
246
+ },
247
+ {
248
+ "epoch": 26,
249
+ "train": 0.09008330495711457,
250
+ "val": 0.08046494296898968,
251
+ "pitch_mae_deg": 2.7038564682006836,
252
+ "roll_mae_deg": 2.3806567192077637,
253
+ "yaw_mae_deg": 1.6689109802246094
254
+ },
255
+ {
256
+ "epoch": 27,
257
+ "train": 0.08978113147476037,
258
+ "val": 0.07989089151746348,
259
+ "pitch_mae_deg": 2.692418336868286,
260
+ "roll_mae_deg": 2.4487438201904297,
261
+ "yaw_mae_deg": 1.6251274347305298
262
+ },
263
+ {
264
+ "epoch": 28,
265
+ "train": 0.08945507099516169,
266
+ "val": 0.07935293018817902,
267
+ "pitch_mae_deg": 2.6850106716156006,
268
+ "roll_mae_deg": 2.3853209018707275,
269
+ "yaw_mae_deg": 1.5958898067474365
270
+ },
271
+ {
272
+ "epoch": 29,
273
+ "train": 0.0891421977581348,
274
+ "val": 0.07996009172577608,
275
+ "pitch_mae_deg": 2.693944215774536,
276
+ "roll_mae_deg": 2.375354528427124,
277
+ "yaw_mae_deg": 1.6029860973358154
278
+ },
279
+ {
280
+ "epoch": 30,
281
+ "train": 0.08896089701846822,
282
+ "val": 0.0793423713429978,
283
+ "pitch_mae_deg": 2.6876747608184814,
284
+ "roll_mae_deg": 2.370105743408203,
285
+ "yaw_mae_deg": 1.6090757846832275
286
+ },
287
+ {
288
+ "epoch": 31,
289
+ "train": 0.08868927482551209,
290
+ "val": 0.0788348114216014,
291
+ "pitch_mae_deg": 2.680671453475952,
292
+ "roll_mae_deg": 2.3722896575927734,
293
+ "yaw_mae_deg": 1.5897678136825562
294
+ },
295
+ {
296
+ "epoch": 32,
297
+ "train": 0.08841876725914989,
298
+ "val": 0.07828495494629208,
299
+ "pitch_mae_deg": 2.6755311489105225,
300
+ "roll_mae_deg": 2.3592045307159424,
301
+ "yaw_mae_deg": 1.5938224792480469
302
+ },
303
+ {
304
+ "epoch": 33,
305
+ "train": 0.08829338179738142,
306
+ "val": 0.07879007970424075,
307
+ "pitch_mae_deg": 2.672231674194336,
308
+ "roll_mae_deg": 2.3470544815063477,
309
+ "yaw_mae_deg": 1.583457112312317
310
+ },
311
+ {
312
+ "epoch": 34,
313
+ "train": 0.08804849298661294,
314
+ "val": 0.07809831976498428,
315
+ "pitch_mae_deg": 2.6717796325683594,
316
+ "roll_mae_deg": 2.345898151397705,
317
+ "yaw_mae_deg": 1.5844926834106445
318
+ },
319
+ {
320
+ "epoch": 35,
321
+ "train": 0.08788964650137973,
322
+ "val": 0.07806965493057903,
323
+ "pitch_mae_deg": 2.665562629699707,
324
+ "roll_mae_deg": 2.343658924102783,
325
+ "yaw_mae_deg": 1.5944466590881348
326
+ },
327
+ {
328
+ "epoch": 36,
329
+ "train": 0.08776004950435745,
330
+ "val": 0.07801351490381517,
331
+ "pitch_mae_deg": 2.6699180603027344,
332
+ "roll_mae_deg": 2.347235918045044,
333
+ "yaw_mae_deg": 1.588186502456665
334
+ },
335
+ {
336
+ "epoch": 37,
337
+ "train": 0.08765846724136074,
338
+ "val": 0.07789983218045611,
339
+ "pitch_mae_deg": 2.6638052463531494,
340
+ "roll_mae_deg": 2.3336102962493896,
341
+ "yaw_mae_deg": 1.5877548456192017
342
+ },
343
+ {
344
+ "epoch": 38,
345
+ "train": 0.08762438727969014,
346
+ "val": 0.0777415705746726,
347
+ "pitch_mae_deg": 2.659308433532715,
348
+ "roll_mae_deg": 2.336526393890381,
349
+ "yaw_mae_deg": 1.5783231258392334
350
+ },
351
+ {
352
+ "epoch": 39,
353
+ "train": 0.08753714936622983,
354
+ "val": 0.0779279994925386,
355
+ "pitch_mae_deg": 2.662292003631592,
356
+ "roll_mae_deg": 2.334559440612793,
357
+ "yaw_mae_deg": 1.5846630334854126
358
+ },
359
+ {
360
+ "epoch": 40,
361
+ "train": 0.08748793931207821,
362
+ "val": 0.07779885426555809,
363
+ "pitch_mae_deg": 2.6598613262176514,
364
+ "roll_mae_deg": 2.335223436355591,
365
+ "yaw_mae_deg": 1.578811764717102
366
+ }
367
+ ]
368
+ }
pose_mlp_v2.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2e237215e977b334d34b3116b77cd7e83a0bae98189fb6700886b85dcde4dfe5
3
+ size 948800