Vincentqyw commited on
Commit
8869f68
1 Parent(s): 8e76240

update: d2net model links and SIFT

Browse files
common/utils.py CHANGED
@@ -5,7 +5,7 @@ import torch
5
  from itertools import combinations
6
  import cv2
7
  import gradio as gr
8
- from hloc import matchers, extractors
9
  from hloc.utils.base_model import dynamic_load
10
  from hloc import match_dense, match_features, extract_features
11
  from hloc.utils.viz import add_text, plot_keypoints
@@ -187,14 +187,17 @@ def compute_geom(
187
  )
188
  if H is not None:
189
  geo_info["Homography"] = H.tolist()
190
- _, H1, H2 = cv2.stereoRectifyUncalibrated(
191
- mkpts0.reshape(-1, 2),
192
- mkpts1.reshape(-1, 2),
193
- F,
194
- imgSize=(w1, h1),
195
- )
196
- geo_info["H1"] = H1.tolist()
197
- geo_info["H2"] = H2.tolist()
 
 
 
198
  return geo_info
199
  else:
200
  return {}
 
5
  from itertools import combinations
6
  import cv2
7
  import gradio as gr
8
+ from hloc import matchers, extractors, logger
9
  from hloc.utils.base_model import dynamic_load
10
  from hloc import match_dense, match_features, extract_features
11
  from hloc.utils.viz import add_text, plot_keypoints
 
187
  )
188
  if H is not None:
189
  geo_info["Homography"] = H.tolist()
190
+ try:
191
+ _, H1, H2 = cv2.stereoRectifyUncalibrated(
192
+ mkpts0.reshape(-1, 2),
193
+ mkpts1.reshape(-1, 2),
194
+ F,
195
+ imgSize=(w1, h1),
196
+ )
197
+ geo_info["H1"] = H1.tolist()
198
+ geo_info["H2"] = H2.tolist()
199
+ except cv2.error as e:
200
+ logger.error(f"e, skip")
201
  return geo_info
202
  else:
203
  return {}
hloc/extractors/d2net.py CHANGED
@@ -26,7 +26,7 @@ class D2Net(BaseModel):
26
  model_file.parent.mkdir(exist_ok=True)
27
  cmd = [
28
  "wget",
29
- "https://dsmn.ml/files/d2-net/" + conf["model_name"],
30
  "-O",
31
  str(model_file),
32
  ]
 
26
  model_file.parent.mkdir(exist_ok=True)
27
  cmd = [
28
  "wget",
29
+ "https://dusmanu.com/files/d2-net/" + conf["model_name"],
30
  "-O",
31
  str(model_file),
32
  ]
hloc/extractors/dog.py CHANGED
@@ -44,6 +44,7 @@ class DoG(BaseModel):
44
  raise ValueError(f'Unknown descriptor: {conf["descriptor"]}')
45
 
46
  self.sift = None # lazily instantiated on the first image
 
47
  self.device = torch.device("cpu")
48
 
49
  def to(self, *args, **kwargs):
@@ -63,7 +64,8 @@ class DoG(BaseModel):
63
  assert image_np.min() >= -EPS and image_np.max() <= 1 + EPS
64
 
65
  if self.sift is None:
66
- use_gpu = pycolmap.has_cuda and self.device.type == "cuda"
 
67
  options = {**self.conf["options"]}
68
  if self.conf["descriptor"] == "rootsift":
69
  options["normalization"] = pycolmap.Normalization.L1_ROOT
@@ -73,8 +75,7 @@ class DoG(BaseModel):
73
  options=pycolmap.SiftExtractionOptions(options),
74
  device=getattr(pycolmap.Device, "cuda" if use_gpu else "cpu"),
75
  )
76
-
77
- keypoints, scores, descriptors = self.sift.extract(image_np)
78
  scales = keypoints[:, 2]
79
  oris = np.rad2deg(keypoints[:, 3])
80
 
@@ -109,7 +110,8 @@ class DoG(BaseModel):
109
  keypoints = torch.from_numpy(keypoints[:, :2]) # keep only x, y
110
  scales = torch.from_numpy(scales)
111
  oris = torch.from_numpy(oris)
112
- scores = torch.from_numpy(scores)
 
113
  if self.conf["max_keypoints"] != -1:
114
  # TODO: check that the scores from PyCOLMAP are 100% correct,
115
  # follow https://github.com/mihaidusmanu/pycolmap/issues/8
 
44
  raise ValueError(f'Unknown descriptor: {conf["descriptor"]}')
45
 
46
  self.sift = None # lazily instantiated on the first image
47
+ self.dummy_param = torch.nn.Parameter(torch.empty(0))
48
  self.device = torch.device("cpu")
49
 
50
  def to(self, *args, **kwargs):
 
64
  assert image_np.min() >= -EPS and image_np.max() <= 1 + EPS
65
 
66
  if self.sift is None:
67
+ device = self.dummy_param.device
68
+ use_gpu = pycolmap.has_cuda and device.type == "cuda"
69
  options = {**self.conf["options"]}
70
  if self.conf["descriptor"] == "rootsift":
71
  options["normalization"] = pycolmap.Normalization.L1_ROOT
 
75
  options=pycolmap.SiftExtractionOptions(options),
76
  device=getattr(pycolmap.Device, "cuda" if use_gpu else "cpu"),
77
  )
78
+ keypoints, descriptors = self.sift.extract(image_np)
 
79
  scales = keypoints[:, 2]
80
  oris = np.rad2deg(keypoints[:, 3])
81
 
 
110
  keypoints = torch.from_numpy(keypoints[:, :2]) # keep only x, y
111
  scales = torch.from_numpy(scales)
112
  oris = torch.from_numpy(oris)
113
+ scores = keypoints.new_zeros(len(keypoints)) # no scores for SIFT yet
114
+
115
  if self.conf["max_keypoints"] != -1:
116
  # TODO: check that the scores from PyCOLMAP are 100% correct,
117
  # follow https://github.com/mihaidusmanu/pycolmap/issues/8