使用自己训练的superpoint与superglue模型进行图像配准

基于官方团队发布的预训练模型,使用SuperPoint与SuperGlue实现图像配准,可以参考https://blog.csdn.net/a486259/article/details/129093084

基于官方团队发布的代码训练自己的模型,可以参考https://blog.csdn.net/a486259/article/details/135425673进行实现,训练出的模型不能直接参考上述博客进行部署,为此发布使用代码。

本博文实现基于https://github.com/magicleap/SuperGluePretrainedNetwork进行改进。

1、已训练模型提取

1.1 superpoint模型

参考https://blog.csdn.net/a486259/article/details/135425673训练出的superpoint模型可以在logs目录中找到,具体如下所示。
在这里插入图片描述
使用以下代码,可以将训练出的superpoint模型参数提取出,保存为SuperGluePretrainedNetwork所需的格式,模型文件名为superpoint_v1.pth

>>> import torch
>>> m=torch.load("F:\OPEN_PROJECT\pytorch-superpoint-master\logs\superpoint_my_data\checkpoints\superPointNet_1611_checkpoint.pth.tar")    
>>> m_dict=m["model_state_dict"]
>>> torch.save(m_dict,"superpoint_v1.pth")

代码执行效果如下所示
在这里插入图片描述

1.2 superglue模型

参考https://blog.csdn.net/a486259/article/details/135425673训练出的SuperGlue模型存储路径如下所示,将目标模型复制一份,重命名为superglue_outdoor.pth
在这里插入图片描述

2、SuperGluePretrainedNetwork修改

2.1 代码修改

SuperGluePretrainedNetwork代码修改完全参考https://blog.csdn.net/a486259/article/details/129093084?中章节1、前置操作进行修改

2.2 创建SPSG

这个与2.1章节中链接的博客操作是一模一样的。

import torch
from superglue import SuperGlue
from superpoint import SuperPoint
import torch
import torch.nn as nn
import torch.nn.functional as F
class SPSG(nn.Module):#def __init__(self):super(SPSG, self).__init__()self.sp_model = SuperPoint({'max_keypoints':700})self.sg_model = SuperGlue({'weights': 'outdoor'})def forward(self,x1,x2):keypoints1,scores1,descriptors1=self.sp_model(x1)keypoints2,scores2,descriptors2=self.sp_model(x2)#print(scores1.shape,keypoints1.shape,descriptors1.shape)#example=(descriptors1.unsqueeze(0),descriptors2.unsqueeze(0),keypoints1.unsqueeze(0),keypoints2.unsqueeze(0),scores1.unsqueeze(0),scores2.unsqueeze(0))example=(descriptors1,descriptors2,keypoints1,keypoints2,scores1,scores2)indices0,  indices1,  mscores0,  mscores1=self.sg_model(*example)#return indices0,  indices1,  mscores0,  mscores1matches = indices0[0]valid = torch.nonzero(matches > -1).squeeze().detach()mkpts0 = keypoints1[0].index_select(0, valid);mkpts1 = keypoints2[0].index_select(0, matches.index_select(0, valid));confidence = mscores0[0].index_select(0, valid);return mkpts0, mkpts1, confidence

2.3 替换预训练模型

使用章节一种生成的superglue_outdoor.pth与superpoint_v1.pth替换掉原有的模型,具体如下所示
在这里插入图片描述

3、对自己的数据进行配准

使用以下代码,可以基于自行训练的模型对自己的数据进行配准。

进行图像读取、图像显示操作的代码被封装为imgutils库,具体可以查阅https://hpg123.blog.csdn.net/article/details/124824892

from imgutils import *
import torch
from SPSG import SPSG
model=SPSG().to('cuda')
tensor2a,img2a=read_img_as_tensor(r"potato\a (1).jpg",(320,320),device='cuda')
tensor2b,img2b=read_img_as_tensor(r"potato\a (2).jpg",(320,320),device='cuda')
print(tensor2a.shape)
mkpts0, mkpts1, confidence=model(tensor2a,tensor2b)
#myimshows( [img2a,img2b],size=12)import cv2 as cv
pt_num = mkpts0.shape[0]
im_dst,im_res=img2a,img2b
img = np.zeros((max(im_dst.shape[0], im_res.shape[0]), im_dst.shape[1]+im_res.shape[1]+10,3))
img[:,:im_res.shape[0],]=im_dst
img[:,-im_res.shape[0]:]=im_res
img=img.astype(np.uint8)
match_threshold=0.6
for i in range(0, pt_num):if (confidence[i] > match_threshold):pt0 = mkpts0[i].to('cpu').numpy().astype(np.int32)pt1 = mkpts1[i].to('cpu').numpy().astype(np.int32)#cv.circle(img, (pt0[0], pt0[1]), 1, (0, 0, 255), 2)#cv.circle(img, (pt1[0], pt1[1]+650), (0, 0, 255), 2)cv.line(img, pt0, (pt1[0]+im_res.shape[0], pt1[1]), (0, 255, 0), 1)
myimshow( img,size=12)import cv2
def getGoodMatchPoint(mkpts0, mkpts1, confidence,  match_threshold:float=0.5):n = min(mkpts0.size(0), mkpts1.size(0))srcImage1_matchedKPs, srcImage2_matchedKPs=[],[]if (match_threshold > 1 or match_threshold < 0):print("match_threshold error!")for i in range(n):kp0 = mkpts0[i]kp1 = mkpts1[i]pt0=(kp0[0].item(),kp0[1].item());pt1=(kp1[0].item(),kp1[1].item());c = confidence[i].item();if (c > match_threshold):srcImage1_matchedKPs.append(pt0);srcImage2_matchedKPs.append(pt1);return np.array(srcImage1_matchedKPs),np.array(srcImage2_matchedKPs)
pts_src, pts_dst=getGoodMatchPoint(mkpts0, mkpts1, confidence)h1, status = cv2.findHomography(pts_src, pts_dst, cv.RANSAC, 8)
im_out1 = cv2.warpPerspective(im_dst, h1, (im_dst.shape[1],im_dst.shape[0]))
im_out2 = cv2.warpPerspective(im_res, h1, (im_dst.shape[1],im_dst.shape[0]),16)
#这里 im_res和im_out1是严格配准的状态
myimshowsCL([im_dst,im_out1,im_res,im_out2],rows=2,cols=2, size=6)

代码、数据、模型的关系如下所示
在这里插入图片描述
代码运行效果如下所示
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

如何理解UDP 和 TCP? 区别? 应用场景?

文章目录 一、UDP二、TCP三、区别参考文献 一、UDP UDP&#xff08;User Datagram Protocol&#xff09;&#xff0c;用户数据包协议&#xff0c;是一个简单的面向数据报的通信协议&#xff0c;即对应用层交下来的报文&#xff0c;不合并&#xff0c;不拆分&#xff0c;只是在…

SQL简单优化思路

在编写SQL查询时&#xff0c;优化查询性能是一个重要的考虑因素&#xff0c;特别是在处理多表连接&#xff08;JOIN&#xff09;和子查询时。以下是一些具体的技巧和最佳实践&#xff0c;可以帮助你在保持相同返回值的前提下&#xff0c;降低SQL执行速度&#xff1a; 明确连接顺…

什么是运放噪声频率曲线?怎么算噪声有效值?只需要3个公式!

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 大家好&#xff0c;我是工程师看海&#xff0c;原创文章欢迎点赞分享&#xff01; 运放有哪些噪声源&#xff1f;什么是噪声频率曲线&#x…

使用Autodl与Xftp远程训练模型及管理远程文件

1 AutoDL网站登录创建实例 AutoDL网站:AutoDL算力云 | 弹性、好用、省钱。租GPU就上AutoDL 1&#xff09;进入算力市场&#xff0c;选取可用显卡&#xff08;工作日一般白天抢不到&#xff0c;晚上才能抢到&#xff09; 2&#xff09;选择配置环境 3&#xff09;创建成功实例…

蓝桥集训之阶乘分解

蓝桥集训之阶乘分解 核心思想&#xff1a;线性筛质数 筛出每一个质数后 只要将所有质数的1 2 3 … 次方个数都加上即可 #include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N 1e610;int …

python中如何使用help()

help()函数帮助我们了解模块、类型、对象、方法、属性的详细信息。 1、帮助查看类型详细信息&#xff0c;包含类的创建方式、属性、方法 >>> help(list) Help on class list in module builtins: class list(object)| list() -> new empty list| list(iterable)…

企微知识库优缺点解析:如何让其效益最大化

企业搭建企微知识库&#xff0c;作为企业内部知识的集中存储和共享平台&#xff0c;为企业带来了很多便利。但是&#xff0c;任何事物都有其两面性&#xff0c;企微知识库也不例外。今天我们就来详细探讨搭建企微知识库的优点和缺点&#xff0c;如何在使用企微知识库时使其发挥…

联达动力OA 多处任意文件上传漏洞复现

0x01 产品简介 联达动力OA是PHPOA推出的新一代OA系统,系统支持性好、安全、数据高速缓存化;支持100+应用自行安装与定义,应用表单自定义,支持应用无代码开发,支持多语言。 0x02 漏洞概述 联达动力OA /FileManage/UpLoadFile.aspx、/Hosp_Portal/uploadLogo.aspx、/Dept_Por…

7.stack容器的使用

文章目录 stack容器常用接口代码工程运行结果 stack容器 常用接口 /*1.push - 入栈*/ /*2.top - 查看栈顶元素*/ /*3.pop - 出栈*/代码工程 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<stack>using namespace std;/*1.push - 入栈*/ /*2.top…

markdown语法备忘

&#x1f505;-ʜєʟʟɵ &#x1f342; &#x1d5e0;&#x1d5ee;&#x1d5ff;&#x1d5f8;&#x1d5f1;&#x1d5fc;&#x1d604;&#x1d5fb; markdown语法备忘 1. 公式 1.1 单行/多行 ☑ 行内公式&#xff1a; 将公式插入到本行内 语法&#xff1a; $公式内容$…

Java后端开发中JVM和JDK的关系

Java后端开发中JVM和JDK的关系 一、技术介绍1、JVM&#xff08;Java Virtual Machine&#xff09;2、JDK&#xff08;Java Development Kit&#xff09; 二、关系 一、技术介绍 1、JVM&#xff08;Java Virtual Machine&#xff09; 定义&#xff1a;JVM是一个抽象的计算机&a…

【力扣一刷】代码随想录day29(回溯算法part5:491.递增子序列、46.全排列、47.全排列 II)

目录 【491.递增子序列】中等题 【46.全排列】中等题 【47.全排列 II】中等题 【491.递增子序列】中等题 思路&#xff1a; 1、处理当前节点 如果到当前节点的路径长度为1或者为0&#xff0c;直接遍历访问子节点即可如果到当前节点的路径长度大于/等于2&#xff0c;则判断是…

Linux-Arm GDB调试(本地和远程)

目录 问题描述 已有coredump 没有coredump 小结 问题描述 Linux本机调试使用GDB非常方便&#xff0c;但嵌入式Linux设备资源有限&#xff0c;通常并没有交叉编译工具&#xff0c;那嵌入式设备上的应用发生问题如何查找问题&#xff1f;通常IDE有远程DEBUG功能&#xff0c;这…

【百度实习总结】百度国际化产品研发中心——mediago服务端测试开发实习

目录 Q1:觉得这一段实习跟百度网盘服务端的有什么区别&#xff1f; 移动端和pc端 测试方式的不同 百度网盘&#xff1a; mediago&#xff1a; 觉得两种测试方式哪种更加好&#xff1f; Q2:讲一下印象深刻的BUG Q3:讲一下线上的监控脚本这个是干什么的&#xff1f;可以讲…

3.冒泡排序

冒泡排序 基本思想&#xff1a;每次比较两个相邻的元素 如果它们的顺序错误就把它们交换过来 重点&#xff1a;交换 时间复杂度为&#xff1a;O(n^2)&#xff08;平均情况、最坏情况&#xff09; 最优情况&#xff1a;输入的数组已经是完全有序的时候 冒泡排序只需要进行一…

IT外包服务:企业数据资产化加速利器

随着数字化时代的兴起&#xff0c;数据成为企业最为重要的资源之一。数据驱动创新对于企业的竞争力和可持续发展至关重要。在这一进程中&#xff0c;IT外包服务发挥着关键作用&#xff0c;加速企业数据资产化进程&#xff0c;为企业提供了重要支持。 首先&#xff0c;IT外包服务…

第七讲 索引并发控制

我们假设迄今为止讨论的所有数据结构都是单线程访问的。 但 DBMS 需要允许多个线程安全地访问数据结构&#xff0c;以充分利用额外的 CPU &#xff0c;并隐藏磁盘 I/O 停顿。 并发控制协议【concurrency control protocol】是 DBMS 用于确保在共享对象上的并发操作得到“正确”…

【React】基于JS 3D引擎库实现关系图(图graph)

主角&#xff1a;3D Force-Directed Graph 简介&#xff1a;一个使用ThreeJS/WebGL进行3D渲染的Graph图库 GitHub: https://github.com/vasturiano/3d-force-graph Ps: 较为复杂或节点巨大时&#xff0c;对GPU>CPU消耗较大&#xff0c;同量级节点对比下优于AntV G6和Echarts…

简单介绍lamp/lnmp和ssh服务

lamp/lnmp和ssh服务 lamp/lnmp配置lnmp ssh服务 lamp/lnmp LAMP linuxapachemysqlphp LNMP linuxnginxmysqlphp配置lnmp 安装的组件 nginx -epel源 php-fpm - remi源 mysql - mysql-server mariadb 第一步&#xff1a;安装nginx nginx安装 第二步&#xff1a;安装mysql yum…

树(Tree) - 概念与基础

树的基本概念 树(Tree)是一种重要的数据结构&#xff0c;它在计算机科学中被广泛应用于各种算法和程序中。树是由节点(node)组成的层次结构&#xff0c;其中每个节点都有一个父节点&#xff0c;除了根节点外&#xff0c;每个节点都有零个或多个子节点。树的一个关键特点是没有…