Python第三方库Kornia中LoFTR的使用

0,背景

浏览LoFTR代码主页:LoFTR,看到其中提到,LoFTR从0.5.11版本开始集成到kornias库中,所以决定尝试。

硬件:联想拯救者Y7000P 2020,i7-10750H,RTX2060

1,Kornia

Kornia 是一个基于 PyTorch 的开源计算机视觉库,提供了一系列的图像处理操作和算法。它的设计目标是将经典的计算机视觉算法与现代深度学习框架结合起来,方便研究人员和开发者在深度学习模型中使用传统的图像处理技术。以下是 Kornia 的一些主要功能和特点:

  • 图像处理:Kornia 提供了各种图像处理功能,如滤波、变换、形态学操作等。这些操作可以在 GPU 上高效地执行,适合处理大规模数据。

  • 几何变换:支持仿射变换、透视变换、旋转、缩放、平移等几何变换,可以方便地在深度学习模型中进行数据增强和预处理。

  • 特征检测与匹配:Kornia 包含了一些经典的特征检测算法,如 SIFT、ORB 等,可以在深度学习框架中直接使用。

  • 图像复原:提供了图像去噪、去模糊、超分辨率等图像复原技术,可以用于提高图像质量。

  • 深度学习集成:Kornia 完全基于 PyTorch 构建,可以无缝地与深度学习模型结合使用,支持梯度计算和自动微分。

  • 可扩展性:Kornia 的模块化设计使得用户可以根据需要扩展和自定义自己的图像处理算法。

2,安装kornias

运行指令

pip install kornia

需要注意,安装的版本应该大于0.5.11,我在Python 3.8环境下装出来就是0.4.X的,没有LoFTR,就需要下面的指令更新

pip install --upgrade kornia

3,编程使用

LoFTR (Local Feature TRansformer) 是 Kornia 中用于特征匹配的一个模块。LoFTR 是一种深度学习方法,用于在图像对之间找到对应的特征点。与传统的特征匹配算法(如 SIFT 和 ORB)不同,LoFTR 依靠深度学习模型来提取和匹配特征点,具有更高的鲁棒性和精度。

以下是 LoFTR 的一些主要用途和特点:

  • 特征提取与匹配:LoFTR 可以在两幅图像中找到对应的特征点,这对于图像配准、立体视觉、SLAM 等应用非常重要。

  • 深度学习驱动:与传统方法不同,LoFTR 使用深度神经网络来学习特征描述和匹配策略,能够在复杂的场景中表现出色。

  • 鲁棒性:LoFTR 在存在遮挡、视角变化、光照变化等情况下仍然能够可靠地匹配特征点。

  • 高精度:由于使用了深度学习技术,LoFTR 在特征匹配的精度上通常优于传统算法。

  • 可扩展性:作为 Kornia 的一部分,LoFTR 可以方便地与其他计算机视觉模块和深度学习模型结合使用。

4,测试程序

选择测试的文件为手机拍摄的远近两张水杯照片

为了减轻显卡压力,将图片转为800*600分辨率(直接处理原图,2060遭不住)

在窗口显示原图、Feature Matches和Matched Keypoints

  • Feature Matches:这个图显示的是两张图像拼接在一起后,绘制出每对匹配的特征点之间的连线。通过这些连线,可以直观地看到LoFTR模型在两张图像中找到了哪些对应的特征点,以及这些特征点的位置关系。

  • Matched Keypoints:这个图展示的是每对匹配的特征点在各自的原始图像中的具体位置。通过cv2.drawMatches函数,这些匹配点在两张图像中用连线连接起来,从而可以更清晰地看到哪些特征点在两张图像中被匹配上了。这个图像使得每对匹配点的位置和关系更加明显。

注意:第一次运行下面的程序,会自动下载outdoor权重文件到C盘中:

Downloading: "http://cmp.felk.cvut.cz/~mishkdmy/models/loftr_outdoor.ckpt" to C:\Users\HRSI/.cache\torch\hub\checkpoints\loftr_outdoor.ckpt
100%|██████████████████████████████████████████████| 44.2M/44.2M [01:11<00:00, 650kB/s]
import torch
import kornia as K
from kornia.feature import LoFTR
import cv2
import matplotlib.pyplot as plt# 初始化 LoFTR 模型
loftr = LoFTR(pretrained="outdoor")# 加载并预处理图像
img1 = cv2.imread('demo/images/cup_1.jpg')
img2 = cv2.imread('demo/images/cup_2.jpg')# 调整图像大小为 800x600
img1_resized = cv2.resize(img1, (800, 600))
img2_resized = cv2.resize(img2, (800, 600))# 转换颜色格式从 BGR 到 RGB
img1_resized = cv2.cvtColor(img1_resized, cv2.COLOR_BGR2RGB)
img2_resized = cv2.cvtColor(img2_resized, cv2.COLOR_BGR2RGB)# 转换为张量并添加批次维度
img1_tensor = K.image_to_tensor(img1_resized, False).float() / 255.
img2_tensor = K.image_to_tensor(img2_resized, False).float() / 255.# 将图像转换为灰度图像
img1_gray = K.color.rgb_to_grayscale(img1_tensor)
img2_gray = K.color.rgb_to_grayscale(img2_tensor)# 特征匹配
input_dict = {"image0": img1_gray, "image1": img2_gray}
with torch.no_grad():correspondences = loftr(input_dict)# 提取匹配的特征点
keypoints0 = correspondences['keypoints0']
keypoints1 = correspondences['keypoints1']# 可视化匹配结果
fig, axs = plt.subplots(2, 2, figsize=(20, 15))# 显示原图
axs[0, 0].imshow(img1_resized)
axs[0, 0].set_title('Original Image 1')
axs[0, 0].axis('off')axs[0, 1].imshow(img2_resized)
axs[0, 1].set_title('Original Image 2')
axs[0, 1].axis('off')# 拼接两张图像以便在同一张图上绘制匹配点
img_concat = torch.cat([img1_tensor, img2_tensor], dim=-1)
axs[1, 0].imshow(K.utils.tensor_to_image(img_concat))for kp0, kp1 in zip(keypoints0, keypoints1):axs[1, 0].plot([kp0[0], kp1[0] + img1_tensor.shape[-1]], [kp0[1], kp1[1]], 'ro-')axs[1, 0].set_title('Feature Matches')
axs[1, 0].axis('off')# 绘制匹配点的特写
img_matches = cv2.drawMatches(cv2.cvtColor(img1_resized, cv2.COLOR_RGB2BGR), [cv2.KeyPoint(pt[0].item(), pt[1].item(), 1) for pt in keypoints0],cv2.cvtColor(img2_resized, cv2.COLOR_RGB2BGR), [cv2.KeyPoint(pt[0].item(), pt[1].item(), 1) for pt in keypoints1],[cv2.DMatch(i, i, 0) for i in range(len(keypoints0))], None)axs[1, 1].imshow(cv2.cvtColor(img_matches, cv2.COLOR_BGR2RGB))
axs[1, 1].set_title('Matched Keypoints')
axs[1, 1].axis('off')plt.show()

5,查看效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/874604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系统变量设置失败导致 /usr/bin:/bin 不在 PATH 环境变量,许多基本命令都无法调用!!手欠的!!!

GPT害人不浅&#xff0c;专坑我这种电脑小白&#xff0c;差点被骗重装系统。。 看起来你的 PATH 环境变量真的缺失了标准的二进制文件路径&#xff08;如 /usr/bin 和 /bin&#xff09;&#xff0c;这导致你无法使用许多常用命令&#xff0c;包括 nano 和 vim。我们需要采取另…

在 CentOS 7 上安装 Docker 并安装和部署 .NET Core 3.1

1. 安装 Docker 步骤 1.1&#xff1a;更新包索引并安装依赖包 先安装yum的扩展&#xff0c;yum-utils提供了一些额外的工具&#xff0c;这些工具可以执行比基本yum命令更复杂的任务 sudo yum install -y yum-utils sudo yum update -y #更新系统上已安装的所有软件包到最新…

使用 Socket和动态代理以及反射 实现一个简易的 RPC 调用

使用 Socket、动态代理、反射 实现一个简易的 RPC 调用 我们前面有一篇 socket 的文章&#xff0c;再之前&#xff0c;还有一篇 java动态代理的文章&#xff0c;本文用到了那两篇文章中的知识点&#xff0c;需要的话可以回顾一下。 下面正文开始&#xff1a; 我们的背景是一个…

【Linux网络】epoll模型构建Reactor_Tcp服务器{协议/客户端/bind/智能指针}

文章目录 1.std::enable_shared_from_this<TcpServer>2.std::bind3.std::make_shared4.std::shared_ptrstd::shared_ptr 和 std::weak_ptr配合使用 5.剖析代码6.整体代码Calculator.hppClientCal.ccCMakeLists.txtCommon.hppEpoller.hppLog.hppMain.ccnocopy.hppProtocol…

YOLOv8预测时报错ValueError

【问题描述】执行YOLOv8预测代码时&#xff1a; # 导入训练好的权重文件做预测 from ultralytics import YOLO# Load a pretrained YOLOv8n model model YOLO("/data/yolov8/runs/detect/train6/weights/best.pt")# Run inference on bus.jpg with arguments model…

四大引用——强软弱虚

目录 一、强引用 二、软引用 三、弱引用 四、虚引用 一、强引用 强引用是在程序代码之中普遍存在的&#xff0c;类似于“Object obj new Object()”&#xff0c;obj变量引用Object这个对象&#xff0c;就叫做强引用。当内存空间不足&#xff0c;Java虚拟机宁愿抛出OutOfMe…

使用 Redis 实现验证码、token 的存储,用自定义拦截器完成用户认证、并使用双重拦截器解决 token 刷新的问题

基于session实现登录流程 1.发送验证码 用户在提交手机号后&#xff0c;会校验手机号是否合法&#xff0c;如果不合法&#xff0c;则要求用户重新输入手机号 如果手机号合法&#xff0c;后台此时生成对应的验证码&#xff0c;同时将验证码进行保存&#xff0c;然后再通过短信…

安防视频监控EasyCVR视频汇聚平台修改配置后无法启动的原因排查与解决

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台基于云边端一体化架构&#xff0c;兼容性强、支持多协议接入&#xff0c;包括国标GB/T 28181协议、部标JT808、GA/T 1400协议、RTMP、RTSP/Onvif协议、海康Ehome、海康SDK、大华SDK、华为SDK、宇视SDK、乐橙SDK、萤石云SD…

Linux学习第55天:Linux 4G 通信实验(更快、更高、更强)

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 无论是有线网络还是WiFi都是摆脱不了布线的尴尬&#xff0c;而4G通信可以彻底拜托网线的束缚&#xff0c;实现无线网络通信。 而说到4G就不得不提到5G&#xff0c;中…

关于css中flex布局垂直居中失效问题的原因

项目中遇到用flex进行页面布局后&#xff0c;使用上下居中设置&#xff1a;align-item: center; 目标效果如下&#xff1a; 但是失效&#xff0c;不起作用&#xff0c;如下图所示&#xff1a; 各种排查过后发现设置了子模块 align-self 属性&#xff0c;这会覆盖容器上的 al…

mysql高阶语句:

mysql高阶语句&#xff1a; 高级语法的查询语句&#xff1a; select * from 表名 where limitsdistinct 去重查询like 模糊查询 排序语法&#xff1a;关键字排序 升序和降序 默认的排序方式就是升序 升序&#xff1a;ASC 配合order by语法 select * from 表名…

Python爬虫掌握-----4实战(爬取视频)

我们使用爬虫时难免会遇到爬取视频的情况&#xff0c;其实爬取图片视频&#xff0c;内容都是一样的。这里以b站视频为例。 一、开始 1.找到url&#xff0c;请求url 防盗链&#xff0c;需要写在UA伪装中 正常的三步&#xff1a; 1.url 2.requests请求 3.UA伪装 import req…

Zabbix基本介绍

文章目录 一、监控为什么需要监控需要监控什么Zabbix使用场景及系统概述zabbix介绍Zabbix功能Zabbix架构Zabbix术语 二、部署安装编译安装 一、监控 为什么需要监控 监控功能 在需要的时刻&#xff0c;提前预警即将出问题,避免故障发生。实时监控系统和业务,当出问题之后&am…

数据库安全:MySQL安全配置,MySQL安全基线检查加固

「作者简介」&#xff1a;冬奥会网络安全中国代表队&#xff0c;CSDN Top100&#xff0c;就职奇安信多年&#xff0c;以实战工作为基础著作 《网络安全自学教程》&#xff0c;适合基础薄弱的同学系统化的学习网络安全&#xff0c;用最短的时间掌握最核心的技术。 这一章节我们需…

配置Linux客户端免密登录服务端Linux主机的root用户

1.安装shh服务 首先安装shh服务&#xff0c;redhat端通过下面代码进行安装服务 sudo yum install sshd sudo yum install openssh-server 2.生成密钥&#xff08;公钥&#xff0b;私钥&#xff09; 执行ssh-keygen命令&#xff0c;会生成id_rsa&#xff08;私钥&#xff0…

并发编程--synchronized介绍

1.初步认识synchronized 先来看下利用 synchronized 实现 同步的基 础 &#xff1a; Java 中的每一个 对 象都可以作 为锁 。具体表 现 为 以下 3 种形式。 &#xff1a; 对于普通同步方法&#xff0c; 锁 是当前 实 例 对 象。 对于静 态 同步方法&#xff0c; 锁 是当前 类…

python-首字母移位(PythonTip)

[题目描述] 编写一个程序&#xff0c;将句子中每个单词的首字母移位到下一个单词。定义函数shift_first_letter()&#xff0c;参数为sentence&#xff08;字符串&#xff09;。在函数内&#xff0c;将句子中每个单词的首字母移位到下一个单词。最后一个单词的首字母移位到句子的…

SQL 注入漏洞详解 - Union 注入

1)漏洞简介 SQL 注入简介 SQL 注入 即是指 Web 应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在 Web 应用程序中事先定义好的查询语句的结尾上添加额外的 SQL 语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,…

记录|C#+winform创建扁平化风格界面

本项目的C#内容是自己跟做的&#xff0c;自己做的内容已经打包&#xff0c;可以通过自己跟做写的Dashboard界面&#xff0c;C#下的winform模式下载获得&#xff0c;但是需要花费3个积分 目录 前言一、左边设置和步骤界面步骤Step1.Step2.Step3.Step4Step5 二、右边属性和步骤属…

【BUG】已解决:ModuleNotFoundError: No module named ‘requests‘

ModuleNotFoundError: No module named ‘requests‘ 目录 ModuleNotFoundError: No module named ‘requests‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&a…