File size: 7,446 Bytes
e840ad2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
03c5125
e840ad2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fb2c4b3
e840ad2
fb2c4b3
c3fe535
fb2c4b3
e840ad2
 
 
 
c3fe535
 
 
 
 
 
fb2c4b3
 
 
 
 
 
e840ad2
c3fe535
 
 
e840ad2
 
 
155ed46
 
 
 
 
e840ad2
c3fe535
 
e840ad2
 
 
 
 
 
 
 
 
cd98315
 
 
 
 
 
 
 
 
 
 
 
 
e840ad2
 
cd98315
 
 
 
e840ad2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2923d84
 
 
 
 
e840ad2
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
---
pretty_name: DEGAS Pretrained Avatars
license: cc-by-nc-sa-4.0
language:
- en
tags:
- 3d
- avatar
- gaussian-splatting
- smplx
- degas
library_name: pytorch
---

# DEGAS: pretrained full-body Gaussian avatars

Trained avatars for [**DEGAS: Detailed Expressions on Full-Body Gaussian
Avatars**](https://initialneil.github.io/DEGAS) (3DV 2025), built on the
[DREAMS-AVATAR](https://huggingface.co/datasets/initialneil/DREAMS-AVATAR) captures.

- **Code:** [github.com/initialneil/DEGAS](https://github.com/initialneil/DEGAS)
- **Dataset:** [initialneil/DREAMS-AVATAR](https://huggingface.co/datasets/initialneil/DREAMS-AVATAR)
- **Paper:** [arXiv:2408.10588](https://arxiv.org/abs/2408.10588)
- **Registration:** our multiview SMPL-X tracker (the fitted result ships with the dataset)

## Available avatars

| Avatar | Trained on | Iterations | Face driven by |
|---|---|---|---|
| `P1_smplx` | P1C1 | 800k | the fitted SMPL-X expression + jaw |
| `P1_dpe` | P1C1 | 800k | a per-frame 512-d DPE code, mesh face neutralised |
| `P2_smplx` | P2C1 | 800k | SMPL-X expression + jaw *(training, uploads when it finishes)* |
| `P3_smplx` | P3C1 | 800k | SMPL-X expression + jaw *(training, uploads when it finishes)* |
| `P4_smplx` | P4C1 | 800k | SMPL-X expression + jaw *(training, uploads when it finishes)* |

`P1_smplx` and `P1_dpe` are the same subject, the same data, the same architecture and the
same schedule. They differ **only** in how the face is animated, so they are a clean
side-by-side of the two options the code supports.

Each capture's `C1` session is the training session and `C2` is held out, so evaluating an
avatar on `PxC2` is a genuine cross-session drive.

## Layout

Each avatar is stored exactly as `degas_eval.py --model_path` expects:

```
avatars/<NAME>/
  config.yaml                                    the run's own config, paths made portable
  avatar.json                                    provenance: subject, capture, face path
  point_cloud/iteration_800000/checkpoint.pt     the model (~1.3 GB)
  point_cloud/iteration_800000/point_cloud.ply   the Gaussians
  point_cloud/iteration_800000/smplx_refined.pt  the refined SMPL-X parameters
```

## Usage

```bash
git clone --recursive https://github.com/initialneil/DEGAS && cd DEGAS
# install per the repo's Setup section, and place SMPLX_NEUTRAL.npz under model/data/

pip install -U "huggingface_hub[cli]"
hf download initialneil/DEGAS --include "avatars/P1_smplx/*" --local-dir weights
hf download initialneil/DREAMS-AVATAR --repo-type dataset \
    --include "data/P1C2/*" --local-dir DREAMS-AVATAR

python degas_eval.py \
    --dat_dir "$PWD/DREAMS-AVATAR/data/P1C2" \
    --ip none \
    --model_path "$PWD/weights/avatars/P1_smplx" \
    --configs "$PWD/weights/avatars/P1_smplx/config.yaml" \
    dataset.cache_dir="$PWD/cache/P1C2_eval_cam3" \
    dataset.test.cam_select=[3] \
    "dataset.test.frm_list=np.arange(0, 293, 8).tolist()"
```

**You pass the avatar's config yourself.** `degas_eval.py` does not read the run's
`config.yaml` behind your back; it used to append it last, which let a training-time value
silently outrank the command line. Each avatar here ships a portable, fully resolved
`config.yaml` (`dat_dir: ???`, no machine-specific paths), so naming it alone is enough.
Anything required but missing is reported by name up front, not deep inside the model.

**`--model_path` must be absolute.** A relative one is resolved *inside* `--dat_dir`
(`os.path.join(dat_dir, model_path)`), because that is where a training run writes by
default, so `weights/avatars/P1_smplx` fails with a `FileNotFoundError` on a path you never
typed. Hence `$PWD`.

Three more things fail quietly rather than loudly, so they are worth stating plainly:

1. **Pass the avatar's own `config.yaml`**, or it is not evaluated under the settings it was
   trained with. Command-line `key=value` overrides still outrank every config file, which
   is why the test split is set that way above.
2. **Give every capture its own `dataset.cache_dir`.** Decoded frames are named
   `cam%02d/%08d.jpg` with no capture in the path, so a shared cache would serve P1C1's
   frame 110 for P1C2's frame 110.
3. **For `P1_dpe`, `dataset.with_face_dpe` must point at the session you are driving
   with**, not the one it was trained on. These avatars store it as the *relative* value
   `dpe`, and the loader resolves relative paths against `dat_dir`, so they follow
   `--dat_dir` on their own. A config saved by your own training run holds an absolute path
   to the training session's codes instead, and there you must override it.

For `P1_dpe`, point `--model_path` and `--configs` at that avatar instead, and add
`dataset.with_face_dpe=` for the session you are driving with.

## Training setup

800k iterations per avatar, roughly 41 h on a single RTX 3090. Trained on all frames of the
`C1` session across 29 of 32 cameras at `2x` (1024x750). **cam03**, the frontal tele face
closeup, is held out as an unseen view, and the whole `C2` session is held out as an unseen
session. The DPE codes were extracted from cam07 and cam30, both frontal tele views inside
the training split, so no evaluation view leaks into the face conditioning.

## Which face path won

On P1, with identical data, schedule and architecture, `P1_smplx` **beat** `P1_dpe`. That is
why the other released avatars use the SMPL-X path. `P1_dpe` is the paper-faithful
formulation, and the right choice when you have no trustworthy face fit, but it is not the
stronger one on this data.

Read that carefully, though: whole-image and even head-crop metrics could not separate the
two at all, differing only in the fourth decimal. A face ablation moves roughly 1% of the
pixels, so whole-image PSNR is dominated by torso and clothing. Only a mouth region defined
from the jaw-driven SMPL-X vertices distinguished them (PSNR +0.58, SSIM +0.015, LPIPS
-10%). It is one subject, so treat it as a direction, not a settled result.

## Limitations

- **`P1_dpe` evaluation is not deterministic.** The per-frame face code is a random convex
  combination of the two camera codes, redrawn on every sample, and that path runs at eval
  time as well as during training. Restrict the evaluation to one camera per frame if you
  need reproducible numbers.
- One subject per avatar. These are personalised avatars, not a generalisable model.
- Driving signal must be a registered SMPL-X sequence in the DREAMS-AVATAR convention.
- Densification is disabled during training, and there is no oral-cavity geometry, so teeth
  render as a specular smear when the mouth opens wide.
- The SMPL-X body model is **not** included here. Register at
  [smpl-x.is.tue.mpg.de](https://smpl-x.is.tue.mpg.de/) and install it yourself.

## Licence

**[CC BY-NC-SA 4.0](https://creativecommons.org/licenses/by-nc-sa/4.0/)**, non-commercial
use only, matching the DEGAS code. The DREAMS-AVATAR captures these were trained on are
[CC BY-NC 4.0](https://creativecommons.org/licenses/by-nc/4.0/). Any commercial use needs
formal permission first.

## Citation

```bibtex
@inproceedings{shao2025degas,
  title = {{DEGAS: Detailed Expressions on Full-Body Gaussian Avatars}},
  author = {Zhijing Shao and Duotun Wang and Qing-Yao Tian and Yao-Dong Yang and Hengyu Meng and Zeyu Cai and Bo Dong and Yu Zhang and Kang Zhang and Zeyu Wang},
  booktitle = {Proceedings of the International Conference on 3D Vision (3DV)},
  year = {2025}
}
```