文章目录
- 解决什么实际问题?
- 算法结构
解决什么实际问题?
主要是解决传统特征匹配和之前的基于深度学习特征匹配不稳定和不准确的问题。传统的特征匹配方法主要依赖于特征点的检测,如果特征点的检测出现问题,比如某一些的关键点没有检测到,就会直接影响特征点的匹配。上述问题可以总结成特征点检测很稀疏。此外特征点的检测还存在 位置不同但是特征很相似的问题,比如两个在白墙上的点,虽然位置不同但是特征很相似。这也是之前的算法无法解决的问题。
算法结构
那么这个算法是如何来解决上述提到的问题的问题的呢?
首先这个算法没有针对检测特征点的,就可以直接解决之前因为没有检测好特征点而对最终结果的影响。 首先,这个网络的输入是两张照片,是通过一个简单的CNN来提取分别提起 coarse-level 和 fine-level的特征图。 将coarse level的特征图展开,并且进行位置编码然后加到特征图上。目的是让每一个特征都有一个位置信息,这个可以对“位置不同但是信息很相似”问题的解决做出贡献。
为了寻找两张照片之间的联系,需要寻找两个特征之间的相关性。但是我们只希望将照片中最重要的部分拿去做关联,而不是将所有点都拿去做关联。 所以这里采用的是 self-attention + cross_attention的结构。这正好满足这个需求,先使用self-attention来做自相关,找到自身最重要的特征,然后再把这个最重要的特征拿和另一张图最重要的特征做cross-attention。重复多次,就可以找到两个图像之间最重要位置的相关性。
Matching Module
之前的操作可以看成是特征的重组,但是没有进行匹配。这个方法匹配模式分别是粗力度匹配和细腻度匹配 。前者的匹配我认为可以理解成是特征图大致区域的匹配,因为它这一步主要是计算之前得到特征相关性的confidence。但是因为是transfomer做的,它会把图像变成很多小patch,这个小patch在特征图里面的表示就是一个点了。在粗匹配中,先筛除相关性比较低的点, 然后将相互相关度都很高的点匹配起来(相互最近邻)。这是因为,两张特征图之间有可能出现 a 和b的相关度最高,但是和b相关度最高的并不是a的情况,使用相互最近邻可以避免这个问题。
但是粗力度匹配不能精确到点上,他只是一个小区域的匹配,但是这个小区域里面的点要怎么匹配呢?这就是fine-level要考虑的问题了,细腻度的匹配实际上是在粗力度匹配完成的基础之做的优化。就是将匹配上的点拿出来在做优化。比如A和B 区域匹配上了,我们将他们单独拿出来,有经过一个loftr模块,也就是self-attention+cross-attention。具体在哪里?根据中心位置和其他位置的相关性,得到一个概率图,然后根据其期望来得出最终的匹配位置。