目标检测论文阅读:GraphFPN算法笔记

news2024/9/21 18:41:22

标题: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)来获得一个层次结构分割,即一族图像划分 { S 0 , S 1 , . . . , S L } \{\mathcal{S}^0,\mathcal{S}^1,...,\mathcal{S}^L\} {S0,S1,...,SL}。注意, S 0 \mathcal{S}^0 S0中的每个超像素都是原始输入图像中的单个像素, S L \mathcal{S}^L SL只有一个代表整个图像的超像素, S l \mathcal{S}^l Sl S l − 1 \mathcal{S}^{l-1} Sl1中超像素的数量仅相差一个(即 S l \mathcal{S}^l Sl中的一个超像素是 S l − 1 \mathcal{S}^{l-1} Sl1中两个超像素的并集)。
本文从 { S 0 , S 1 , . . . , S L } \{\mathcal{S}^0,\mathcal{S}^1,...,\mathcal{S}^L\} {S0,S1,...,SL}中选取一个划分子集,定义一个超像素层次 S = { S l 1 , S l 2 , S l 3 , S l 4 , S l 5 } \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的上标表示分割层次结构中的划分层, S l 1 \mathcal{S}^{l_1} Sl1是层次结构中最精细的超像素集合, S l i + 1 \mathcal{S}^{l_{i+1}} Sli+1中的超像素是 S l i \mathcal{S}^{l_i} Sli中超像素的并集。为了匹配卷积神经网络中的下采样率,选择 { l 1 , l 2 , l 3 , l 4 , l 5 } \{l_1,l_2,l_3,l_4,l_5\} {l1,l2,l3,l4,l5},使得 S l i + 1 \mathcal{S}^{l_{i+1}} Sli+1中的超像素数量为 S l i \mathcal{S}^{l_i} Sli中的 1 / 4 1/4 1/4。然后,超像素层次结构 S \mathcal{S} S可以用来表示输入图像的部分-整体层次结构,并跟踪超像素之间的祖先-后代关系。

3.2. Multi-scale Graph Pyramid

我们构建了一个图金字塔 { G 1 , G 2 , G 3 , G 4 , G 5 } \{\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在开始有 L 1 L_1 L1个contextual层,中间有 L 2 L_2 L2个hierarchical层,最后有 L 3 L_3 L3个contextual层。更重要的是,这些层中的每一层都有自己可学习的参数,这些参数不与其它层共享。为了简单起见,在我们的实验中 L 1 L_1 L1 L 2 L_2 L2 L 3 L_3 L3总是相等的,在消融实验中讨论了它们具体值的选择。
尽管contextual层和hierarchical层使用不同的边,但这两类层中的GNN操作完全相同。两种类型的层共享相同的空间和通道注意力机制。我们简单地采用图注意力网络中的自注意力机制作为我们的空间注意力。给定结点 i i i及其邻居集合 N i \mathcal{N}_i Ni,空间注意力按照下式更新特征:
h ⃗ i ′ = M ( h ⃗ i , { h ⃗ j } j ∈ N i ) \vec{h}_i^\prime=\mathcal{M}(\vec{h}_i,\{\vec{h}_j\}_{j\in\mathcal{N}_i}) h i=M(h i,{h j}jNi)其中, M \mathcal{M} M是单头自注意力, h ⃗ j ∈ N i \vec{h}_{j\in\mathcal{N}_i} h jNi是从结点 i i i的邻居中获得的特征向量集合, h ⃗ i \vec{h}_i h i h ⃗ i ′ \vec{h}_i^\prime h i分别是结点 i i i更新前后的特征向量。
通道注意力机制由基于平均池化的局部通道级注意力模块和局部通道自注意力模块组成。在基于平均池化的局部通道级注意力中,首先对结点 i i i及其邻居的特征向量进行平均,得到特征向量 a ⃗ i ′ ∈ R C \vec{a}_i^\prime\in\mathbb{R}^C a iRC。我们把平均后的特征向量通过一个带有sigmoid激活的全连接层,并在得到的结果和 h ⃗ i ′ \vec{h}_i^\prime h i之间执行元素相乘:
h ⃗ i ′ ′ = σ ( W 1 a ⃗ i ′ ) ⊙ h ⃗ i ′ \vec{h}_i^{\prime\prime}=\sigma(\boldsymbol{W}_1\vec{a}_i^\prime)\odot\vec{h}_i^\prime h i′′=σ(W1a i)h i其中, σ \sigma σ是sigmoid函数, W 1 ∈ R C × C \boldsymbol{W}_1\in\mathbb{R}^{C×C} W1RC×C是全连接层可学习的权重矩阵, ⊙ \odot 表示逐像素相乘。在局部通道自注意力模块中,首先获取结点 i i i及其邻居结点的特征向量集合 A \boldsymbol{A} A,并将其reshape到 R ( ∣ N i ∣ + 1 ) × C \mathbb{R}^{(|\mathcal{N}_i|+1)×C} R(Ni+1)×C。这里 ∣ N i ∣ |\mathcal{N}_i| Ni是结点 i i i的邻居数量。然后得到通道相似矩阵 X = A T A ∈ R C × C \boldsymbol{X}= \boldsymbol{A}^{\mathrm T}\boldsymbol{A}\in\mathbb{R}^{C×C} X=ATARC×C,并对 X \boldsymbol{X} X的每一行使用softmax函数。局部通道自注意力模块的输出为:
h ⃗ i ′ ′ ′ = β X h ⃗ i ′ ′ + h ⃗ i ′ ′ \vec{h}_i^{\prime\prime\prime}=\beta\boldsymbol{X}\vec{h}_i^{\prime\prime}+\vec{h}_i^{\prime\prime} h i′′′=βXh i′′+h i′′其中, β \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 = { C 1 , C 2 , C 3 , C 4 , C 5 } \mathcal{C}=\{\mathcal{C}^1,\mathcal{C}^2,\mathcal{C}^3,\mathcal{C}^4,\mathcal{C}^5\} C={C1,C2,C3,C4,C5} P = { P 1 , P 2 , P 3 , P 4 , P 5 } \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} CS): 我们将主干 C i \mathcal{C}^i Ci的第 i i i个特征图映射到 S \mathcal{S} S中的第 i i i S i \mathcal{S}^i Si C i \mathcal{C}^i Ci中的特征位于一个矩形网格上,每个网格单元对应原始输入图像中的一个矩形区域,而 S i \mathcal{S}^i Si中的超像素通常具有不规则的形状。如果多个超像素与 C i \mathcal{C}^i Ci中相同的网格单元部分地重叠,如图2所示,那么我们将网格单元分配给重叠程度最大的超像素。这样的分配导致一个小的网格单元集合 C k i C_k^i Cki被分配给 S i \mathcal{S}^i Si中相同的超像素 R k i R_k^i Rki。我们对该集合同时执行最大池化和最小池化,并使用ReLU激活将concatenate池化结果输入到全连接层。 R k i R_k^i Rki的映射特征可以写为:
h ⃗ k i = δ ( W 2 [ ( Δ m a x ( C k i ) ∣ ∣ Δ m i n ( C k i ) ) ] ) \vec{h}_k^i=\delta(\boldsymbol{W}_2[(\Delta_{max}(C_k^i)||\Delta_{min}(C_k^i))]) h ki=δ(W2[(Δmax(Cki)∣∣Δmin(Cki))])其中, δ \delta δ表示ReLU激活, W 2 \boldsymbol{W}_2 W2表示全连接层可学习的权重矩阵, ∣ ∣ || ∣∣表示concatenate操作, Δ m a x ( C k i ) \Delta_{max}(C_k^i) Δmax(Cki) Δ m i n ( C k i ) \Delta_{min}(C_k^i) Δmin(Cki)分别表示最大池化和最小池化操作。
从GNN到CNN的映射( S ↦ P \mathcal{S}\mapsto\mathcal{P} SP): 一旦我们向前通过GraphFPN,我们将其最后一层的特征映射到卷积特征金字塔 P \mathcal{P} P。令 P k i P_k^i Pki表示 P i \mathcal{P}^i Pi中网格单元的集合,它被分配给 S i \mathcal{S}^i Si中的超像素 R k i R_k^i Rki。我们简单地将 R k i R_k^i Rki处的最终特征复制到 P k i P_k^i Pki中的每个网格单元。这样,我们为卷积FPN的第 i i i层获得了一个新的特征图 P ‾ i \overline{\mathcal{P}}^i Pi。我们将 P i \mathcal{P}^i Pi P ‾ i \overline{\mathcal{P}}^i Pi进行concatenate,并将concatenate后的特征图输入到一个具有1×1卷积核的卷积层,以确保融合后的特征图 P ~ i \widetilde{\mathcal{P}}^i P i具有与 P i \mathcal{P}^i Pi相同的通道数。最终,融合后的特征金字塔为 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 ={P 1,P 2,P 3,P 4,P 5}

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目标检测方法。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指派问题与匈牙利法讲解

指派问题概述:实际中,会遇到这样的问题,有n项不同的任务,需要n个人分别完成其中的1项,每个人完成任务的时间不一样。于是就有一个问题,如何分配任务使得花费时间最少。通俗来讲,就是n*n矩阵中&a…

Django框架之展示书籍列表案例

展示书籍列表 需求 实现步骤 1.创建视图2.创建模板3.配置URLconf 1.创建视图 查询数据库数据构造上下文 传递上下文到模板 # 定义视图:提供书籍列表信息 def bookList(request):# 查询数据库书籍列表数据books BookInfo.objects.all()# 构造上下文context {boo…

超详细的JAVA高级进阶基础知识04

目录 4. 面向对象高级 - 常用的API 4.1 Arrays 工具类 4.1.1 Arrays 类介绍 4.2 冒泡排序 4.3 选择排序 4.4 二分查找 4.5 正则表达式 4.5.1 String 类中与正则有关的常见方法 4.5.2 练习 4.5.3 今日学习目标 4. 面向对象高级 - 常用的API 4.1 Arrays 工具类 4.1.1…

Java面试——Spring Bean相关知识

目录 1.Bean的定义 2.Bean的生命周期 3.BeanFactory及Factory Bean 4.Bean的作用域 5.Bean的线程安全问题 1.Bean的定义 JavaBean是描述Java的软件组件模型。在Java模型中,通过JavaBean可以无限扩充Java程序的功能,通过JavaBean的组合可以快速的生…

Day887.MySQL写入binlog和redolog的流程机制 -MySQL实战

MySQL写入binlog和redolog的流程机制 Hi,我是阿昌,今天学习记录的是关于MySQL写入binlog和redolog的流程机制的内容。 只要 redo log 和 binlog 保证持久化到磁盘,就能确保 MySQL 异常重启后,数据可以恢复。 那redo log 的写入…

《第一行代码》 第四章:碎片的最佳实践

一&#xff0c;碎片的简单用法 在一个活动中添加两个碎片&#xff0c;并且让这两个碎片平分活动空间。 第一步&#xff1a;首先在layout中创建 left_fragment.xml&#xff1a; <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"androi…

【LoRaWAN 时钟同步】

本文主要介绍了 LoRaWAN 自组网协议、设备工作模式、设备间的时间同步问题 LoRaWAN 时钟同步1. 前言2. 设备数据收发2.1 数据帧格式2.2 数据发送2.3 数据接收3. A类设备4. C类设备5. B类设备5.1 GPS5.3 网关时间同步5.4 节点时间同步5.4.1 首次时间同步5.4.2 节点接收Beacon5.5…

生成系列论文:文本控制的3d点云生成 TextCraft(一):论文概览

TextCraft: Zero-Shot Generation of High-Fidelity and Diverse Shapes from Text 论文原文&#xff1a; https://arxiv.org/abs/2211.01427 论文的研究动机 DALL2已经在文本控制的图像生成上取得很好的效果&#xff0c;但是基于文本控制的3d点云生成的研究还不太成熟&#…

软件架构知识2-系统复杂度

架构设计的真正目的&#xff1a;是为了解决软件系统复杂度带来的问题&#xff0c;一个解决方案。 系统复杂度&#xff0c;如何入手&#xff1a; 1、通过熟悉和理解需求&#xff0c;识别系统复杂性所在的地方&#xff0c;然后针对这些复杂点进行架构设计。 2、架构设计并不是要…

毕业3年不到选择跳槽,居然拿到20K的薪资,简直了···

本人本科就读于某普通院校&#xff0c;毕业后通过同学的原因加入软件测试这个行业&#xff0c;角色也从测试小白到了目前的资深工程师&#xff0c;从功能测试转变为测试开发&#xff0c;并顺利拿下了某二线城市互联网企业Offer&#xff0c;年薪 30W 选择和努力哪个重要&#xf…

Java Email 发HTML邮件工具 采用 freemarker模板引擎渲染

Java Email 发HTML邮件工具 采用 freemarker模板引擎 1.常用方式对比 Java发送邮件有很多的实现方式 第一种&#xff1a;Java 原生发邮件mail.jar和activation.jar <!-- https://mvnrepository.com/artifact/javax.mail/mail --> <dependency><groupId>jav…

使用VUE自定义组件封装部门选择功能

背景 照惯例&#xff0c;先交待下背景&#xff0c;从真实需求出发&#xff0c;讲述实现效果、设计思路和实现方式。 软件系统中&#xff0c;会有一些常见常用的选择功能&#xff0c;如部门选择、人员选择等&#xff0c;用于填报表单&#xff0c;使用频率很高。直接使用一方面会…

浅谈应用安全测试工具

正确的应用程序安全测试工具可以改善企业安全态势和开发工作流程。如今&#xff0c;应用程序安全从一开始就内置在整个软件生命周期中&#xff0c;即使是具有成熟开发实践的组织也需要自动化工具来在复杂、快速变化的环境中成功地保护他们的软件。以下比较了三个广泛使用的应用…

MAVEN打包这一篇就够了

Maven打包说明IDEA目录结构Java代码从编码到最后运行到两个核心步骤为"编译"和"执行"。"编译"会根据"源代码"产出对应的".class"文件&#xff0c;而"执行"就是让程序运行起来&#xff0c;运行的对象就是这些"…

【C语言学习笔记】:动态库

一、动态库 通过之前静态库那篇文章的介绍。发现静态库更容易使用和理解&#xff0c;也达到了代码复用的目的&#xff0c;那为什么还需要动态库呢&#xff1f; 1、为什么还需要动态库&#xff1f; 为什么需要动态库&#xff0c;其实也是静态库的特点导致。 ▶ 空间浪费是静…

怎么打造WhatsApp Team?SaleSmartly(ss客服)告诉你

关键词&#xff1a;WhatsApp Team SaleSmartly&#xff08;ss客服&#xff09; 您是否正在寻找一种让您的团队能够在 WhatsApp协作消息传递的解决方案?拥有了 WhatsApp Team&#xff0c;不仅效率提升&#xff0c;还可以在智能聊天工具中比如SaleSmartly&#xff08;ss客服&…

51单片机——中断系统,小白讲解,相互学习

中断介绍 中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的&#xff0c;中断功能的存在&#xff0c;很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一&#xff0c;是我们学些单片机必须要掌握的。 为了更容易的理解中断概念&…

算法思想 - 动态规划算法

动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中&#xff0c;可能会有许多可行解。每一个解都对应于一个值&#xff0c;我们希望找到具有最优值的解。动态规划算法与分治法类似&#xff0c;其基本思想也是将待求解问题分解成若干个子问题&#xff0c;先求解子问…

哈希表题目:判断路径是否相交

文章目录题目标题和出处难度题目描述要求示例数据范围解法一思路和算法代码复杂度分析解法二思路和算法代码复杂度分析题目 标题和出处 标题&#xff1a;判断路径是否相交 出处&#xff1a;1496. 判断路径是否相交 难度 3 级 题目描述 要求 给你一个字符串 path\texttt…

【软考系统架构设计师】2022下案例分析历年真题

【软考系统架构设计师】2022下案例分析历年真题 【软考系统架构设计师】2022下案例分析历年真题【软考系统架构设计师】2022下案例分析历年真题2022下案例分析历年真题第一题&#xff08;25分&#xff09;2022下案例分析历年真题第二题&#xff08;25分&#xff09;2022下案例分…