Skip to content

Commit

Permalink
Make the pipelines work with Windows (#323)
Browse files Browse the repository at this point in the history
  • Loading branch information
sarlinpe authored Jan 12, 2024
1 parent 683c1e6 commit 1c6fc64
Show file tree
Hide file tree
Showing 4 changed files with 337 additions and 307 deletions.
164 changes: 86 additions & 78 deletions hloc/pipelines/Aachen/pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,96 +6,104 @@
colmap_from_nvm,
extract_features,
localize_sfm,
logger,
match_features,
pairs_from_covisibility,
pairs_from_retrieval,
triangulation,
)

parser = argparse.ArgumentParser()
parser.add_argument(
"--dataset",
type=Path,
default="datasets/aachen",
help="Path to the dataset, default: %(default)s",
)
parser.add_argument(
"--outputs",
type=Path,
default="outputs/aachen",
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_upright/"
def run(args):
# Setup the paths
dataset = args.dataset
images = dataset / "images_upright/"

outputs = args.outputs # where everything will be saved
sift_sfm = outputs / "sfm_sift" # from which we extract the reference poses
reference_sfm = outputs / "sfm_superpoint+superglue" # 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_hloc_superpoint+superglue_netvlad{args.num_loc}.txt"
outputs = args.outputs # where everything will be saved
sift_sfm = outputs / "sfm_sift" # from which we extract the reference poses
reference_sfm = outputs / "sfm_superpoint+superglue" # 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_hloc_superpoint+superglue_netvlad{args.num_loc}.txt"

# list the standard configurations available
print(f"Configs for feature extractors:\n{pformat(extract_features.confs)}")
print(f"Configs for feature matchers:\n{pformat(match_features.confs)}")
# list the standard configurations available
logger.info("Configs for feature extractors:\n%s", pformat(extract_features.confs))
logger.info("Configs for feature matchers:\n%s", pformat(match_features.confs))

# pick one of the configurations for extraction and matching
retrieval_conf = extract_features.confs["netvlad"]
feature_conf = extract_features.confs["superpoint_aachen"]
matcher_conf = match_features.confs["superglue"]
# pick one of the configurations for extraction and matching
retrieval_conf = extract_features.confs["netvlad"]
feature_conf = extract_features.confs["superpoint_aachen"]
matcher_conf = match_features.confs["superglue"]

features = extract_features.main(feature_conf, images, outputs)
features = extract_features.main(feature_conf, images, outputs)

colmap_from_nvm.main(
dataset / "3D-models/aachen_cvpr2018_db.nvm",
dataset / "3D-models/database_intrinsics.txt",
dataset / "aachen.db",
sift_sfm,
)
pairs_from_covisibility.main(sift_sfm, sfm_pairs, num_matched=args.num_covis)
sfm_matches = match_features.main(
matcher_conf, sfm_pairs, feature_conf["output"], outputs
)
colmap_from_nvm.main(
dataset / "3D-models/aachen_cvpr2018_db.nvm",
dataset / "3D-models/database_intrinsics.txt",
dataset / "aachen.db",
sift_sfm,
)
pairs_from_covisibility.main(sift_sfm, sfm_pairs, num_matched=args.num_covis)
sfm_matches = match_features.main(
matcher_conf, sfm_pairs, feature_conf["output"], outputs
)

triangulation.main(reference_sfm, sift_sfm, images, sfm_pairs, features, sfm_matches)
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,
)
loc_matches = match_features.main(
matcher_conf, loc_pairs, feature_conf["output"], outputs
)

localize_sfm.main(
reference_sfm,
dataset / "queries/*_time_queries_with_intrinsics.txt",
loc_pairs,
features,
loc_matches,
results,
covisibility_clustering=False,
) # not required with SuperPoint+SuperGlue

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,
)
loc_matches = match_features.main(
matcher_conf, loc_pairs, feature_conf["output"], outputs
)

localize_sfm.main(
reference_sfm,
dataset / "queries/*_time_queries_with_intrinsics.txt",
loc_pairs,
features,
loc_matches,
results,
covisibility_clustering=False,
) # not required with SuperPoint+SuperGlue
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"--dataset",
type=Path,
default="datasets/aachen",
help="Path to the dataset, default: %(default)s",
)
parser.add_argument(
"--outputs",
type=Path,
default="outputs/aachen",
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()
run(args)
154 changes: 82 additions & 72 deletions hloc/pipelines/Aachen_v1_1/pipeline.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,90 +5,100 @@
from ... import (
extract_features,
localize_sfm,
logger,
match_features,
pairs_from_covisibility,
pairs_from_retrieval,
triangulation,
)

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_upright/"
sift_sfm = dataset / "3D-models/aachen_v_1_1"
def run(args):
# Setup the paths
dataset = args.dataset
images = dataset / "images_upright/"
sift_sfm = dataset / "3D-models/aachen_v_1_1"

outputs = args.outputs # where everything will be saved
reference_sfm = outputs / "sfm_superpoint+superglue" # 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_superpoint+superglue_netvlad{args.num_loc}.txt"
outputs = args.outputs # where everything will be saved
reference_sfm = outputs / "sfm_superpoint+superglue" # 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_superpoint+superglue_netvlad{args.num_loc}.txt"
)

# list the standard configurations available
print(f"Configs for feature extractors:\n{pformat(extract_features.confs)}")
print(f"Configs for feature matchers:\n{pformat(match_features.confs)}")
# list the standard configurations available
logger.info("Configs for feature extractors:\n%s", pformat(extract_features.confs))
logger.info("Configs for feature matchers:\n%s", pformat(match_features.confs))

# pick one of the configurations for extraction and matching
retrieval_conf = extract_features.confs["netvlad"]
feature_conf = extract_features.confs["superpoint_max"]
matcher_conf = match_features.confs["superglue"]
# pick one of the configurations for extraction and matching
retrieval_conf = extract_features.confs["netvlad"]
feature_conf = extract_features.confs["superpoint_max"]
matcher_conf = match_features.confs["superglue"]

features = extract_features.main(feature_conf, images, outputs)
features = extract_features.main(feature_conf, images, outputs)

pairs_from_covisibility.main(sift_sfm, sfm_pairs, num_matched=args.num_covis)
sfm_matches = match_features.main(
matcher_conf, sfm_pairs, feature_conf["output"], outputs
)
pairs_from_covisibility.main(sift_sfm, sfm_pairs, num_matched=args.num_covis)
sfm_matches = match_features.main(
matcher_conf, sfm_pairs, feature_conf["output"], outputs
)

triangulation.main(reference_sfm, sift_sfm, images, sfm_pairs, features, sfm_matches)
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,
)
loc_matches = match_features.main(
matcher_conf, loc_pairs, feature_conf["output"], outputs
)

localize_sfm.main(
reference_sfm,
dataset / "queries/*_time_queries_with_intrinsics.txt",
loc_pairs,
features,
loc_matches,
results,
covisibility_clustering=False,
) # not required with SuperPoint+SuperGlue

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,
)
loc_matches = match_features.main(
matcher_conf, loc_pairs, feature_conf["output"], outputs
)

localize_sfm.main(
reference_sfm,
dataset / "queries/*_time_queries_with_intrinsics.txt",
loc_pairs,
features,
loc_matches,
results,
covisibility_clustering=False,
) # not required with SuperPoint+SuperGlue
if __name__ == "__main__":
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()
run(args)
Loading

0 comments on commit 1c6fc64

Please sign in to comment.