Spaces:
Running
on
Zero
Running
on
Zero
import cv2 | |
from pathlib import Path | |
from imcui.hloc import logger | |
from imcui.ui.utils import DEVICE, get_matcher_zoo, load_config | |
from imcui.api import ImageMatchingAPI | |
ROOT = Path(__file__).parents[1] | |
def test_all(): | |
config = load_config(ROOT / "config/config.yaml") | |
img_path1 = ROOT / "tests/data/02928139_3448003521.jpg" | |
img_path2 = ROOT / "tests/data/17295357_9106075285.jpg" | |
image0 = cv2.imread(str(img_path1))[:, :, ::-1] # RGB | |
image1 = cv2.imread(str(img_path2))[:, :, ::-1] # RGB | |
matcher_zoo_restored = get_matcher_zoo(config["matcher_zoo"]) | |
for k, v in matcher_zoo_restored.items(): | |
if image0 is None or image1 is None: | |
logger.error("Error: No images found! Please upload two images.") | |
enable = config["matcher_zoo"][k].get("enable", True) | |
skip_ci = config["matcher_zoo"][k].get("skip_ci", False) | |
if enable and not skip_ci: | |
logger.info(f"Testing {k} ...") | |
api = ImageMatchingAPI(conf=v, device=DEVICE) | |
pred = api(image0, image1) | |
assert pred is not None | |
log_path = ROOT / "experiments" / "all" | |
log_path.mkdir(exist_ok=True, parents=True) | |
api.visualize(log_path=log_path) | |
else: | |
logger.info(f"Skipping {k} ...") | |
def test_one(): | |
img_path1 = ROOT / "tests/data/02928139_3448003521.jpg" | |
img_path2 = ROOT / "tests/data/17295357_9106075285.jpg" | |
image0 = cv2.imread(str(img_path1))[:, :, ::-1] # RGB | |
image1 = cv2.imread(str(img_path2))[:, :, ::-1] # RGB | |
# sparse | |
conf = { | |
"feature": { | |
"output": "feats-superpoint-n4096-rmax1600", | |
"model": { | |
"name": "superpoint", | |
"nms_radius": 3, | |
"max_keypoints": 4096, | |
"keypoint_threshold": 0.005, | |
}, | |
"preprocessing": { | |
"grayscale": True, | |
"force_resize": True, | |
"resize_max": 1600, | |
"width": 640, | |
"height": 480, | |
"dfactor": 8, | |
}, | |
}, | |
"matcher": { | |
"output": "matches-NN-mutual", | |
"model": { | |
"name": "nearest_neighbor", | |
"do_mutual_check": True, | |
"match_threshold": 0.2, | |
}, | |
}, | |
"dense": False, | |
} | |
api = ImageMatchingAPI(conf=conf, device=DEVICE) | |
pred = api(image0, image1) | |
assert pred is not None | |
log_path = ROOT / "experiments" / "one" | |
log_path.mkdir(exist_ok=True, parents=True) | |
api.visualize(log_path=log_path) | |
# dense | |
conf = { | |
"matcher": { | |
"output": "matches-loftr", | |
"model": { | |
"name": "loftr", | |
"weights": "outdoor", | |
"max_keypoints": 2000, | |
"match_threshold": 0.2, | |
}, | |
"preprocessing": { | |
"grayscale": True, | |
"resize_max": 1024, | |
"dfactor": 8, | |
"width": 640, | |
"height": 480, | |
"force_resize": True, | |
}, | |
"max_error": 1, | |
"cell_size": 1, | |
}, | |
"dense": True, | |
} | |
api = ImageMatchingAPI(conf=conf, device=DEVICE) | |
pred = api(image0, image1) | |
assert pred is not None | |
log_path = ROOT / "experiments" / "one" | |
log_path.mkdir(exist_ok=True, parents=True) | |
api.visualize(log_path=log_path) | |
if __name__ == "__main__": | |
test_one() | |
test_all() | |