Spaces:
Running
Running
# 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 | |