|
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"] |
|
|
|
|
|
|
|
timestamps = get_timestamps(reloc, 1) |
|
delete_unused_images(seq_images, timestamps) |
|
|
|
|
|
generate_query_lists(timestamps, seq_dir, query_list) |
|
|
|
|
|
generate_localization_pairs(sequence, reloc, num_loc_pairs, ref_pairs, loc_pairs) |
|
|
|
|
|
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) |
|
|
|
|
|
submission_dir.mkdir(exist_ok=True) |
|
prepare_submission(results_path, reloc, ref_dir / "poses.txt", submission_dir) |
|
|
|
|
|
if "test" not in sequence: |
|
logger.info("Evaluating the relocalization submission...") |
|
evaluate_submission(submission_dir, reloc) |
|
|