LoFTR: Detector-Free Local Feature Matching with Transformers—特征点匹配算法系列

news2024/11/20 1:54:18

LoFTR: Detector-Free Local Feature Matching with Transformers

受到:受到开创性作品 SuperGlue 的启发

摘要总结:

在这里插入图片描述

提出了一种局部图像特征匹配的新方法。更为突出说明的是室内场景下的特征点的匹配问题。

  1. 不是依次执行图像特征检测、描述和匹配,也就是传统的图像匹配算法主要是采用了手工制作的特征(例如具有 SIFT 描述符 的 Hessian 仿射检测器)在强烈的视点变化和恒定照明下获得了令人印象深刻的性能。

手工制作的特征”在这里指的是那些通过算法直接从图像数据中提取的特征,这些特征的提取和描述过程是由人类基于对图像属性的理解来设计的,而不是通过机器学习模型自动学习得到的。

  1. 论文提出了首先在粗略水平上建立像素级密集匹配,然后在精细水平上细化良好的匹配

  2. 我们在 Transformer 中使用自注意力层和交叉注意力层来获取以两个图像为条件的特征描述符。

  3. Transformer 提供的全局感受野使我们的方法能够在低纹理区域产生密集匹配。而特征检测器通常很难在这些区域产生可重复的兴趣点。

在这里插入图片描述
本文的创新点在于Transformer提供的全局感受野使得该方法能够在低纹理区域产生密集匹配。

相关背景介绍:

减少篇幅突出重点的知识,对引言和相关工作中的一些背景知识进行简单的总结和概括。

传统的sift特征点检测算法分为了三个步骤

  • feature detection, :在检测阶段,首先将角点等显着点检测为每个图像中的兴趣点
  • feature description, 然后在这些兴趣点的邻域区域周围提取局部描述符
  • and feature matching. 最近邻搜索或更复杂的匹配算法找到它们的点对点对应关系。

好处:特征检测器的使用减少了匹配的搜索空间,并且得到的稀疏对应足以满足大多数任务

之前自己看的几篇论文基于神经网络cnn(领域共识网络)就无法区分不明显的区域。论文中它说是因为无法获得全局的感受野的问题,也间接的说明了全局感受野的重要性。

解决问题的方式:全局感受野,同时加入位置编码之后还会和位置相关。从而在匹配的时候会考虑到位置的信息。

之后我们着重介绍点匹配的发展阶段,这种局部的特征点匹配是如何发展到商汤科技和浙大的这篇cvpr2021的阶段的

阶段一:Detector-based Local Feature Matching

  • Detector-based Local Feature Matching 基于检测器的局部特征匹配:SIFT ORB LIFT
  • 基于学习的局部特征匹配方法SuperGlue:受两组兴趣点及其描述符作为输入,并通过图神经网络 (GNN) 学习它们的匹配。SuperGlue 中的注意力范围也仅限于检测到的兴趣点。

阶段二:Detector-free Local Feature Matching

  • Detector-free Local Feature Matching基于无检测器的局部特征匹配方法。
    • SIFT Flow
    • NCNet
    • Sparse NCNet
    • DRC-Net:提出了从粗到细的过程

阶段三:Transform处理长序列工作的兴起。

核心方法

核心:建议通过无检测器设计来解决特征检测器的可重复性问题

什么是特征检测器的可重复性问题呢?

特征检测器的可重复性问题指的是,在图像序列或不同视角下,特征检测器能否稳定地检测到相同的特征点。可重复性高的特征检测器能够在不同图像中准确地检测并匹配相同的特征点,这对于图像配准、立体视觉和三维重建等任务至关重要。

Local Feature Extraction

  1. 使用带有FPN的CNN网络(RestNet)主要是两个尺度1/8和1/2
  2. 表示形式分别为:

F ~ A  and  F ~ B \tilde{F}^{A} \text { and } \tilde{F}^{B} F~A and F~B

F ^ A  and  F ^ B \hat{F}^{A} \text { and } \hat{F}^{B} F^A and F^B

Local Feature Transformer (LoFTR) Module

在这里插入图片描述

也就是对应的比较核心的:(LoFTR) Module部分。——提取位置和上下文相关的局部特征

将1/8的特征图展平之后经过Transform之后得到的形式为:

F ~ t r A F ~ t r B \tilde{F}_{t r}^{A} \tilde{F}_{t r}^{B} F~trAF~trB

简单的介绍了一下Transform的基础信息,与信息检索类似,查询向量 Q 从值向量 V 中检索信息。根据 Q 和每个值 V 对应的关键向量 K 的点积计算出的注意力权重。

Attention ⁡ ( Q , K , V ) = softmax ⁡ ( Q K T ) V \operatorname{Attention}(Q, K, V)=\operatorname{softmax}\left(Q K^{T}\right) V Attention(Q,K,V)=softmax(QKT)V

直观上,注意力操作通过测量查询元素与每个关键元素之间的相似度来选择相关信息。 输出向量是按相似度分数加权的值向量的总和。 结果,如果相似度高,则从值向量中提取相关信息。 这个过程在图神经网络中也称为“消息传递”

在这里插入图片描述

线性的Transform层

将Q和K的长度表示为N,将它们的特征维度表示为D Transformer 中 Q 和 K 之间的点积随着输入序列的长度呈二次方增长的计算成本 (O(N2))。

提出通过用替代核函数 sim(Q,K) = φ(Q) · φ(K)T 替换原始注意力层中使用的指数核,将 Transformer 的计算复杂度降低到 O(N),其中 φ( ·) = elu(·) + 1。

模型不再需要计算和存储整个注意力矩阵,从而显著减少了内存和计算资源的需求.

在这里插入图片描述
sim ⁡ ( Q , K ) = ϕ ( Q ) ⋅ ϕ ( K ) T ϕ ( . ) = elu ⁡ ( . ) + 1 \begin{array}{c} \operatorname{sim}(Q, K)=\phi(Q) \cdot \phi(K)^{T} \\ \phi(.)=\operatorname{elu}(.)+1 \end{array} sim(Q,K)=ϕ(Q)ϕ(K)Tϕ(.)=elu(.)+1

在这里插入图片描述

之后论文的后面提到了参考DETR中的思想引入位置编码的概念。By adding the position encoding toF˜A andF˜B

这对于 LoFTR 在不明显的区域中产生匹配的能力至关重要自己理解也就是在匹配的时候具有位置信息的学习能力了。

在这里插入图片描述
虽然白墙的颜色是均匀的但是经过Transfrom之后因为位置的不同产生颜色上的变化的。

Self-attention and Cross-attention Layers

交替的经过自注意力层和交叉注意力层。输入的特征表示为:

f i  and  f j f_{i} \text { and } f_{j} fi and fj

图a:(a) 卷积的感受野图示图(b)Transform的感受野的形式。

Transformers 的全局感受野使得这种连接只需通过一个注意力层就可以建立。

在这里插入图片描述

Establishing Coarse-level Matches

在经过局部的Transfrom的特征提取模块之后,将得到的

F ~ t r A F ~ t r B \tilde{F}_{t r}^{A} \tilde{F}_{t r}^{B} F~trAF~trB

部分送入到粗粒度匹配的部分中去执行第一个阶段的匹配过程。通过下面的公式来计算:变换后特征之间的得分矩阵 S

S ( i , j ) = 1 τ ⋅ ⟨ F ~ t r A ( i ) , F ~ t r B ( j ) ⟩ . \mathcal{S}(i, j)=\frac{1}{\tau} \cdot\left\langle\tilde{F}_{t r}^{A}(i), \tilde{F}_{t r}^{B}(j)\right\rangle . S(i,j)=τ1F~trA(i),F~trB(j).

可以在S的两个维度上应用softmax(以下称为双softmax)通过归一化来获得相互最近邻匹配的概率:

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.

之后就可以基于上面算出的置信度矩阵Pc,来进行匹配的选择了Match Selection
选择置信度高于阈值 θc 的匹配,并进一步强制执行相互最近邻 (MNN) 标准它过滤可能的异常值粗匹配(这里的意思是说要互相的进行相关性运算,也就是A与B计算成立之后,还要通过B与A进行一个相关性的运算)。 我们表示粗级匹配预测为下面的形式:

M c = { ( i ~ , j ~ ) ∣ ∀ ( i ~ , j ~ ) ∈ MNN ⁡ ( P c ) , P c ( i ~ , j ~ ) ≥ θ c } \mathcal{M}_{c}=\left\{(\tilde{i}, \tilde{j}) \mid \forall(\tilde{i}, \tilde{j}) \in \operatorname{MNN}\left(\mathcal{P}_{c}\right), \mathcal{P}_{c}(\tilde{i}, \tilde{j}) \geq \theta_{c}\right\} Mc={(i~,j~)(i~,j~)MNN(Pc),Pc(i~,j~)θc}

这里的粗粒度可以看作是区域之间的匹配过程了。

Coarse-to-Fine Module

建立粗略匹配后,使用从粗到细的模块将这些匹配细化到原始图像分辨率。

在这里插入图片描述

  1. 将其位置(ˆi,ˆj)定位在精细级特征图上

F ^ A  and  F ^ B \hat{F}^{A} \text { and } \hat{F}^{B} F^A and F^B

也就是从粗的匹配进一步细化到细的匹配上:
( i ~ , j ~ ) − > ( i ^ , j ^ ) (\tilde{i}, \tilde{j}) -> (\hat{i}, \hat{j}) (i~,j~)>(i^,j^)

  1. 然后裁剪两组大小为 w × w 的局部窗口。 然后,较小的 LoFTR 模块将每个窗口内的裁剪特征变换 Nf 次产生两个变换后的局部特征图

F ^ t r A ( i ^ )  and  F ^ t r B ( j ^ ) \hat{F}_{t r}^{A}(\hat{i}) \text { and } \hat{F}_{t r}^{B}(\hat{j}) F^trA(i^) and F^trB(j^)

其中i和j表示的是区域的中心位置信息。

在这里插入图片描述

  1. 然后,我们将 FA tr (ˆi) 的中心向量与 ˆB tr (ˆj) 中的所有向量相关联,从而生成一个热图,该热图表示 ˆj 与 ˆi 邻域中每个像素的匹配概率

  2. 通过计算概率分布的期望,我们得到待匹配的IB图上亚像素精度的最终位置。从而完成最终的匹配过程。

对于最后的训练部分因为是工业上落地的实现项目了,在训练的时候分为了室内场景的训练和室外场景的训练。训练所使用的数据集的大小和GPU资源不是我们能够在复刻的,因此后面的重点是学习预训练模型的加载的流程同时查看源码。

算法整体概括

论文原文中对于核心细节的描述过程较为的抽象,因此在这个部分在对其中涉及到的一些细节的部分进行补充说明。

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. 由此我们引出了最后一步,进行最后一步的细粒度匹配的问题。

补充Pytorch中的unfold操作。
torch.nn.functional.unfold(input, kernel_size, dilation=1, padding=0, stride=1)
input:输入张量
kernel_size:int或tuple类型,表示要提取的区域的大小
dilation:int或tuple类型,控制核的点之间的间隔,默认为1
padding:int或tuple类型,输入的每一侧添加额外的0,默认为0
stride:int或 tuple 类型,控制窗口在输入张量上滑动的步长,默认为1

unfold 是展开的意思,在 torch 中则是只卷不积,相当于只滑窗,不进行元素相乘

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

在这里插入图片描述

这里举例,w和h分别是5x5的区域 c代表的是128维的特征。

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

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

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

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

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

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

在这里插入图片描述
在细粒度中,我们针对25个位置还要走Self Attention和Cross Attention.也就是输入142x25x128这样一个矩阵经过和之前同样的一个运算的方式。

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

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

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

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

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

相关文章

Percona XtraBackup备份docker版本mysql 5.7

my.cnf配置文件 [client] default_character_setutf8[mysqld] # 数据存储目录(必须手动指定) datadir/var/lib/mysql/data# 字符集 collation_server utf8_general_ci character_set_server utf8 # 二进制日志 server-id1 log_bin/var/log/mysql/binl…

Windows安装vcpkg教程(VS2022)

内容摘要: 本文详细介绍如何在Windows系统上使用 Git 克隆 vcpkg 仓库来安装vcpkg工具,并链接Visual Studio 2022。 目录 一、关于vcpkg 二、开发环境 三、安装Git 四、使用 Git 克隆 vcpkg 仓库 一、关于vcpkg vcpkg 是一个开源的 C 包管理工具&am…

nodejs入门(1):nodejs的前后端分离

一、引言 我关注nodejs还是从前几年做了的一个电力大数据展示系统开始的,当然,我肯定是很多年的计算机基础的,万变不离其宗。 现在web网站都流行所谓的前后端结构,不知不觉我也开始受到这个影响,以前都是前端直接操作…

智能停车解决方案之停车场室内导航系统(二):核心技术与系统架构构建

hello~这里是维小帮,如有项目需求和技术交流欢迎大家私聊我们!点击文章最下方获取智慧停车场方案~撒花! 随着城市化进程的加速,停车难问题日益凸显。智能停车系统作为缓解停车压力的有效手段,其核心技术与架构的构建至…

Django5 2024全栈开发指南(三):数据库模型与ORM操作

目录 一、模型的定义二、数据迁移三、数据表关系四、数据表操作4.1 Shell工具4.2 数据新增4.3 数据修改4.4 数据删除4.5 数据查询4.6 多表查询4.7 执行SQL语句4.8 数据库事务 Django 对各种数据库提供了很好的支持,包括 PostgreSQL、MySQL、SQLite 和 Oracle&#x…

中仕公考怎么样?事业编面试不去有影响吗?

事业编考试笔试已经通过,但是面试不去参加会有影响吗? 1. 自动放弃面试资格:未能按时出席事业单位的面试将被视为主动放弃该岗位的竞争机会。 2. 个人信誉问题:面试作为招聘流程的关键步骤,无故缺席可能被解释为诚信…

MySql结合element-plus pagination的分页查询

实现效果如下: 重点:使用mysql查询的limit和offset 原生SQL写法: select c.id as deptid,c.name as department,position,a.name staffname,2024-11 as shijian ,CASE WHEN b.shijian IS NULL THEN no ELSE yes END AS submit from fa_wecom…

学习笔记019——Ubuntu部署tomcat

1、下载Tomcat压缩包。本人下载的版本是:apache-tomcat-8.5.77.tar.gz 2、将压缩包上传到Ubuntu某个目录。 本人存放的目录是 /opt 目录下, 命令解压: ## 解压tomcat压缩包 tar -zxvf apache-tomcat-8.5.77.tar.gz 3、vim打开bin目录的setclasspath…

【JavaSE】(6)抽象类和接口

目录 一、抽象类 1、什么是抽象类 2、抽象类的特点 3、抽象类的作用 4、抽象类示例代码 二、接口 1、什么是接口 2、接口的书写建议 3、接口的特点 4、实现多个接口 5、接口能“忘记类型” 6、接口间的继承 7、接口的应用 7.1、引用类型的比较--Comparable 和 Co…

Git学习教程(更新中)

持续更新完善中… 1 Git简介 1.1 Git是什么? Git是一个开源的分布式版本控制系统,由Linus Torvalds创建,用于有效、高速地处理从小到大的项目版本管理。它能够记录项目文件的变更历史,让多个开发者可以协作开发同一个项目&#…

TON商城与Telegram App:生态融合与去中心化未来的精彩碰撞

随着区块链技术的快速发展,去中心化应用(DApp)逐渐成为了数字生态的重要组成部分。而Telegram作为全球领先的即时通讯应用,不仅仅满足于传统的社交功能,更在区块链领域大胆探索,推出了基于其去中心化网络的…

〔 MySQL 〕数据类型

目录 1.数据类型分类 2 数值类型 2.1 tinyint类型 2.2 bit类型 2.3 小数类型 2.3.1 float 2.3.2 decimal 3 字符串类型 3.1 char 3.2 varchar 3.3 char和varchar比较 4 日期和时间类型 5 enum和set mysql表中建立属性列: 列名称,类型在后 n…

两行命令搭建深度学习环境(Docker/torch2.5.1+cu118/命令行美化+插件),含完整的 Docker 安装步骤

深度学习环境的配置过于繁琐,所以我制作了两个基础的镜像,希望可以帮助大家节省时间,你可以选择其中一种进行安装,版本说明: base 版本基于 pytorch/pytorch:2.5.1-cuda11.8-cudnn9-devel,默认 python 版本…

免费实时图片编辑工具:MagicQuill

参看: https://huggingface.co/spaces/AI4Editing/MagicQuill 人工智能交互式图像编辑:可以制定涂改增加删除

前端学习八股资料CSS(五)

更多详情:爱米的前端小笔记,更多前端内容,等你来看!这些都是利用下班时间整理的,整理不易,大家多多👍💛➕🤔哦!你们的支持才是我不断更新的动力!找…

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言:自2021年起,翼鸥教育便开始应用OceanBase社区版,两年间,先后部署了总计12套生产集群,其中核心集群占比超过四分之三,所承载的数据量已突破30TB。自2022年10月,OceanBase 社区发布了4.2.x 版…

如何在 Ubuntu 22.04 上安装 ownCloud

简介 ownCloud 是一个开源的个人云存储平台,它允许用户在本地服务器上存储和同步文件,提供了一个类似于 Dropbox 或 Google Drive 的服务,但是更加注重隐私和数据控制。以下是 ownCloud 的一些基础使用简介: 文件存储&#xff1…

使用Mybatis向Mysql中的插入Point类型的数据全方位解析

1. 结果 希望每一个能够看到结果的人都能自己装载进去!加油! 2.代码 2.1TestMapper import org.apache.ibatis.annotations.*; import java.util.Date; import java.util.List;/*** author Administrator*/ Mapper public interface TestMapper {/*…

web——sqliabs靶场——第六关——报错注入和布尔盲注

这一关还是使用报错注入和布尔盲注 一. 判断是否有sql注入 二. 判断注入的类型 是双引号的注入类型。 3.报错注入的检测 可以使用sql报错注入 4.查看库名 5. 查看表名 6.查看字段名 7. 查具体字段的内容 结束 布尔盲注 结束

鸿蒙实战:页面跳转传参

文章目录 1. 实战概述2. 实现步骤2.1 创建鸿蒙项目2.2 编写首页代码2.3 新建第二个页面 3. 测试效果4. 实战总结 1. 实战概述 本次实战,学习如何在HarmonyOS应用中实现页面间参数传递。首先创建项目,编写首页代码,实现按钮跳转至第二个页面并…