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