论文阅读笔记《Nctr: Neighborhood Consensus Transformer for Feature Matching》
核心思想
本文提出一种融合邻域一致性的Transfomer结构来实现特征点的匹配(NCTR)。整个的实现流程和思想与SuperGlue相似,改进点在于考虑到了邻域一致性。邻域一致性在许多的传统图像匹配和图匹配任务中都有应用,他基于一个很重要的假设,就是对于一对匹配点,其邻域内的其他点也大概是匹配的,至少是相似程度很高的。而在SuperGlue中注意力机制是面向所有的特征点进行信息聚合,而没有考虑到局部邻域的一致性约束。为弥补上述缺陷,作者提出了NCTR

实现过程
首先,与SuperGlue相同输入的是源图AAA和目标图BBB中关键点的视觉特征diA,djBd_i^A,d_j^BdiA,djB及坐标特征piA,pjBp_i^A,p_j^BpiA,pjB,其中坐标特征pip_ipi包含关键点的二维坐标(xi,yi)(x_i,y_i)(xi,yi)和置信度得分cic_ici,上述特征均有特征提取和描述器提供,如SuperPoint。位置特征经过一个编码器后与视觉特征相加构成初始的输入特征xi(0)x_i^{(0)}xi(0),编码器由多层感知机构成。

然后,要基于注意力机制进行特征聚合。注意力机制包含自注意力(self-attention)和交叉注意力(cross-attention),给定第lll层网络的两个输入xs(l)x_s^{(l)}xs(l)和xt(l)x_t^{(l)}xt(l),对于自注意力层而言,两个输入是来自于同一个图(源图或目标图)的特征;而对于交叉注意力层而言,两个输入分别来自两个图的特征。自注意力层和交叉注意力层是交替进行的,这模拟了人类在进行匹配时会相互比对的过程。
下面简述一下注意力机制的计算过程,这个是由ViT实现的。输入的特征xs(l)x_s^{(l)}xs(l)和xt(l)x_t^{(l)}xt(l)(对于自注意力层两者相同)经过一个LayerNorm层分别被线性映射到Q(l),K(l),V(l)Q^{(l)},K^{(l)},V^{(l)}Q(l),K(l),V(l),其中xs(l)→Q(l)x_s^{(l)}\rightarrow Q^{(l)}xs(l)→Q(l),而xt(l)→K(l),V(l)x_t^{(l)}\rightarrow K^{(l)}, V^{(l)}xt(l)→K(l),V(l)。我们称Q(l),K(l),V(l)Q^{(l)},K^{(l)},V^{(l)}Q(l),K(l),V(l)分别为查询向量、键向量和值向量,他们经过下式可以得到注意力计算方法

注意力可以理解为利用QKTQK^TQKT计算向量之间的相似性作为权重对VVV向量进行加权求和,一组Q(l),K(l),V(l)Q^{(l)},K^{(l)},V^{(l)}Q(l),K(l),V(l)向量得到一个注意力结果,我们称之为一个头Head\mathbf{Head}Head。

按照相同的方法,分别构建hhh个头,并将其拼接起来经过一个线性映射层就得到了多头注意力

再将多头注意力和输入的xs(l)x_s^{(l)}xs(l)拼接起来经过线性映射层得到前向输入网络结果

最后将前向输入网络的结果与输入的xs(l)x_s^{(l)}xs(l)进行残差连接(相加)就得到该层注意力网络的输出结果

其将作为下一层注意力网络的输入继续进行计算。上述过程都是SuperGlue所采用的注意力机制,而本文是将邻域一致性引入上述计算过程。

邻域一致性模块如上图(a)所示,输入的特征xs(l)x_s^{(l)}xs(l)和xt(l)x_t^{(l)}xt(l)经过内积计算和softmax层得到对应性矩阵S~\widetilde{S}S,这并不是最终要求解的匹配关系矩阵。对源图中的特征点分别随机生成对应的颜色向量Rc∈RM×cR_c\in \mathbb{R}^{M\times c}Rc∈RM×c,MMM表示源图中特征点数量,ccc表示颜色向量的长度。这里的颜色向量可不是图像中RGB这样的颜色特征,而是用于表示匹配关系的表示方式。将源图对应的颜色向量RcR_cRc与对应性矩阵的转置S~T\widetilde{S}^TST相乘,就得到变换后的颜色向量TcT_cTc,作为目标图的颜色向量。源图和目标图中的每个关键点都作为一个节点,根据上文计算得到注意力权重作为相似性度量,并选择最相似8个节点作为每个关键点的邻域,将中心节点与8个邻域节点相连构成一个图。源图和目标图对应的边特征分别为EsE_sEs和EtE_tEt(计算方式文中没有介绍),将两幅图边特征和颜色向量分别经过GNN进行信息传递,得到新的节点颜色特征表示

两个节点颜色特征表示之间的差异就表示了两幅图之间的邻域一致性,差异越小,一致性越强。计算两个节点的颜色特征表示的差值,并经过一个多层感知机就得到了邻域一致性信息FFNCFF_{NC}FFNC

将邻域一致性信息FFNCFF_{NC}FFNC与上文介绍的前向输入网络的特征FFTRFF_{TR}FFTR级联起来,在经过一个线性映射层就得到带有邻域一致性的注意力聚合信息

与普通注意力机制相同,通过与输入特征相加得到最终的结果

带有邻域一致性的注意力机制和普通的注意力机制的实现方式和比较如图(b)所示。
最后,对聚合后的特征进行匹配,源图和目标图对应的特征向量xA,xB\mathbf{x}^A,\mathbf{x}^BxA,xB,计算内积得到相似性得分矩阵SSS,并通过Sinkhorn算法得到匹配矩阵PPP。将匹配得分PijP_{ij}Pij低于阈值的点去掉,按照互为最近邻的原则选择最终的匹配结果。损失函数是对匹配矩阵进行负指数似然损失计算

创新点
- 设计了一种邻域一致性模块,并将其引入到注意力机制计算过程中
算法总结
本文在SuperGlue的基础上提出一种带有邻域一致性的注意力机制,邻域一致性的计算思路与《DEEP GRAPH MATCHING CONSENSUS》这篇文章非常相似,实验结果来看是有一定的性能提升的,但计算复杂度较大,对于大规模的特征匹配将会存在计算成本过高的问题。
相关文章:
论文阅读笔记《Nctr: Neighborhood Consensus Transformer for Feature Matching》
核心思想 本文提出一种融合邻域一致性的Transfomer结构来实现特征点的匹配(NCTR)。整个的实现流程和思想与SuperGlue相似,改进点在于考虑到了邻域一致性。邻域一致性在许多的传统图像匹配和图匹配任务中都有应用,他基于一个很重要…...
上位机系统Ubuntu 20.04与下位机arduino UNO通讯
目录一、安装arduino IDE1.1安装方法1.1.1终端里命令下载(不推荐)1.1.2官网下载(不推荐)1.1.3论坛下载(不推荐)1.1.4系统应用商店(推荐!)1.2配置项目文件位置1.3测试IDE功…...
hive面试题
1、什么是Hive Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能(HQL) 2、Hive的意义(最初研发的原因) 避免了去写MapReduce,提供快速开发的…...
【CUDA】《CUDA编程:基础与实践》CUDA加速的关键因素
CUDA事件计时 CUDA提供了一种基于CUDA事件(CUDA event)的计时方式,可用来给一段CUDA代码(可能包含主机代码和设备代码)计时。 对计时器的封装: class CUDATimeCost { public:void start() {elapsed_time_ 0.0;// 初始化cudaEventcheckCudaRuntime(cud…...
数据结构【Golang实现】(四)——双向循环链表
目录0. 定义节点1. IsEmpty()2. Length()3. AddFromHead()4. AddFromTail()5. Insert()6. DeleteHead()7. DeleteTail()8. Remove()9. RemoveByValue()10. Contain()11. Traverse()0. 定义节点 type DLNode struct {Data anyPrev, Next *DLNode }// DoublyLoopLinkedLis…...
【Redis】高可用架构之哨兵模式 - Sentinel
Redis 高可用架构之哨兵模式 - Sentinel1. 前言2. Redis Sentinel 哨兵集群搭建2.1 一主两从2.2 三个哨兵3. Redis Sentinel 原理剖析3.1 什么哨兵模式3.2 哨兵机制的主要任务3.2.1 监控(1)每1s发送一次 PING 命令(2)PING 命令的回…...
图片的美白与美化
博主简介 博主是一名大二学生,主攻人工智能研究。感谢让我们在CSDN相遇,博主致力于在这里分享关于人工智能,c,Python,爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主,博主会继续更新的,…...
面试官:关于CPU你了解多少?
CPU是如何执行程序的? 程序执行的基本过程 第一步,CPU 读取「程序计数器」的值,这个值是指令的内存地址,然后 CPU 的「控制单元」操作「地址总线」指定需要访问的内存地址,接着通知内存设备准备数据,数据准…...
UI自动化测试-Selenium的使用
文章目录 1. 环境搭建1.1 入门示例1.2 元素操作常用方法1.3 浏览器操作常用方法1.4 获取元素信息常用方法1.5 鼠标操作常用方法1.6 键盘操作常用方法1.7 下拉选择框操作2. 元素定位2.1 id定位2.2 name定位2.3 class_name定位2.4 tag_name定位2.5 link_text定位2.6 partail_link…...
嵌入式学习笔记——STM32的USART相关寄存器介绍及其配置
文章目录前言USART的相关寄存器介绍状态寄存器:USARTX->SR具体位代表的含义实际代码数据寄存器 USARTX->DR波特率寄存器 USARTX->BRR控制寄存器 (USART_CR)控制寄存器1(USART_CR1)控制寄存器2(USART_CR2)GPIO…...
Android setContentView流程分析(一)
对于做Android App的小伙伴来说setContentView这个方法再熟悉不过了,那么有多少小伙伴知道它的调用到底做了多少事情呢?下面就让我们来看看它背后的故事吧? setContentView()方法将分为两节来讲: 第一节:如何获取De…...
doris数据库操作数字遇到的问题
关于doris数据库Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场景。…...
3.13文件的IO操作
一.文件1.定义文件一般指的是存储在硬盘上的普通文件形如:txt.jpg.mp4,rar等这些文件在计算机中,文件可能是一个广义的概念,不仅可以包含普通文件,还可以包含目录(也就是文件夹.把目录称为目录文件)在操作系统中,还会用文件来描述一些其他的硬件设备或者软件资源比如网卡,显示器…...
ffmpeg使用
1 下载FFmpeg安装 官网地址:https://www.ffmpeg.org/download.html#build-windows 进入网址,点击下面红框部分 点击下面范围进行下载,下载速度有点慢,等等吧! 下载成功后,解压后,复制bin的路…...
spark中的并行度(分区数)/分区器如何确定
源头RDD有自己的分区计算逻辑,一般没有分区器,并行度是根据分区算法自动计算的,RDD的compute函数中记录了数据如何而来,如何分区的hadoopRDD,根据XxxinputFormat.getInputSplits()来决定,比如默认的TextInputFormat将文…...
00后女生“云摆摊”两周赚1.5万,实体店转战线上真的能赚钱吗?
最近,山东临沂的00后女生利用小程序在线上“云摆摊”卖水果,两周赚1.5万,引发网友热议。不少人发出质疑的声音:年轻人不要有稳定的工作不做,去摆摊;网上开店成本低,开实体店结果就难说了&#x…...
华为OD机试题 - 最优资源分配(JavaScript)| 机考必刷
更多题库,搜索引擎搜 梦想橡皮擦华为OD 👑👑👑 更多华为OD题库,搜 梦想橡皮擦 华为OD 👑👑👑 更多华为机考题库,搜 梦想橡皮擦华为OD 👑👑👑 华为OD机试题 最近更新的博客使用说明本篇题解:最优资源分配题目输入输出描述备注示例一输入输出说明示例二输入…...
利用python判断字符串是否为回文
1 问题 如何用python判断字符串是否为回文。 2 方法 用两个变量left,right模仿指针(一个指向第一个字符,一个指向最后一个字符),每比对成功一次,left向右移动一位,right向左移动一位,…...
GDB 调用之ptype、set variable
今天在公司的时候,排查一个问题,创建l3 lif 失败,查看各种日志发现是用key去创建的 lif失败了,日志里指示key为空,导致的创建失败。原因为一个结构体比基线的多了一些东西,导致版本不对,既而计算…...
并发编程---阻塞队列(五)
阻塞队列一 阻塞队列1.1.阻塞队列概念1.2.阻塞队列API案例1.2.1. ArrayBlockingQueue1.2.1.1.抛出异常1.2.1.2.返回布尔1.2.1.3.阻塞1.2.1.4.超时1.2.2.SynchronousQueue二 阻塞队列应用---生产者消费者2.1.传统模式案例代码结果案例问题---防止虚假唤醒2.2.⽣产者消费者防⽌虚…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
