当前位置: 首页 > news >正文

LoFTR关键点特征匹配算法环境构建与图像匹配测试Demo

0,LoFTR

CVPR 2021论文《LoFTR: Detector-Free Local Feature Matching with Transformers》开源代码

1,项目主页

LoFTR: Detector-Free Local Feature Matching with Transformers

2,GItHub主页

GitHub - zju3dv/LoFTR: Code for "LoFTR: Detector-Free Local Feature Matching with Transformers", CVPR 2021, T-PAMI 2022

3,配置环境

一键运行:

conda env create -f environment.yaml

 'environment.yaml'中内容如下,所以时间会比较久:

name: loftr
channels:# - https://dx-mirrors.sensetime.com/anaconda/cloud/pytorch- pytorch- conda-forge- defaults
dependencies:- python=3.8- cudatoolkit=10.2- pytorch=1.8.1- pip- pip:- -r requirements.txt

 4,下载模型

作者提供了数据下载链接,其中weights文件夹里是模型文件:

https://drive.google.com/drive/folders/1DOcOPZb3-5cWxLqn256AhwUVjBPifhuf?usp=sharing

模型文件下载后,将weights文件夹放在LoFTR目录中

5,设置数据

在LoFTR/demo文件夹下创建两个文件夹,命名为images和output

其中images需要放入进行特征匹配的照片

output用来存放输出结果

图片文件随便两张带有重叠景象的图片

6,测试demo

由于我测试的是室内拍摄的照片,所以使用的是indoor权重,程序如下:

import torch
import cv2
import numpy as np
import matplotlib.cm as cm
import osfrom src.utils.plotting import make_matching_figure
from src.loftr import LoFTR, default_cfgif __name__ == '__main__':# 根据图片拍摄场景和下载的预训练模型进行选择 可选:indoor(室内)、outdoor(室外)image_type = 'indoor'# 根据个人图片路径进行修改img0_pth = "demo/images/mouse (1).jpg"img1_pth = "demo/images/mouse (2).jpg"# img0_pth = "demo/images/1.png"# img1_pth = "demo/images/2.png"image_pair = [img0_pth, img1_pth]# 默认配置使用dual-softmax最大值。# 室外和室内模型使用相同的配置。# 你可以更改默认值,比如阈值和粗匹配类型。matcher = LoFTR(config=default_cfg)# 加载预训练模型if image_type == 'indoor':matcher.load_state_dict(torch.load("weights/indoor_ds.ckpt")['state_dict'])elif image_type == 'outdoor':matcher.load_state_dict(torch.load("weights/outdoor_ds.ckpt")['state_dict'])else:raise ValueError("给定的 image_type 错误。")matcher = matcher.eval().cuda()# 如果上传了新的图片对,重新运行此单元格(及以下单元格)。img0_raw = cv2.imread(image_pair[0], cv2.IMREAD_GRAYSCALE)img1_raw = cv2.imread(image_pair[1], cv2.IMREAD_GRAYSCALE)# 检查图像是否成功读取if img0_raw is None:raise FileNotFoundError(f"无法找到或读取路径 {image_pair[0]} 下的图像。")if img1_raw is None:raise FileNotFoundError(f"无法找到或读取路径 {image_pair[1]} 下的图像。")img0_raw = cv2.resize(img0_raw, (640, 480))img1_raw = cv2.resize(img1_raw, (640, 480))img0 = torch.from_numpy(img0_raw)[None][None].cuda() / 255.img1 = torch.from_numpy(img1_raw)[None][None].cuda() / 255.batch = {'image0': img0, 'image1': img1}# 使用 LoFTR 进行推理并获得预测with torch.no_grad():matcher(batch)mkpts0 = batch['mkpts0_f'].cpu().numpy()mkpts1 = batch['mkpts1_f'].cpu().numpy()mconf = batch['mconf'].cpu().numpy()# 绘图color = cm.jet(mconf, alpha=0.7)text = ['LoFTR','Matches: {}'.format(len(mkpts0)),]fig = make_matching_figure(img0_raw, img1_raw, mkpts0, mkpts1, color, mkpts0, mkpts1, text)# 也会自动下载高分辨率的PDF。make_matching_figure(img0_raw, img1_raw, mkpts0, mkpts1, color, mkpts0, mkpts1, text, path="demo/output/LoFTR-colab-demo.pdf")

7,运行结果

运行上面的程序,在demo/output文件夹中能找到PDF文件LoFTR-colab-demo.pdf

相关文章:

  • 图像分类算法概述:深度学习方法
  • 乐尚代驾六订单执行一
  • C#初级——输出语句和转义字符
  • JAW:一款针对客户端JavaScript的图形化安全分析框架
  • Java 序列流:Java 对象的序列化和反序列化详解
  • 基于 HTML+ECharts 实现智慧运维数据可视化大屏(含源码)
  • SpringCloud 负载均衡
  • linux、windows、macos,命令终端清屏
  • 从0到1:理发店预约剪发小程序开发笔记(上)
  • SpringBoot接入mongodb例子,并有增删改查功能
  • 四、GD32 MCU 常见外设介绍 (5) TIMER 模块介绍
  • Vue中的diff算法
  • 华为嵌入式面试题及参考答案(持续更新)
  • PyTorch 中的一个函数:torch.pow
  • 完美捕捉趋势!立足市场必备“指数通行红绿灯”!股票量化分析工具QTYX-V2.8.7...
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • [译]Python中的类属性与实例属性的区别
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • isset在php5.6-和php7.0+的一些差异
  • mysql innodb 索引使用指南
  • QQ浏览器x5内核的兼容性问题
  • TypeScript实现数据结构(一)栈,队列,链表
  • vue总结
  • Windows Containers 大冒险: 容器网络
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 二维平面内的碰撞检测【一】
  • 机器学习 vs. 深度学习
  • 简单易用的leetcode开发测试工具(npm)
  • 我这样减少了26.5M Java内存!
  • Prometheus VS InfluxDB
  • 曜石科技宣布获得千万级天使轮投资,全方面布局电竞产业链 ...
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​queue --- 一个同步的队列类​
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #pragma multi_compile #pragma shader_feature
  • #图像处理
  • (libusb) usb口自动刷新
  • (读书笔记)Javascript高级程序设计---ECMAScript基础
  • (二)PySpark3:SparkSQL编程
  • (接口自动化)Python3操作MySQL数据库
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (转)IOS中获取各种文件的目录路径的方法
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • *上位机的定义
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .equals()到底是什么意思?
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Core引入性能分析引导优化
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .net 后台导出excel ,word
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET框架类在ASP.NET中的使用(2) ——QA