File size: 2,575 Bytes
9223079
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e15a186
 
 
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
94
95
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