怎样使用kornia库中的LoFTR(Image matching example with LoFTR)

Image matching example with LoFTR

本篇博客是对LoFTR使用的一个探索,LoFTR源码请访问:https://github.com/zju3dv/LoFTR#reproduce-the-testing-results-with-pytorch-lightning
kornia请访问:https://github.com/kornia/kornia
如何使用LoFTR实现图片匹配:
第一步:安装需要的库

  • 使用LoFTR需要安装最新版本的kornia
pip install kornia -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
  • 使用MAGSAC++稳健估计方法需要安装最新版本的OpenCV
  • 使用kornia_moons实现转换和可视化
%%capture
!pip install kornia==0.6.7
!pip install kornia_moons
!pip install opencv-python --upgrade

现在我们来下载一个图像对(示例)

!wget https://github.com/kornia/data/raw/main/matching/kn_church-2.jpg
!wget https://github.com/kornia/data/raw/main/matching/kn_church-8.jpg

首先,我们将用OpenCV SIFT特征定义图像匹配框架。我们还将使用kornia作为最先进的匹配过滤-Lowe ratio+相互最近邻检查和MAGSAC+作为RANSAC。

import matplotlib.pyplot as plt
import cv2
import kornia as K
import kornia.feature as KF
import numpy as np
import torch
from kornia_moons.feature import *

def load_torch_image(fname):
    img = K.image_to_tensor(cv2.imread(fname), False).float() /255.
    img = K.color.bgr_to_rgb(img)
    return img
    
fname1 = 'kn_church-2.jpg'
fname2 = 'kn_church-8.jpg'

img1 = load_torch_image(fname1)
img2 = load_torch_image(fname2)


matcher = KF.LoFTR(pretrained='outdoor')

input_dict = {"image0": K.color.rgb_to_grayscale(img1), # LofTR 只在灰度图上作用
              "image1": K.color.rgb_to_grayscale(img2)}

with torch.inference_mode():
    correspondences = matcher(input_dict)
for k,v in correspondences.items():
    print (k)
# 现在让我们用现代RANSAC清理对应关系,并估计两幅图像之间的基本矩阵
mkpts0 = correspondences['keypoints0'].cpu().numpy()
mkpts1 = correspondences['keypoints1'].cpu().numpy()
Fm, inliers = cv2.findFundamentalMat(mkpts0, mkpts1, cv2.USAC_MAGSAC, 0.5, 0.999, 100000)
inliers = inliers > 0
# 最后,让我们使用kornia_moons的函数绘制匹配图像。正确的匹配用绿色表示,不精确的匹配用蓝色表示
draw_LAF_matches(
    KF.laf_from_center_scale_ori(torch.from_numpy(mkpts0).view(1,-1, 2),
                                torch.ones(mkpts0.shape[0]).view(1,-1, 1, 1),
                                torch.ones(mkpts0.shape[0]).view(1,-1, 1)),

    KF.laf_from_center_scale_ori(torch.from_numpy(mkpts1).view(1,-1, 2),
                                torch.ones(mkpts1.shape[0]).view(1,-1, 1, 1),
                                torch.ones(mkpts1.shape[0]).view(1,-1, 1)),
    torch.arange(mkpts0.shape[0]).view(-1,1).repeat(1,2),
    K.tensor_to_image(img1),
    K.tensor_to_image(img2),
    inliers,
    draw_dict={'inlier_color': (0.2, 1, 0.2),
               'tentative_color': None, 
               'feature_color': (0.2, 0.5, 1), 'vertical': False})

效果示例:
在这里插入图片描述
图片采用matplotlib.cm.jet也就是与matplotlib.pyplot.set_cmap()函数同理,越靠近红色分数越高
在这里插入图片描述
如果想要直接对比两张图片,但不需要画出对比图像,可以直接使用LoFTR(更多资料需要科学上网)

class kornia.feature.LoFTR

参数:

  • config(Dict类型,可选)-初始参数Dict,默认值:default_cfg
  • 预训练(可选)-下载设置预训练模型权重:‘outdoor’-在MegaDepth上训练,‘indoor’-在ScanNet上训练,默认值:‘outdoor’

返回:图片匹配结果和置信度分数Dict

示例:

img1 = torch.rand(1, 1, 320, 200)
img2 = torch.rand(1, 1, 128, 128)
input = {"image0": img1, "image1": img2}
loftr = LoFTR('outdoor')
out = loftr(input)

关键字参数

  • image0 - 左图形如(N,1,H1,W1)
  • image1 - 右图形如(N,1,H2,W2)
  • mask0(可选) - 左图的mask。‘0’ 指示填充位置 (N,H1,W1)
  • mask1(可选) - 右图的mask。‘0’ 指示填充位置 (N,H2,W2)

返回类型
Dict[ str , Tensor]
返回值

  • keypoints0:image0的匹配关键点,shape为(NC,2)
  • keypoints1:image1的匹配关键点,shape为(NC,2)
  • confidence:[ 0 , 1 ]之间的置信度,shape为(NC)
  • batch_indexes: batch indexes for the keypoints and lafs,shape为(NC)
  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fuhanghang@yeah.net

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值