论文解读:SuperGlue: Learning Feature Matching with Graph Neural Networks

SuperGlue: Learning Feature Matching with Graph Neural Networks
发表时间:2020
论文地址:https://arxiv.org/abs/1911.11763
项目地址:http://github.com/magicleap/SuperGluePretrainedNetwork。

本文介绍了一种通过联合寻找对应和拒绝非匹配点来匹配两组局部特征的神经网络。通过求解一个可微最优传输问题来估计分配,该问题的代价由图神经网络预测。我们引入了一种基于注意力的灵活的上下文聚合机制,使SuperGlue能够共同推理底层的三维场景和特征分配。与传统的、手工设计的启发式方法相比,我们的技术通过对Image pair进行端到端训练,来学习三维世界的几何变换和规律。在挑战现实世界的室内外环境中,SuperGlue于其他学习方法,并在姿态估计任务中取得了最先进的结果。该方法在现代GPU上进行实时匹配,并可以很容易地集成到现代SfM或SLAM系统中。

关键点

1、将两个图之间的特征点匹配问题松弛为两个特征点图的最优传输问题,可以快速的处理遮挡点、不可重复点的问题;
2、以图像对的形式进行端到端的训练,预先在大型数据集学习姿态估计的先验,使其能推理三维场景;
3、将自然先验应用到模型结构设计中(可以见章节三),设计了点最多是一对一、有些点缺少匹配点;
4、将特征点之间的关系定义为内点(一个图像内)和外点(两个图像间),分别使用self-attention和cross-attenion提前特征;
5、使用神经网络预测两个图之间的传输成本,然后使用辛克霍恩迭代来计算两个图之间的传输问题(特征点之间的分配问题);

其更为详细的解读可以查阅:https://cloud.tencent.com/developer/article/1855000
其中关于Cross-Attention的设计可以查阅:https://vaclavkosar.com/ml/cross-attention-in-transformer-architecture

1. Introduction

在几何计算机视觉任务中,如同步定位和映射(SLAM)和结构运动(SfM),图像中点之间的对应关系对于估计三维结构和摄像机姿态是至关重要的。这种对应通常是通过匹配局部特征来估计的,这一过程被称为数据关联。较大的视点、照明变化、遮挡、模糊和缺乏纹理是2d到2d数据关联问题变难得主要因素。

本文提出了一种思考特征匹配问题的新方法。我们使用一种叫做SuperGlue的新神经架构,从预先存在的局部特征中学习匹配过程,而不是学习更好的与任务无关的局部特征,然后是简单的匹配启发式和技巧。在SLAM的背景下,通常会将问题分解为视觉特征提取前端束调整或姿态估计后端,我们的网络直接位于中间——SuperGlue是一个可学习的中间端(见图1)。

在本工作中,学习特征匹配被看作是寻找两组局部特征之间的部分分配。通过解决一个线性分配问题,我们重新讨论了经典的基于图的匹配策略,当该问题松弛到一个最优传输问题时,可以分步骤求解。利用图神经网络(GNN)预测该优化的代价函数。受Transformer[61]成功的启发,它使用self(图像内)和cross(图像间)注意力来利用关键点的空间关系[self-attention]和它们的视觉外观[cross-attention]。这个公式加强了预测的分配结构,同时能低成本能够学习复杂的先验,优雅地处理遮挡和不可重复的关键点。我们的方法是从图像对,端到端训练的。我们从一个大型数据集学习姿态估计的先验,使SuperGlue能够推理三维场景和分配。我们的工作可以应用于各种需要高质量的特征对应的多视图几何问题(见图2)。

与手工匹配器和其他深度学习分类器相比,我们展示了SuperGlue的优越性。当与深度前端SuperPoint[18]结合时,SuperGlue在室内和室外姿态估计任务上取得了最先进的技术,并为端到端深度SLAM铺平了道路。

2. Related work

Local feature matching 通常通过 i)检测兴趣点=》计算视觉描述符=》用最近邻(NN)搜索匹配这些兴趣点=》过滤不正确的匹配=》估计一个几何变换。2000年代开发的经典pipeline通常基于SIFT=》特征粗匹配=》基于RANSAC计算变化矩阵。
最近关于匹配的深度学习的工作通常集中在使用卷积神经网络(CNNs)从数据中学习更好的稀疏检测器和局部描述符。为了提高它们的鉴别能力,一些工作明确地使用区域特征[32]或log-polar[20]来研究更广泛的应用场景。其他方法通过将匹配分类为inliers和outliers[33,44,7,71]来学习过滤匹配。这些操作的匹配集,仍然由神经网络搜索估计,因此忽略分配结构,丢弃视觉信息。迄今为止,研究匹配的工作都集中在密集匹配的[46]或3D点云[65]上,并且仍然表现出同样的限制。相比之下,我们的可学习的单个端到端架构中可以同时执行上下文聚合、匹配和过滤。
现有方法对特征点间的空间结构有所忽略

Graph matching 问题通常被表述为二次赋值问题,其是一个困难的np问题,求解代价是昂贵和复杂的。对于局部特性,21世纪初[5,27,57]的计算机视觉文献使用了手工制作的成本和许多启发式方法,使其复杂而又不够鲁棒。Caetano等人[9]学习更简单的线性分配的优化成本,但只使用浅层模型,而我们的SuperGlue使用深度神经网络学习灵活的成本。与图匹配相关的是最优传输[63]的问题——它是一个广义的线性分配,具有一个有效而简单的近似解,即Sinkhorn算法(在目标检测锚框分配的最优传输OTA中也用到了该算法)
Sinkhorn算法可以应用到特征点图的匹配问题上(将特征点图的匹配问题视为最优传输问题)

Deep learning for sets 例如,点云旨在通过聚合跨元素的信息来设计排列等量或不变函数。有些工作通过全局池化[70,40,15]或实例规范化[60,33,32]来平等地对待所有元素,而另一些工作则关注坐标或特征空间[41,66]中的局部邻域。注意,[61,64,62,26]可以通过关注特定的元素和属性来执行全局和数据端端的局部聚合,因此更加灵活。通过观察self-attention可以被看作是一个消息传递图神经网络[23,4]的一个实例,我们将注意力应用于具有多种边的图,类似于[28,72],并使SuperGlue能够学习关于两组局部特征的复杂推理。
将self-attention应用到图数据上

3. The SuperGlue Architecture

Motivation: 在图像匹配问题中,可以利用一些世界的规律:三维世界大部分是平滑的,有时是平面的,如果场景是静态的,那么给定图像对的所有对应都来自一个单一的外极变换,而且一些姿态比其他姿态更有可能。此外,二维关键点通常是突出的三维点的投影,如角或斑点,因此图像之间的对应关系必须遵循一定的物理约束:

  • i)一个关键点在另一幅图像中最多可以有一个对应关系;
  • ii)一些关键点由于探测器的遮挡和故障而不匹配。
    一个有效的特征匹配模型应该是寻找相同三维点的重投影之间的所有对应,并识别没有匹配的关键点。我们用SuperGlue(见图3)来解决一个优化问题,其成本由深度神经网络预测。这减轻了对领域专业知识和启发式的需求——我们直接从数据中学习相关的先验。

Formulation 考虑两个图像A和图像B,每一个图像都有一组关键点位置P和相关的视觉描述符D,我们将它们联合使用(P,D)称为局部特征。关键点P由pi :=(x,y,c)组成(x,y为坐标,c为置信度),视觉描述符D可以是由CNN提取(如superpoint)或者传统的描述符(如SIFT)。图像A和B具有M和N个局部特征,分别由A := {1,…,M}和B := {1,…,N}进行索引。

Partial Assignment 约束i)和约束ii)意味着对应关系来自于两组关键点之间的部分赋值。为了集成到下游任务中和更好的可解释性,每个可能的对应关系都应该有一个置信值。因此,我们将部分软分配矩阵 P ∈ [ 0 , 1 ] M × N P∈[0,1]^{M×N} P[0,1]M×N定义为:

实验目标是设计一个神经网络,从两组局部特征中预测分配P。

3.1. Attentional Graph Neural Network

除了关键点的位置和视觉外观外,整合其他上下文线索还可以直观地提高其独特性。例如,我们可以考虑它与其他共可见关键点的空间和视觉关系,如aslient显著性[32]、self-similar自相似[54]、co-occurring 共生[73]或adjacent 相邻[58]。另一方面,了解第二幅图像中的关键点可以通过比较候选匹配或从全局和明确的线索估计相对光度或几何变换来帮助解决歧义。

当被要求匹配一个给定的模糊关键点时,人类会来回看这两幅图像:他们筛选初步匹配的关键点,检查每个关键点,并寻找上下文线索,以帮助消除真实匹配与其他自相似性[11]中的歧义。这暗示了一个可以将其注意力集中在特定位置上的迭代过程。

因此,我们将SuperGlue的第一个主要块设计为一个注意图神经网络(见图3)。给定初始局部特征,它通过让特征相互通信来计算匹配的描述符。正如我们将展示的,图像内和跨图像的远程特征聚合对于鲁棒匹配至关重要。

Keypoint Encoder 每个关键点i的初始表示 x i x_i xi结合了它的视觉特征描述符和位置,我们将关键点位置由MLP嵌入到一个高维向量中, x i x_i xi的具体计算形式如下:

该编码器使图网络能够共同推理外观和位置,特别是当与注意力结合时,是语言处理中流行的“位置编码器”的一个实例

Multiplex Graph Neural Network 我们构造由两幅图像的相同关键点组成的一个单一完整的图,该图有两种类型的无向边-它是一个多路图[34,36]。

图像内边,或自身边,即图像本身,将关键点i连接到同一图像中的所有其他关键点。
图像间边,或交叉边,Ecross,将关键点i连接到其他图像中的所有关键点。

我们使用消息传递公式[23,4]来沿着这两种类型的边传播信息。由此得到的多路图神经网络从每个节点的高维状态开始,并通过同时聚合所有节点的所有给定边上的消息,在每一层计算一个更新的表示。


其中,[·||·]表示连接。对于图像b中的所有关键点,可以同时进行类似的更新。具有不同参数的固定数量的层L被链接,或者沿着自边和交叉边聚合。

Attentional Aggregation 一个注意机制执行聚合并计算消息 m E → i m_{E→i} mEi。内部edges基于自注意[61],交叉edges基于cross-attention。类似于数据库检索,用i来表示元素,qi,vj,kj。该消息被计算为以下值的加权平均值:

key, query和 value被计算为图神经网络的深度特征的线性投影。考虑到查询关键点i在图像Q中,而所有的源关键点都在图像S中, ( Q , S ) ∈ { A , B } 2 (Q,S)∈\{A,B\}^2 QS{AB}2中,我们可以定义以下公式:

每一层l都有自己的投影参数,学习并共享两个图像的所有关键点。在实践中,我们通过多头注意力来提高表达性。

我们的公式提供了最大的灵活性,因为网络可以学习基于特定属性专注于关键点的子集(见图4)。
SuperGlue可以根据外观和关键点位置来检索或参加,因为它们被编码在表示xi中。这包括注意附近的关键点和检索相似或显著关键点的相对位置。这就可以表示几何变换和赋值。最终匹配的描述符是线性投影:

3.2. Optimal matching layer

SuperGlue的第二个主要部分(见图3)是最优匹配层,它产生一个部分分配矩阵。在标准图匹配公式中,赋值P通过在所有可能的匹配下计算分数矩阵 S ∈ R M × N S∈R^{M×N} SRM×N,并在公式1的约束下最大化总分。这等价于解决一个线性分配问题。

Score Prediction: 为所有的M×N潜在匹配建立一个单独的表示将是禁止的。相反,我们用匹配描述符的相似度来表示成对的分数:

其中,<·,·>是内积。与学习到的视觉描述符不同,匹配的描述符没有被归一化,它们的大小可以在每个特征和训练过程中发生变化,以反映预测的置信度。

Occlusion and Visibility: 为了让网络抑制一些关键点,我们用一个垃圾箱来增加每个集合,以便显式地分配不匹配的关键点给它。这种技术在图匹配中很常见,垃圾箱也被SuperPoint[18]使用来解释可能没有检测到的图像单元。我们通过添加一个新的行和列,点到箱和箱到箱的分数,填充一个可学习的参数来增加分数S到¯S:

A中的关键点将被分配给B中的一个关键点或垃圾箱,而每个垃圾箱的匹配项和另一组中的关键点一样多:N、M分别为A、B中的垃圾箱。我们将表示为a和b中每个关键点和垃圾箱的期望匹配的数量。增强赋值¯P现在有以下约束条件:

Sinkhorn Algorithm: 上述优化问题的解对应于离散分布a和b之间的最优传输[39],分数为¯S。它的熵正则化公式自然地产生了期望的软分配,并可以在GPU上使用Sinkhorn Algorithm(辛克霍恩算法)有效地求解。它是Hungarian(匈牙利)算法[35]的一个可微版本,经典地用于二部匹配,它包括沿着行和列迭代地归一化exp(¯S),类似于行和列的Softmax。经过T次迭代后,我们放下垃圾箱并恢复P=¯P1:M,1:N。

3.3. Loss

通过设计,图神经网络和最优匹配层都是可微的,这使得从匹配到视觉描述符的反向传播成为可能。SuperGlue是以监督的方式从地面真实匹配 M = { ( i , j ) } ⊂ A × B M = \{(i,j)\}⊂A×B M={ij}A×B。这些是从地面真实相对变换估计的-使用姿态和深度映射或同态。这也允许我们将一些关键点I⊆A和J⊆B标记为不匹配的,如果它们在其附近没有任何重投影。给定这些标签,我们最小化分配¯P的负对数可能性:

这种监督的目的是同时最大化匹配的精度和召回率。

3.4. Comparisons to related work

SuperGlue胶体系结构与图像中关键点的排列是对称变化的。与其他手工制作或学习的方法不同,它也与图像的排列是对称变化的,这更好地反映了问题的对称性,并提供了一个有益的归纳偏差。此外,最优传输公式加强了匹配的互惠性,如相互检查,但以一种柔软的方式,类似于[46],从而将其嵌入到训练过程中。

SuperGlue vs. Instance Normalization SuperGlue所使用的注意力机制是一种比实例规范化更灵活和更强大的上下文聚合机制,它平等地对待所有关键点,就像之前的特征匹配工作所使用的那样。

SuperGlue vs. ContextDesc SuperGlue可以联合推理外观和位置,而上下文描述可以分别处理它们。此外,上下文描述是一个前端(特征点和特征位置提取器),另外需要一个更大的区域提取器,并有一个丢失的关键点得分。SuperGlue只需要本地功能,学习或手工制作,因此可以是一个简单的临时替代现有的匹配器。

SuperGlue vs. Transformer SuperGlue借鉴了Transformer的self-attention,但将其嵌入到图神经网络中,并另外引入了对称的交叉注意。这简化了体系结构,并导致了更好地跨层进行特性重用。

4. Implementation details

SuperGlue可以与任何局部特征检测器和描述符结合,但与superpoint[18]特别有效,它产生可重复和稀疏的关键点——实现非常有效的匹配。视觉描述符是从半密集的特征图中进行双早期采样的。为了与其他匹配器进行公平的比较,除非明确提到,否则我们在训练SuperGlue时不训练视觉描述符网络。在测试时,可以使用置信阈值(我们选择0.2)来从软分配中保留一些匹配,或者在后续步骤中使用所有它们和它们的置信度,比如加权姿态估计。

Architecture details: 所有中间表示(key, query value, descriptors)与SuperPoint描述符具有相同的维度D = 256。我们使用L = 9层交替的多头自注意和交叉注意,每个层有4个头,并执行T = 100的Sinkhorn迭代。该模型在PyTorch [38]中实现,包含12M参数,并在NVIDIA GTX 1080 GPU上实时运行:对于室内图像对,一次forward平均需要69 ms(15FPS)(见附录C)。

Training details: 为了允许数据增强,SuperPoint检测和描述步骤在训练期间作为批量动态执行。为了有效的批处理和提高鲁棒性,进一步增加了一些随机关键点。更多细节见附录E。

5. Experiments

5.1. Homography estimation

我们使用具有鲁棒(RANSAC)估计和非鲁棒(DLT)估计的真实图像和合成同域性进行了一个大规模的同调性估计实验。

Dataset 通过对随机同形性进行采样,并将随机光照失真应用于真实图像,并遵循类似于[16,18,45,44]的方法来生成图像对。底层图像来自于Oxford and Paris数据集[42]中的1M干扰物图像集,可分为训练、验证和测试集。

Baselines: 我们将SuperGlue与应用于SuperPoint局部特征的几种匹配器进行了比较——最近邻(NN)匹配器和各种异常排斥器:Nearest Neighbor (NN) matcher、PointCN [33]和Order-Aware Network(OANet)[71]。所有学习的方法,包括SuperGlue,都是在对应GT上训练的,这是通过将关键点从一幅图像投影到另一幅图像来找到的。我们动态地生成同形性和光度失真,使一个图像对在训练过程中从未见过两次。

Metrics 匹配精度§和召回率®是根据地面真实值的对应关系计算出来的。同源估计采用RANSAC和直接线性变换[24](DLT),它有一个直接平方乘解。我们计算图像的四个角的平均重投影误差,并报告累积误差曲线(AUC)下的面积为10像素。

Results SuperGlue足以掌握同质变化,达到98%的查全率和高精度(见表1)。估计的对应关系是如此之好,因此不需要一个鲁棒的估计器。SuperGlue在DLT上比在RANSAC上工作得更好。像PointCN和OANet这样的拒绝离群值方法不能预测比NN匹配器本身更正确的匹配,因为它过度依赖于初始描述符(见图6和附录A)

5.2. Indoor pose estimation

室内图像匹配由于缺乏纹理、丰富的自相似性、复杂的三维几何场景和较大的视角变化,因此非常具有挑战性。正如我们在下面所展示的,超级胶可以有效地学习之前克服这些挑战。

Dataset 我们使用ScanNet [13],这是一个大型室内数据集,由具有地面真实姿态和深度图像的单眼序列组成,以及与不同场景对应的、定义良好的训练、验证和测试分割。以往的工作基于时间差[37,17]或SfM可可见性[33,71,7]选择训练和评估对,通常使用SIFT计算。我们认为,这限制了对的难度,而不是选择这些基于重叠分数计算在给定序列中所有可能的图像对只使用地面真实姿态和深度。这导致了明显更宽的基线对,这对应于当前的真实世界室内图像匹配的边界。丢弃重叠太小或太大的对,我们选择230M训练对和1500个测试对。

Metrics 与之前的工作[33,71,7]一样,我们报告了在阈值(5◦,10◦,20◦)处的姿态误差的AUC,其中姿态误差是旋转和平移中角度误差的最大值。利用RANSAC进行基本矩阵估计,得到了相对姿态。我们还报告了匹配精度和匹配分数[18,69],其中一个匹配被认为是基于它的外极距离是正确的。

Baselines 我们使用根归一化的SIFT [31,2]和SuperPoint[18]特征来评估SuperGlue和各种基线匹配器。SuperGlue是训练对应和不匹配的关键点从GT姿态和深度。所有的基线都是基于最近邻(NN)匹配器和一个潜在的离群值拒绝方法。在“Handcrafted”类别中,我们考虑相互检查、比率检验[31]、描述符距离阈值,以及更复杂的GMS [6]。“学习”类别的方法是PointCN [33]及其后续的OANet [71]和NG-RANSAC [7]。我们在PointCN和OANet对punnet和SIFT进行再训练,使用分类损失。对于NG-RANSAC,我们使用原始的训练模型。我们不包括任何图匹配方法,因为它们对于我们所考虑的关键点(>500)的数量太慢了一个数量级。其他局部特性作为参考进行评估:使用GMS的ORB [47]、D2-Net [19]和使用公开使用的训练模型的上下文Desc[32]

Results 与手工制作和学习的匹配器相比,SuperGlue具有显著更高的姿态精度(见表2和图5),并且在SIFT和SuperPoint上都能很好地工作。它的精度明显高于其他学习的匹配器,显示了其更高的表示能力。它还会产生更多的正确匹配——当应用于SIFT时,比比率测试多10倍,因为它操作的是完整的可能匹配集,而不是有限的最近邻集。SuperGlue与SuperPoint取得了最先进的结果,在室内姿态估计。它们可以很好地相互补充,因为可重复的关键点使得即使在非常具有挑战性的情况下也可以估计更多的正确匹配(参见图2、图6和附录A)。

5.3. Outdoor pose estimation

由于户外图像序列呈现出自己的一系列挑战(例如,照明变化和遮挡),我们训练和评估supergule在户外环境中的姿态估计。我们使用与室内姿态估计任务相同的评价度量和基线方法。

Dataset 我们对光旅游数据集进行了评估,这是CVPR‘19图像匹配挑战[1]的一部分。它是YFCC100M数据集[56]的一个子集,具有从一个直升机场外的SfM工具[37,52,53]获得的地面真实姿态和稀疏三维模型。所有学习到的方法都是在较大的元深度数据集[29]上进行训练的,该数据集也有用多视图立体声计算的深度图。在摄影旅游测试集中的场景将从训练集中删除。与室内情况类似,我们选择具有挑战性的图像对进行训练和评估,使用从SfM可可见性计算出的重叠分数,如在[19,37]中。

Results 如表3所示,当同时应用于SuperPoint和SIFT时,胶水在所有相对姿态阈值下都优于所有基线。最值得注意的是,该结果匹配的精度非常高(84.9%),这加强了超级胶“粘”将局部特征结合在一起的类比。

5.4. Understanding SuperGlue

Ablation study 为了评估我们的设计决策,我们重复了具有SuperPoint特征的室内实验,但这次关注的是不同的超级胶变体。如表4所示的消融研究表明,所有的SuperGlue块都是有用的,并带来了实质性的性能提高。当我们在训练SuperGlue时通过SuperPoint描述符网络反向传播时,我们观察到20◦的AUC从51.84提高到53.38。这证实了SuperGlue除了匹配之外还适用于端到端学习。

Visualizing Attention: self-attention模式图7显示了self-attention和交叉注意模式的广泛多样性,反映了学习行为的复杂性。附录D对其发展趋势和内部工作进行了详细的分析。

6. Conclusion

本文证明了基于注意的图神经网络在局部特征匹配中的强大能力。SuperGlue的架构使用了两种注意力: (i)self-attention,它增强了局部描述符的接受域;(ii)交叉注意,它支持交叉图像通信,并受到人类在匹配图像时来回观察的方式的启发。我们的方法通过解决一个最优传输问题来优雅地处理部分分配和遮挡点。我们的实验表明,与现有的方法相比,SuperGlue取得了显著的改进,能够对极宽基线的室内和室外图像对进行高度精确的相对姿态估计。此外,superglue能保证实时运行,并与经典特征提取算法相互结合。

总之,我们在中间件用一个强大的神经模型取代了手工制作的启发式方法,该模型在一个统一的体系结构中同时执行上下文聚合、匹配和过滤。我们相信,当与深前端结合时,SuperGlue是迈向端到端深SLAM的一个重要里程碑。

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

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

相关文章

浅谈基于分项计量的校园能源监管平台解决方案设计

张心志 关注acrelzxz 安科瑞电气股份有限公司 上海嘉定 201801 摘要&#xff1a;伴随着我国经济的飞速发展&#xff0c;国家机关办公建筑和大型公共建筑高耗能的问题日益突出&#xff0c;如何解决建筑能耗己成为一个国家总能耗的重要组成部分。学校是肩负着教育、科研和社会服…

AutoCV第十一课:DL基础

目录 DL基础前言1. BP训练mnist2. 权重初始化理论分析总结 DL基础 前言 手写AI推出的全新保姆级从零手写自动驾驶CV课程&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 本次课程我们来了解下 BP 反向传播和学习权重初始化相关知识 课程大纲可看下面的思维导…

Redis的持久化方式

为什么要持久化 Redis是内存数据库&#xff0c;宕机后数据会消失&#xff0c;Redis重启后快速恢复数据&#xff0c;要提供持久化机制。 把内存中的数据持久化到磁盘中&#xff0c;防止数据丢失。 —当redis服务器开启时&#xff0c;会把磁盘中的数据加载到内存中进行计算。 …

docker搭建nginx

一、安装Docker 1、安装&#xff1a; yum install docker 2、启动/停止/重启docker服务 systemctl docker start systemctl docker stop systemctl docker restart #开机自启动 systemctl enable docker#设置容器自启动 1.创建容器时设置 docker run -d --restartalways …

vue使用mapbox地图

1、下载依赖 npm install --save mapbox-gl mapbox/mapbox-gl-language 2、引入mapBox&#xff0c;将引入的内容封装为js文件 在api/map文件夹下新建mapbox.js文件 代码&#xff1a; import mapboxgl from mapbox-gl import mapbox-gl/dist/mapbox-gl.css import MapboxLang…

Redis缓存问题与缓存更新机制

目录 ​编辑 一、缓存问题 1.1 缓存穿透 1.1.1 问题来源 1.1.2 解决方案 1.1.2.1 缓存空对象 1.1.2.2 使用布隆过滤器 1.2 缓存击穿 1.2.1 问题来源 1.2.2 解决方案 1.2.2.1 设置热点数据永远不过期 1.2.2.2 新增后台定时更新缓存线程&#xff08;逻辑不过期&#xff09; 1.2.…

MFC项目添加外部头文件和源文件后编译出现C1010错误

出现这个问题的主要原因是如果使用VC向生成工程的话&#xff0c;默认使用预编译头文件“stdafx.h”&#xff0c;这样做的目的是为了加快编译速度。 如果加入第三方c/cpp文件没有#include “stdafx.h” &#xff0c;就会报此错误。 在<解决方案管理器中>(就是可以看到工程…

Git 常用操作总结

版本控制系统&#xff08;VCS&#xff09;是管理文件和目录所做的更改的工具&#xff0c;每一次提交便记录下目录及其文件的内容&#xff0c;以及较上一版本的更改。通过这样去跟踪项目的更改过程&#xff0c;方便与他人进行协作&#xff0c;或者撤销不想要的更改以回退到此前的…

10 Web全栈 组件化设计

前端架构层次设计 前端技术体系庞大&#xff0c;层级也非常分明&#xff0c;在架构设计领域中不能一概而论&#xff0c;任何应用种类都有自己独立的架构体系。比如在前端开发领域&#xff0c;在框架基础上进行应用构建的开发者锁思考的问题&#xff0c;与在组件库设计方面的开…

【文件 part 6 - 格式化读写文件函数 随机读写】

格式化读写文件函数 /* 函数调用: */ fprintf ( 文件指针&#xff0c;格式字符串&#xff0c;输出表列&#xff09;&#xff1b; fscanf ( 文件指针&#xff0c;格式字符串&#xff0c;输入表列&#xff09;&#xff1b;/** 函数功能:* 从磁盘文件中读入或输出字符* fprint…

SAP从入门到放弃系列之生产订单结算

文章目录概览 一、概述二、结算的模式2.1、订单相关的成本归集2.2、产品相关的成本归集 最后 一、概述 当生产从计划到订单&#xff0c;生产领料、投料、报工、入库整个生产流程完成后&#xff0c;生产订单中会产生对应的财务数据&#xff0c;或者说借贷项数据&#xff08;材料…

npm启动,node.js版本过高

“dev_t”: “set NODE_OPTIONS”–openssl-legacy-provider" & npm run dev\n"

Ubuntu安装碰撞检测库FCL以及前置依赖libccd, OctoMap

Ubuntu安装碰撞检测库FCL以及前置依赖libccd, OctoMap 大致安装流程见FCL github地址&#xff0c;但是在安装libccd时存在一些问题。 建议完整浏览后再进行安装 1.编译libccd的报错 首先FCL页面已经说明libccd要直接克隆源码&#xff0c;不要下载压缩包。 其次&#xff0c;在…

MAYA传送带上放石头(新旧粒子系统)

播放试试 使用老的粒子系统 particleShape1.shuliangrand(0,5); particleShape1.daxiao<<rand(0.2,0.5),rand(0.2,0.5),rand(0.2,0.5)>>; particleShape1.xuanzhuan<<rand(360),rand(360),rand(360)>>; 使用新的粒子系统 粒子向后滑落 新粒子系统能进行…

SSMP整合案例(11) 在界面中实现添加操作

上文 SSMP整合案例(10) vue端调整项目环境 发送请求 基本界面编写我们搭建了基本的页面结构 然后 我们来做个新增的功能 首先 新增 我们肯定是用户点击了这个新建之后 我们再来处理这个逻辑 我们之前的代码 新增是有绑定 一个事件的 但是这个 AddBook中并没有内容 首先 我们…

4.44ue4:相机抖动

1.创建相机抖动类 右键内容面板&#xff0c;点击创建蓝图类&#xff0c;搜索shake&#xff08;camera shake&#xff09; 2.使用相机抖动&#xff1a; 节点&#xff1a;play world .. api解释&#xff1a; epicenter&#xff1a;震源 inner Radius&#xff1a;内圈范围&a…

【梦辛工作室】java实现简易消息队列处理器 可分区 分区顺序消费MxMQ

大家好哇&#xff0c;又是我&#xff0c;梦辛工作室的灵&#xff0c;最近在巩固JUC并发包&#xff0c;突然想到如果自己的应用体量不大&#xff0c;但有需要消息队列来实现应用解耦和削峰来缓解服务器突增压力&#xff0c;比如抢票时&#xff0c;突然有比较用户同时抢票&#x…

分布式运用——rsync远程同步

分布式运用——rsync远程同步 一、rsync的背景和原理1.rsync的功能2.rsync的应用场景3.使用rsync的基本命令4.scp与rsync的区别 二、配置rsync源服务器1.关闭防火墙2.建立/etc/rsyncd.conf 配置文件3.保证所有用户对源目录/var/www/html 都有读取权限4.启动 rsync 服务程序5.关…

flutter3.7版本下使用flutter boost解决使用platview崩溃或异常问题

背景 工程使用了混合开发&#xff0c;使用flutter boost插件&#xff0c;flutter 的activity1 frament1 跳转activity2 frament2&#xff0c;frament1 包含platformView&#xff0c;按照上面老哥解决崩溃问题的基础上&#xff0c;出现activity2 frament2返回activity1 framen…

“未来之光:揭秘创新科技下的挂灯魅力“

写在前面&#xff1a; 高度信息化当下时代&#xff0c;对电脑及数字设备的需求与日俱增无处不在&#xff0c;随之而来的视觉疲劳和眼睛问题也攀升到了前所未有的高度。传统台灯对于长时间使用电脑的人群来说是完全无法解决这些问题的。一款ScreenBar Halo 屏幕挂灯&#xff0c;…