LoFTR: Detector-Free Local Feature Matching with Transformers

LoFTR: Detector-Free Local Feature Matching with Transformers

整体概括

Loftr特征点匹配算法与传统的特征点匹配算法的优势:

  1. 不需要先得到特征点,这也就解决了第一个问题
  2. End2End的方式,用起来比较方便,效果也更好

整体流程的核心就是Transform了下面是整个算法的一个核心的流程图

在这里插入图片描述

  1. 第一步:通过backbone进行特征提取。
  • 注意:输入是两张图像分别得到不同层特征输入:[2,1,480,640]两张图像拼一起进行backbone
  • 通过我们的backbone网络分别得到下采样2倍和下采样8倍的特征图。
  1. 使用核心的Transform的部分
  • 这里就完全和Transform定义与特征点匹配相互对应起来了 对于经过特征提取的两个Feature map A和B来我们把A中的点定义为q B中的点定义为k它们之间做注意力机制,也就是我们常见的cross attention交叉注意力机制。

  • 同时我们需要去匹配的A特征图,要在自己的像素之间做一个self-attention的机制使其具有一个全局的感受野避免匹配的重复性。

在这里插入图片描述

  • 我们首先要先将这个特征图拉长也就是我们的Transform要求输入的应该是一个token序列。然后进行位置编码,传统的匹配中更多的考虑的是特征关系而去忽略了位置上的关系。所以这里要进行位置编码。

这里就对于的第一块,两张图像分别展开成序列,同时分别加上位置编码。也就是粗级局部特征变换

  • 下面我们使用的方式是先做Self-Attention Layer在做Cross-Attention Layer按照这个顺序将它的整个过程重复N次

为什么要按照这种方式来设计呢?个人的理解是第一次先做自注意力是为了获取全局的信息,之后我们在做交叉注意力进行匹配,重复的做自注意力是为了告诉后面的特征点已匹配的部分信息,避免重复的匹配。所以按照这个顺序匹配了6次

  • self-attention的意思是别选重复了先定义好自身的分工。理解为自身点选取的一个过程这里没有画全只是画了部分的点每个点要和其他的点计算注意力(点积

在这里插入图片描述

  • Cross-attention的意思找到之间的配对关系。也就是每个点和图像中的其他的点还要再去匹配一下

在这里插入图片描述

我们按照这种方式进行计算之后原来的A和B特征和背景比较相似的点,之后就可加入了位置信息,之前无法进行确认配对的 A A’ B B’点就可以根据位置的信息完成配对了

在这里插入图片描述

位置关系和自身特征更明确(CNN后结果类似,但transformer后鲜明了)

这里我们经过Transform之后就得到了输出的特征向量或者说是嵌入的token向量,之后要考虑的就是匹配的问题了。

  1. 第三:粗粒度的一个匹配过程

根据上一步,我们多次的Attention后我们已经得到了两个图重构后的特征向量信息了。

  • 两张图源码中好像分别有4800个点,现在咱们就能得到4800*4800的一个关系矩阵了。

P c ( i , j ) = softmax ⁡ ( S ( i , ⋅ ) ) j ⋅ softmax ⁡ ( S ( ⋅ , j ) ) i . \mathcal{P}_{c}(i, j)=\operatorname{softmax}(\mathcal{S}(i, \cdot))_{j} \cdot \operatorname{softmax}(\mathcal{S}(\cdot, j))_{i} . Pc(i,j)=softmax(S(i,))jsoftmax(S(,j))i.

  • softmax表示分别对两张图中的内积结果做归一化,
    得到概率值

在这里插入图片描述

这里的粗粒度的匹配完成的并不是像素点到像素点的匹配而是位置到位置的一个匹配 原因在4800个点并非是整个图像区域内的所有的点而是提取过特征信息之后的点。

得到计算的关系之后我们如何的进行匹配呢?

  1. 通过阈值进行一部分过滤操作去掉置信度水平过低的点。
  2. 我们通过计算从A图得到的一个点匹配上了B图上的一个点,那么从B图来说A这个点是我们关系最大的一个匹配点吗? 也就是要相互运算

现在我们完成的是粗粒度的匹配,也就是说经过Transform之后完成的实际上是区域之间的匹配问题。但是区域之间的点的匹配会存在一定的偏差。

  1. 由此我们引出了最后一步,进行最后一步的细粒度匹配的问题。

在上一步的基础上继续调整,咱们就叫它Coarse-to-Fine(一个通用的解决方案。)这一部分细粒度的匹配过程是比较绕的

在细粒度的匹配过程中又用到了Transform了在粗粒度匹配完成的基础上再去走细粒度的点。

  • 先将我们的特征图来进行拆解。每个特征是128的特征向量来表示。假设我们粗粒度输出的区域是5 x 5的一个区域就会得到128 x 5 x 5 =3200个特征

  • 之前我们提到了粗粒度的匹配生成的是4800x4800的一个关系矩阵。所以最后得到的一个结果就是4800 x 3200的一个结果。4800是长条的个数,3200是特征的个数

  • 转换维度得到:480025128,也就是每个长条块是由25个点组成的

实际上:例如筛选后得到4800个点里面只有142个是相互匹配的142x25x128这样一个矩阵。对这142个已经匹配的区域,再做实际点的微调,也就是25个点再最匹配的

相当于一个区域由25个点组成,咱们要再这个区域里找到最准确的点位置

在这里插入图片描述
在细粒度中,我们针对25个位置还要走Self Attention和Cross Attention

  • transformer过后,只是把各个点的特征进行了重构那接下来如何进行微调呢?

  • 现在我们要算这25个点与其中心点的关系,相当于我要以中心点为圆心,算周围点跟它的概率关系,这样会得到一个热度图例如最后输出了14255的一个概率图,相当于哪块跟中心点关系紧密

  • 相当于这25个点都会对最终结果产生影响,我们算其期望:142*2(实际位置)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

免押租赁系统的优势与应用前景分析

内容概要 免押租赁系统是一种新兴的租赁形式,它利用了信用大数据与区块链技术的优势,帮助用户摆脱了传统租赁中常见的押金烦恼。通过这种方式,用户不仅可以体验到更低的租用门槛,还能享受到更顺畅的交易过程。用户只需提供基本的…

「Qt Widget中文示例指南」如何创建一个窗口标志?(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 窗口标志要么是类型…

(附项目源码)Java开发语言,211 springboot 在线问诊系统的设计与实现,计算机毕设程序开发+文案(LW+PPT)

摘 要 针对医院门诊等问题,对在线问诊进行研究分析,然后开发设计出在线问诊系统以解决问题。在线问诊系统主要功能模块包括首页、轮播图管理、公告信息管理、资源管理、系统用户管理(管理员、患者用户、医生用户)、模块管理&#…

Vulnhub靶场 Billu_b0x 练习

目录 0x00 准备0x01 主机信息收集0x02 站点信息收集0x03 漏洞查找与利用1. 文件包含2. SQL注入3. 文件上传4. 反弹shell5. 提权(思路1:ssh)6. 提权(思路2:内核)7. 补充 0x04 总结 0x00 准备 下载链接&#…

Linux应用层学习——Day2(文件IO)

fopen #include <stdio.h>int main(int argc,char const *argv[]) {// FILE *fopen (const char *__restrict __filename&#xff1a;字符串要打开的文件名称,// const char *__restrict __modes&#xff1a;打开的模式// 1) r&#xff1a;只读模式&#xff0c;如果…

Java并发篇--ReentrantLock原理

ReentrantLock原理 非公平锁实现原理 加锁解锁流程 先从构造器开始看,默认为非公平锁 public ReentrantLock() {sync new NonfairSync(); }NonfairSync 继承自 AQS 没有竞争时 第一个竞争出现时 Thread-1执行了 1.CAS尝试将state由0改为1,结果失败 2.进入tryAcquire逻辑…

分析http话术异常挂断原因

用户反馈在与机器人通话时&#xff0c;自己明明有说话&#xff0c;但是通话还是被挂断了&#xff0c;想知道原因。 分析日志 我们根据用户提供的freeswitch日志分析&#xff1a;发现是因为超时导致话术执行hangup动作&#xff0c;结束了通话。 从这一行向上分析日志&#xff…

【Pikachu】PHP反序列化RCE实战

痛是你活着的证明 1.PHP反序列化概述 在理解 PHP 中 serialize() 和 unserialize() 这两个函数的工作原理之前&#xff0c;我们需要先了解它们各自的功能及其潜在的安全隐患。接下来&#xff0c;我会对相关概念做更详细的扩展解释。 1. 序列化 serialize() 序列化&#xff…

零基础Java第十八期:图书管理系统

目录 一、package book 1.1. Book 1.2. BookList 二、package user 2.1. User 2.2. NormalUser与AdminiUser 三、Main 四、NormalUser与AdminiUser的菜单界面 五、package operation 5.1. 设计管理员菜单 六、业务逻辑 七、完整代码 今天博主来带大家实现一个…

【每日题解】3239. 最少翻转次数使二进制矩阵回文 I

给你一个 m x n 的二进制矩阵 grid 。 如果矩阵中一行或者一列从前往后与从后往前读是一样的&#xff0c;那么我们称这一行或者这一列是 回文 的。 你可以将 grid 中任意格子的值 翻转 &#xff0c;也就是将格子里的值从 0 变成 1 &#xff0c;或者从 1 变成 0 。 请你返回 …

vue面试题9|[2024-11-15]

问题1&#xff1a;scoped原理 1.作用&#xff1a;让样式在本组件中生效&#xff0c;不影响其他组件 2.原理&#xff1a;给节点新增自定义属性&#xff0c;然后css根据属性选择器添加样式。 问题2&#xff1a;让css只在当前组件生效 <style scoped> 问题3&#xff1a;scss…

2024新版pycharm如何切换anaconda虚拟环境

2024新版pycharm如何切换anaconda虚拟环境 不得不说这界面改的真不错&#xff0c;看着很舒服。 回归正题&#xff0c; 导入项目后点击文件>设置&#xff0c;找到解释器。 添加解释器>添加本地解释器 以前是选择conda环境&#xff0c;现在直接就是Virtualenv 环境 看…

Codeforces Round 987 (Div. 2)(前四道)

A. Penchick and Modern Monument 翻译&#xff1a; 在繁华大都市马尼拉的摩天大楼中&#xff0c;菲律宾最新的 Noiph 购物中心刚刚竣工&#xff01;建筑管理方 Penchick 订购了一座由 n 根支柱组成的先进纪念碑。 纪念碑支柱的高度可以用一个由 n 个正整数组成的数组 h 来表示…

探索AI驱动的企业知识库:提升管理效率的新利器

对于企业而言&#xff0c;如何高效管理知识、提升团队协作、加速决策过程&#xff0c;已成为生存与发展的关键。而人工智能(AI)的迅速发展为解决这些问题提供了新的思路和工具。越来越多的企业开始构建AI驱动的知识库&#xff0c;以实现信息的智能管理与利用。本文将深入探讨AI…

C语言项⽬实践-贪吃蛇

目录 1.项目要点 2.窗口设置 2.1mode命令 2.2title命令 2.3system函数 2.Win32 API 2.1 COORD 2.2 GetStdHandle 2.3 CONSOLE_CURSOR_INFO 2.4 GetConsoleCursorInfo 2.5 SetConsoleCursorInfo 2.5 SetConsoleCursorPosition 2.7 GetAsyncKeyState 3.贪吃蛇游戏设…

为什么 Vue3 封装 Table 组件丢失 expose 方法呢?

在实际开发中&#xff0c;我们通常会将某些常见组件进行二次封装&#xff0c;以便更好地实现特定的业务需求。然而&#xff0c;在封装 Table 组件时&#xff0c;遇到一个问题&#xff1a;Table 内部暴露的方法&#xff0c;在封装之后的组件获取不到。 代码展示为&#xff1a; …

【Framework系列】UnityEditor调用外部程序详解

需求介绍 之前Framework系列有介绍过导表配置工具&#xff0c;感兴趣的小伙伴可以看一看之前的文章《【Framework系列】Excel转Json&#xff0c;配置表、导表工具介绍》。由于导表工具和Unity是两个工程&#xff0c;导表工具不在Unity工程之内&#xff0c;所以在配置生成完成之…

redis序列化数据查询

可以看到是HashMap&#xff0c;那么是序列化的数据 那么我们来获得反序列化数据 import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.ObjectInputStream; import redis.clients.jedis.Jedis;public class RedisDeserializeDemo {public static…

ui->tableView升序

亮点 //设置可排序ui->tableView->setSortingEnabled(true);ui->tableView->sortByColumn(0,Qt::AscendingOrder); //排序void Widget::initTable() {//设置焦点策略:ui->tableView->setFocusPolicy(Qt::NoFocus);//显示网格线:ui->tableView->se…

Dubbo源码解析-服务导出(四)

一、服务导出 当我们在某个接口的实现类上加上DubboService后&#xff0c;就表示定义了一个Dubbo服务&#xff0c;应用启动时Dubbo只要扫描到了DubboService&#xff0c;就会解析对应的类&#xff0c;得到服务相关的配置信息&#xff0c;比如&#xff1a; 1. 服务的类型&…