Spaces:
Runtime error
Runtime error
| import argparse | |
| import logging | |
| from pathlib import Path | |
| import torch | |
| from omegaconf import OmegaConf | |
| from ..datasets import get_dataset | |
| from ..geometry.depth import sample_depth | |
| from ..models import get_model | |
| from ..settings import DATA_PATH | |
| from ..utils.export_predictions import export_predictions | |
| resize = 1024 | |
| n_kpts = 2048 | |
| configs = { | |
| "sp": { | |
| "name": f"r{resize}_SP-k{n_kpts}-nms3", | |
| "keys": ["keypoints", "descriptors", "keypoint_scores"], | |
| "gray": True, | |
| "conf": { | |
| "name": "gluefactory_nonfree.superpoint", | |
| "nms_radius": 3, | |
| "max_num_keypoints": n_kpts, | |
| "detection_threshold": 0.000, | |
| }, | |
| }, | |
| "sp_open": { | |
| "name": f"r{resize}_SP-open-k{n_kpts}-nms3", | |
| "keys": ["keypoints", "descriptors", "keypoint_scores"], | |
| "gray": True, | |
| "conf": { | |
| "name": "extractors.superpoint_open", | |
| "nms_radius": 3, | |
| "max_num_keypoints": n_kpts, | |
| "detection_threshold": 0.000, | |
| }, | |
| }, | |
| "cv2-sift": { | |
| "name": f"r{resize}_opencv-SIFT-k{n_kpts}", | |
| "keys": ["keypoints", "descriptors", "keypoint_scores", "oris", "scales"], | |
| "gray": True, | |
| "conf": { | |
| "name": "extractors.sift", | |
| "max_num_keypoints": 4096, | |
| "backend": "opencv", | |
| }, | |
| }, | |
| "pycolmap-sift": { | |
| "name": f"r{resize}_pycolmap-SIFT-k{n_kpts}", | |
| "keys": ["keypoints", "descriptors", "keypoint_scores", "oris", "scales"], | |
| "gray": True, | |
| "conf": { | |
| "name": "extractors.sift", | |
| "max_num_keypoints": n_kpts, | |
| "backend": "pycolmap", | |
| }, | |
| }, | |
| "pycolmap-sift-gpu": { | |
| "name": f"r{resize}_pycolmap_SIFTGPU-nms3-fixed-k{n_kpts}", | |
| "keys": ["keypoints", "descriptors", "keypoint_scores", "oris", "scales"], | |
| "gray": True, | |
| "conf": { | |
| "name": "extractors.sift", | |
| "max_num_keypoints": n_kpts, | |
| "backend": "pycolmap_cuda", | |
| "nms_radius": 3, | |
| }, | |
| }, | |
| "keynet-affnet-hardnet": { | |
| "name": f"r{resize}_KeyNetAffNetHardNet-k{n_kpts}", | |
| "keys": ["keypoints", "descriptors", "keypoint_scores", "oris", "scales"], | |
| "gray": True, | |
| "conf": { | |
| "name": "extractors.keynet_affnet_hardnet", | |
| "max_num_keypoints": n_kpts, | |
| }, | |
| }, | |
| "disk": { | |
| "name": f"r{resize}_DISK-k{n_kpts}-nms5", | |
| "keys": ["keypoints", "descriptors", "keypoint_scores"], | |
| "gray": False, | |
| "conf": { | |
| "name": "extractors.disk_kornia", | |
| "max_num_keypoints": n_kpts, | |
| }, | |
| }, | |
| "aliked": { | |
| "name": f"r{resize}_ALIKED-k{n_kpts}-n16", | |
| "keys": ["keypoints", "descriptors", "keypoint_scores"], | |
| "gray": False, | |
| "conf": { | |
| "name": "extractors.aliked", | |
| "max_num_keypoints": n_kpts, | |
| }, | |
| }, | |
| } | |
| def get_kp_depth(pred, data): | |
| d, valid = sample_depth(pred["keypoints"], data["depth"]) | |
| return {"depth_keypoints": d, "valid_depth_keypoints": valid} | |
| def run_export(feature_file, scene, args): | |
| conf = { | |
| "data": { | |
| "name": "megadepth", | |
| "views": 1, | |
| "grayscale": configs[args.method]["gray"], | |
| "preprocessing": { | |
| "resize": resize, | |
| "side": "long", | |
| }, | |
| "batch_size": 1, | |
| "num_workers": args.num_workers, | |
| "read_depth": True, | |
| "train_split": [scene], | |
| "train_num_per_scene": None, | |
| }, | |
| "split": "train", | |
| "model": configs[args.method]["conf"], | |
| } | |
| conf = OmegaConf.create(conf) | |
| keys = configs[args.method]["keys"] | |
| dataset = get_dataset(conf.data.name)(conf.data) | |
| loader = dataset.get_data_loader(conf.split or "test") | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| model = get_model(conf.model.name)(conf.model).eval().to(device) | |
| if args.export_sparse_depth: | |
| callback_fn = get_kp_depth # use this to store the depth of each keypoint | |
| keys = keys + ["depth_keypoints", "valid_depth_keypoints"] | |
| else: | |
| callback_fn = None | |
| export_predictions( | |
| loader, model, feature_file, as_half=True, keys=keys, callback_fn=callback_fn | |
| ) | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument("--export_prefix", type=str, default="") | |
| parser.add_argument("--method", type=str, default="sp") | |
| parser.add_argument("--scenes", type=str, default=None) | |
| parser.add_argument("--num_workers", type=int, default=0) | |
| parser.add_argument("--export_sparse_depth", action="store_true") | |
| args = parser.parse_args() | |
| export_name = configs[args.method]["name"] | |
| data_root = Path(DATA_PATH, "megadepth/Undistorted_SfM") | |
| export_root = Path(DATA_PATH, "exports", "megadepth-undist-depth-" + export_name) | |
| export_root.mkdir(parents=True, exist_ok=True) | |
| if args.scenes is None: | |
| scenes = [p.name for p in data_root.iterdir() if p.is_dir()] | |
| else: | |
| with open(DATA_PATH / "megadepth" / args.scenes, "r") as f: | |
| scenes = f.read().split() | |
| for i, scene in enumerate(scenes): | |
| print(f"{i} / {len(scenes)}", scene) | |
| feature_file = export_root / (scene + ".h5") | |
| if feature_file.exists() and False: | |
| continue | |
| if not (data_root / scene / "images").exists(): | |
| logging.info("Skip " + scene) | |
| continue | |
| logging.info(f"Export local features for scene {scene}") | |
| run_export(feature_file, scene, args) | |