Spaces:
Running
on
L40S
Running
on
L40S
| #!/usr/bin/env python3 | |
| # Copyright (C) 2024-present Naver Corporation. All rights reserved. | |
| # Licensed under CC BY-NC-SA 4.0 (non-commercial use only). | |
| # | |
| # -------------------------------------------------------- | |
| # Script to export the list of scenes for habitat (after having rendered them). | |
| # Usage: | |
| # python3 datasets_preprocess/preprocess_co3d.py --root data/habitat_processed | |
| # -------------------------------------------------------- | |
| import numpy as np | |
| import os | |
| from collections import defaultdict | |
| from tqdm import tqdm | |
| def find_all_scenes(habitat_root, n_scenes=[100000]): | |
| np.random.seed(777) | |
| try: | |
| fpath = os.path.join(habitat_root, f'Habitat_all_scenes.txt') | |
| list_subscenes = open(fpath).read().splitlines() | |
| except IOError: | |
| if input('parsing sub-folders to find scenes? (y/n) ') != 'y': | |
| return | |
| list_subscenes = [] | |
| for root, dirs, files in tqdm(os.walk(habitat_root)): | |
| for f in files: | |
| if not f.endswith('_1_depth.exr'): | |
| continue | |
| scene = os.path.join(os.path.relpath(root, habitat_root), f.replace('_1_depth.exr', '')) | |
| if hash(scene) % 1000 == 0: | |
| print('... adding', scene) | |
| list_subscenes.append(scene) | |
| with open(fpath, 'w') as f: | |
| f.write('\n'.join(list_subscenes)) | |
| print(f'>> wrote {fpath}') | |
| print(f'Loaded {len(list_subscenes)} sub-scenes') | |
| # separate scenes | |
| list_scenes = defaultdict(list) | |
| for scene in list_subscenes: | |
| scene, id = os.path.split(scene) | |
| list_scenes[scene].append(id) | |
| list_scenes = list(list_scenes.items()) | |
| print(f'from {len(list_scenes)} scenes in total') | |
| np.random.shuffle(list_scenes) | |
| train_scenes = list_scenes[len(list_scenes) // 10:] | |
| val_scenes = list_scenes[:len(list_scenes) // 10] | |
| def write_scene_list(scenes, n, fpath): | |
| sub_scenes = [os.path.join(scene, id) for scene, ids in scenes for id in ids] | |
| np.random.shuffle(sub_scenes) | |
| if len(sub_scenes) < n: | |
| return | |
| with open(fpath, 'w') as f: | |
| f.write('\n'.join(sub_scenes[:n])) | |
| print(f'>> wrote {fpath}') | |
| for n in n_scenes: | |
| write_scene_list(train_scenes, n, os.path.join(habitat_root, f'Habitat_{n}_scenes_train.txt')) | |
| write_scene_list(val_scenes, n // 10, os.path.join(habitat_root, f'Habitat_{n//10}_scenes_val.txt')) | |
| if __name__ == "__main__": | |
| import argparse | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument("--root", required=True) | |
| parser.add_argument("--n_scenes", nargs='+', default=[1_000, 10_000, 100_000, 1_000_000], type=int) | |
| args = parser.parse_args() | |
| find_all_scenes(args.root, args.n_scenes) | |