biptv3 / code /pointcept_framework /pointcept /datasets /preprocessing /scannet /extract_partition.py
| import json | |
| import shutil | |
| import argparse | |
| import torch | |
| import glob | |
| import os.path | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument( | |
| "--dataset_root", | |
| required=True, | |
| help="Path to the ScanNet dataset containing scene folders", | |
| ) | |
| parser.add_argument( | |
| "--processed_root", | |
| required=True, | |
| help="Path to the processed ScanNet dataset, add partition to test data dict", | |
| ) | |
| parser.add_argument( | |
| "--segmentor_root", | |
| required=True, | |
| help="Path to Felzenswalb and Huttenlocher's Graph Based Image Segmentation binary", | |
| ) | |
| parser.add_argument( | |
| "--split", | |
| default="test", | |
| choices=["test", "val"], | |
| help="Split to process. [test / val]", | |
| ) | |
| config = parser.parse_args() | |
| if config.split == "test": | |
| raw_split = "scans_test" | |
| else: | |
| raw_split = "scans" | |
| scene_list = glob.glob(os.path.join(config.processed_root, config.split, "*.pth")) | |
| os.makedirs(os.path.join(config.processed_root, "tmp"), exist_ok=True) | |
| for scene in scene_list: | |
| scene_name = os.path.basename(scene).split(".")[0] | |
| raw_scene = os.path.join( | |
| config.dataset_root, | |
| raw_split, | |
| scene_name, | |
| f"{scene_name}_vh_clean_2.ply", | |
| ) | |
| tmp_scene = os.path.join( | |
| config.processed_root, | |
| "tmp", | |
| f"{scene_name}_vh_clean_2.ply", | |
| ) | |
| # copy original scene to tmp folder | |
| shutil.copy(raw_scene, tmp_scene) | |
| # run segmentor | |
| process = os.popen(f"{config.segmentor_root} {tmp_scene}") | |
| print(process.read()) | |
| process.close() | |
| # load partition file | |
| partition_file = tmp_scene.replace(".ply", ".0.010000.segs.json") | |
| with open(partition_file) as f: | |
| partition = json.load(f)["segIndices"] | |
| data_dict = torch.load(scene) | |
| data_dict["partition"] = partition | |
| torch.save(data_dict, scene) | |
| # clean tmp | |
| os.remove(partition_file) | |
| os.remove(tmp_scene) | |
| print(f"Adding partition information to {scene_name}") | |
| os.rmdir(os.path.join(config.processed_root, "tmp")) | |