import argparse import collections.abc as collections from pathlib import Path from typing import List, Optional, Union from . import logger from .utils.io import list_h5_names from .utils.parsers import parse_image_lists def main( output: Path, image_list: Optional[Union[Path, List[str]]] = None, features: Optional[Path] = None, ref_list: Optional[Union[Path, List[str]]] = None, ref_features: Optional[Path] = None, ): if image_list is not None: if isinstance(image_list, (str, Path)): names_q = parse_image_lists(image_list) elif isinstance(image_list, collections.Iterable): names_q = list(image_list) else: raise ValueError(f"Unknown type for image list: {image_list}") elif features is not None: names_q = list_h5_names(features) else: raise ValueError("Provide either a list of images or a feature file.") self_matching = False if ref_list is not None: if isinstance(ref_list, (str, Path)): names_ref = parse_image_lists(ref_list) elif isinstance(image_list, collections.Iterable): names_ref = list(ref_list) else: raise ValueError(f"Unknown type for reference image list: {ref_list}") elif ref_features is not None: names_ref = list_h5_names(ref_features) else: self_matching = True names_ref = names_q pairs = [] for i, n1 in enumerate(names_q): for j, n2 in enumerate(names_ref): if self_matching and j <= i: continue pairs.append((n1, n2)) logger.info(f"Found {len(pairs)} pairs.") with open(output, "w") as f: f.write("\n".join(" ".join([i, j]) for i, j in pairs)) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--output", required=True, type=Path) parser.add_argument("--image_list", type=Path) parser.add_argument("--features", type=Path) parser.add_argument("--ref_list", type=Path) parser.add_argument("--ref_features", type=Path) args = parser.parse_args() main(**args.__dict__)