LoFTR: Detector-Free Local Feature Matching with Transformers
整体概括
Loftr特征点匹配算法与传统的特征点匹配算法的优势:
- 不需要先得到特征点,这也就解决了第一个问题
- End2End的方式,用起来比较方便,效果也更好
整体流程的核心就是Transform了下面是整个算法的一个核心的流程图
- 第一步:通过backbone进行特征提取。
- 注意:输入是两张图像分别得到不同层特征输入:[2,1,480,640]两张图像拼一起进行backbone
- 通过我们的backbone网络分别得到下采样2倍和下采样8倍的特征图。
- 使用核心的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向量,之后要考虑的就是匹配的问题了。
- 第三:粗粒度的一个匹配过程
根据上一步,我们多次的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,⋅))j⋅softmax(S(⋅,j))i.
- softmax表示分别对两张图中的内积结果做归一化,
得到概率值
这里的粗粒度的匹配完成的并不是像素点到像素点的匹配而是位置到位置的一个匹配 原因在4800个点并非是整个图像区域内的所有的点而是提取过特征信息之后的点。
得到计算的关系之后我们如何的进行匹配呢?
- 通过阈值进行一部分过滤操作去掉置信度水平过低的点。
- 我们通过计算从A图得到的一个点匹配上了B图上的一个点,那么从B图来说A这个点是我们关系最大的一个匹配点吗? 也就是要相互运算
现在我们完成的是粗粒度的匹配,也就是说经过Transform之后完成的实际上是区域之间的匹配问题。但是区域之间的点的匹配会存在一定的偏差。
- 由此我们引出了最后一步,进行最后一步的细粒度匹配的问题。
在上一步的基础上继续调整,咱们就叫它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(实际位置)