Spaces:
Runtime error
Runtime error
| import argparse | |
| import json | |
| import os | |
| import sys | |
| from stru3d_utils import generate_coco_dict, generate_density, normalize_annotations, parse_floor_plan_polys | |
| from tqdm import tqdm | |
| sys.path.append("../.") | |
| from common_utils import export_density, read_scene_pc | |
| ### Note: Some scenes have missing/wrong annotations. These are the indices that you should additionally exclude | |
| ### to be consistent with MonteFloor and HEAT: | |
| invalid_scenes_ids = [ | |
| 76, | |
| 183, | |
| 335, | |
| 491, | |
| 663, | |
| 681, | |
| 703, | |
| 728, | |
| 865, | |
| 936, | |
| 985, | |
| 986, | |
| 1009, | |
| 1104, | |
| 1155, | |
| 1221, | |
| 1282, | |
| 1365, | |
| 1378, | |
| 1635, | |
| 1745, | |
| 1772, | |
| 1774, | |
| 1816, | |
| 1866, | |
| 2037, | |
| 2076, | |
| 2274, | |
| 2334, | |
| 2357, | |
| 2580, | |
| 2665, | |
| 2706, | |
| 2713, | |
| 2771, | |
| 2868, | |
| 3156, | |
| 3192, | |
| 3198, | |
| 3261, | |
| 3271, | |
| 3276, | |
| 3296, | |
| 3342, | |
| 3387, | |
| 3398, | |
| 3466, | |
| 3496, | |
| ] | |
| type2id = { | |
| "living room": 0, | |
| "kitchen": 1, | |
| "bedroom": 2, | |
| "bathroom": 3, | |
| "balcony": 4, | |
| "corridor": 5, | |
| "dining room": 6, | |
| "study": 7, | |
| "studio": 8, | |
| "store room": 9, | |
| "garden": 10, | |
| "laundry room": 11, | |
| "office": 12, | |
| "basement": 13, | |
| "garage": 14, | |
| "undefined": 15, | |
| "door": 16, | |
| "window": 17, | |
| } | |
| def config(): | |
| a = argparse.ArgumentParser(description="Generate coco format data for Structured3D") | |
| a.add_argument( | |
| "--data_root", default="Structured3D_panorama", type=str, help="path to raw Structured3D_panorama folder" | |
| ) | |
| a.add_argument("--output", default="coco_stru3d", type=str, help="path to output folder") | |
| args = a.parse_args() | |
| return args | |
| def main(args): | |
| data_root = args.data_root | |
| data_parts = os.listdir(data_root) | |
| ### prepare | |
| outFolder = args.output | |
| if not os.path.exists(outFolder): | |
| os.mkdir(outFolder) | |
| annotation_outFolder = os.path.join(outFolder, "annotations") | |
| if not os.path.exists(annotation_outFolder): | |
| os.mkdir(annotation_outFolder) | |
| train_img_folder = os.path.join(outFolder, "train") | |
| val_img_folder = os.path.join(outFolder, "val") | |
| test_img_folder = os.path.join(outFolder, "test") | |
| for img_folder in [train_img_folder, val_img_folder, test_img_folder]: | |
| if not os.path.exists(img_folder): | |
| os.mkdir(img_folder) | |
| coco_train_json_path = os.path.join(annotation_outFolder, "train.json") | |
| coco_val_json_path = os.path.join(annotation_outFolder, "val.json") | |
| coco_test_json_path = os.path.join(annotation_outFolder, "test.json") | |
| coco_train_dict = {"images": [], "annotations": [], "categories": []} | |
| coco_val_dict = {"images": [], "annotations": [], "categories": []} | |
| coco_test_dict = {"images": [], "annotations": [], "categories": []} | |
| for key, value in type2id.items(): | |
| type_dict = {"supercategory": "room", "id": value, "name": key} | |
| coco_train_dict["categories"].append(type_dict) | |
| coco_val_dict["categories"].append(type_dict) | |
| coco_test_dict["categories"].append(type_dict) | |
| ### begin processing | |
| instance_id = 0 | |
| for part in tqdm(data_parts): | |
| scenes = os.listdir(os.path.join(data_root, part, "Structured3D")) | |
| for scene in tqdm(scenes): | |
| scene_path = os.path.join(data_root, part, "Structured3D", scene) | |
| scene_id = scene.split("_")[-1] | |
| if int(scene_id) in invalid_scenes_ids: | |
| print("skip {}".format(scene)) | |
| continue | |
| # load pre-generated point cloud | |
| ply_path = os.path.join(scene_path, "point_cloud.ply") | |
| points = read_scene_pc(ply_path) | |
| xyz = points[:, :3] | |
| ### project point cloud to density map | |
| density, normalization_dict = generate_density(xyz, width=256, height=256) | |
| ### rescale raw annotations | |
| normalized_annos = normalize_annotations(scene_path, normalization_dict) | |
| ### prepare coco dict | |
| img_id = int(scene_id) | |
| img_dict = {} | |
| img_dict["file_name"] = scene_id + ".png" | |
| img_dict["id"] = img_id | |
| img_dict["width"] = 256 | |
| img_dict["height"] = 256 | |
| ### parse annotations | |
| polys = parse_floor_plan_polys(normalized_annos) | |
| polygons_list = generate_coco_dict(normalized_annos, polys, instance_id, img_id, ignore_types=["outwall"]) | |
| instance_id += len(polygons_list) | |
| ### train | |
| if int(scene_id) < 3000: | |
| coco_train_dict["images"].append(img_dict) | |
| coco_train_dict["annotations"] += polygons_list | |
| export_density(density, train_img_folder, scene_id) | |
| ### val | |
| elif int(scene_id) >= 3000 and int(scene_id) < 3250: | |
| coco_val_dict["images"].append(img_dict) | |
| coco_val_dict["annotations"] += polygons_list | |
| export_density(density, val_img_folder, scene_id) | |
| ### test | |
| else: | |
| coco_test_dict["images"].append(img_dict) | |
| coco_test_dict["annotations"] += polygons_list | |
| export_density(density, test_img_folder, scene_id) | |
| print(scene_id) | |
| with open(coco_train_json_path, "w") as f: | |
| json.dump(coco_train_dict, f) | |
| with open(coco_val_json_path, "w") as f: | |
| json.dump(coco_val_dict, f) | |
| with open(coco_test_json_path, "w") as f: | |
| json.dump(coco_test_dict, f) | |
| if __name__ == "__main__": | |
| main(config()) | |