论文阅读笔记《COTR: Correspondence Transformer for Matching Across Images》

本文提出了一种使用Transformer架构进行关键点匹配的算法,通过结合自注意力和跨注意力机制处理图像特征。算法包括特征提取、位置编码、Transformer编码解码以及多层感知机预测等步骤,并通过迭代聚焦方法提高匹配精度。对于尺度变化,通过循环一致性损失筛选共同可见部分,以适应不同尺度的图像。此外,还提出剔除误匹配点的策略,以提高匹配质量。实验表明,该方法在稀疏和稠密匹配任务中表现出色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

核心思想

  本文提出一种使用Transform实现关键点匹配的算法。传统的关键点匹配算法通常包含:关键点检测、特征描述、特征匹配、利用几何约束筛除误匹配点等步骤。本文则是采用深度学习中最新的Transformer技术,实现关键点的匹配任务。作者把关键点匹配任务看作通过最小化损失函数得到最佳参数的过程,,给定一幅图像 I I I和图像中待匹配的点坐标 x x x,从另一幅图像 I ′ I' I中寻找到对应的匹配点 x ′ x' x,损失函数的定义如下
在这里插入图片描述
其中 L c o r r L_{corr} Lcorr表示匹配损失, L c y c l e L_{cycle} Lcycle表示循环一致性损失,目标就是得到最优的参数函数 F Φ F_{\Phi} FΦ。算法处理流程如下图所示
在这里插入图片描述
  两个结构相同参数共享的特征提取网络 ε \varepsilon ε将图像下采样得到尺寸为16 * 16 * 256的特征图,将原图 I I I和目标图 I ′ I' I对应的特征图沿水平方向拼接起来,得到尺寸为16 * 32 *256的特征图,这样做的目的是让后面的Transformer编码过程能够建立起每幅图像内部(自注意力)和两幅图像之间的(跨注意力)位置关系。然后,对位置坐标进行线性编码,编码过程如下
在这里插入图片描述
其中 x = [ x , y ] \textbf{x}=[x,y] x=[x,y]表示每个点的坐标, N N N表示特征图通道数,本文取 N = 256 N=256 N=256。因为 p k ( x ) p_k(\textbf{x}) pk(x)包含四个值( x , y x,y x,y分别对应两个值),因此位置坐标编码 P ( x ) P(\textbf{x}) P(x)的尺寸也为16 * 32 * 256,将位置坐标编码与拼接后的特征图相加,得到上下文特征图 c c c
在这里插入图片描述
  将特征图 c c c输入到Transformer编码器 T ε T_{\varepsilon} Tε中,并将编码结果 T ε ( c ) T_{\varepsilon}(c) Tε(c)和待匹配的点 x x x对应的编码值 P ( x ) P(x) P(x)一起输入到Transformer解码器 T D T_{D} TD中,最后将解码结果输入到一个多层感知机 D D D中得到最终的预测坐标值。
在这里插入图片描述
  在前向计算过程中,由于Transformer计算成本较高,因此需要对图像进行严重的下采样,这使得匹配的准确性受到较大影响,为缓解这个问题,作者提出了一种迭代聚焦逐步优化的方法,如下图所示。
在这里插入图片描述
首先将原图进行下采样,并在下采样后的图像上进行匹配,以计算出来的匹配点位置坐标为中心,重新在原图上选取对应大小尺寸的图块,重新进行匹配。反复迭代,并且每次迭代图款尺寸都会缩小为原来的1/2,这样起到一种逐步聚焦的效果,得到更加精确的匹配结果。
  对于尺度变化较大的匹配图像,作者认为尺度变化的比例应该和两幅图像之间共同可见部分的图像比例一致,如下图所示
在这里插入图片描述
作者认为近处拍摄宫殿(图1)相对于远处拍摄宫殿(图2)的放大比例,与两幅图之间的共同可见部分(图3和图4)之间的比例是一样的。为了补偿这个尺度变化,作者先对下采样后的原图进行一次匹配,并根据循环一致性损失值滤除掉两幅图之间不是共同可见的部分,得到图3和图4的效果。根据图3和图4中有效像素数目的比例,来调整从原图 I I I和目标图 I ′ I' I中选取的图块尺寸。
  对于不同尺寸的图像,本文都将其变形为256 * 256大小输入到网络中,而由于使用了上文介绍的迭代聚焦逐步优化的方法,即使对于那些长宽比比较大的图像,本文仍能取得较好的匹配效果。
  对于错误的匹配点(部分匹配点由于遮挡或者视野变化并不存在真实匹配点),本文选择将其筛除。筛选方法一方面是根据循环一致性损失,将循环一致性损失超过一定阈值的匹配点筛除;另一方面是将迭代聚焦过程中不能收敛的匹配点筛除。
  对于稠密的匹配任务(每个点都要进行匹配,如立体匹配或光流估计任务),可以通过逐点匹配的方式或对稀疏匹配结果进行插值处理的方式完成,后者能够利用GPU更高效的实现。

实现过程

网络结构

  特征提取网络采用ResNet-50网络,Transformer的编码解码器都包含6层网络,每个编码器层都包含一个8 heads的自注意力层;每个解码器都包含一个8 heads的编码解码注意力层,但没有自注意力层。多层感知机包含3个全连接层。

损失函数

  在这里插入图片描述

训练策略

  训练过程分为三个阶段,第一阶段冻结特征提取网络部分的参数(该部分参数已经在ImageNet数据集上进行预训练),只对剩余部分网络进行训练,共300k次迭代;然后对整个网络进行端到端的训练,共2M次迭代;最后采用上文介绍的迭代聚焦方法进行训练,共300次迭代。

算法推广

  本文提出的算法可在稀疏匹配,稠密匹配,大基线立体匹配和光流估计等任务中取得SOTA的效果。

创新点

  • 采用Transformer结构实现图像关键点的匹配过程,并将稀疏匹配和稠密匹配整合为一个参数优化的问题
  • 提出了一种迭代聚焦,逐步优化的匹配方法

算法评价

  本文较早的将Transformer技术引入到图像匹配的领域中,并且针对Transformer结构需要对图像进行多次下采样来降低计算量的问题,提出了迭代聚焦,逐步优化的方法,在保证计算速度的条件下,提高了匹配的精度。对于尺度变化较大的图像、尺寸不一致的图像以及误匹配点等问题也提出了相应的解决措施。

如果大家对于深度学习与计算机视觉领域感兴趣,希望获得更多的知识分享与最新的论文解读,欢迎关注我的个人公众号“深视”。在这里插入图片描述

### 关于 Image Matching 的数据集和资源 #### 数据集概述 对于图像匹配任务,存在多个公开可用的数据集,这些数据集提供了丰富的场景用于模型训练和评估。例如,在命令 `ln -s ImageMatch_dataset/data/descriptors descriptors` 中提到的路径可能指向一个本地存储的描述符文件夹[^1]。 ScanNet 是一种广泛使用的室内两视角匹配数据集,它由 1613 个序列组成,每个序列都包含了 RGB 图像、深度地图以及相机的姿态信息。该数据集的特点在于其展示了较大的视图变化和重复或无纹理的图案[^3]。这使得 ScanNet 成为测试算法鲁棒性和泛化能力的理想平台。 另外,《COTR: Correspondence Transformer for Matching Across Images》这篇论文也提到了一些重要的实验细节,比如遵循 SuperGlue 和 LoFTR 的相同训练与测试协议来确保对比的一致性[^2]。 以下是几个常用的图像匹配数据集: - **HPatches**: 提供了不同光照条件下的多视角图像对集合。 - **MegaDepth**: 跨尺度的大规模室外场景数据集,适合处理大范围几何变换的任务。 - **ScanNet (已提及)**: 主要针对室内的复杂环境设计而成。 - **YFCC100M**: 包含超过一亿张图片及其元数据,可用于构建自定义子集来进行特定研究方向上的探索。 #### 示例代码片段 下面是一个简单的 Python 脚本示例,展示如何加载并预览 MegaDepth 数据集中的一部分内容: ```python import os from PIL import Image def load_megadepth_images(base_dir, pair_id): img_paths = [ f"{base_dir}/pairs/{pair_id}_im1.jpg", f"{base_dir}/pairs/{pair_id}_im2.jpg" ] images = [] for path in img_paths: if not os.path.exists(path): raise FileNotFoundError(f"The file {path} does not exist.") image = Image.open(path).convert('RGB') images.append(image) return images if __name__ == "__main__": base_directory = "/path/to/megadepth/" sample_pair = "example_pair_0001" try: imgs = load_megadepth_images(base_directory, sample_pair) print("Successfully loaded the following images:") for i, im in enumerate(imgs): print(f"Image {i}: Size={im.size}") except Exception as e: print(e) ``` #### 注意事项 当使用上述任何数据集时,请务必查阅官方文档以了解许可条款和其他重要说明。此外,考虑到某些大型数据集可能会占用大量磁盘空间,建议提前规划好存储方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深视

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值