Spaces:
Running
Running
import torch | |
from hloc import logger | |
from ..utils.base_model import BaseModel | |
class XFeatLightGlue(BaseModel): | |
default_conf = { | |
"keypoint_threshold": 0.005, | |
"max_keypoints": 8000, | |
} | |
required_inputs = [ | |
"image0", | |
"image1", | |
] | |
def _init(self, conf): | |
self.net = torch.hub.load( | |
"verlab/accelerated_features", | |
"XFeat", | |
pretrained=True, | |
top_k=self.conf["max_keypoints"], | |
) | |
logger.info("Load XFeat(dense) model done.") | |
def _forward(self, data): | |
# we use results from one batch | |
im0 = data["image0"] | |
im1 = data["image1"] | |
# Compute coarse feats | |
out0 = self.net.detectAndCompute(im0, top_k=self.conf["max_keypoints"])[ | |
0 | |
] | |
out1 = self.net.detectAndCompute(im1, top_k=self.conf["max_keypoints"])[ | |
0 | |
] | |
out0.update({"image_size": (im0.shape[-1], im0.shape[-2])}) # W H | |
out1.update({"image_size": (im1.shape[-1], im1.shape[-2])}) # W H | |
mkpts_0, mkpts_1 = self.net.match_lighterglue(out0, out1) | |
mkpts_0 = torch.from_numpy(mkpts_0) # n x 2 | |
mkpts_1 = torch.from_numpy(mkpts_1) # n x 2 | |
pred = { | |
"keypoints0": mkpts_0, | |
"keypoints1": mkpts_1, | |
"mconf": torch.ones_like(mkpts_0[:, 0]), | |
} | |
return pred | |