COTR 网络(图像匹配)

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)、视觉定位、点跟踪和人体姿态估计 。这个问题存在两个基本研究方向:

  1. 一种是从两个图像中提取稀疏关键点集并进行匹配,以最小化对齐度量。
  2. 另一种是将对应解释为密集过程,其中第一幅图像中的每个像素映射到第二幅图像中的像素。

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} 104,批量大小为 24。然后,我们解冻骨干网络并以 1 0 − 5 10^{−5} 105 的学习率和 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实现该网络,同时继续学习图像匹配相关的网络模型。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记录一次hss不能防护主机的问题

场景:hss的控制台显示不在防护中,其他云主机并没有这个情况。 故障发生的时间是昨天下午15点半左右,运维同事做了重启网卡的操作。service network restart 排查分析: 于是仔细的查看日志,发现报错如下&#xff1a…

openstack中windows虚拟机时间显示异常问题处理

文章目录 一、问题描述二、元数据信息总结 一、问题描述 openstack创建出windows虚拟机的时候,发现时间和当前时间相差8小时,用起来很难受。 参考:https://www.cnblogs.com/hraa0101/p/11365238.html 二、元数据信息 通过设置镜像的元数据…

边缘计算采集网关如何助力制造企业解决数采问题-天拓四方

一、企业背景 某大型制造企业,位于国内某经济发达的工业园区内,拥有多个生产线和智能化设备,致力于提高生产效率、降低运营成本。随着企业规模的扩大和生产自动化的推进,该企业面临着海量数据处理、实时响应和网络安全等多重挑战…

vmware 中的Ubuntu系统虚拟机忘记root密码强制重置操作

忘记密码情况下,vmware虚拟机重置Ubuntu的root密码 在企业使用的vmware ESXI中重置Ubuntu系统root密码 1-本地电脑安装个人版的vmware workstation,目的:vmware ESXI自带的远程控制台无法输入指定的键盘按键,需要借助外部的远程辅…

spring.rabbitmq.listener.simple.default-requeue-rejected = false 和放入死信队列的区别

目录 一、场景 二、使用 spring.rabbitmq.listener.simple.default-requeue-rejected false 2.1 特点 三、 放入死信队列 四、两种区别 一、场景 当我们使用RabbitMq的时候,我们如果业务中有异常,很有可能造成死循环,因为 在RabbitMQ和…

AI提速 OpenAI 新模型GPT-5今年上线?

这两天,有关OpenAI新模型 GPT-5的消息又多了起来。有知情人士称,OpenAI将在今年年中的某个时候发布GPT-5,很可能是在今年夏天期间。OpenAI CEO 萨姆奥特曼在一次播客采访中透露“GPT-5的智能水平得到提升”。 有趣的是,播客的主理…

Spring Security——08,自定义失败处理

自定义失败处理 一、自定义实现类1.1 实现AccessDeniedHandler1.2 实现AuthenticationEntryPoint 二、配置SpringSecurity三、测试3.1 认证失败3.2 权限不足 一键三连有没有捏~~ 我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json&#xff0c…

AI智慧医疗:探索机器学习在医疗保健中的应用与进展

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

MySQL学习笔记------事务

事务 事务是一组操作的集合,他是一个不可分割的单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败 事务操作 create table account(id int comment ID,name varchar(10) …

Java 面向对象基础篇【接口、抽象类、实现类之间的关系】

目录 接口(Interface):抽象类(Abstract Class):实现类(Concrete Class): 接口、抽象类、实现类之间的关系类(Class): 接口、抽象类、类…

学习嵌入式可以胜任哪一些行业?

嵌入式技术之应用范围甚广,其多见于机器人、无人机、医疗器械以及军工等领域,为学习者带来诸多广泛之职业机遇。嵌入式工程师于此诸领域中扮演关键之角色,负责解决硬件平台适配等诸问题,以为创新提供支撑之力。 虽嵌入式技术与日…

[C++][算法基础]最大异或对(Trie树)

在给定的 N 个整数 &#xff0c;...... 中选出两个进行 xor&#xff08;异或&#xff09;运算&#xff0c;得到的结果最大是多少&#xff1f; 输入格式 第一行输入一个整数 N。 第二行输入 N 个整数 ~ 。 输出格式 输出一个整数表示答案。 数据范围 1≤N≤, 0≤< 输…

lua学习笔记12(多脚本和大G表)

print("*****************************多脚本执行*******************************") print("*****************************全局变量和本地变量*******************************") --全局变量 a114514 b"你干嘛&#xff0c;哎呦" for i1,2 doc&…

【Spring Security】2.实现最简单的身份验证

文章目录 一、找到官网的身份认证&#xff08;authentication&#xff09;示例代码二、实现最简单的身份验证1、创建Spring Boot项目2、创建IndexController3、创建index.html4、启动项目测试Controller 三、{/logout}的作用四、页面样式无法加载的问题 一、找到官网的身份认证…

【MATLAB源码-第36期】matlab基于BD,SVD,ZF,MMSE,MF,SLNR预编码的MIMO系统误码率分析。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. MIMO (多输入多输出)&#xff1a;这是一个无线通信系统中使用的技术&#xff0c;其中有多个发送和接收天线。通过同时发送和接收多个数据流&#xff0c;MIMO可以增加数据速率和系统容量&#xff0c;同时提高信号的可靠性。…

顺子日期(StringBuffer)

题目 public class Main {static int[] date new int[] {0,31,28,31,30,31,30,31,31,30,31,30,31};public static boolean res(StringBuffer s) {String ss s.toString();//yyrrfor(int i0;i<2;i) {int x Integer.parseInt(s.charAt(i)"");int y Integer.par…

适配版图再扩大!忆联多项产品通过Intel VROC技术认证

近日&#xff0c;深圳忆联信息系统有限公司&#xff08;简称&#xff1a;忆联&#xff09;的数据中心级固态硬盘 UH711a以及企业级固态硬盘UH811a/UH831a与英特尔VROC 7.8完成兼容认证&#xff0c;测试期间&#xff0c;整体运行稳定&#xff0c;在功能、性能及兼容性方面表现良…

libevent源码解析-定时机制,信号处理,流量控制

概述 libevent的event&#xff0c;event_callback&#xff0c;event_base除了可以用来支持套接字的自动和手动分发&#xff0c;也可用来支持定时机制&#xff0c;信号处理&#xff0e;这里&#xff0c;我们补充对定时机制&#xff0c;信号处理的分析&#xff0e; libevent中的…

2024.4.4-day09-CSS 布局模型(标准流模型、浮动模型)

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;HTML5和CSS3悦读 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 作业 2024.4.4-学习笔记1 CSS 布局模型1.1 标准流1.2 CSS 浮动1.3 去除塌陷 2…

golang es查询的一些操作,has_child,inner_hit,对索引内父子文档的更新

1.因为业务需要查询父文档以及其下子文档&#xff0c;搞了很久才理清楚。 首先还是Inner_hits,inner_hits只能用在nested,has_child,has_parents查询里面 {"query": {"nested": {"path": "comments","query": {"match…