蓝色
紫色
红色
2022-01-13 22:39:19

Learning to Find Good Correspondences

Code

Abstract

  我们开发了一个深度架构,以学习为 宽基线双目立体视觉图像 找到良好的对应关系。给定一组 假定的稀疏匹配和相机内参 ,我们以端到端的方式训练我们的网络,将对应关系标记为内点或外点,同时使用它们来 恢复相对位姿,如使用本质矩阵编码的那样。我们的架构基于 多层感知机 ,该感知机在 像素坐标上 运行,而 不是直接在图像上 运行,因此简单而小巧。我们引入了一种称为 上下文规范化(Context Normalization) 的新的归一化技术,它允许我们在将 全局信息嵌入其中 的同时 单独处理 每个数据点,并且还使网络不固定到对应的顺序。我们在多个具有挑战性的数据集上的实验表明,我们的方法能够以 很少的训练数据 大幅提高技术水平。

1. Introduction

  恢复两个图像之间的 相对相机运动 是计算机视觉中最基本的任务之一,也是宽基线立体视觉和运动结构 (SfM) 综合解决方案的关键部分。然而,如图1所示,在处理 宽基线、重复结构和照明变化 时,这仍然是一个难题。大多数算法依靠稀疏的关键点 [19,2,24] 在图像之间建立一组初始对应关系,然后尝试找到符合给定几何模型的可靠匹配子集 —— 内点 —— 并使用它们来恢复位姿[11]。它们依赖于成熟技术的组合,例如SIFT [19],RANSAC [10]和 8点算法[18],这些技术已经使用了几十年。

  随着深度学习的出现,人们一直在推动使用神经网络 重新设计 局部特征提取 [35,26]。然而,尽管这些算法在 点匹配基准上(point-matching benchmarks) 的表现优于早期的算法,但正如最近的两项研究所指出的那样,将它们纳入位姿
估计pipline 可能并不一定转化为性能提升[25,3]。这表明,限制因素可能不在于建立对应关系,而在于 选择最适合恢复姿势的对应关系

  这个问题受到的关注相对较少,大多数算法仍然依靠不可微分的手算技术来解决它。DSAC [4]是我们最近所知道的以可微分方式解决 稀疏异常值拒绝 的唯一尝试。但是,这种方法旨在模仿RANSAC,而不是优于它。此外,它特定于3D到2D对应,而不是立体视觉。

[4] Differentiable RANSAC for Camera Localization 16’

  相比之下,我们提出了一种新颖的方法使用深度网络来寻找 几何一致性对应点 。给定两个图像中的特征点以及它们之间的潜在对应关系,我们训练一个深度网络,该网络通过利用极性约束同时解决 分类问题(保留或拒绝每个对应关系)回归问题(检索相机运动)——通过利用几何约束 。为此,我们引入了一种 可微分的方法,通过对 8点算法的简单加权 重新表述来计算位姿,这些权重 用于 预测 对应关系正确的 可能性。在实践中,我们假设 相机内参是已知 的,这通常是正确的,因为它们存储在 图像元数据 中,并根据 基本矩阵 表示相机运动[11]。

  如图 2 所示,我们的架构依赖于多层感知器 (MLP),这些感知器(MLP)在每次 对应点上独立应用,使网络相对于 输入的顺序 保持不变。这受到 PointNet [21] 的启发,PointNet 从3D云的每个点上运行MLP,然后将结果馈送到 生成全局特征 的附加网络,然后将其附加到每个逐点特征。相比之下,我们只是每当对应点通过感知机时 简单地将特征图在所有对应关系上的分布归一化 。由于对应关系 受摄像机运动的约束 ,因此此过程提供了 上下文context。我们称这种新颖的非参数操作为 上下文归一化Context Normalization,并发现它比 PointNet[21]的全局上下文特征 更简单,更有效。

  我们的方法具有以下优点:(i)它可以 使现有技术的性能翻倍 ;(ii)基于关键点 ,它比基于图像的密集方法更好地推广到 看不见的场景,我们用一个单一的模型证明了这一点,该模型在截然不同的室内和室外数据集上优于当前的方法;(iii) 它只需要通过 基础矩阵 进行微弱的监督;(iv)它可以在 非常少的训练数据下 有效地工作,例如,我们仍然可以在只有59个训练图像的挑战性户外场景中超越最先进的技术。

2. Related Work

   传统的手工计算方法 。估计两个图像之间相对相机运动的传统方法是使用稀疏关键点(如SIFT [19])建立一组初始对应关系,并使用5点算法[20]或8点算法[18]来检索基本矩阵,使用RANSAC [10]拒绝异常值。

  许多工作都集中在改进该pipline的 异常值拒绝 步骤,即RANSAC。MLESAC [29] 在求解 图像几何问题 时显示出改进。PROSAC [7] 加快了估算过程。USAC [22]将多项进步结合到一个统一的框架中。Least median of squares(LMEDS)[23]也常用于代替RANSAC。关于这个主题的全面研究可以在[6,22]中找到。然而,在实践中,RANSAC仍然是事实上的标准。

  这些方法的一个主要缺点是它们依赖于 数据的一小部分来生成假设(hypotheses),例如,5点算法一次只考虑 五个对应关系 。这是次优的,因为具有较大基线和成像变化的图像对将包含 很大比例的异常值 ,从而使大多数假设变得毫无用处。

  最近的工作试图通过同时 拒绝异常值和估计全局运动 来克服这一限制。[17] 假设全局运动应该是分段平滑的。GMS [3] 通过将图像划分为多个网格并在网格单元格之间形成初始匹配来进一步利用这一假设。尽管它们比传统的匹配策略有所改善,但在实践中经常违反 分段平滑度假设

  基于学习的方法。使用深度网络来解决 图像对应点问题 最近引起了很多兴趣。与传统方法相比,许多这些新技术[32,31,37,36] 都是 密集的,使用原始图像作为输入。他们在 受约束的双目立体视觉 问题上显示出有希望的结果,例如 匹配视频序列中的两帧,但一般问题仍远未解决。正如我们的实验所证明的那样,这种方法在 具有遮挡或大基线的场景中 可能是有害的,这在旅游摄影应用中很常见。

  撇开密集方法不谈, DSAC [4] 最近引入了一种用于单目姿态估计的可微异常值抑制方案。然而,它依赖于一种 单目姿势估计所特有的策略评估假设,并且难以扩展到双目立体视觉。此外,这种技术相当于用 可微分的对应物 替换RANSAC进行端到端训练,这并没有像我们一样显著提高RANSAC以外的性能。

  在[9]中,提出了一种具有独立网络的双重架构,用于提取稀疏的关键点并形成对应关系,假设一个单应矩阵(homography)模型。由于它 要求对物体的角做 GT 标注 ,这项工作仅在合成的,非真实的图像上进行了演示。相比之下,我们的方法只需要 基础矩阵 进行训练,因此,正如我们的实验所证明的那样,在真实世界中是有效的。

3. Method

  我们的目标是在图像之间建立有效且几何上一致的对应关系,并使用它们来检索相机运动。我们依赖于 局部特征,这些特征可能不可靠,需要 异常值拒绝。传统方法通过迭代采样小的匹配子集来解决这个问题,这使得很难利用全局上下文。相比之下,我们开发了一个深度网络,可以 在一次拍摄中利用所有可用信息

  具体来说,我们提取两个图像上的局部特征,创建一组过度完成的假定对应关系,并将它们输入到图2所示的网络。它为每个对应关系分配一个权重,以编码它们成为 inlier 的可能性。我们进一步使用它来设置 八点算法加权重新表达中 每个对应关系的影响[18] 。换句话说,我们的方法执行联合的入值/异常值分类和回归到基本矩阵。然后,可以通过对所得基本矩阵进行奇异值分解来恢复相机之间的相对旋转和平移[11]。

  在本节的其余部分中,我们将问题公式化并描述图 2 的体系结构。然后,我们重新表达了加权对应的八点算法,并讨论了我们的混合损失学习策略。

3.1. Problem Formulation

  

  

  

3.2. Network Architecture

  现在,我们描述了实现方程(3)映射的网络。因为对应点的顺序是随意的,交换顺序的 x k x_k xk​ 应该生成的是等效排列的 w k = f Φ ( x k ) w_k=f_Φ(x_k) wk​=fΦ​(xk​)。为了实现这一目标,受到PointNet [21]的启发,PointNet是一种深度网络,旨在无序3D点云上运行,我们利用多层感知器(MLP)。与卷积或密集网络不同,由于MLP在单个对应关系上运行,因此合并来自其他感知器(即上下文)的信息对于其正常工作是必不可少的。PointNet和我们的方法之间的区别因素是如何做到这一点的。

  在 PointNet 中,点域特征 由生成全局上下文特征的单独网络 显式组合,然后该全局上下文特征连接到每个点域输出。相比之下,如图 2 所示,我们引入了一种简单的策略,在每个感知器之后,根据特征图的分布对特征图进行归一化。这使我们能够单独处理每个对应关系,同时在其余部分定义的全局上下文中对其进行框架,该上下文对摄像机运动和场景几何体进行编码。我们称之为非参数操作上下文规范化 (CN)。

  

  这种操作在机械上类似于其他归一化技术[14,1,30],但应用于不同的维度并发挥不同的作用。我们跨对应关系对每个感知器的输出进行规范化,但要针对每个图像对单独进行规范化。这允许特征图的分布来编码场景几何和摄像机运动,将上下文信息嵌入到与上下文无关的 MLPs 中。

  相比之下,其他规范化技术主要关注收敛速度,对网络的运行方式影响不大。批处理规范化 [14] 在小型批处理上规范化每个神经元的输入,以便在训练时遵循一致的分布。层归一化[1]将此操作转置到通道,因此与每个神经元的观测值数量无关。但是,它们不会向输入添加上下文信息。批量归一化假定每个样本都遵循相同的全局统计量,并在测试时减少到减去和除以固定标量值。层归一化是独立应用于每个神经元的,即,它一次考虑一个对应的特征。

  更密切相关的是实例规范化 [30],它应用了与完整图像相同的操作来规范化其对比度,以实现图像风格化。但是,它也仅限于增强收敛性,因为在其应用程序中,上下文已经被空间卷积捕获,这些卷积不适合我们问题中的稀疏数据。

  但请注意,我们的技术与批量规范化兼容,实际上我们确实使用它来加快训练速度。如图2所示,我们的网络是一个12层的ResNet[12],其中每层包含两个顺序块,包括:一个感知器,其中128个神经元共享每个对应的权重,一个上下文归一化层,一个批处理归一化层和一个ReLU。在最后一个感知器之后,我们应用ReLU,后跟tanh来强制输出范围[0:1]。我们使用这种截断的tanh而不是sigmoid,以便网络可以轻松输出wi = 0以完全删除异常值。

3.3. Computing the Essential Matrix

  现在,我们定义了方程 (3) 的函数 g,它从一组加权对应关系中估计基本矩阵。如果我们要将其集成到深度学习框架中,它必须在权重方面是可微分的。我们首先概述了处理未加权场景的 8 点算法 [18],然后将其扩展到加权情况。

3.4. Learning with Classification and Regression

3.5. RANSAC at Test Time

  损失函数必须相对于网络权重是可微分的。但是,此要求在测试时会消失。因此,我们可以将RANSAC应用于被我们的网络标记为不确定值的对应关系,以清除任何剩余的异常值。我们将证明,这比独立的RANSAC表现得更好,这证实了我们的直觉,即采样是一种次优的方式,可以处理异常值比例很大的"大海捞针"场景。

4. Experimental Results

  我们首先介绍数据集和评估协议,然后证明我们的实现选择。最后,我们将我们的方法与最先进的技术进行基准比较。

4.1. Datasets

  稀疏特征匹配在户外场景中特别有效,我们将看到这就是我们的方法闪耀的地方。相比之下,基于关键点的方法不太适合室内场景。尽管如此,最近的技术已经解决了这个问题,我们表明我们的方法在这种情况下仍然优于最先进的技术。

  户外场景。为了评估我们在户外环境中的方法,我们的目标是利用许多具有从不同角度看到的相似场景的图像。因此,光旅游数据集是自然的候选者。我们依赖于雅虎的YFCC100M数据集[28],这是一个由1亿张可公开访问的Flickr图像以及随附的元数据组成的集合,后来被策划为72个适合于Motion结构(SfM)的图像集合。我们选择五个序列,如图 3 所示。我们使用VisualSFM [33]来恢复摄像机姿势并生成地面实况。

  我们还考虑了[27]中的"喷泉"和"HerzJesu"序列。它们非常小,我们只使用它们进行测试,以表明我们在照片旅游数据集上训练的网络可以成功推广。

  室内场景。我们使用 SUN3D 数据集 [34],该数据集包含一系列使用 Kinect 拍摄的室内视频,并进行 3D 重建。它们具有类似办公室的场景,几乎没有明显的特征,许多重复的元素和大量的自遮挡,这使得它们对于稀疏的关键点方法极具挑战性。我们选择9个序列进行训练和测试,并使用[31]先前选择的15个序列仅用于测试,以提供公平的比较。我们将视频细分为 10 倍。

  对于我们训练的每个序列,我们随机将图像分成不相交的子集,用于训练(60%),验证(20%)和测试(20%)。为了在"户外"子集上选择有效的图像对,我们随机采样两个图像,并检查它们是否具有来自SfM重建的最小数量的3D点,表明问题是可以解决的。对于"室内"系列,我们使用深度图来确定能见度。我们使用 1k 图像对进行验证和测试,并尽可能多地进行训练。

4.2. Evaluation Protocols

  基于关键点的方法。它们包括完善的算法,RANSAC [10],MLESAC [29]和LMEDS [23],以及最近的GMS [3]。对于GMS,我们加入了一个额外的RANSAC步骤,如第3.5节中我们的方法所述,我们经验上认为这是获得良好性能所必需的。

  请注意,GMS 使用大型 (10k) ORB 特征池 [24]运行,因此其行为类似于密集方法。对于所有其他功能,包括我们的功能,我们评估了SIFT [19]和LIFT [35]功能。对于SIFT,我们使用OpenCV库,对于LIFT,我们使用公开可用的模型,这些模型是在与我们不同的照片旅游数据上进行训练的。

  密集的方法。我们考虑G3DR [36]和DeMoN [31]。对于G3DR,我们实现了他们的架构,并仅使用其损失函数的姿势分量对其进行训练,因为他们认为在没有分类损失的情况下,姿态估计更准确[36]。对于DeMoN,我们使用公开可用的模型,这些模型在SUN3D序列和户外集合的SfM重建上进行了训练。

  指标。给定两个图像,理论上可以精确估计旋转,并且仅平移到比例因子[11]。因此,我们使用估计向量和地面实况向量之间的角差,即最接近的弧距(以度为单位)作为我们的误差度量。我们这样做如下。首先,我们通过将每个姿势分类为准确与否来生成曲线,即我们计算精度,给定阈值(0到180o),并构建归一化累积曲线,如[8,3]所示。其次,我们计算此曲线下的面积(AUC),最大阈值为5,10或20o,因为在点之后,姿势估计的不准确程度并不重要。当曲线测量精度时,其 AUC 等效于平均精度 (mAP)。为简单起见,我们对旋转和平移应用相同的阈值。

4.3. Ablation Study

  我们方法的核心是两个关键思想:将对应关系标记为入值或异常值,同时使用它们来估计基本矩阵,并利用类似 PointNet 的体系结构,用第 3.2 节中介绍的上下文规范化替换其全局上下文功能。我们研究了这两种选择的影响。

4.3.1 Hybrid Approach vs Classification vs Regression

4.3.2 Context Normalization vs Context Feature

  为了进行比较,我们使用 PointNet 体系结构 [21] 重新表述了我们的方法。Point-Net的特殊性在于,它从输入特征中提取一个全局上下文特征,然后将其连接到每个单独的特征并重新注入网络。相比之下,我们只是通过上下文规范化将其嵌入到每个逐点特征中。为了进行公平的比较,我们使用与我们的架构具有相似复杂性的架构,每个架构有12个MLP用于提取点特征,全局特征和最终输出。我们将最大池化替换为平均池化以提取全局特征,从而提供了更好的结果。我们将这种架构称为PointNet,并使用均衡器(6)的混合损耗来训练它,就像我们对Our所做的那样。为了完整性,我们还尝试了没有上下文规范化的方法。

  我们在图5中报告了"圣心"序列的结果。在所有三种情况下,我们都会在没有第3.5节的最终RANSAC阶段的情况下呈现结果。正如预期的那样,我们没有上下文规范化的方法表现不佳,而有了它,它的表现比PointNet好得多。

4.4. Postprocessing with RANSAC

  请注意,如果没有 RANSAC,传统的基于关键点的方法根本不起作用。相比之下,我们的网络在单次向前传递中优于RANSAC,仅使用8点算法。但是,在测试时,我们可以放弃可微性约束,如第 3.5 节所述,并在幸存的进取值上应用 RANSAC 以进一步提高性能。我们将在本文的其余部分执行此操作。

  此外,我们的方法比独立的RANSAC快得多,因为它可以在一个步骤中丢弃大多数糟糕的匹配。给定 2k 匹配,通过我们的网络的正向传递在 GPU 上需要 13 毫秒(或在 CPU 上需要 25 毫秒),平均返回约 300 个入值 — RANSAC 然后在 9 毫秒内再删除约 100 个匹配项。相比之下,具有完整 2k 匹配的 RANSAC 循环需要 373 毫秒,并返回约 300 个入值。因此,我们的方法(包括RANSAC)不仅更准确,而且速度提高了17倍(请参阅补充材料以获取综合数字)。

4.5. Comparison to the Baselines

  现在,我们将我们的方法与上面讨论的基线进行比较。鉴于第 4.3 节中介绍的结果,我们使用打开上下文规范化时使用 Ours,并将 RANSAC 后处理应用于所有稀疏方法。我们将结果平均为多个集合 - 有关其他结果,请参阅补充材料。

  我们首先考虑在来自同一场景的图像上进行训练和测试的网络,然后在不同的场景上进行训练和测试。请注意,我们将图像拆分为不相交的集合以训练测试,如第 4.1 节所述,因此在这两种情况下,两个集合之间都没有重叠。对于GMS以外的基于关键点的方法,我们同时考虑SIFT和LIFT。

4.5.1 Performance on Known Scenes

  考虑来自YFCC100M的5个室外图像集合和来自SUN3D的9个室内序列,如第4.1节所述,如图3所示。我们在图6和图8中报告了我们的比较结果。训练集和测试集始终是不相交的,但取自同一集合。

  对于五个"户外"系列,其图像功能丰富,我们使用在照片旅游数据集上训练的LIFT功能实现最佳结果。然后,我们提供的mAP是以前最先进的方法的两倍多。但是,即使使用更流行的SIFT,它仍然优于其他方法。此外,对于较小的误差阈值,差距会越来越大,这表明我们的方法越严格,性能越好。

  相比之下,这两个"室内"系列的特点是纹理不佳的图像,具有重复的图案,静态环境和一致的比例,这使得它们不适合基于关键点的方法,更适合密集的方法。尽管如此,我们的方法明显优于所有比较的方法,包括密集的方法。在这些图像上,Ours使用SIFT比LIFT表现更好,这与LIFT接受过摄影旅游图像培训的事实一致。请注意,对于图6中报告的DeMoN数字,我们使用了他们预先训练的模型,因为由于缺乏"户外"数据的深度信息,无法重新训练它。还要注意,他们的训练集包括来自SUN3D的不是一个序列,而是许多序列[31]。

4.5.2 Generalization to Unknown Scenes

  在这里,我们通过在不同场景上进行训练和测试来评估方法的泛化能力。图 7 报告了使用"室外"中的"圣彼得"序列和"室内"中的"Brown 1"序列组合训练的模型的结果。对于"户外",我们报告了除"圣彼得"之外的所有套装的平均结果。对于"室内",我们报告了[31]选择的15个测试序列的平均结果,以便进行公平比较。

  我们在"户外"方面的表现远远超过所有基线。比较图 6 和图 7 表明,我们的模型可以很好地泛化到未知场景。请注意,图 6 和图 7 之间几个基线的性能跳跃完全是由于添加了两个简单的序列"Fountain"和"Herzjesu",用于图 7 中的测试。

  在"室内"中,我们以很小的优势超越了最先进的技术,并失去了一些泛化能力,可能受到室内场景的SIFT和LIFT功能的限制。尽管如此,我们在两个子集上都表现出色,单个模型仅在2000张户外和500张室内图像上进行了训练,并在完全不同的场景中进行了测试。在补充材料中给出了进一步的结果,我们表明我们仍然可以通过更小的训练集(例如59张图像)超越最先进的技术。

5. Conclusion

  我们提出了一种单镜头技术,以恢复具有深网络的两个图像之间的相对运动。与当前趋势相反,我们的方法是稀疏的,这表明基于关键点的稳健估计在密集的黑盒公式时代仍然具有相关性。我们的方法在图像很少和监督有限的情况下,以显着的优势超越了最先进的技术。
  我们的解决方案需要已知的相机内参。将来,我们计划使用F矩阵而不是E矩阵进行研究。虽然表达将基本保持不变,但我们预计混合损失的回归分量会出现数值稳定性问题,这可能需要额外的归一化层或正则化项。

Learning to Find Good Correspondences 18‘CVPR 论文阅读笔记相关推荐

  1. 《Learning Unsupervised Metaformer for Anomaly Detection》论文阅读笔记

    作者:Jhih-Ciang Wu1,2, Ding-Jie Chen1, Chiou-Shann Fuh2, and Tyng-Luh Liu1 出自:ICCV Abstract: 核心是一个无监督的 ...

  2. Learning Multiview 3D point Cloud Registration论文阅读笔记

    Learning multiview 3D point cloud registration Abstract 提出了一种全新的,端到端的,可学习的多视角三维点云配准算法. 多视角配准往往需要两个阶段 ...

  3. 论文阅读笔记(2):Learning a Self-Expressive Network for Subspace Clustering,SENet,用于大规模子空间聚类的自表达网络

    论文阅读笔记(2):Learning a Self-Expressive Network for Subspace Clustering. SENet--用于大规模子空间聚类的自表达网络 前言 摘要 ...

  4. Learning from Synthetic Data for Crowd Counting in the Wild 论文阅读笔记

    Learning from Synthetic Data for Crowd Counting in the Wild 论文阅读笔记 发表:CVPR 2019 人群计数任务在多变的环境,大范围的人群中 ...

  5. 论文Learning to Solve Large-Scale Security-Constrained Unit Commitment Problems阅读笔记

    论文Learning to Solve Large-Scale Security-Constrained Unit Commitment Problems阅读笔记 论文arxiv链接:Learning ...

  6. 论文阅读笔记:SCAN: Learning to Classify Images without Labels

    论文阅读笔记:SCAN: Learning to Classify Images without Labels 摘要 简介和相关工作 方法 表征学习 语义聚类损失 2.3 通过自标记进行微调 3 实验 ...

  7. 论文阅读笔记:Improving Attacks on Speck32 / 64 using Deep Learning

    论文阅读笔记:Improving Attacks on Speck32 / 64 using Deep Learning 本文通过神经网络利用了减少轮数的 Speck 的差分性质.为此,作者对神经网络 ...

  8. 【论文阅读笔记】Learning To Detect Unseen Object Classes by Between-Class Attribute Transfer

    摘要: 本文主要研究训练和测试类别不相交时(即没有目标类别的训练示例)的对象分类问题.在此之前并没有对于毫无关联的训练集和测试集进行对象检测的工作,只是对训练集所包含的样本进行分类.实验表明,通过使用 ...

  9. 论文阅读笔记(8):Structured Sparse Subspace Clustering: A Joint Affinity Learning and Subspace Clustering

    论文阅读笔记(8):Structured Sparse Subspace Clustering: A Joint Affinity Learning and Subspace Clustering F ...

最新文章

  1. 十二张图详解Redis的数据结构和对象系统
  2. 混合现实未来的八大应用场景
  3. LDAP 轻量级目录访问协议 介绍
  4. 读书笔记:锋利的JQuery
  5. 【MFC】带进度条的状态栏
  6. 祝贺 在线文件管理系统 访问量 超过500
  7. java自动加空格吗_程序加上空格和不加空格运行结果不一样
  8. c# 整个工程(包括窗体工程)做成dll
  9. PyTorch:tensor-数据处理
  10. 蚂蚁金服二面,竟然被问到事务的基本原理?
  11. 利用ExcelJS读取Excel文件
  12. Linux自学之旅-基础命令(Ext4文件系统)
  13. 光模块调式总结(SFP)
  14. DayDayUp:2020,再见了,不平凡的一年,让我懂得了珍惜,让我明白了越努力越幸运
  15. android--GooglePay 谷歌支付内购接入(1)
  16. ictclas4j java_ictclas4j 分词工具包 安装流程
  17. 父爱如山,催泪微电影感动全网
  18. 辐射探测 期末考试 考完后的recheck!oh,老baby,高纯锗要低温呀!!
  19. linux 脚本 $? -ne 0是什么意思,【shell】linux之if [ $? -ne 0 ];-ne 表示 不等于,参考shell中运算符整数比较
  20. 30岁买房只需记住一句话,永远不会出错!

热门文章

  1. php mysql 影响的行数,php mysql_affected_rows获取sql执行影响的行数
  2. 如何在GitHub上收集Star?
  3. windows php 添加环境变量
  4. BUUCTF——异性相吸 题解
  5. vue项目兼容ie浏览器(出现白屏)
  6. Hibernate OneToMany等注解详解
  7. Linux声音设备编程实例
  8. XServer基本概念 + x11vnc配置远程桌面
  9. WEB集群与各种负载均衡简介 (资源)
  10. Unity3D Animation Rig 蜘蛛动画