Spaces:
Runtime error
Runtime error
| # Copyright (C) 2022-present Naver Corporation. All rights reserved. | |
| # Licensed under CC BY-NC-SA 4.0 (non-commercial use only). | |
| """ | |
| Paths to Habitat-Sim scenes | |
| """ | |
| import os | |
| import json | |
| import collections | |
| from tqdm import tqdm | |
| # Hardcoded path to the different scene datasets | |
| SCENES_DATASET = { | |
| "hm3d": "./data/habitat-sim-data/scene_datasets/hm3d/", | |
| "gibson": "./data/habitat-sim-data/scene_datasets/gibson/", | |
| "habitat-test-scenes": "./data/habitat-sim/scene_datasets/habitat-test-scenes/", | |
| "replica_cad_baked_lighting": "./data/habitat-sim/scene_datasets/replica_cad_baked_lighting/", | |
| "replica_cad": "./data/habitat-sim/scene_datasets/replica_cad/", | |
| "replica": "./data/habitat-sim/scene_datasets/ReplicaDataset/", | |
| "scannet": "./data/habitat-sim/scene_datasets/scannet/" | |
| } | |
| SceneData = collections.namedtuple("SceneData", ["scene_dataset_config_file", "scene", "navmesh", "output_dir"]) | |
| def list_replicacad_scenes(base_output_dir, base_path=SCENES_DATASET["replica_cad"]): | |
| scene_dataset_config_file = os.path.join(base_path, "replicaCAD.scene_dataset_config.json") | |
| scenes = [f"apt_{i}" for i in range(6)] + ["empty_stage"] | |
| navmeshes = [f"navmeshes/apt_{i}_static_furniture.navmesh" for i in range(6)] + ["empty_stage.navmesh"] | |
| scenes_data = [] | |
| for idx in range(len(scenes)): | |
| output_dir = os.path.join(base_output_dir, "ReplicaCAD", scenes[idx]) | |
| # Add scene | |
| data = SceneData(scene_dataset_config_file=scene_dataset_config_file, | |
| scene = scenes[idx] + ".scene_instance.json", | |
| navmesh = os.path.join(base_path, navmeshes[idx]), | |
| output_dir = output_dir) | |
| scenes_data.append(data) | |
| return scenes_data | |
| def list_replica_cad_baked_lighting_scenes(base_output_dir, base_path=SCENES_DATASET["replica_cad_baked_lighting"]): | |
| scene_dataset_config_file = os.path.join(base_path, "replicaCAD_baked.scene_dataset_config.json") | |
| scenes = sum([[f"Baked_sc{i}_staging_{j:02}" for i in range(5)] for j in range(21)], []) | |
| navmeshes = ""#[f"navmeshes/apt_{i}_static_furniture.navmesh" for i in range(6)] + ["empty_stage.navmesh"] | |
| scenes_data = [] | |
| for idx in range(len(scenes)): | |
| output_dir = os.path.join(base_output_dir, "replica_cad_baked_lighting", scenes[idx]) | |
| data = SceneData(scene_dataset_config_file=scene_dataset_config_file, | |
| scene = scenes[idx], | |
| navmesh = "", | |
| output_dir = output_dir) | |
| scenes_data.append(data) | |
| return scenes_data | |
| def list_replica_scenes(base_output_dir, base_path): | |
| scenes_data = [] | |
| for scene_id in os.listdir(base_path): | |
| scene = os.path.join(base_path, scene_id, "mesh.ply") | |
| navmesh = os.path.join(base_path, scene_id, "habitat/mesh_preseg_semantic.navmesh") # Not sure if I should use it | |
| scene_dataset_config_file = "" | |
| output_dir = os.path.join(base_output_dir, scene_id) | |
| # Add scene only if it does not exist already, or if exist_ok | |
| data = SceneData(scene_dataset_config_file = scene_dataset_config_file, | |
| scene = scene, | |
| navmesh = navmesh, | |
| output_dir = output_dir) | |
| scenes_data.append(data) | |
| return scenes_data | |
| def list_scenes(base_output_dir, base_path): | |
| """ | |
| Generic method iterating through a base_path folder to find scenes. | |
| """ | |
| scenes_data = [] | |
| for root, dirs, files in os.walk(base_path, followlinks=True): | |
| folder_scenes_data = [] | |
| for file in files: | |
| name, ext = os.path.splitext(file) | |
| if ext == ".glb": | |
| scene = os.path.join(root, name + ".glb") | |
| navmesh = os.path.join(root, name + ".navmesh") | |
| if not os.path.exists(navmesh): | |
| navmesh = "" | |
| relpath = os.path.relpath(root, base_path) | |
| output_dir = os.path.abspath(os.path.join(base_output_dir, relpath, name)) | |
| data = SceneData(scene_dataset_config_file="", | |
| scene = scene, | |
| navmesh = navmesh, | |
| output_dir = output_dir) | |
| folder_scenes_data.append(data) | |
| # Specific check for HM3D: | |
| # When two meshesxxxx.basis.glb and xxxx.glb are present, use the 'basis' version. | |
| basis_scenes = [data.scene[:-len(".basis.glb")] for data in folder_scenes_data if data.scene.endswith(".basis.glb")] | |
| if len(basis_scenes) != 0: | |
| folder_scenes_data = [data for data in folder_scenes_data if not (data.scene[:-len(".glb")] in basis_scenes)] | |
| scenes_data.extend(folder_scenes_data) | |
| return scenes_data | |
| def list_scenes_available(base_output_dir, scenes_dataset_paths=SCENES_DATASET): | |
| scenes_data = [] | |
| # HM3D | |
| for split in ("minival", "train", "val", "examples"): | |
| scenes_data += list_scenes(base_output_dir=os.path.join(base_output_dir, f"hm3d/{split}/"), | |
| base_path=f"{scenes_dataset_paths['hm3d']}/{split}") | |
| # Gibson | |
| scenes_data += list_scenes(base_output_dir=os.path.join(base_output_dir, "gibson"), | |
| base_path=scenes_dataset_paths["gibson"]) | |
| # Habitat test scenes (just a few) | |
| scenes_data += list_scenes(base_output_dir=os.path.join(base_output_dir, "habitat-test-scenes"), | |
| base_path=scenes_dataset_paths["habitat-test-scenes"]) | |
| # ReplicaCAD (baked lightning) | |
| scenes_data += list_replica_cad_baked_lighting_scenes(base_output_dir=base_output_dir) | |
| # ScanNet | |
| scenes_data += list_scenes(base_output_dir=os.path.join(base_output_dir, "scannet"), | |
| base_path=scenes_dataset_paths["scannet"]) | |
| # Replica | |
| list_replica_scenes(base_output_dir=os.path.join(base_output_dir, "replica"), | |
| base_path=scenes_dataset_paths["replica"]) | |
| return scenes_data | |