Spaces:
Runtime error
Runtime error
| from pathlib import Path | |
| import argparse | |
| from ... import extract_features, match_features, localize_sfm, logger | |
| from .utils import get_timestamps, delete_unused_images | |
| from .utils import generate_query_lists, generate_localization_pairs | |
| from .utils import prepare_submission, evaluate_submission | |
| relocalization_files = { | |
| "training": "RelocalizationFilesTrain//relocalizationFile_recording_2020-03-24_17-36-22.txt", | |
| "validation": "RelocalizationFilesVal/relocalizationFile_recording_2020-03-03_12-03-23.txt", | |
| "test0": "RelocalizationFilesTest/relocalizationFile_recording_2020-03-24_17-45-31_*.txt", | |
| "test1": "RelocalizationFilesTest/relocalizationFile_recording_2020-04-23_19-37-00_*.txt", | |
| } | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument( | |
| "--sequence", | |
| type=str, | |
| required=True, | |
| choices=["training", "validation", "test0", "test1"], | |
| help="Sequence to be relocalized.", | |
| ) | |
| parser.add_argument( | |
| "--dataset", | |
| type=Path, | |
| default="datasets/4Seasons", | |
| help="Path to the dataset, default: %(default)s", | |
| ) | |
| parser.add_argument( | |
| "--outputs", | |
| type=Path, | |
| default="outputs/4Seasons", | |
| help="Path to the output directory, default: %(default)s", | |
| ) | |
| args = parser.parse_args() | |
| sequence = args.sequence | |
| data_dir = args.dataset | |
| ref_dir = data_dir / "reference" | |
| assert ref_dir.exists(), f"{ref_dir} does not exist" | |
| seq_dir = data_dir / sequence | |
| assert seq_dir.exists(), f"{seq_dir} does not exist" | |
| seq_images = seq_dir / "undistorted_images" | |
| reloc = ref_dir / relocalization_files[sequence] | |
| output_dir = args.outputs | |
| output_dir.mkdir(exist_ok=True, parents=True) | |
| query_list = output_dir / f"{sequence}_queries_with_intrinsics.txt" | |
| ref_pairs = output_dir / "pairs-db-dist20.txt" | |
| ref_sfm = output_dir / "sfm_superpoint+superglue" | |
| results_path = output_dir / f"localization_{sequence}_hloc+superglue.txt" | |
| submission_dir = output_dir / "submission_hloc+superglue" | |
| num_loc_pairs = 10 | |
| loc_pairs = output_dir / f"pairs-query-{sequence}-dist{num_loc_pairs}.txt" | |
| fconf = extract_features.confs["superpoint_max"] | |
| mconf = match_features.confs["superglue"] | |
| # Not all query images that are used for the evaluation | |
| # To save time in feature extraction, we delete unsused images. | |
| timestamps = get_timestamps(reloc, 1) | |
| delete_unused_images(seq_images, timestamps) | |
| # Generate a list of query images with their intrinsics. | |
| generate_query_lists(timestamps, seq_dir, query_list) | |
| # Generate the localization pairs from the given reference frames. | |
| generate_localization_pairs( | |
| sequence, reloc, num_loc_pairs, ref_pairs, loc_pairs | |
| ) | |
| # Extract, match, amd localize. | |
| ffile = extract_features.main(fconf, seq_images, output_dir) | |
| mfile = match_features.main(mconf, loc_pairs, fconf["output"], output_dir) | |
| localize_sfm.main(ref_sfm, query_list, loc_pairs, ffile, mfile, results_path) | |
| # Convert the absolute poses to relative poses with the reference frames. | |
| submission_dir.mkdir(exist_ok=True) | |
| prepare_submission(results_path, reloc, ref_dir / "poses.txt", submission_dir) | |
| # If not a test sequence: evaluation the localization accuracy | |
| if "test" not in sequence: | |
| logger.info("Evaluating the relocalization submission...") | |
| evaluate_submission(submission_dir, reloc) | |