Views
No views yet
| 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 | the fitted SMPL-X expression + jaw |
P3_smplx | P3C1 | 800k | the fitted SMPL-X expression + jaw |
P4_smplx | P4C1 | 800k | the fitted SMPL-X expression + jaw |
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.C1 session is the training session and C2 is held out, so evaluating an
avatar on PxC2 is a genuine cross-session drive.P5 or P6 avatar and there will not be one: P5C1 does not exist in the
source captures and P6C1 was excluded, so those two subjects have nothing to train on.
Their C2 sessions ship in the dataset purely as cross-reenactment drivers.| Avatar | unseen view (own C1, cam03) | unseen session (C2, cam03) |
|---|---|---|
| PSNR / SSIM / LPIPS | PSNR / SSIM / LPIPS | |
P1_smplx | 25.69 / 0.927 / 0.061 | 21.28 / 0.885 / 0.097 |
P1_dpe | 25.60 / 0.926 / 0.062 | 21.06 / 0.884 / 0.101 |
P2_smplx | 27.996 / 0.924 / 0.071 | 24.19 / 0.891 / 0.115 |
P3_smplx | 23.16 / 0.770 / 0.111 | 21.18 / 0.767 / 0.173 |
P4_smplx | 28.51 / 0.959 / 0.066 | 24.01 / 0.943 / 0.094 |
P1_smplx vs
P1_dpe, which share a subject, a schedule and an architecture, and even there the
whole-image numbers barely separate them: a face is roughly 1% of the pixels, so these
figures are dominated by torso and clothing. The difference between the two face paths only
shows up in a mouth region derived from the SMPL-X jaw weights, where P1_smplx leads by
about 0.58 dB.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 parameters1git clone --recursive https://github.com/initialneil/DEGAS && cd DEGAS
2# install per the repo's Setup section, and place SMPLX_NEUTRAL.npz under model/data/
3
4pip install -U "huggingface_hub[cli]"
5hf download initialneil/DEGAS --include "avatars/P1_smplx/*" --local-dir weights
6hf download initialneil/DREAMS-AVATAR --repo-type dataset \
7 --include "data/P1C2/*" --local-dir DREAMS-AVATAR
8
9python degas_eval.py \
10 --dat_dir "$PWD/DREAMS-AVATAR/data/P1C2" \
11 --ip none \
12 --model_path "$PWD/weights/avatars/P1_smplx" \
13 --configs "$PWD/weights/avatars/P1_smplx/config.yaml" \
14 dataset.cache_dir="$PWD/cache/P1C2_eval_cam3" \
15 dataset.test.cam_select=[3] \
16 "dataset.test.frm_list=np.arange(0, 293, 8).tolist()"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.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.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.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.P1_dpe, point --model_path and --configs at that avatar instead, and add
dataset.with_face_dpe= for the session you are driving with.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.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.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.1@inproceedings{shao2025degas,
2 title = {{DEGAS: Detailed Expressions on Full-Body Gaussian Avatars}},
3 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},
4 booktitle = {Proceedings of the International Conference on 3D Vision (3DV)},
5 year = {2025}
6}