agerhund commited on
Commit
a03ad18
·
verified ·
1 Parent(s): d8cf81c

Delete horizonnet/misc/zind_prepare_dataset.py

Browse files
horizonnet/misc/zind_prepare_dataset.py DELETED
@@ -1,106 +0,0 @@
1
- import os
2
- import json
3
- import multiprocessing
4
- from tqdm import tqdm
5
- import numpy as np
6
- from PIL import Image
7
- import functools
8
-
9
-
10
- def label_iterator(label):
11
- for floor_id, floor_data in label['merger'].items():
12
- for complete_room_id, complete_room_data in floor_data.items():
13
- for partial_room_id, partial_room_data in complete_room_data.items():
14
- for pano_id, pano_data in partial_room_data.items():
15
- yield floor_id, partial_room_id, pano_id, pano_data
16
-
17
-
18
- def show_statistic(root, scene_id_lst):
19
- sta = []
20
- for scene_id in scene_id_lst:
21
- label = json.load(open(os.path.join(root, scene_id, 'zind_data.json')))
22
- for floor_id, partial_room_id, pano_id, pano_data in label_iterator(label):
23
- sta.append([pano_data['is_primary'], pano_data['is_inside'], pano_data.get('is_ceiling_flat', False)])
24
- sta = np.array(sta)
25
- is_primary = sta[:,0].astype(bool)
26
- is_inside = sta[:,1].astype(bool)
27
- is_ceiling_flat = sta[:,2].astype(bool)
28
- print(f'is_primary : {is_primary.sum()} ({is_primary.mean()*100:.1f}%)')
29
- print(f'is_inside : {is_inside.sum()} ({is_inside.mean()*100:.1f}%)')
30
- print(f'is_ceiling_flat : {is_ceiling_flat.sum()} ({is_ceiling_flat.mean()*100:.1f}%)')
31
- print(f'is_inside given that is_primary : {is_inside[is_primary].sum()} ({is_inside[is_primary].mean()*100:.1f}%)')
32
- print(f'is_ceiling_flat given that is_primary : {is_ceiling_flat[is_primary].sum()} ({is_ceiling_flat[is_primary].mean()*100:.1f}%)')
33
-
34
-
35
- def run(scene_id, split, args):
36
- label = json.load(open(os.path.join(args.indir, scene_id, 'zind_data.json')))
37
- for floor_id, partial_room_id, pano_id, pano_data in label_iterator(label):
38
- if args.geometry not in pano_data:
39
- continue
40
- if args.is_primary != -1:
41
- if (args.is_primary == 0 and pano_data['is_primary']) or\
42
- (args.is_primary == 1 and not pano_data['is_primary']):
43
- continue
44
- if args.is_inside != -1:
45
- if (args.is_inside == 0 and pano_data['is_inside']) or\
46
- (args.is_inside == 1 and not pano_data['is_inside']):
47
- continue
48
- if args.is_ceiling_flat != -1:
49
- if (args.is_ceiling_flat == 0 and pano_data.get('is_ceiling_flat', False)) or\
50
- (args.is_ceiling_flat == 1 and not pano_data.get('is_ceiling_flat', False)):
51
- continue
52
- key = f'{floor_id}_{partial_room_id}_{pano_id}'
53
- img_path = os.path.join(args.indir, scene_id, 'panos', f'{key}.jpg')
54
- assert os.path.isfile(img_path), f'Image not found {img_path}'
55
- floor_z = -pano_data['camera_height']
56
- ceiling_z = pano_data['ceiling_height'] - pano_data['camera_height']
57
- vertices = np.array(pano_data[args.geometry]['vertices'])
58
- theta = np.arctan2(-vertices[:,0], vertices[:,1])
59
- ceiling_phi = np.arctan2(ceiling_z, np.sqrt((vertices**2).sum(1)))
60
- floor_phi = np.arctan2(floor_z, np.sqrt((vertices**2).sum(1)))
61
- coor_x = (theta + np.pi) / (2.0*np.pi) * (args.width - 1)
62
- coor_y0 = (1 - (ceiling_phi + np.pi/2.0)/np.pi) * (args.width/2 - 1)
63
- coor_y1 = (1 - (floor_phi + np.pi/2.0)/np.pi) * (args.width/2 - 1)
64
- img = Image.open(img_path).resize((args.width, args.width//2), Image.LANCZOS)
65
- img.save(os.path.join(args.outdir, split, 'img', f'{scene_id}_{key}.jpg'), quality=95, optimize=True)
66
- with open(os.path.join(args.outdir, split, 'label_cor', f'{scene_id}_{key}.txt'), 'w') as f:
67
- for i in range(len(coor_x)):
68
- f.write(f'{coor_x[i]:.1f} {coor_y0[i]:.1f}\n')
69
- f.write(f'{coor_x[i]:.1f} {coor_y1[i]:.1f}\n')
70
-
71
-
72
- if __name__ == '__main__':
73
- import argparse
74
- parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
75
- parser.add_argument('--partition', default='zind_partition.json')
76
- parser.add_argument('--indir', default='data/')
77
- parser.add_argument('--outdir', default='zind_horizonnet/')
78
- parser.add_argument('--width', default=1024, type=int)
79
- parser.add_argument('--geometry', default='layout_visible')
80
- parser.add_argument('--is_primary', default=1, choices=[-1,0,1], type=int,
81
- help='-1 dont care / 0 false only / 1 true only')
82
- parser.add_argument('--is_inside', default=1, choices=[-1,0,1], type=int,
83
- help='-1 dont care / 0 false only / 1 true only')
84
- parser.add_argument('--is_ceiling_flat', default=1, choices=[-1,0,1], type=int,
85
- help='-1 dont care / 0 false only / 1 true only')
86
- parser.add_argument('--num_workers', default=10, type=int)
87
- args = parser.parse_args()
88
-
89
- assert os.path.isfile(args.partition), f'Partition not found: {args.partition}'
90
- assert os.path.exists(args.indir), f'Dir not found: {args.indir}'
91
-
92
- partition = json.load(open(args.partition))
93
-
94
- for split, scene_id_lst in partition.items():
95
- os.makedirs(os.path.join(args.outdir, split, 'img'), exist_ok=True)
96
- os.makedirs(os.path.join(args.outdir, split, 'label_cor'), exist_ok=True)
97
- print(f'Processing split: {split}')
98
- #show_statistic(args.indir, scene_id_lst)
99
- if args.num_workers > 1:
100
- run_partial = functools.partial(run, split=split, args=args)
101
- with multiprocessing.Pool(args.num_workers) as pool:
102
- list(tqdm(pool.imap(run_partial, scene_id_lst)))
103
- else:
104
- for scene_id in tqdm(scene_id_lst):
105
- run(split, scene_id, args)
106
-