Spaces:
Running
on
Zero
Running
on
Zero
| from pathlib import Path | |
| from pprint import pformat | |
| import argparse | |
| from ... import extract_features, match_dense, triangulation | |
| from ... import pairs_from_covisibility, pairs_from_retrieval, localize_sfm | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument( | |
| "--dataset", | |
| type=Path, | |
| default="datasets/aachen_v1.1", | |
| help="Path to the dataset, default: %(default)s", | |
| ) | |
| parser.add_argument( | |
| "--outputs", | |
| type=Path, | |
| default="outputs/aachen_v1.1", | |
| help="Path to the output directory, default: %(default)s", | |
| ) | |
| parser.add_argument( | |
| "--num_covis", | |
| type=int, | |
| default=20, | |
| help="Number of image pairs for SfM, default: %(default)s", | |
| ) | |
| parser.add_argument( | |
| "--num_loc", | |
| type=int, | |
| default=50, | |
| help="Number of image pairs for loc, default: %(default)s", | |
| ) | |
| args = parser.parse_args() | |
| # Setup the paths | |
| dataset = args.dataset | |
| images = dataset / "images/images_upright/" | |
| sift_sfm = dataset / "3D-models/aachen_v_1_1" | |
| outputs = args.outputs # where everything will be saved | |
| outputs.mkdir() | |
| reference_sfm = outputs / "sfm_loftr" # the SfM model we will build | |
| sfm_pairs = ( | |
| outputs / f"pairs-db-covis{args.num_covis}.txt" | |
| ) # top-k most covisible in SIFT model | |
| loc_pairs = ( | |
| outputs / f"pairs-query-netvlad{args.num_loc}.txt" | |
| ) # top-k retrieved by NetVLAD | |
| results = outputs / f"Aachen-v1.1_hloc_loftr_netvlad{args.num_loc}.txt" | |
| # list the standard configurations available | |
| print(f"Configs for dense feature matchers:\n{pformat(match_dense.confs)}") | |
| # pick one of the configurations for extraction and matching | |
| retrieval_conf = extract_features.confs["netvlad"] | |
| matcher_conf = match_dense.confs["loftr_aachen"] | |
| pairs_from_covisibility.main(sift_sfm, sfm_pairs, num_matched=args.num_covis) | |
| features, sfm_matches = match_dense.main( | |
| matcher_conf, sfm_pairs, images, outputs, max_kps=8192, overwrite=False | |
| ) | |
| triangulation.main( | |
| reference_sfm, sift_sfm, images, sfm_pairs, features, sfm_matches | |
| ) | |
| global_descriptors = extract_features.main(retrieval_conf, images, outputs) | |
| pairs_from_retrieval.main( | |
| global_descriptors, | |
| loc_pairs, | |
| args.num_loc, | |
| query_prefix="query", | |
| db_model=reference_sfm, | |
| ) | |
| features, loc_matches = match_dense.main( | |
| matcher_conf, | |
| loc_pairs, | |
| images, | |
| outputs, | |
| features=features, | |
| max_kps=None, | |
| matches=sfm_matches, | |
| ) | |
| localize_sfm.main( | |
| reference_sfm, | |
| dataset / "queries/*_time_queries_with_intrinsics.txt", | |
| loc_pairs, | |
| features, | |
| loc_matches, | |
| results, | |
| covisibility_clustering=False, | |
| ) # not required with loftr | |