COTR 网络(图像匹配)
- 摘要
- Abstract
- 1. COTR网络
- 1.1 文献摘要
- 1.2 研究背景
- 1.3 COTR网络架构
- 1.4 创新点
- 1.5 实验
- 1.5.1 数据集
- 1.5.2 具体实施
- 1.5.3 实验数据
- 1.6 结论
- 2. COTR模型代码实现
- 总结
摘要
本周学习了图像匹配方向的COTR网络模型,COTR通过使用Transformer来捕获全局和局部先验,该网络可以在给定两幅图像和一幅图像中的查询点的情况下,在另一幅图像中找到其对应点,该网络可以选择只查询感兴趣的点并检索稀疏对应关系,或者查询图像中的所有点并获得密集映射。在推理阶段,通过逐步缩小区域的方式,应用对应网络,形成一种多尺度管线,能够提供高度精确的对应关系。本文将详细介绍COTR网络模型。
Abstract
This week, we learned about the COTR network model for image matching direction, COTR captures global and local prior by using Transformer, the network can find its counterpart in another image given two images and query points in one image, the network has the option of querying only the points of interest and retrieving sparse correspondences or querying all points in the image and obtain a dense mapping. In the inference phase, the correspondence network is applied by progressively narrowing down the region to form a kind of multiscale pipeline that can provide highly accurate correspondences. In this paper, the COTR network model is described in detail.
Translated with DeepL.com (free version)
1. COTR网络
文献来源:COTR: Correspondence Transformer for Matching Across Images
1.1 文献摘要
作者在本文提出了一种基于深度神经网络的 COTR网络,给定两个图像和其中一个图像中的查询点,在另一个图像中找到其对应关系。通过这样做,人们可以选择仅查询感兴趣的点并检索稀疏对应关系,或者查询图像中的所有点并获得 密集映射。为了捕获局部和全局先验,作者使用Transformer来实现COTR网络。
密集映射是指一个函数,它 将一个集合中的每个点都映射到另一个集合中的点,且在目标集合中的任何点的邻域中都有源集合中的点。换句话说,对于给定的两个集合,如果每个目标集合中的点都至少有一个源集合中的点映射到它,那么这个映射就被称为密集映射。密集映射在数学分析、拓扑学和其他数学领域中具有重要的作用。
1.2 研究背景
查找图像对之间的对应关系是计算机视觉中的一项基本任务,其应用范围从相机校准到光流、运动结构 (SfM)、视觉定位、点跟踪和人体姿态估计 。这个问题存在两个基本研究方向:
- 一种是从两个图像中提取稀疏关键点集并进行匹配,以最小化对齐度量。
- 另一种是将对应解释为密集过程,其中第一幅图像中的每个像素映射到第二幅图像中的像素。
COTR可以表达两种形式的先验知识(全局和局部),并从数据中隐式学习它们,作者利用密集连接网络在表示平滑函数时所具有的归纳偏差,并使用Transformer来自动控制先验的性质。作者以函数形式表达寻找图像
I
I
I 和
I
′
I'
I′ 之间的对应关系的问题,如:
其中 F Φ F_Φ FΦ 是我们的神经网络架构,由 Φ Φ Φ 参数化, x x x 索引查询位置,在 I I I 中, x ′ x' x′ 索引其在 I ′ I' I′ 中的对应位置;如下图,与稀疏方法不同,COTR 可以通过此函数映射匹配任意查询点,仅预测所需数量的匹配。与密集方法不同,COTR 隐式学习平滑度,可以有效处理大的相机运动。
1.3 COTR网络架构
作者首先使用(共享)主干 CNN
ε
\varepsilon
ε 去处理每个图像,生成大小为 16x16 的特征图,然后将其连接在一起,并添加位置编码以形成上下文特征图,结果与查询点 x 一起被输入到 Transformer T 中,Transformer 的输出由多层感知器 D 解码为对应关系
x
′
x'
x′。如下图:
用Transformer实现
F
Φ
F_Φ
FΦ。如上图所示,首先将输入裁剪并调整大小为 256 × 256 图像,然后将其转换为具有共享 CNN 主干的下采样特征图大小 16 × 16 × 256,接着并排连接两个相应图像的表示,形成大小为 16 × 32 × 256 的特征图,向其中添加坐标函数 Ω 的位置编码 P(N=256 个通道)来生成上下文特征图 c(大小为 16 × 32 × 256)
然后,将上下文特征图 c 馈送到Transformer编码器
T
ε
T_\varepsilon
Tε,并使用Transformer解码器
T
D
T_D
TD 解释其结果,以及由 P(用于生成 Ω 的位置编码器)编码的查询点
x
x
x。最后,我们使用全连接层 D 处理 Transformer 解码器的输出,以获得对应点
x
′
x'
x′ 的估计。
作者将COTR网络引入为在单个查询点 x 上运行的函数,将其扩展到多个查询点非常简单,可以简单地一次输入多个查询,转换器解码器
T
D
T_D
TD 和解码器
D
D
D 将其转换为多个坐标,在这样做的同时,不允许查询点之间存在自我关注,以确保它们能够独立解决。
通过放大进行递归推理。将Transformer注意力机制应用于视觉问题需要大量下采样的特征图,作者通过递归地应用网络 F Φ F_Φ FΦ 来解决这个问题。如下图所示:
在递归匹配图像时,可能会出现两个图像之间的比例不匹配,作者将要裁剪的补丁的比例与目标图像中常见的可见区域成比例,从而来解决这个问题,在第一轮递归迭代中使用整个图像进行计算,为了提取该区域,我们计算每个像素最粗层次的循环一致性误差,并在 256 × 256 图像上将其阈值设置为
T
v
i
s
i
b
l
e
=
5
T_{visible}=5
Tvisible=5 个像素,如下图,在后续阶段(放大)中,只需调整
I
I
I 和
I
′
I'
I′ 上的裁剪尺寸。
COTR网络需要固定 256×256 形状的图像,为了处理任意大小的图像,在初始步骤中,只需将它们调整大小(即拉伸)到 256 × 256,并估计初始对应关系。在随后的放大中,从估计点周围的原始图像中裁剪出与当前缩放级别相称的大小的方形块,并将其大小调整为 256×256。
1.4 创新点
作者通过 使用Transformer来捕获局部和全局先验,并将稀疏匹配和稠密匹配整合为一个参数优化的问题,同时通过递归放大估计来应用COTR网络,产生能够提供高精度对应的多尺度管道。
1.5 实验
1.5.1 数据集
作者在 MegaDepth 数据集上训练我们该方法,该数据集提供由 SfM 生成的图像和相应的密集深度图,这些图像来自摄影旅游,在外观和视角上表现出很大的变化。深度图的准确性足以学习准确的局部特征,为了找到可以训练的共同可见图像对,作者首先过滤掉 SfM 模型中没有共同 3D 点的图像,然后,通过将像素从一幅图像投影到另一幅图像来计算剩余图像对之间的公共区域,最后,计算投影像素的并集的交集,这考虑了不同的图像尺寸。
1.5.2 具体实施
对于主干网 E,作者使用 ResNet50 ,使用在 ImageNet 上预训练的权重进行初始化,在第四个下采样步骤之后(在第三个残差块之后)使用特征图,其大小为 16 × 16 × 1024,将其通过 1×1 卷积转换为 16×16×256。
对于 Transformer,作者使用了6层编码器和解码器,每个编码器层包含一个具有 8 个头的自注意力层,每个解码器层包含一个具有 8 个头的编码器-解码器注意力层,但没有自注意力层,以防止查询点之间相互通信。,最后,对于将 Transformer 输出转换为坐标 D 的网络,使用 3 层 MLP,每个层有 256 个单元,然后是 ReLU 激活。
随机选择训练的图像对,在第一张图像中选择一个随机查询点,并在第二张图像上找到其对应点,然后,从十个级别之一中选择一个随机缩放级别,均匀间隔,以对数比例,在 1× 和 10× 之间,然后,从第一张图像中以所需的缩放级别裁剪一个以查询点为中心的方形补丁,以及包含第二张图像中相应点的方形补丁。
模型分三个阶段进行训练。首先,我们冻结预训练的主干 E,并使用 ADAM 优化器训练网络的其余部分,进行 300k 次迭代,学习率为 1 0 − 4 10^{−4} 10−4,批量大小为 24。然后,我们解冻骨干网络并以 1 0 − 5 10^{−5} 10−5 的学习率和 16 的批量大小端到端地微调所有内容,在第三阶段,引入按上述方式生成的放大,并端到端地训练所有内容以进行进一步的 30 万次迭代。
1.5.3 实验数据
作者使用四个不同的数据集评估模型,分别是HPatches、KITTI、ETH3D、Image Matching Challenge (IMC2020)。
我们遵循该领域的评估标准,即计算所有有效像素的平均端点误差(AEPE),以及给定重投影误差阈值下的正确关键点百分比(PCK)——我们使用1、3和5 像素,即PCK-1px、PCK-3px、PCK-5px。生成图像对时,将每个场景的第一张(六张中的)图像作为参考,与其他五张图像进行匹配。在HPatches数据集下的评估结果如下表:
为了在比简单平面场景更复杂的环境中评估我们的方法,我们使用 KITTI 数据集,使用训练分割来进行此评估,以 AEPE 和“Fl.”(光流异常值的百分比)形式报告结果。作者从有效地面事实覆盖的区域中随机采样每个图像对 40,000 个点,在下表中报告了 KITTI-2012 和 KITTI2015 的结果,显然,作者的方法大大优于所有基线。在KITTI数据集下的评估结果如下表
1.6 结论
作者在本文引入了一种图像对应功能网络,能够解决稀疏和密集匹配问题,通过新颖的架构和递归推理方案,它在 HPatches、KITTI、ETH3D 和 IMC2020 的一个场景上实现了相当于或高于现有技术水平的性能。
2. COTR模型代码实现
class COTR(nn.Module):
def __init__(self, backbone, transformer, sine_type='lin_sine'):
super().__init__()
self.transformer = transformer
hidden_dim = transformer.d_model
self.corr_embed = MLP(hidden_dim, hidden_dim, 2, 3)
self.query_proj = NerfPositionalEncoding(hidden_dim // 4, sine_type)
self.input_proj = nn.Conv2d(backbone.num_channels, hidden_dim, kernel_size=1)
self.backbone = backbone
def forward(self, samples: NestedTensor, queries):
if isinstance(samples, (list, torch.Tensor)):
samples = nested_tensor_from_tensor_list(samples)
features, pos = self.backbone(samples)
src, mask = features[-1].decompose()
assert mask is not None
_b, _q, _ = queries.shape
queries = queries.reshape(-1, 2)
queries = self.query_proj(queries).reshape(_b, _q, -1)
queries = queries.permute(1, 0, 2)
hs = self.transformer(self.input_proj(src), mask, queries, pos[-1])[0]
outputs_corr = self.corr_embed(hs)
out = {'pred_corrs': outputs_corr[-1]}
return out
def build(args):
backbone = build_backbone(args)
transformer = build_transformer(args)
model = COTR(
backbone,
transformer,
sine_type=args.position_embedding,
)
return model
总结
本周学习了图像匹配方向的COTR网络,也让我初步了解了图像匹配领域,下周我会将通过pytorch实现该网络,同时继续学习图像匹配相关的网络模型。