(多视图分类)EMVN:Equivariant Multi-View Network

el/2024/4/20 15:12:06

(多视图分类)EMVN:Equivariant Multi-View Network

  • 简介
  • 论文
    • abstract
    • introduction
    • 2. Related work
      • 2.1 3D shape analysis
      • 2.2 Equivariant representations
    • 3. Preliminaries
    • 4. Method
      • 4.1 View configurations
      • 4.2 Group convolutional networks
      • 4.3 Equivariance with fewer views
      • 4.4 Filter localization
    • 5. Experiments
      • 5.1 SHREC’17 retrieval challenge
      • 5.2 ModelNet classification and retrieval
      • 5.3 Scene classification
      • 5.4 Discussion
    • 6. Conclusion

简介

2019-ICCV
版权:
在这里插入图片描述

论文

abstract

一些流行的3D视觉任务的方法是用在自然图像上预训练的深度神经网络来独立处理输入的多个视图,通过对所有视图进行单轮池化操作来实现视图的不变性。我们认为,这种操作丢弃了重要的信息,导致了不合格的全局描述符。在本文中,我们提出了一种多视图聚合的组卷积方法,其中卷积是在旋转组的一个离散子组上进行的,因此能够以等值(而不是不变)的方式对所有视图进行联合推理,直到最后一层为止。我们进一步发展了这个想法,在旋转组的更小的离散同质空间上进行操作,其中极地视图表示法被用来维持等值,而输入视图的数量只是一小部分。我们在几个大规模的三维形状检索任务中设定了新的技术状态,并展示了在全景场景分类中的额外应用。

introduction

物体[39, 3]和整个场景[2, 8]的大规模三维数据集的激增使得深度学习模型的训练产生了全局描述符,可以应用于分类和检索任务。出现的第一个挑战是如何表示输入。尽管在体素[39, 24]、点云[27, 32]和基于网格[23, 26]的表征方面做了许多尝试,但使用3D输入的多视图可以转换到2D领域,所有最近基于图像的深度学习的突破(例如[15])都可以直接应用,促进最先进的性能[33, 20]。基于多视图(MV)的方法需要某种形式的视图池化,可以是(1)在一些中间卷积层上的像素级池化[33],(2)在最终的一维视图描述符上的池化[34],或者(3)结合最终的得分[20],这可以被视为独立投票。这些操作通常不受视图排列组合的影响。我们的关键观察是,传统的视图池化是在对视图集进行任何联合处理之前进行的,将不可避免地丢弃有用的特征,导致不合格的描述符。我们首先意识到每个视图都可以与旋转群SO(3)的一个元素相关联,所以结合多个视图的自然方式是作为群上的一个函数来解决这个问题。传统的CNN被用来获得组成这个函数的视图描述符。我们设计了一个群演化网络(G-CNN,受到[5]的启发)来学习对群的变换具有等效性的表示。这与通过通常的视图池化获得的不变的表征不同,后者抛弃了信息。我们通过对最后一个G-CNN层进行汇集,获得对分类和检索有用的不变描述符。我们的G-CNN在组上有局部支持的过滤器,并且随着我们堆叠更多的层和增加感受野,可以分层次地学习更复杂的表示。我们利用多视图的有限性,考虑像二十面体这样的有限旋转组,这与[6, 10]在连续组上的操作不同。为了减少处理每个组元素的一个视图的计算成本,我们表明,通过考虑相对于面内扩张旋转组(对数极坐标)的典范坐标的视图,我们可以大大减少视图的数量,并获得一个同质空间(H空间)上的初始表示,可以通过相关来提升,同时保持等价性。我们专注于3D形状,但我们的模型适用于任何多视图可以代表输入的任务,这一点在全景场景的实验中得到了证明。

在这里插入图片描述
图1说明了我们的模型。我们的贡献是。- 我们引入了一种新的聚合多视图的方法,无论是 "由外向内 "的三维形状还是 "由内向外 "的全景。我们的模型利用了底层的群组结构,产生了作为旋转群组函数的等值特征。- 我们介绍了一种在保持等值性的同时减少视图数量的方法,即通过对平面内旋转的典型坐标进行转换,然后进行同质空间卷积。- 我们探索了有限旋转群和同质空间,并在迄今为止最大的旋转群–二十面体群上提出了一个离散的G-CNN模型。我们进一步探索了这个群组的过滤器定位的概念。- 我们在多个形状检索基准上取得了最先进的性能,包括在经典姿势和旋转扰动下的性能,并展示了在全景场景分类中的应用。

2. Related work

2.1 3D shape analysis

三维形状分析的性能在很大程度上取决于输入表现。主要的表示方法是体素、点云和多视图。体积方法的早期例子是[3],它引入了ModelNet数据集,并使用体素表征的深度信念网络训练了一个三维形状分类器;以及[24],它提出了一个具有三维卷积层和全连接层的标准架构。Su等人[33]意识到,通过渲染3D输入的多个视图,可以将基于图像的CNN的力量转移到3D任务中。他们表明,即使只使用输入的单一视图,传统的CNN也能胜过体积法,而多视图(MV)模型则能进一步提高分类的准确性。Qi等人[28]研究了体积法和多视图法,并提出了对两者的改进;Kanezaki等人[20]介绍了一种MV方法,通过联合预测类别和姿势,实现了最先进的分类性能,尽管没有明确的姿势监督。GVCNN[12]试图学习如何结合不同的视图描述符来获得一个视图-组-形状的表示;他们把特征的任意组合称为 “组”。这与我们对 "组 "一词的用法不同,后者是代数定义。基于点云的方法[27]取得了介于体积和多视图之间的性能,但在计算上要高效得多。虽然网格可以说是最自然的表示方法,并且在计算机图形学中被广泛使用,但直接在网格上操作的学习模型只取得了有限的成功[23, 26]。为了更好地比较三维形状描述符,我们将把重点放在检索性能上。最近的方法显示出对检索的明显改进。You等人[41]结合了点云和MV表征;Yavartanoo等人[40]引入了多视图立体投影;Han等人[14]实现了一个循环MV方法。我们还考虑了关于旋转的ModelNet和SHREC’17[29]检索挑战的更具挑战性的任务,其中包含旋转的形状。任意旋转的存在促使我们使用等值表示法。

2.2 Equivariant representations

一些应变方法已经被引入,以处理任意朝向的三维形状。典型的例子是训练时间的旋转增强和测试时间的投票[28],以及学习初始旋转到一个典型的姿势[27]。[33]中的视图集合对输入视图集的排列组合是不变的。处理旋转的一个原则性方法是使用设计中的等值表示。主要有三种方法将等值嵌入到CNN中。第一种方法是约束过滤器的结构,这与基于Lie发生器的方法相似[30, 17]。Worral等人[38]利用圆周谐波的优势,将平移和二维旋转的等值性纳入CNN。同样,Thomas等人[35]引入了一个张量场来保持三维点云的平移和旋转的等值性。第二种方式是通过改变坐标;[11,18]采取输入的对数极化变换,将关于单点的旋转和缩放等值转移到平移等值。第三种方法是利用等值滤波器的轨道。Cohen和Welling提出了带有方形旋转群的群卷积(G-CNNs)[5],后来扩展到六边形[19]。Worrall和Brostow[37]提出在三维体素化数据上使用Klein的四组的CubeNet。Winkels等人[36]在八面体对称群上实现了三维群卷积,用于容积CT图像。Cohen等人[7]最近考虑了二十面体上的函数,然而他们的卷积是在循环群上,而不是像我们这样在二十面体上。Esteves等人[10]和Cohen等人[6]专注于无限群SO(3),并使用球面谐波变换来精确实现球面卷积或相关关系。这些方法的主要问题是,输入的球形表示法不能捕捉到物体形状的复杂性;它们的效率也较低,并面临带宽的挑战。

3. Preliminaries

我们试图利用数据中的对称性。对称性是指保留了一个对象的某些结构的操作。如果对象是一个没有额外结构的离散集合,每个操作都可以被看作是其元素的置换。群这个词在其经典的代数定义中是指一个具有满足封闭性、关联性、同一性和反转性的操作的集合。像互换这样的变换群是 “抽象群和对称性概念之间的缺失环节”[25]。我们把视图称为从一个有方向的相机中拍摄的图像。这与视角不同,视角指的是光轴方向,对于移动的相机来说,是由外向内指向固定的物体,对于固定的相机来说,是由内向外指向不同方向。多个视图可以从同一视角拍摄;它们通过平面内的旋转联系起来。

等价表征:
在设计上具有等价性的表征是利用对称性的一种有效方式。考虑一个集合X和一个变换群G。对于任何g∈G,我们可以定义应用于该集合的群作用,TXg: X → X ,它具有同构的属性,TXg*TXh = TXgh。如果如下:我们就说Φ对G是等价的。
在这里插入图片描述
在CNN的背景下,X和Y分别是输入和特征表示的集合。这个定义包含了TYg是标识的情况,使Φ对G不变量,并抛弃了g的信息。在本文中,我们对保留信息的非退化情况感兴趣。

组卷积:
我们将多个视图表示为一个群组上的函数,并寻求对该组的等价性,所以组卷积(G-Conv)是我们方法的自然操作。让我们回顾一下f,h之间的平面卷积。R2→R,这是CNN的主要操作。
在这里插入图片描述
它可以被看作是对平面上的平移群的操作,其中群作用是坐标值的加法;它很容易被证明对平移是等价的。这可以推广到任何群G和f,h。G →R,
在这里插入图片描述
这对来自G的群作用是等价的。

同质空间上的卷积:
为了提高效率,我们可以放松每个群元素一个视图的要求,只考虑低卡度同质空间的每个元素一个视图。例如,我们可以在二十面体的12个顶点(一个H空间)上表示输入,而不是在二十面体组的60个旋转上。一个群G的同质空间X被定义为一个空间,其中G的作用是过境的:对于任何x1,x2∈X,存在g∈G,使得x2=gx1。在同质空间的函数f,h之
间可以定义两个类似卷积的操作。X →R:
在这里插入图片描述
其中η∈X是一个任意的标准元素。我们表示(4) “同质空间卷积”(H-Conv)和(5) “同质空间相关”(H-Corr)。请注意,卷积在同质空间X上产生一个函数,而相关将输出提升到群G上。我们参考[22,4]关于神经网络背景下群和同质空间卷积的阐述。

有限旋转群:
由于我们的表征是一个可以被识别为旋转的有限视图集,我们将处理旋转群SO(3)的有限子群。SO(3)的有限子群可以是2π/k的倍数的循环群Ck,正规k-gon对称的二面体群Dk,四面体群、八面体群或二十面体群[1]。我们的主要结果是关于二十面体群I,二十面体的60元非阿贝尔对称群(在补充材料中说明)。这些对称性可以被划分为围绕几个轴的旋转组。例如,围绕通过二十面体顶点的每个轴有5个旋转,或围绕通过其面心的每个轴有3个旋转。

通过典型坐标进行等值化:
有些配置产生的视图是通过平面内的旋转来关联的。我们利用这一点来减少所需的视图数量,通过改变典范坐标和CNN来获得旋转不变的视图描述符。Segman等人[30]的研究表明,改变为经典坐标系统可以使输入的某些变换显示为输出的平移。对于平面上的扩张旋转群(与SO(2) × R +同构),典范坐标是由对数极坐标变换给出的。由于平面卷积对平移是等价的,将图像转换为对数极值并应用CNN会产生对扩张旋转等价的特征,这些特征可以被汇集到最后一层的不变描述符中[11, 18]。

4. Method

4.1 View configurations

二十面体对称性有几种可能的视图配置,基本上由具有相同对称性的实体的顶点或面组成。两个例子是将视点与二十面体的面/顶点联系起来,这些面/顶点相当于其对偶十二面体的顶点/面。这些配置是基于柏拉图实体的,它保证了视点的均匀分布。通过从二十面体的面中选择视点,我们得到了20组3个视图,在平面旋转中只相差120度;我们把这种配置称为20×3。 同样,使用十二面体的面,我们得到了12×5的配置。在三维形状分析的背景下,多个视点对于处理自我封闭和模糊性是很有用的。从这个意义上说,通过面内旋转相关的视图是多余的,但对于保持组的结构是必要的。为了尽量减少冗余,我们建议将视点与截断二十面体(具有二十面体对称性)的60个顶点联系起来。在这种配置中,每个视点都有一个视图。这并不是一个均匀的视点分布,但其多样性是有益的。图3显示了我们考虑的一些视图配置。请注意,我们的配置与[33]的80个视图和[20]的20个视图都不同,它们与任何旋转组都不同构。他们的12个视图配置与更有限的循环群同构。
在这里插入图片描述

4.2 Group convolutional networks

我们方法的组卷积部分的核心是公式(3)的离散版本。一个在输入和输出中有ci , cj通道和非线性σ的群卷积层:
在这里插入图片描述
其中fi是在层ℓ的通道i,hij是通道i和j之间的过滤器,其中1 ≤ j ≤ cj。我们最重要的结果是关于二十面体群I,它有60个元素,是旋转群SO(3)的最大离散子群。据我们所知,这是在离散G-CNN的背景下考虑过的最大的群。由于我只对SO(3)进行了粗略的采样,对任意旋转的等价性只是近似的。然而,我们的结果表明,CNN提供的对局部变形的不变性和G-CNN提供的精确等价性的结合,足以在许多任务中实现最先进的性能。当考虑I组时,Φ2的输入是60×n,其中n是Φ1最后一层的通道数(ResNet-18的n=512)。每层有ci×cj个滤波器,每个滤波器都有与组相同的基数。我们可以把滤波器和特征图看作是五角十二面体面上的函数,五角十二面体是截断二十面体的对偶多面体。它具有二十面体的对称性,有60个面可以被识别为组的元素。与gi∈I相关的面的颜色反映了f(gi),它是矢量值的。图2显示了我们的方法学到的一些等值特征图。
在这里插入图片描述

4.3 Equivariance with fewer views

如图3所示,二十面体的对称性可以被划分为围绕几个轴的旋转集。如果我们安排摄像机,使它们位于这些轴上,那么每个摄像机产生的图像都是通过面内旋转联系起来的。如第3节所示,将一个图像转换为典型坐标可以将平面内的旋转转换为平移。我们将把转换后的图像称为 “极坐标图像”。由于完全卷积网络可以产生平移不变的描述符,通过对极地图像的应用,我们有效地实现了对平面内旋转的不变性[11, 18],这使得每个视点只需要一个视图。这些网络需要在角度维度上进行循环填充。当每个视点只关联一个视图时,输入是在一个点的空间,而不是一组旋转。事实上,输入是该组同质空间上的一个函数;具体来说,对于我们考虑的视图配置,它是在二十面体或十二面体顶点上。我们可以在同质空间上应用离散版本的卷积和相关,如第3节所定义的:
在这里插入图片描述
这种方法的好处是,由于从12×5(20×3)的配置开始时,它使用了5倍(3倍)少的视图,它的速度大约是5倍(3倍),因为大部分的计算是在G-CNN之前完成的。缺点是,从极地图像中学习可能是一种挑战。图4显示了由视图产生的极地图像的一个例子。当已知输入是对齐的(在典型姿势中),就不需要等价的中间表示;在这种情况下,我们可以用同样的方法来减少所需的视图数量,但不需要极地变换。
在这里插入图片描述

4.4 Filter localization

G-CNN过滤器是G上的函数,它最多可以有|G|个条目。在过去几年中,用深度CNN获得的结果显示了有限支持过滤器的好处(许多架构都使用3×3内核)。其优点是双重的。(1)有限支持的卷积在计算上更有效率,(2)随着层的堆叠,它允许学习分层的更复杂的特征。受此启发,我们为离散的G-CNNs引入了本地化的滤波器。对于一个过滤器h。G →R,我们只需选择G的一个子集S,该子集允许有非零的滤波器值,而h(G - S)被设置为零。由于S是一个固定的超参数,我们可以更有效地计算(6):
在这里插入图片描述
为了确保过滤器的位置性,最好是S的元素在旋转流形中相互靠近。I中12个最小的旋转都是72度的。因此,我们选择S包含身份和一些72度的旋转。这种方法的一个注意事项是,我们需要确保S横跨G,否则无论堆叠多少层,感受野都不会覆盖整个输入,如果S属于G的一个子组,就会发生这种情况(见图5)。在实践中,这并不是一个具有挑战性的条件;对于我们只选择72度旋转的启发式方法,我们只需要保证至少有两个是围绕不同的轴。
在这里插入图片描述

5. Experiments

我们对三维形状分类、检索和场景分类进行了评估,并在补充材料中包括了更多的比较和一项消融研究。首先,我们讨论架构、训练程序和数据集。

架构:
我们使用ResNet-18[15]作为视图处理网络Φ1,其权重从ImageNet[9]预训练中初始化。G-CNN部分包含3层,有256个通道,在其支持上有9个元素(注意,参数的数量与一个传统的3×3层相同)。我们从512个通道投射到256个通道,所以参数的数量保持在接近基线的水平。当第4.3节中的方法被用来减少视图的数量时,第一个G-Conv层被一个H-Corr所取代。我们的方法的变体被称为Ours-X和OursR-X。R后缀表示检索的具体特征,包括(1)三联体损失4和(2)重新排列检索列表,使被归类为查询预测类的对象排在前面。在重新排序之前,列表按照描述符之间的余弦距离进行排序。对于SHREC’17来说,选择检索对象的数量N是任务的一部分–在这种情况下,我们只是返回所有被分类为查询类别的对象。为了公平地评估我们的贡献,我们实现了MVCNN的一个变体,对X个输入视图表示为MVCNN-M-X,其中显示了表现最好的X。MVCNN-MX具有与我们相同的视图处理网络、训练程序和数据集;唯一的区别是,它对视图描述符进行了汇集,而不是使用G-CNN。

训练:
我们使用SGD训练,以Nesterov momentum作为优化器。对于ModelNet的实验,我们训练了15个epochs,对于SHREC’17,我们训练了10个。按照[16],学习率在第一个历时中从0线性增加到lr,然后在一个余弦四分之一周期后衰减到零。当用60个视图进行训练时,我们将批次大小设置为6,lr为0.0015。这需要大约11Gb的内存。当用12个或20个视图进行训练时,我们线性地增加批次大小和lr。在NVIDIA 1080 Ti上,在ModelNet40上训练我们的20个视图模型一个历时需要≈353秒,而相应的MVCNN-M需要≈308秒。在相同的条件下,训练RotationNet[20]一个历时≈1063s。

数据集:
我们为ModelNet和ShapeNet SHREC’17子集渲染12×5、20×3和60×1的相机配置(第4.1节),包括旋转和对齐版本。对于对齐的数据集,不需要对旋转进行等值处理,我们将相机的上向量固定在由物体中心、相机和北极定义的平面内。这就把视图的数量从12×5减少到12,从20×3减少到20。对于旋转的数据集,所有的渲染都有60个视图,并遵循分组结构。请注意,旋转的数据集并不局限于离散组,而是包含从SO(3)开始的连续旋转。我们观察到,60×1的配置表现最好,所以这些是 "Ours-60 "的数字。对于视图较少的实验,我们从12×5中选择了12个,从20×3中选择了20个,这些视图被转换为对数极坐标(第4.3节)。对于场景分类实验,我们从全景图中抽取12个重叠的视图。没有进行数据增强。

5.1 SHREC’17 retrieval challenge

SHREC’17大型三维形状检索挑战[29]利用ShapeNet Core55[3]数据集,有两种模式。"正常 "和 “扰动”,对应于我们在第5.2节定义的 "对齐 "和 “旋转”。该挑战是在2017年进行的,但最近人们对它很感兴趣,特别是对 "旋转 "模式[6, 10, 21]。表1显示了结果。N是检索到的元素的数量,我们选择的是与查询相同类别的对象。归一化贴现累积收益(NDGC)得分使用ShapeNet子类来衡量检索到的模型之间的相关性。方法通过微观(基于实例)和宏观(基于类)的mAP的平均值进行排名。一些额外的检索指标包括在补充材料中。只显示了表现最好的方法;更多结果请参考[29]。我们的模型在两种模式下都优于目前的技术水平,即使没有三联体损失,如果包括三联体损失,也会增加利润率。我们认为这是我们最重要的结果,因为它是最大的可用的三维形状检索基准,并且有许多关于它的公开结果。
在这里插入图片描述

5.2 ModelNet classification and retrieval

我们在ModelNet[39]的变体上评估三维形状分类和检索。为了与大多数公开的结果进行比较,我们在 "对齐的 "ModelNet上进行评估,并使用所有可用的模型与原始训练/测试分割(9843用于训练,2468用于测试)。我们还对更具挑战性的 "旋转的 "ModelNet40进行了评估,其中每个实例都被随机旋转的SO(3)所扰动。表2和表3显示了结果。我们只显示表现最好的方法,完整的排行榜请参考ModelNet网站5。分类性能由准确性(acc)和检索性能由平均精度(mAP)决定。平均数是指实例的平均数。我们在补充材料中包括基于类别的平均数。对于ModelNet10和ModelNet40,即使没有检索的特定特征,我们的检索性能也优于目前的技术水平。当包括这些特征(三联体损失和按类标签重新排序)时,差值明显增加。我们专注于检索,并不要求分类方面的技术水平,这一点由RotationNet[20]保持。虽然[20]没有尝试过ModelNet检索,但SHREC’17的检索是尝试过的,而且我们在这方面的表现明显更好(表1)。
在这里插入图片描述
在这里插入图片描述

5.3 Scene classification

我们展示了以物体为中心的配置(由外向内)的实验,但我们的方法也适用于以相机为中心的配置(由内向外),这在Matterport3D[2]全景图任务的场景分类上得到了证明。我们从全景图中抽取多个重叠的方位角视图,并在12个旋转的循环组上应用我们的模型,过滤器的支持度为6。表4显示了结果;补充材料中列出了每个类别和输入样本的精确度的完整表格。MV方法优于直接在全景图上操作,因为(1)它允许更高的整体分辨率,同时在各视图之间共享权重,以及(2)视图与自然图像的比例相匹配,因此预训练被更好地利用。我们的MVCNN-M优于这两个基线,我们提出的模型也优于它,这表明在这种情况下,组结构也是有用的。在这项任务中,我们的表述对方位角旋转是等价的;直接在全景图上操作的CNN具有相同的属性。
在这里插入图片描述

5.4 Discussion

我们的模型在多个三维形状检索基准上表现出最先进的性能。我们认为,检索问题更适合于评估形状描述符,因为它需要一个完整的模型之间的相似度等级,而不是只有一个类标签。我们对对齐数据集的结果表明,全套60个视图是不必要的,在这种情况下甚至可能是有害的;但即使不需要等值,用G-Convs进行原则性的视图聚合也是有益的,正如MVCNN-M和我们的方法之间的直接比较所示。对于旋转的数据集,结果清楚地表明,性能随着视图数量的增加而增加,而G-Convs的聚合带来了巨大的改进。有趣的是,我们的MVCNN-M基线优于许多竞争的方法。与原始MVCNN[33]的区别是:(1)晚期视图池,(2)使用ResNet,(3)改进渲染,以及(4)改进学习率计划。在[34]中也观察到了这些明显的性能提升,并证明了多视图表示法的代表性潜力。一个限制是,我们的特征图只对离散旋转有等价性,虽然在连续旋转下的分类和检索性能很好,但对于连续姿势估计这样的任务来说,可能就不是了。另一个限制是,我们假设视图遵循组的结构,这对真实的图像来说可能很难实现。请注意,这对于三维形状分析不是一个问题,在那里我们可以呈现任何任意的视图。

6. Conclusion

我们提出了一种方法,利用传统的深度CNN的表示能力,并利用多视图的有限性来设计一个群卷积网络,在离散的群中进行精确的等值,最重要的是二十面体群。我们还在此背景下引入了局部过滤器和同质空间上的卷积。相对于传统的视图池,我们的方法能够对所有的视图进行联合推理,并且在几个三维形状检索的基准中以很大的幅度超过了目前的技术水平。


http://www.ngui.cc/el/3376886.html

相关文章

点云生成-PointFlow: 3D Point Cloud Generation with Continuous Normalizing Flows

点云生成-PointFlow: 3D Point Cloud Generation with Continuous Normalizing Flows简介论文摘要1.introduction2.related works3. Overview4. Background4.1. Continuous normalizing flow4.2. Variational auto-encoder5. Model5.1. Flow-based point generation from shape…

点云生成:Diffusion Probabilistic Models for 3D Point Cloud Generation

点云生成:Diffusion Probabilistic Models for 3D Point Cloud Generation简介论文abstract1.instruction2.Related works3.Diffusion Probabilistic Models for Point Clouds3.1.Formulation3.2.Training Objective3.3.Training Algorithm4.Model Implementations4…

大数据(一)

平台 1.概念:就是操作系统。(windows,linux,Mac) 2.跨平台:java可以运行在任意的操作系统上,一次编写到处运行。 3.原理:实现跨平台需要依赖虚拟机–java虚拟机。 注释 什么是注释…

while和do—while循环语句

while循环语句 格式: while(判断条件语句){ ​ 循环体语句; } 扩展格式: 初始化语句; while(判断条件语句){ ​ 循环体语句; ​ 控制条件语句; } 实例一 猜字…

if-else条件语句

if-else条件语句 语法: if(布尔表达式) { //如果布尔表达式为true将执行的语句 } 实例一 输入分数,判断段位 public static void main(String[] args){ Scanner scnew Scanner(System.in);System.out.println("请输入分数");int x sc.…

面向过程

面向过程 A:面向过程: 强调的是过程,所有的事情都需要自己完成 B:面向对象: 是一种更符合我们思想习惯的思想(懒人思想,我把事情自己不做,交给别人去做) 可以将复杂…

unity获取到网络时间和本地时间

unity获取到网络时间和本地时间获取到网络时间unity获取本地时间2018年11月26日 16:30:10做一个时间的显示,unity有获取到系统时间的api DateTime 当时考虑到网络游戏几个人的时间还是统一比较好,因此做了一个获取网络时间 上代码 获取到网络时间 先做…

关于bigAutocomplete的自动补全功能

1. 首先献上官网地址和资源这个官网什么的我不知道,好像没官网,哈哈哈哈直接百度云链接:https://pan.baidu.com/s/1ehti6Ue6cNtBipjkCtxWSQ 密码:lq2kjquery.bigautocomplete.cssjquery.bigautocomplete.js 2.具体前端后端代码&am…

关于富文本框KindEditor的使用

1. 首先献上官网地址和资源 js&#xff0c;css等资源百度云链接&#xff1a;https://pan.baidu.com/s/1tbSeToJQ1BYsXNPKChX7Zg 密码&#xff1a;xry2 2.具体前端后端代码&#xff08;html没有加入其他样式&#xff09; 引入上面的js和css <textarea id"description&…

通过oracle触发器调用存储过程发送http请求

什么是触发器&#xff0c;什么是存储过程&#xff0c;我不说&#xff0c;我也不知道 现在我要说的是怎么通过触发器调用存储过程发送http请求 --触发器&#xff1a;--语法&#xff1a;create [or replace] tigger 触发器名 触发时间 触发事件 on 表名[for each row]beginpl/s…