File size: 2,569 Bytes
9223079 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
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
|