目标检测论文阅读:GraphFPN算法笔记
标题:GraphFPN: Graph Feature Pyramid Network for Object Detection
会议:ICCV2021
论文地址:https://ieeexplore.ieee.org/document/9710561/
Abstract
特征金字塔已经被证明在需要多尺度特征的图像理解任务中是强大的。SOTA的多尺度特征学习方法侧重于使用具有固定拓扑结构的神经网络进行跨空间和跨尺度的特征交互。在本文中,我们提出了图特征金字塔网络,它能够调整其拓扑结构以适应不同的内在图像结构,并支持在所有尺度上同时进行特征交互。我们首先为每个输入图像定义一个特定于图像的超像素层次结构来表示其内在的图像结构。图特征金字塔网络的结构继承了这个超像素层次结构。上下文层和层次层旨在实现同一尺度内和不同尺度间的特征交互。contextual层和hierarchical层旨在实现同一尺度内和不同尺度间的特征交互。为了使这些层更加powerful,我们通过推广卷积神经网络的全局通道注意力,为图神经网络引入了两种类型的局部通道注意力。提出的图特征金字塔网络可以增强来自卷积特征金字塔网络中的多尺度特征。我们通过将图特征金字塔网络集成到Faster R-CNN算法中来在目标检测任务中进行评估。在MS-COCO 2017验证和测试数据集上,改进的算法不仅优于SOTA的基于特征金字塔的方法,而且优于其他流行的检测方法。
1. Introduction
深度卷积神经网络利用局部连通性和权重共享,在计算机视觉任务中取得了一系列突破性进展,包括图像识别、目标检测、语义分割等。由于图像中的目标可能具有不同的尺度,因此需要在每个不同的尺度上获得具有足够空间分辨率的高层和低层特征融合后的多尺度特征图。这启发了特征金字塔网络(FPN)及其改进版本,如路径聚合网络(PANet)和特征金字塔转换器(FPT)等。
每幅图像都具有多尺度的内在结构,包括将像素分组为目标部分、将部分进一步分组为目标以及图像空间中目标的空间布局。这种多尺度内在结构因图像而异,可以为图像理解和目标识别提供重要线索。但是FPN及其相关方法总是使用与图像内在结构无关的固定的多尺度网络拓扑结构(即神经元的2D网格)。这种固定的网络拓扑结构对于多尺度特征学习可能不是最优的。根据心理学的证明,人类将视觉场景解析为部分-整体的层次结构,对不同图像中的部分-整体关系进行动态建模。受此启发,研究人员开发了一系列“胶囊”模型,用于描述图像特定区域中特定类型的出现。层次结构的分割可以根据超像素的位置和相似度递归地对超像素进行分组,生成超像素层次结构。这样一个部分-整体的层次结构可以通过弥补像素和目标之间的语义差距来辅助目标检测和语义分割。
众所周知,特征金字塔中的多尺度特征可以通过跨尺度交互以及同一尺度内的交互来增强。现有特征金字塔网络相关方法的另一个局限性是只有来自相邻尺度的特征是直接交互的,而来自非相邻尺度的特征则是通过其它的中间尺度间接交互。这一方面是因为匹配相邻两个尺度的分辨率最为方便,另一方面是因为现有的交互机制一次处理两个尺度最为方便。相邻尺度之间的交互通常遵循自顶向下或自底向上的顺序。在现有的方案中,位于金字塔顶端的最高层特征需要经过多个中间尺度传播,并与这些尺度下的特征交互后才能到达金字塔底端的特征。在这种传播和交互过程中,精髓的特征信息可能丢失或减弱。
在本文中,我们提出了图特征金字塔网络来克服上述限制,因为图网络能够适应输入图像的不同内在结构,并且支持跨所有尺度同时的特征交互。我们首先为输入图像定义一个超像素层次结构。这个超像素层次结构有多个层次,每个层次由一组不重叠的超像素组成,定义了输入图像的一个分割。从输入图像的同一层次结构分割中提取层次结构的各层分割。因此,层次结构中相邻两个层次的超像素是密切相关的。粗粒度上的每个超像素是细粒度上超像素的并集。超像素在两个层次上的这种一对多的对应关系定义了上述部分-整体关系,也可以称为祖先-后代关系。层次结构分割及其派生的超像素层次结构揭示了图像的内在结构。虽然超像素对图像进行了过度分割,但同一超像素中的像素通常属于同一语义目标/部分,并不会跨越语义目标/部分的边界。因此,超像素具有比均匀图像分割中的单元更同性的像素,更有效地防止了背景杂质和前景目标之间的特征混合。
为了有效地利用图像的内在结构,我们的图特征金字塔网络的实际结构通过输入图像的上述超像素层次结构来确定。事实上,图特征金字塔网络通过将超像素映射到图结点的方式,将其结构从超像素层次结构继承过来。图的边建立在同一层次的相邻超像素之间以及祖先-后裔关系中对应的超像素之间。图特征金字塔网络中的层与特征提取主干中的一个子集层之间也建立了对应关系。所有图结点上的初始特征首先从其在主干中对应位置的特征映射而来。contextual和hierarchical图神经网络层分别被设计用来促进同一尺度内和不同尺度间的特征交互。hierarchical层使得来自所有不同尺度的对应特征直接交互。将图特征金字塔各层的最终特征与传统特征金字塔网络中的特征进行融合,就产生了增强的多尺度特征。
我们在本文中的贡献总结如下。
- 我们提出了一种新的图特征金字塔网络来利用图像的内在结构并支持跨所有尺度同时的特征交互。这种图特征金字塔网络继承了输入图像的超像素层次结构。contextual和hierarchical层分别被设计用来促进同一尺度内和不同尺度间的特征交互。
- 通过推广现有的卷积神经网络全局通道注意力机制,我们进一步引入了两种类型的图神经网络局部通道注意力机制。
- 在MS-COCO 2017验证和测试数据集上的大量实验表明,我们的图特征金字塔网络能达到明显优于现有SOTA目标检测方法的性能,无论它们是否基于特征金字塔。消融研究的结果进一步验证了所提出的网络组件的有效性。
2. Related Work
特征金字塔。 在目标检测和语义分割中,特征金字塔在多个尺度上呈现高层特征图,并与主干网络一起工作,以实现跨多个尺度的性能提升和平衡。最近关于特征金字塔的工作可以分为3类:自顶向下网络、自顶向下/自底向上网络和基于注意力的方法。特征金字塔网络(FPN)利用深度卷积神经网络内在的多尺度、金字塔层次结构,构建具有横向连接的自顶向下结构,获得所有尺度下的高层语义特征图。路径聚合网络(PANet)通过自底向上的路径增强来缩短底层特征与最顶层特征之间的信息路径,以增强特征的层次结构。ZigZagNet不仅通过自顶向下和自底向上的稠密聚合,而且通过自顶向下和自底向上不同层次结构之间的锯齿交叉来丰富多层次的上下文信息。特征金字塔转换器通过3个转换器进行跨空间和跨尺度的主动特征交互。自转换器实现了单个特征图内部的非局部交互,grounding/rendering转换器实现了特征金字塔相邻层之间自顶向下/自底向上的连续交互。
本文旨在填补不同金字塔层的特征图之间的语义差距。与上述工作相比,我们的图特征金字塔网络最独特的特点是图特征金字塔的拓扑结构会动态适应输入图像的内在结构。此外,我们构建了一个跨所有尺度的图神经网络,使得跨所有尺度同时的特征交互成为可能。
图神经网络。 图神经网络能够灵活地建模结点间的依赖关系,可以用于数据结构不规则的场景。图卷积网络(GCN)通过对图进行频域卷积来在结点间传播信息。图注意力网络(GAT)利用局部自注意力层为相邻结点指定权重,在许多任务中得到了普及。Gao等人提出了结合图池化和去池化操作的图U-Net。图池化层依靠可训练的相似性度量自适应地选择结点子集以形成更粗粒度的图,而图去池化层则利用保存的信息将图反转为其成对池化操作之前的结构。
我们在GraphFPN中采用了GAT中的自注意力机制。为了进一步提高结点特征的识别力,我们通过推广现有CNNs的全局通道注意力机制,为GNNs引入局部通道注意力机制。与图U-Net相比,我们的图金字塔是建立在超像素层次结构上的。其结点的合并和分离操作不仅基于局部相似性排序,而且依赖于图像的内在结构,这使得我们的GraphFPN在图像理解任务中更加有效。
层次结构分割和GLOM。 通过建立部分-整体的层次结构来理解图像一直是计算机视觉中长期存在的开放式问题。MCG和COB中的层次结构分割算法可以利用检测到的边界将图像的像素组合成超像素。这些超像素是分层形成的,以自底向上的方式描述目标。Hinton提出了GLOM假想系统,旨在使用具有固定结构的神经网络将图像解析为特定于图像的部分-整体层次结构。
给定一幅输入图像,我们使用COB中的层次结构分割来构建特定于图像的超像素层次结构,并在此基础上进一步构建图特征金字塔网络。本文的贡献之一在于利用特定于图像的部分-整体层次结构来增强多尺度特征学习,这将有利于包括目标检测在内的图像理解任务。
3. Graph Feature Pyramid Networks
3.1. Superpixel Hierarchy
在层次结构分割中,像素(或者更小的超像素)通过相似性度量被递归地分组为更大的像素。给定一幅图像I\boldsymbol{I}I,我们依靠卷积定向边界(COB)来获得一个层次结构分割,即一族图像划分{S0,S1,...,SL}\{\mathcal{S}^0,\mathcal{S}^1,...,\mathcal{S}^L\}{S0,S1,...,SL}。注意,S0\mathcal{S}^0S0中的每个超像素都是原始输入图像中的单个像素,SL\mathcal{S}^LSL只有一个代表整个图像的超像素,Sl\mathcal{S}^lSl和Sl−1\mathcal{S}^{l-1}Sl−1中超像素的数量仅相差一个(即Sl\mathcal{S}^lSl中的一个超像素是Sl−1\mathcal{S}^{l-1}Sl−1中两个超像素的并集)。
本文从{S0,S1,...,SL}\{\mathcal{S}^0,\mathcal{S}^1,...,\mathcal{S}^L\}{S0,S1,...,SL}中选取一个划分子集,定义一个超像素层次S={Sl1,Sl2,Sl3,Sl4,Sl5}\mathcal{S}=\{\mathcal{S}^{l_1},\mathcal{S}^{l_2},\mathcal{S}^{l_3},\mathcal{S}^{l_4},\mathcal{S}^{l_5}\}S={Sl1,Sl2,Sl3,Sl4,Sl5},其中S\mathcal{S}S的上标表示分割层次结构中的划分层,Sl1\mathcal{S}^{l_1}Sl1是层次结构中最精细的超像素集合,Sli+1\mathcal{S}^{l_{i+1}}Sli+1中的超像素是Sli\mathcal{S}^{l_i}Sli中超像素的并集。为了匹配卷积神经网络中的下采样率,选择{l1,l2,l3,l4,l5}\{l_1,l_2,l_3,l_4,l_5\}{l1,l2,l3,l4,l5},使得Sli+1\mathcal{S}^{l_{i+1}}Sli+1中的超像素数量为Sli\mathcal{S}^{l_i}Sli中的1/41/41/4。然后,超像素层次结构S\mathcal{S}S可以用来表示输入图像的部分-整体层次结构,并跟踪超像素之间的祖先-后代关系。
3.2. Multi-scale Graph Pyramid
我们构建了一个图金字塔{G1,G2,G3,G4,G5}\{\mathcal{G}^1,\mathcal{G}^2,\mathcal{G}^3,\mathcal{G}^4,\mathcal{G}^5\}{G1,G2,G3,G4,G5},其层对应了超像素层次结构中的层。超像素层次结构中的每个超像素在图金字塔的对应层上都有一个对应的图结点。因此,当我们从图金字塔的一层移动到下一个更高的层时,结点的数量也减少了4倍。我们为图金字塔定义了两类边。它们被称为contextual边和hierarchical边。contextual边连接同一层的两个相邻结点,而hierarchical边连接不同层的两个结点,如果它们对应的超像素之间存在祖先-后代关系的话。contextual边用于在同一层内传播上下文信息,而hierarchical边则用于弥补不同层之间的语义差距。注意,hierarchical边是稠密的,因为每个结点与其祖先和后代之间都有这样一条边。这些稠密连接会带来较大的计算和内存开销。因此,每个hierarchical边都与其结点特征之间的余弦相似度相关联,我们根据它们的余弦特征相似度对hierarchical边进行剪枝。在所有关联到结点的hierarchical边中,排名在最后50%的边会被删除。
3.3. Graph Neural Network Layers
在图金字塔的基础上构建一个名为GraphFPN的图神经网络。GraphFPN中存在两种类型的层,contextual层和hierarchical层。这两类层在图金字塔中使用相同的结点集合,但是不同的图边集合。contextual层只使用contextual边,而hierarchical层只使用剪枝后的hierarchical边。我们的GraphFPN在开始有L1L_1L1个contextual层,中间有L2L_2L2个hierarchical层,最后有L3L_3L3个contextual层。更重要的是,这些层中的每一层都有自己可学习的参数,这些参数不与其它层共享。为了简单起见,在我们的实验中L1L_1L1、L2L_2L2和L3L_3L3总是相等的,在消融实验中讨论了它们具体值的选择。
尽管contextual层和hierarchical层使用不同的边,但这两类层中的GNN操作完全相同。两种类型的层共享相同的空间和通道注意力机制。我们简单地采用图注意力网络中的自注意力机制作为我们的空间注意力。给定结点iii及其邻居集合Ni\mathcal{N}_iNi,空间注意力按照下式更新特征:
h⃗i′=M(h⃗i,{h⃗j}j∈Ni)\vec{h}_i^\prime=\mathcal{M}(\vec{h}_i,\{\vec{h}_j\}_{j\in\mathcal{N}_i}) hi′=M(hi,{hj}j∈Ni)其中,M\mathcal{M}M是单头自注意力,h⃗j∈Ni\vec{h}_{j\in\mathcal{N}_i}hj∈Ni是从结点iii的邻居中获得的特征向量集合,h⃗i\vec{h}_ihi和h⃗i′\vec{h}_i^\primehi′分别是结点iii更新前后的特征向量。
通道注意力机制由基于平均池化的局部通道级注意力模块和局部通道自注意力模块组成。在基于平均池化的局部通道级注意力中,首先对结点iii及其邻居的特征向量进行平均,得到特征向量a⃗i′∈RC\vec{a}_i^\prime\in\mathbb{R}^Cai′∈RC。我们把平均后的特征向量通过一个带有sigmoid激活的全连接层,并在得到的结果和h⃗i′\vec{h}_i^\primehi′之间执行元素相乘:
h⃗i′′=σ(W1a⃗i′)⊙h⃗i′\vec{h}_i^{\prime\prime}=\sigma(\boldsymbol{W}_1\vec{a}_i^\prime)\odot\vec{h}_i^\prime hi′′=σ(W1ai′)⊙hi′其中,σ\sigmaσ是sigmoid函数,W1∈RC×C\boldsymbol{W}_1\in\mathbb{R}^{C×C}W1∈RC×C是全连接层可学习的权重矩阵,⊙\odot⊙表示逐像素相乘。在局部通道自注意力模块中,首先获取结点iii及其邻居结点的特征向量集合A\boldsymbol{A}A,并将其reshape到R(∣Ni∣+1)×C\mathbb{R}^{(|\mathcal{N}_i|+1)×C}R(∣Ni∣+1)×C。这里∣Ni∣|\mathcal{N}_i|∣Ni∣是结点iii的邻居数量。然后得到通道相似矩阵X=ATA∈RC×C\boldsymbol{X}= \boldsymbol{A}^{\mathrm T}\boldsymbol{A}\in\mathbb{R}^{C×C}X=ATA∈RC×C,并对X\boldsymbol{X}X的每一行使用softmax函数。局部通道自注意力模块的输出为:
h⃗i′′′=βXh⃗i′′+h⃗i′′\vec{h}_i^{\prime\prime\prime}=\beta\boldsymbol{X}\vec{h}_i^{\prime\prime}+\vec{h}_i^{\prime\prime} hi′′′=βXhi′′+hi′′其中,β\betaβ是可学习的权重,初始化为0。
我们的局部通道级注意力和局部通道自注意力是受到SENet和双注意力网络(Dual Attention Network)的启发。主要区别在于,我们的通道注意力定义在局部邻居内,因此在空间上因结点而异,而SENet和双注意力网络对所有空间位置的特征使用相同的通道注意力。图神经网络中局部通道注意力的优点包括更低的计算成本和更高的空间自适应性,因此非常适合像GraphFPN这样的大型网络。表5的消融实验表明,我们的双局部通道注意力在GraphFPN中相当有效。
3.4. Feature Mapping between GNN and CNN
卷积神经网络可以保留部分和目标的位置信息,这显然有利于目标检测,而图神经网络可以跨多个语义尺度灵活地建模部分和目标之间的依赖关系。注意,卷积神经网络中的主干和FPN分别负责多尺度编码和解码,而我们的GraphFPN主要负责多尺度解码。因此主干特征作为GraphFPN的输入。为了利用这两种特征金字塔网络的优势,我们还融合了GraphFPN和卷积FPN的最终特征。因此,我们需要映射来自主干特征以初始化GraphFPN,也需要在特征融合之前将最终特征从GraphFPN映射到卷积FPN。主干和卷积FPN中的多尺度特征图分别记为C={C1,C2,C3,C4,C5}\mathcal{C}=\{\mathcal{C}^1,\mathcal{C}^2,\mathcal{C}^3,\mathcal{C}^4,\mathcal{C}^5\}C={C1,C2,C3,C4,C5}和P={P1,P2,P3,P4,P5}\mathcal{P}=\{\mathcal{P}^1,\mathcal{P}^2,\mathcal{P}^3,\mathcal{P}^4,\mathcal{P}^5\}P={P1,P2,P3,P4,P5}。注意,C\mathcal{C}C中的特征图是主干中最后5个卷积阶段的特征图。
从CNN到GNN的映射(C↦S\mathcal{C}\mapsto\mathcal{S}C↦S): 我们将主干Ci\mathcal{C}^iCi的第iii个特征图映射到S\mathcal{S}S中的第iii层Si\mathcal{S}^iSi。Ci\mathcal{C}^iCi中的特征位于一个矩形网格上,每个网格单元对应原始输入图像中的一个矩形区域,而Si\mathcal{S}^iSi中的超像素通常具有不规则的形状。如果多个超像素与Ci\mathcal{C}^iCi中相同的网格单元部分地重叠,如图2所示,那么我们将网格单元分配给重叠程度最大的超像素。这样的分配导致一个小的网格单元集合CkiC_k^iCki被分配给Si\mathcal{S}^iSi中相同的超像素RkiR_k^iRki。我们对该集合同时执行最大池化和最小池化,并使用ReLU激活将concatenate池化结果输入到全连接层。RkiR_k^iRki的映射特征可以写为:
h⃗ki=δ(W2[(Δmax(Cki)∣∣Δmin(Cki))])\vec{h}_k^i=\delta(\boldsymbol{W}_2[(\Delta_{max}(C_k^i)||\Delta_{min}(C_k^i))]) hki=δ(W2[(Δmax(Cki)∣∣Δmin(Cki))])其中,δ\deltaδ表示ReLU激活,W2\boldsymbol{W}_2W2表示全连接层可学习的权重矩阵,∣∣||∣∣表示concatenate操作,Δmax(Cki)\Delta_{max}(C_k^i)Δmax(Cki)和Δmin(Cki)\Delta_{min}(C_k^i)Δmin(Cki)分别表示最大池化和最小池化操作。
从GNN到CNN的映射(S↦P\mathcal{S}\mapsto\mathcal{P}S↦P): 一旦我们向前通过GraphFPN,我们将其最后一层的特征映射到卷积特征金字塔P\mathcal{P}P。令PkiP_k^iPki表示Pi\mathcal{P}^iPi中网格单元的集合,它被分配给Si\mathcal{S}^iSi中的超像素RkiR_k^iRki。我们简单地将RkiR_k^iRki处的最终特征复制到PkiP_k^iPki中的每个网格单元。这样,我们为卷积FPN的第iii层获得了一个新的特征图P‾i\overline{\mathcal{P}}^iPi。我们将Pi\mathcal{P}^iPi与P‾i\overline{\mathcal{P}}^iPi进行concatenate,并将concatenate后的特征图输入到一个具有1×1卷积核的卷积层,以确保融合后的特征图P~i\widetilde{\mathcal{P}}^iPi具有与Pi\mathcal{P}^iPi相同的通道数。最终,融合后的特征金字塔为P~={P~1,P~2,P~3,P~4,P~5}\widetilde{\mathcal{P}}=\{\widetilde{\mathcal{P}}^1,\widetilde{\mathcal{P}}^2,\widetilde{\mathcal{P}}^3,\widetilde{\mathcal{P}}^4,\widetilde{\mathcal{P}}^5\}P={P1,P2,P3,P4,P5}。
3.5. Object Detection
本文提出的图特征金字塔网络可以集成到FPN的目标检测pipeline中,用上述融合特征金字塔代替传统的FPN。我们采用Faster-RCNN作为检测算法,并进行相同的端到端训练。
4. Experiments
介绍了数据集和实现细节。使用COB项目提供的代码计算层次结构分割,并在数据准备过程中为每张图像构建超像素层次结构。构建一幅图像的超像素层次结构平均需要0.120秒,对于目标检测任务是合理的。注意,COB中使用的机器学习模型总是在与检测任务相同的训练集上进行训练。
4.1. Comparison with State-of-the-Art Methods
和SOTA的对比实验,具体的实验结论可以参照原文。
4.2. Comparison with Other Object Detectors
和其它主流检测器的对比实验,具体的实验结论可以参照原文。
4.3. Learnable Parameters and Computational Cost
Params、GFLOPs和测试速度。具体的实验结论可以参照原文。
4.4. Ablation Studies
为了研究GraphFPN中各个组件的有效性,我们通过替换或移除pipeline中的单个组件进行消融实验。我们专门针对GNN层的配置(不同类型GNN层的组合与排序)、GNN层的总数以及空间和通道注意力机制设计了消融实验。
GNN层的配置。 在我们最终的pipeline中,各层的具体配置如下:第一组contextual层,一组hierarchical层,第二组contextual层。所有组的层数都相同。
在跨尺度操作之前,需要在同一尺度内传播上下文信息。即使在第一组contextual层之后紧接着一组hierarchical层,上下文信息传播仍然是有帮助的。两类层实际上是相辅相成的。具体的实验结论可以参照原文。
GNN的层数。 当图层数量过多时,性能变差。我们将此归因于梯度消失。具体的实验结论可以参照原文。
注意力机制。 空间注意力在建模邻居依赖方面是强大的。两种局部通道注意力机制是互补的,显著提高了深层特征的识别能力。具体的实验结论可以参照原文。
5. Conclusions
在本文中,我们提出了图特征金字塔网络,它能够适应输入图像的不同内在结构,并支持跨所有尺度同时的特征交互。我们的图特征金字塔网络的结构继承了根据层次结构分割构建的超像素层次结构。定义contextual图神经网络层和hierarchical图神经网络层,分别实现同一尺度内和不同尺度间的特征交互。为了使这些层更加强大,我们进一步为图神经网络引入了两种类型的局部通道注意力。在MS-COCO 2017验证和测试数据集上的实验表明,集成了图特征金字塔网络的Faster R-CNN+FPN优于现有的SOTA目标检测方法。
相关文章:
目标检测论文阅读:GraphFPN算法笔记
标题:GraphFPN: Graph Feature Pyramid Network for Object Detection 会议:ICCV2021 论文地址:https://ieeexplore.ieee.org/document/9710561/ Abstract 特征金字塔已经被证明在需要多尺度特征的图像理解任务中是强大的。SOTA的多尺度特征…...
实测2023款哪吒U-II,智驾功能对女司机很友好
最近,我们受邀试驾了2023款哪吒U-II。这是一款A级新能源SUV,是哪吒U的改款车型。哪吒U系列自2020年3月上市到2023年1月,累计销售数量达76688台,也因此被称为15万级智能天花板。2023款哪吒U-II的一大亮点是:针对以往哪吒…...
Python自动化测试【软件测试最全教程(附笔记、学习路线)】,看完即就业
最近看到很多粉丝在后台私信我,叫我做一期Python自动化测试的教程,其实关于这个问题,我也早就在着手准备了,我录制了一整套完整的Python自动化测试的教程,上传到网盘里了,大家有兴趣的可以去文末交流群免费…...
2023/2/13总结
今天主要学习了哈夫曼树。 哈夫曼树 哈夫曼树是二叉树的一种,它是一种WPL最优二叉树。 叶子结点(也称叶节点):指的是自己下面不再连接有节点的节点(即末端),称为叶子节点(又称为终…...
webSock前端
1.什么是webSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议。允许服务端主动向客户端推送数据。 2.如何使用webSocket WebSocket 构造函数WebSocket 对象作为一个构造函数,用于新建 WebSocket 实例。 代码如下: let ws = new WebSocket(网址); 2.websock事件: …...
AcWing 3956. 截断数组(每日一题)
AcWing 3956. 截断数组 题目描述 给定一个长度为 nnn 的数组 a1,a2,…,ana_1, a_2, …, a_na1,a2,…,an 。 现在,要将该数组从中间截断,得到三个非空子数组。 要求,三个子数组内各元素之和都相等。 请问,共有多少种不同…...
Android 一体机研发之修改系统设置————屏幕亮度
Android 一体机研发之修改系统设置————屏幕亮度 Android 一体机研发之修改系统设置————声音 Android 一体机研发之修改系统设置————自动锁屏 前言 最近工作略微有点儿空闲,抽空给大家总结一下:近期一直搞得一体机app研发,适用…...
C++通用算法
1.概述根据名字就知道如何使用相关算法,比如copy函数,就是复制的意思,它需要一个范围,以及要复制的位置copy(begin, end, container_begin);#include <iostream> #include<vector> #include<algorithm> #includ…...
Springboot停机方式
1. 介绍 简单的说,就是向应用进程发出停止指令之后,能保证正在执行的业务操作不受影响,直到操作运行完毕之后再停止服务。应用程序接收到停止指令之后,会进行如下操作: 1.停止接收新的访问请求 2.正在处理的请求&…...
Linux perf_event_open 简介
文章目录前言一、简介二、struct perf_event_attr2.1 type2.2 size2.3 config2.3.1 PERF_TYPE_HARDWARE2.3.2 PERF_TYPE_SOFTWARE2.3.3 PERF_TYPE_TRACEPOINT2.3.4 PERF_TYPE_HW_CACHE2.3.5 其他类型三、sample相关参数3.1 sample_period3.2 sample_freq3.3 sample_type四、其他…...
Java给定两组起止日期,求交集
/*** 判断2个时间段是否有重叠(交集)* param startDate1 时间段1开始时间戳* param endDate1 时间段1结束时间戳* param startDate2 时间段2开始时间戳* param endDate2 时间段2结束时间戳* param isStrict 是否严格重叠,true 严格࿰…...
数组的复制与二维数组的用法
今天学习的主要内容有 数组的复制 数组的复制 利用循环进行数组的复制 import java.util.Arrays; public class Main3 {public static void main(String[] args) {int []arr new int[]{1,2,3,4,5,6};int []arr1 new int[arr.length];for (int i 0; i < arr.length; i…...
JS判断两个table数据是否完全相等(判断两个数组对象是否完全相等)
需求 现有的table为tableA,有多个要做对比的table为一个数组 CompareArray 涉及到的问题 外层是数组,但是内部数据都是对象,对象属性名的排序不一样外层数组也涉及到 顺序不一样的问题 思路 对compareArray做长度筛选 filter 得到 同长度…...
关于小程序,你想知道的这些
近年来,各大平台纷纷上架小程序,迎来了小程序的爆发式增长。今天就来跟大家简单分享一下小程序基本的运行机制和安全机制。 小程序的由来 在小程序没有出来之前,最初微信WebView逐渐成为移动web重要入口,微信发布了一整套网页开…...
WuThreat身份安全云-TVD每日漏洞情报-2023-02-13
漏洞名称:THORSTEN PHPMYFAQ 跨站点脚本 漏洞级别:高危 漏洞编号:CVE-2023-0791 相关涉及:THORSTEN PHPMYFAQ 3.1.10 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-03506 漏洞名称:TENDA AC23 越界写入 漏洞级别:高危 漏洞编号:CVE-2023-078…...
【Linux】软件安装(三分钟教会你如何在linux下安装软件)
🔥🔥 欢迎来到小林的博客!! 🛰️博客主页:✈️小林爱敲代码 🛰️博客专栏:✈️Linux之路 🛰️社区:✈️进步学堂 目录&…...
Fluent Python 笔记 第 10 章 序列的修改、散列和切片
本章将以第 9 章定义的二维向量 Vector2d 类为基础,向前迈出一大步,定义表示多维向量的 Vector 类。这个类的行为与 Python 中标准的不可变扁平序列一样。 10.3 协议和鸭子类型 在 Python 中创建功能完善的序列类型无需使用继承,只需实现符…...
在中国程序员工作是青春饭吗?
上个月公司告诉我毕业了。 我打开boss直聘,一溜溜的外包公司和我打招呼。 我寻思我说不定啥时候就离开深圳了,外包不外包也无所谓钱到位就行。(大公司学历不够格也进不去) 结果华为、平安的外包告诉我,不好意思呀&a…...
Linux tcpdump
tcpdump - 转储网络上的数据流 是不是感觉很懵?全方位描述tcpdump: 通俗:tcpdump是一个抓包工具,用于抓取网络中传输的数据包形象:tcpdump如同国家海关,凡是入境和出境的货物,海关都要抽样检查࿰…...
redis知识汇总(部署、高可用、集群)
文章目录一、redis知识汇总什么是redisredis的优缺点:为什么要用redis做缓存redis为什么这么快什么是持久化redis持久化机制是什么?各自优缺点?AOF和RDB怎么选择redis持久化数据和缓存怎么做扩容什么是事务redis事务的概念ACID概念主从复制re…...
【手写 Vuex 源码】第十篇 - Vuex 命名空间的实现
一,前言 上一篇,主要介绍了 Vuex 响应式数据和缓存的实现,主要涉及以下几个点: Vuex 的响应式实现原理;响应式核心方法 resetStoreVM;commit 和 dispatch 的处理; 本篇,继续介绍 …...
面试腾讯测试岗后感想,真的很后悔这5年一直都干的是基础测试....
前两天,我的一个朋友去大厂面试,跟我聊天时说:输的很彻底… 我问她:什么情况?她说:很后悔这5年来一直都干的是功能测试… 相信许多测试人也跟我朋友一样,从事了软件测试很多年,却依…...
知识图谱 方法、实践与应用 王昊奋 读书笔记(下)
最近读了这本书,在思路上很有启发,对知识图谱有了初步的认识,以下是原书后半部分的内容,可以购买实体书获取更多内容。 知识图谱推理 结合已有规则,推出新的事实,例如持有股份就能控制一家公司࿰…...
vue实现打印浏览器页面功能(两种方法)
推荐使用方法二 方法一:通过npm 安装插件 1,安装 npm install vue-print-nb --save 2,引入 安装好以后在main.js文件中引入 import Print from vue-print-nbVue.use(Print); //注册 3,现在就可以使用了 div id"printTest…...
【VictoriaMetrics】VictoriaMetrics单机版批量和单条数据写入(Prometheus格式)
VictoriaMetrics单机版支持以Prometheus格式的数据写入,写入支持单条数据写入以及多条数据写入,下面操作演示下如何使用 1、首先需要启动VictoriaMetrics单机版服务 2、使用postman插入单机版VictoriaMetrics,以当前时间插入数据 地址为 http://victoriaMetricsIP:8428/api…...
【青训营】分布式定时任务简述
这是我参与「第五届青训营 」伴学笔记创作活动的第 13 天 分布式定时任务简述 定义 定时任务是指系统为了自动完成特定任务,实时、延时、周期性完成任务调度的过程。分布式定时任务是把分散的、可靠性差的定时任务纳入统一平台,并且实现集群管理调度和…...
golang语言本身设计点总结
本文参考 1.golang的内存管理分配 golang的内存分配仿造Google公司的内存分配方法TCmalloc算法;她会把将内存请求分为两类,大对象请求和小对象请求,大对象为>32K的对象。 在了解golang的内存分配之前要知道什么事虚拟内存,虚拟内存是把磁盘作为全局…...
PTA L1-046 整除光棍(详解)
前言:内容包括四大模块:题目,代码实现,大致思路,代码解读 题目: 这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1、11、111、1111等。传说任何一个光棍都能被…...
将小程序代码转成uni-app代码
最近因为公司项目原因需要将小程序的项目转换成uni—app的项目,所以总结了以下几点: 首先你可以先到uni-app的官网简单看一下对它的介绍,本次文章的介绍是针对简单的微信小程序来进行的转化。 在这之前我们来看一下目录对比 下面就来介绍一下…...
C语言在游戏中播放音乐
使用 mciSendString 播放音乐 mciSendString 支持 mp3、wma、wav、mid 等多种媒体格式,使用非常简单。这里做一个简单的范例,用 mciSendString 函数播放 MP3 格式的音乐,代码如下: // 编译该范例前,请把 music.mp3 放…...
地方型旅游网站/国内最大的搜索引擎
FRAM铁电存储器。它是一种采用铁电材料(PZT等)的铁电性和铁电效应来进行非易失性数据存储的存储器。FRAM具有ROM和RAM的特点,在高速读写入、高读写耐久性、低功耗和防窜改方面具有优势。 富士通FRAM主要具备三大优势:高读写入耐久性、高速写入以及低功…...
大型大型网站建设方案/网络广告策划与制作
小编典典问了几天问题后,我发现MediaInfo可以提供有关视频或音频文件的许多技术和标签信息。我发现subs4me的源代码树中有一个用于MediaInfo的JNI包装器,我认为它非常有用。以下是一些代码片段,显示了如何从媒体文件中提取一些信息࿱…...
互动营销型网站建设/电商线上推广渠道
HashMap中阈值的设计1.HashMap的长度为什么必须是2的次幂?2.加载因子为什么是0.75?3.处理冲突的几种方法4.equals()和hashCode()在HashMap中的重要性1.HashMap的长度为什么必须是2的次幂? 为了实现一个尽量分布均匀的hash函数,利…...
那些网站平台可以做3d建模/公司注册流程
计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备, 通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下, 实现资源共享和信息传递的计算机系统. 目的是什么 传播交流信息,数据交换,通信 需要什么 IP和端口号 网络通讯协…...
公司电商网站开发合同范本/电商网站运营
认认真真看到最后嘛,看完保证你把这两个函数学得明明白白了啦。虽然这只是很简单很基本的两个函数,但是你肯定没有去深究过,细微处照样有文章可做,学得明白一点不香吗?笔者今天回过头来看这两个函数突然又有了新的见解…...
关于加强门户网站建设的通知/关于营销的最新的新闻
三好学生 2015/11/23 10:560x00 前言写这篇文章有两个原因,一是想介绍一下powershell的高级使用技巧,二是我在测试一些powershell脚本时发现了很多bug,提交给作者后更新的也不及时,于是就有了自己维护代码的想法. 接下来我会陆续…...