File size: 2,014 Bytes
8e5456b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/usr/bin/env python3
"""Dump ground-truth poses in the shared 50-joint format, for FGD/MAEJ scoring.

`eval_fgd_maej.py` needs a `--gt-npz` in the same format as the model dumps. It exists
for Multi-VSL (`dumps_fgd_t2m/gt.npz`) but not for the 3-view TriVis pack, and FGD is
biased by sample size, so the GT must cover exactly the clips the conditions cover --
hence `--like`, which copies the clip list from an existing dump.

KEEP_50 = upper[0:8] + upper[82:124], matching 0.NSLP-G/.../modules/data/mvsl.py.
"""
import argparse
import os

import numpy as np

from dataset import dataset_vsl

KEEP_50 = list(range(8)) + list(range(82, 124))


def main():
    ap = argparse.ArgumentParser()
    ap.add_argument('--data-dir', default='./dataset/VSL3_upper')
    ap.add_argument('--split', default='test')
    ap.add_argument('--like', default=None,
                    help='npz whose `names` define the clip set (keeps FGD comparable)')
    ap.add_argument('--out', required=True)
    args = ap.parse_args()

    st = dataset_vsl.VSLStore(args.data_dir, args.split)
    NK = st.layout.n_kpts
    assert NK == 124, f'expects the 124-kpt upper layout, got {NK}'

    want = None
    if args.like:
        z = np.load(args.like, allow_pickle=True)
        want = [str(n) for n in z['names']]
        print(f'{len(want)} clip names taken from {args.like}')

    by_name = {c['name']: k for k, c in enumerate(st.index)}
    names = want if want is not None else [c['name'] for c in st.index]

    poses, kept = [], []
    for nm in names:
        if nm not in by_name:
            continue
        motion, _ = st.get(by_name[nm])
        p = (motion * st.std + st.mean).reshape(-1, NK, 2)[:, KEEP_50]
        poses.append(p.astype(np.float32))
        kept.append(nm)

    os.makedirs(os.path.dirname(args.out) or '.', exist_ok=True)
    np.savez(args.out, poses=np.array(poses, dtype=object), names=np.array(kept))
    print(f'wrote {args.out}: {len(kept)} clips, 50 joints')


if __name__ == '__main__':
    main()