Spaces:
Running
Running
Realcat
commited on
Commit
•
de8bee7
1
Parent(s):
5e02733
update: api
Browse files- common/api.py +9 -25
- common/config.yaml +23 -23
- test_app_cli.py +38 -31
common/api.py
CHANGED
@@ -27,28 +27,6 @@ warnings.simplefilter("ignore")
|
|
27 |
|
28 |
class ImageMatchingAPI(torch.nn.Module):
|
29 |
default_conf = {
|
30 |
-
"dense": True,
|
31 |
-
"matcher": {
|
32 |
-
"model": {
|
33 |
-
"name": "topicfm",
|
34 |
-
"match_threshold": 0.2,
|
35 |
-
}
|
36 |
-
},
|
37 |
-
"feature": {
|
38 |
-
"model": {
|
39 |
-
"name": "xfeat",
|
40 |
-
"max_keypoints": 1024,
|
41 |
-
"keypoint_threshold": 0.015,
|
42 |
-
},
|
43 |
-
"preprocessing": {
|
44 |
-
"grayscale": False,
|
45 |
-
"resize_max": 1600,
|
46 |
-
"force_resize": True,
|
47 |
-
"width": 640,
|
48 |
-
"height": 480,
|
49 |
-
"dfactor": 8,
|
50 |
-
},
|
51 |
-
},
|
52 |
"ransac": {
|
53 |
"enable": True,
|
54 |
"estimator": "poselib",
|
@@ -83,7 +61,7 @@ class ImageMatchingAPI(torch.nn.Module):
|
|
83 |
"""
|
84 |
super().__init__()
|
85 |
self.device = device
|
86 |
-
self.conf = self.
|
87 |
self._updata_config(detect_threshold, max_keypoints, match_threshold)
|
88 |
self._init_models()
|
89 |
if device == "cuda":
|
@@ -126,14 +104,20 @@ class ImageMatchingAPI(torch.nn.Module):
|
|
126 |
):
|
127 |
self.dense = self.conf["dense"]
|
128 |
if self.conf["dense"]:
|
129 |
-
|
|
|
|
|
|
|
|
|
|
|
130 |
else:
|
131 |
self.conf["feature"]["model"]["max_keypoints"] = max_keypoints
|
132 |
self.conf["feature"]["model"][
|
133 |
"keypoint_threshold"
|
134 |
] = detect_threshold
|
|
|
|
|
135 |
self.match_conf = self.conf["matcher"]
|
136 |
-
self.extract_conf = self.conf["feature"]
|
137 |
|
138 |
def _init_models(self):
|
139 |
# initialize matcher
|
|
|
27 |
|
28 |
class ImageMatchingAPI(torch.nn.Module):
|
29 |
default_conf = {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
30 |
"ransac": {
|
31 |
"enable": True,
|
32 |
"estimator": "poselib",
|
|
|
61 |
"""
|
62 |
super().__init__()
|
63 |
self.device = device
|
64 |
+
self.conf = {**self.default_conf, **conf}
|
65 |
self._updata_config(detect_threshold, max_keypoints, match_threshold)
|
66 |
self._init_models()
|
67 |
if device == "cuda":
|
|
|
104 |
):
|
105 |
self.dense = self.conf["dense"]
|
106 |
if self.conf["dense"]:
|
107 |
+
try:
|
108 |
+
self.conf["matcher"]["model"][
|
109 |
+
"match_threshold"
|
110 |
+
] = match_threshold
|
111 |
+
except TypeError as e:
|
112 |
+
breakpoint()
|
113 |
else:
|
114 |
self.conf["feature"]["model"]["max_keypoints"] = max_keypoints
|
115 |
self.conf["feature"]["model"][
|
116 |
"keypoint_threshold"
|
117 |
] = detect_threshold
|
118 |
+
self.extract_conf = self.conf["feature"]
|
119 |
+
|
120 |
self.match_conf = self.conf["matcher"]
|
|
|
121 |
|
122 |
def _init_models(self):
|
123 |
# initialize matcher
|
common/config.yaml
CHANGED
@@ -16,29 +16,29 @@ defaults:
|
|
16 |
setting_geometry: Homography
|
17 |
|
18 |
matcher_zoo:
|
19 |
-
omniglue:
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
DUSt3R:
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
GIM(dkm):
|
43 |
matcher: gim(dkm)
|
44 |
dense: true
|
|
|
16 |
setting_geometry: Homography
|
17 |
|
18 |
matcher_zoo:
|
19 |
+
# omniglue:
|
20 |
+
# enable: true
|
21 |
+
# matcher: omniglue
|
22 |
+
# dense: true
|
23 |
+
# info:
|
24 |
+
# name: OmniGlue
|
25 |
+
# source: "CVPR 2024"
|
26 |
+
# github: https://github.com/Vincentqyw/omniglue-onnx
|
27 |
+
# paper: https://arxiv.org/abs/2405.12979
|
28 |
+
# project: https://hwjiang1510.github.io/OmniGlue/
|
29 |
+
# display: true
|
30 |
+
# DUSt3R:
|
31 |
+
# # TODO: duster is under development
|
32 |
+
# enable: false
|
33 |
+
# matcher: duster
|
34 |
+
# dense: true
|
35 |
+
# info:
|
36 |
+
# name: DUSt3R #dispaly name
|
37 |
+
# source: "CVPR 2024"
|
38 |
+
# github: https://github.com/naver/dust3r
|
39 |
+
# paper: https://arxiv.org/abs/2312.14132
|
40 |
+
# project: https://dust3r.europe.naverlabs.com
|
41 |
+
# display: true
|
42 |
GIM(dkm):
|
43 |
matcher: gim(dkm)
|
44 |
dense: true
|
test_app_cli.py
CHANGED
@@ -41,29 +41,32 @@ def test_one():
|
|
41 |
image1 = cv2.imread(str(img_path2))[:, :, ::-1] # RGB
|
42 |
# sparse
|
43 |
conf = {
|
44 |
-
"dense": False,
|
45 |
-
"matcher": {
|
46 |
-
"model": {
|
47 |
-
"name": "NN-mutual",
|
48 |
-
"match_threshold": 0.2,
|
49 |
-
}
|
50 |
-
},
|
51 |
"feature": {
|
|
|
52 |
"model": {
|
53 |
-
"name": "
|
54 |
-
"
|
55 |
-
"
|
56 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
57 |
},
|
58 |
-
"
|
59 |
-
"
|
60 |
-
"
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
"max_iter": 10000,
|
66 |
},
|
|
|
67 |
}
|
68 |
api = ImageMatchingAPI(conf=conf, device=device)
|
69 |
api(image0, image1)
|
@@ -73,24 +76,28 @@ def test_one():
|
|
73 |
|
74 |
# dense
|
75 |
conf = {
|
76 |
-
"dense": True,
|
77 |
"matcher": {
|
|
|
78 |
"model": {
|
79 |
"name": "loftr",
|
|
|
|
|
80 |
"match_threshold": 0.2,
|
81 |
-
}
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
"
|
91 |
-
"
|
92 |
},
|
|
|
93 |
}
|
|
|
94 |
api = ImageMatchingAPI(conf=conf, device=device)
|
95 |
api(image0, image1)
|
96 |
log_path = ROOT / "experiments" / "one"
|
|
|
41 |
image1 = cv2.imread(str(img_path2))[:, :, ::-1] # RGB
|
42 |
# sparse
|
43 |
conf = {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
"feature": {
|
45 |
+
"output": "feats-superpoint-n4096-rmax1600",
|
46 |
"model": {
|
47 |
+
"name": "superpoint",
|
48 |
+
"nms_radius": 3,
|
49 |
+
"max_keypoints": 4096,
|
50 |
+
"keypoint_threshold": 0.005,
|
51 |
+
},
|
52 |
+
"preprocessing": {
|
53 |
+
"grayscale": True,
|
54 |
+
"force_resize": True,
|
55 |
+
"resize_max": 1600,
|
56 |
+
"width": 640,
|
57 |
+
"height": 480,
|
58 |
+
"dfactor": 8,
|
59 |
+
},
|
60 |
},
|
61 |
+
"matcher": {
|
62 |
+
"output": "matches-NN-mutual",
|
63 |
+
"model": {
|
64 |
+
"name": "nearest_neighbor",
|
65 |
+
"do_mutual_check": True,
|
66 |
+
"match_threshold": 0.2,
|
67 |
+
},
|
|
|
68 |
},
|
69 |
+
"dense": False,
|
70 |
}
|
71 |
api = ImageMatchingAPI(conf=conf, device=device)
|
72 |
api(image0, image1)
|
|
|
76 |
|
77 |
# dense
|
78 |
conf = {
|
|
|
79 |
"matcher": {
|
80 |
+
"output": "matches-loftr",
|
81 |
"model": {
|
82 |
"name": "loftr",
|
83 |
+
"weights": "outdoor",
|
84 |
+
"max_keypoints": 2000,
|
85 |
"match_threshold": 0.2,
|
86 |
+
},
|
87 |
+
"preprocessing": {
|
88 |
+
"grayscale": True,
|
89 |
+
"resize_max": 1024,
|
90 |
+
"dfactor": 8,
|
91 |
+
"width": 640,
|
92 |
+
"height": 480,
|
93 |
+
"force_resize": True,
|
94 |
+
},
|
95 |
+
"max_error": 1,
|
96 |
+
"cell_size": 1,
|
97 |
},
|
98 |
+
"dense": True,
|
99 |
}
|
100 |
+
|
101 |
api = ImageMatchingAPI(conf=conf, device=device)
|
102 |
api(image0, image1)
|
103 |
log_path = ROOT / "experiments" / "one"
|