gen_seq.py 2.43 KB
Newer Older
Nianchen Deng's avatar
sync    
Nianchen Deng committed
1
2
3
4
5
6
7
8
import json
import sys
import os
import argparse
import numpy as np

sys.path.append(os.path.abspath(sys.path[0] + '/../../'))

Nianchen Deng's avatar
sync    
Nianchen Deng committed
9
10
11
from utils import seqs, math
from utils.types import Resolution

Nianchen Deng's avatar
sync    
Nianchen Deng committed
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

parser = argparse.ArgumentParser()
parser.add_argument('-r', '--rot-range', nargs='+', type=int)
parser.add_argument('-t', '--trans-range', nargs='+', type=float)
parser.add_argument('--fov', type=float)
parser.add_argument('--res', type=str)
parser.add_argument('--gl', action='store_true')
parser.add_argument('-s', '--seq', type=str, required=True)
parser.add_argument('-n', '--views', type=int, required=True)
parser.add_argument('-o', '--out-desc', type=str)
parser.add_argument('--ref', type=str)
parser.add_argument('dataset', type=str)
args = parser.parse_args()


data_dir = args.dataset
os.makedirs(data_dir, exist_ok=True)
Nianchen Deng's avatar
sync    
Nianchen Deng committed
29
out_desc_path = os.path.join(data_dir, args.out_desc or f"{args.seq}.json")
Nianchen Deng's avatar
sync    
Nianchen Deng committed
30
31
32
33
34
35
36
37
38
39
40

if args.ref:
    with open(os.path.join(data_dir, args.ref), 'r') as fp:
        ref_desc = json.load(fp)
else:
    if not args.trans_range or not args.rot_range or not args.fov or not args.res:
        print('-r, -t, --fov, --res options are required if --ref is not specified')
        exit(-1)
    ref_desc = None

if args.trans_range:
Nianchen Deng's avatar
sync    
Nianchen Deng committed
41
    trans_range = np.array(args.trans_range * 3 if len(args.trans_range) == 1 else args.trans_range)
Nianchen Deng's avatar
sync    
Nianchen Deng committed
42
else:
Nianchen Deng's avatar
sync    
Nianchen Deng committed
43
    trans_range = np.array(ref_desc["trs_range"])
Nianchen Deng's avatar
sync    
Nianchen Deng committed
44
if args.rot_range:
Nianchen Deng's avatar
sync    
Nianchen Deng committed
45
    rot_range = np.array(args.rot_range * 2 if len(args.rot_range) == 1 else args.rot_range)
Nianchen Deng's avatar
sync    
Nianchen Deng committed
46
else:
Nianchen Deng's avatar
sync    
Nianchen Deng committed
47
    rot_range = np.array(ref_desc["rot_range"])
Nianchen Deng's avatar
sync    
Nianchen Deng committed
48
49
filter_range = np.concatenate([trans_range, rot_range])

Nianchen Deng's avatar
sync    
Nianchen Deng committed
50
51
cam_params = { "fov": args.fov } if args.fov else ref_desc["cam"]
res = Resolution.from_str(args.res or ref_desc["res"])
Nianchen Deng's avatar
sync    
Nianchen Deng committed
52
53
54
55
56
57
58
59

if args.seq == 'helix':
    centers, rots = seqs.helix(trans_range, 4, args.views)
elif args.seq == 'scan_around':
    centers, rots = seqs.scan_around(trans_range, 1, args.views)
elif args.seq == 'look_around':
    centers, rots = seqs.look_around(trans_range, args.views)

Nianchen Deng's avatar
sync    
Nianchen Deng committed
60
rots = np.degrees(rots)
Nianchen Deng's avatar
sync    
Nianchen Deng committed
61
62
63
64
65
66
67
gl = args.gl or ref_desc and ref_desc.get('gl_coord')
if gl:
    centers[:, 2] *= -1
    rots[:, 0] *= -1

dataset_desc = {
    'gl_coord': gl,
Nianchen Deng's avatar
sync    
Nianchen Deng committed
68
69
70
71
    'res': f"{res.w}x{res.h}",
    'cam': cam_params,
    "trs_range": trans_range.tolist(),
    "rot_range": rot_range.tolist(),
Nianchen Deng's avatar
sync    
Nianchen Deng committed
72
    'samples': [args.views],
Nianchen Deng's avatar
sync    
Nianchen Deng committed
73
74
    'centers': centers.tolist(),
    'rots': rots.tolist()
Nianchen Deng's avatar
sync    
Nianchen Deng committed
75
76
77
78
}

with open(out_desc_path, 'w') as fp:
    json.dump(dataset_desc, fp, indent=4)