【视频目标分割-2024CVPR】Putting the Object Back into Video Object Segmentation

news2024/11/6 3:03:41

Cutie

  • 系列文章目录
  • 1 摘要
  • 2 引言
    • 2.1背景和难点
    • 2.2 解决方案
    • 2.3 成果
  • 3 相关方法
    • 3.1 基于记忆的VOS
    • 3.2对象级推理
    • 3.3 自动视频分割
  • 4 工作方法
    • 4.1 overview
    • 4.2 对象变换器
      • 4.2.1 overview
      • 4.2.2 Foreground-Background Masked Attention
      • 4.2.3 Positional Embeddings
    • 4.3 Object Memory

系列文章目录

  • 2024CVPR-Guided Slot Attention for Unsupervised Video Object Segmentation
  • 2024CVPR-RMem: Restricted Memory Banks Improve Video Object Segmentation
  • 2021NeurIPS-Associating Objects with Transformers for Video Object Segmentation
  • 数据集-Breaking the “Object” in Video Object Segmentation

1 摘要

  • 背景:我们提出了Cutie模型,它是一个结合了对象级记忆读取的视频对象分割网络,它将记忆中的对象表征重新返还给视频目标分割结果。
  • 难点、不足:最近的VOS工作都采用自下而上的像素级记忆读取,它们由于匹配了噪声,尤其是在有干扰物的情况下,导致其结果在具有挑战性的数据下表现不佳。
  • 解决方案:Cutie通过采取一个小型的对象查询集合实现了自上而下的对象级记忆读取。它通过query-based object transformer与自下而上的像素级特征进行交互迭代。这个object queries充当目标对象的高级总结,同时保留高分辨率特征图以实现高准确率分割。结合foreground-background masked attention,Cutie可以将前景图像从背景图中干净的分割出来。
  • 结果:在具有挑战的MOSE数据集中,在相似的运行时间下,Cutie相比XMem提升了8.7 J&F;Cutie相比DeAOT提升了4.2 J&F,速度还快了三倍。

在这里插入图片描述

图0:如图所示,图像从左到右依次为输入图像、目标对象mask、pixel attention和object querry attention。可以发现,在pixel attention中,当存在相似物体时,attention map会被干扰。而object querry attention则专注于目标对象。

2 引言

2.1背景和难点

视频对象分割(Video Object Segmentation, VOS),特别是“半监督”设置,要求从第一帧注释中指定的开放词汇表中跟踪和分割对象。VOS方法在机器人学[1]、视频编辑[2]、降低数据注释成本[3]中具有广泛的适用性,并且还可以与任何事物模型(Segment Anything Models, SAMs)[4]结合,用于通用视频分割(例如,跟踪任何事物[5–7])。

最近的VOS方法采用了基于记忆的范式[8–11]。从过去的分割帧(要么作为输入给出,要么由模型分割)计算出记忆表示,任何新的查询帧“读取”这个记忆以检索用于分割的特征。重要的是,这些方法主要使用像素级匹配进行记忆读取,使用一个[8]或多个匹配层[10],并从像素记忆读出生成自下而上的分割。像素级匹配是每个查询像素独立映射到记忆像素的线性组合(例如,使用注意力层)。因此,像素级匹配缺乏高层一致性,并且容易受到匹配噪声的影响,尤其是在有干扰物的情况下。这导致在具有遮挡和频繁干扰物的具有挑战性场景中性能降低。具体来说,最近的方法[9, 10]在评估最近提出的具有挑战性的MOSE[12]数据集时,与更简单的DAVIS-2017[13]数据集相比,J &F(交并比)降低了20多点。

像素级匹配是每个查询像素独立映射到记忆像素的线性组合,这句话如何理解呢?以AOT模型(Associating Objects with Transformers for Video Object Segmentation)为例:该模型以第一个包含mask 标记的帧为参考图像,其余视频帧依据该参考图像进行分割。在分割的过程中,被分割的帧作为Q(querry),包含了参考帧和对象编码的特征图作为K、V(key和value),被分割帧Q通过多头注意力机制得到Q映射到K的线性组合。详见可见AOT主体模型详解

在这里插入图片描述

图1.像素级记忆读取与对象级记忆读取的比较。在每个框中,左侧是参考帧,右侧是要被分割的查询帧。红色箭头指示错误的匹配。在存在干扰物的情况下,低级像素匹配(例如,XMem [9])可能会有噪声。我们提出对象级记忆读取,以实现更稳健的视频对象分割。

2.2 解决方案

我们认为,在具有挑战性的场景中这种不满意的结果是由于缺乏对象级推理造成的。为了解决这个问题,我们提出了对象级记忆读取,有效地将对象从记忆中重新放回到查询帧中(见图1)。

受到最近基于查询的对象检测/分割[14–18]的启发,这些方法将对象表示为“对象查询”,我们使用对象变换器来实现我们的对象级记忆读取。这个对象变换器使用一组端到端训练的对象查询来1)迭代地探测和校准特征图(由像素级记忆读出实现初始化),以及2)编码对象级信息。这种方法同时保留了高层级但全局的对象查询表示和低层级但高分辨率的特征图,使得顶层/底层的双向通信成为可能。这种通信通过一系列注意力层进行参数化,包括我们提出的foreground-background masked attention。masked attention,从仅关注前景的masked attention[15]扩展而来,允许部分对象查询仅关注前景,而其余部分仅关注背景——允许全局特征交互和前景/背景语义的清晰分离。此外,我们引入了一个紧凑的对象记忆(除了像素记忆之外)来总结目标对象的特征,通过目标特定的特征增强端到端的对象查询。

2.3 成果

在实验中,我们提出的方法Cutie,在具有挑战性的场景中(例如,在MOSE数据集上比XMem高出8.7 J &F [12])比现有方法显著更加稳健,同时在标准数据集(即DAVIS [13]和YouTubeVOS [19])中在准确性和效率方面保持竞争力。总结如下:

  • 我们开发了Cutie,它使用高层自上而下的查询与像素级自下而上的特征,在具有挑战性的场景中实现稳健的视频对象分割。
  • 我们将遮蔽注意力扩展到前景和背景,既丰富了特征,又在目标对象和干扰物之间实现了清晰的语义分离。
  • 我们构建了一个紧凑的对象记忆来总结长期的对象特征,这些特征在查询期间被检索为目标特定的对象级表示。

3 相关方法

3.1 基于记忆的VOS

由于半监督视频对象分割(VOS)涉及信息的方向传播,许多现有方法采用特征记忆表示来存储过去特征以用于分割未来的帧。这包括在线学习,在推理期间对每个视频的第一帧分割进行微调[20-24]。然而,微调在测试期间速度慢。递归方法[25-31]速度更快,但在遮挡下跟踪时缺乏上下文。

最近的方法使用更多上下文[5, 8, 11, 32-64]通过像素级特征匹配和集成,一些方法探索了背景特征的建模——无论是显式地[36, 65]还是隐式地[51]。XMem[9]使用多种类型的记忆以获得更好的性能和效率,但仍然难以应对低级像素匹配中的噪声。虽然我们采用了XMem[9]的记忆读取,但我们开发了对象读取机制,以对象级整合像素特征,使Cutie在具有挑战性的场景中实现更好的性能。

在VOS中的变换器。基于变换器[66]的方法已经开发用于视频对象分割中的像素匹配与记忆[10, 50, 53, 67-70]。然而,它们计算空间特征图(作为交叉注意力、自注意力或两者兼有)之间的注意力,这在时间和空间复杂度上是昂贵的。SST[67]提出了稀疏注意力,但表现不如最先进的方法。AOT方法[10, 68]使用身份库在单次前向传递中处理多个对象以提高效率,但它们不针对对象ID进行排列等变,并且对于长视频不具有很好的扩展性。并行方法[69, 70]使用单个视觉变换器网络联合建模参考帧和查询帧,而不进行显式的记忆读取操作。它们实现了高精度,但需要大规模预训练(例如,MAE[71]),并且推理速度要低得多(每秒<4帧)。Cutie经过精心设计,在我们的对象变换器中不计算任何(昂贵的)空间特征图之间的注意力,同时通过一小组对象查询促进有效的全局通信——使Cutie能够实时处理。

3.2对象级推理

早期尝试在对象级别进行推理的VOS算法[59, 72, 73]使用重新识别或k-means聚类来获取对象特征,并且在标准基准测试中的性能较低。HODOR[18]及其后续工作TarViS[17],采用对象级描述符来处理VOS,这允许更大的灵活性(例如,仅在静态图像上训练[18]或扩展到不同的视频分割任务[17, 74, 75]),但由于未充分利用高分辨率特征而在VOS分割精度方面表现不佳(例如,[74]在DAVIS 2017[13]中比最先进的方法落后6.9 J &F)。ISVOS[76]提议将预训练的实例分割网络(即,Mask2Former[15])的特征注入到基于记忆的VOS方法[51]中。

Cutie的动机相似,但在以下三个方面至关重要的不同:1)Cutie端到端学习对象级信息,而不需要在实例分割任务/数据集上进行预训练,2)Cutie允许像素级特征和对象级特征之间的双向通信,以实现集成框架,3)Cutie是一个单级方法,不会执行单独的实例分割,而ISVOS会——这使得Cutie运行速度大约快六倍。此外,ISVOS没有发布代码,而我们为社区开放了代码,促进后续工作。

3.3 自动视频分割

最近,视频对象分割方法已经被用作自动视频分割流程的一个组成部分,例如开放词汇表/通用视频分割(例如,跟踪任何事物[5, 6],DEVA[7])和无监督视频分割[77]。我们认为Cutie的鲁棒性和效率对这些应用是有益的。

4 工作方法

在这里插入图片描述

图2.Cutie的核心架构和工作流程如下:1)存储像素记忆和对象记忆:我们从之前分割过的帧中存储像素记忆和对象记忆的表征。2)检索像素记忆:对于查询帧,我们将像素记忆检索出来作为像素读出R0.3)双向交互:像素读出R0与对象查询X和对象记忆S在对象变换器中进行双向交互。4)L个对象变换器块将像素特征用对象级语义丰富化,并产生最终的对象读出RL,以便解码成输出掩模。5)简化架构:为了易于理解,省略了标准的残差连接、层归一化以及从查询编码器到解码器的跳跃连接。

4.1 overview

我们在图2中提供了Cutie的概览。为了可读性,遵循先前的工作[8, 9],我们考虑单个目标对象,因为扩展到多个对象是直接的(见补充材料)。按照标准的半监督视频对象分割(VOS)设置,Cutie将目标对象的第一帧分割作为输入,并顺序地以流式方式分割后续帧。首先,Cutie将分割的帧(作为输入给出或由模型分割)编码成高分辨率的像素记忆F(第3.4.1节)和高层对象记忆S(第3.3节),并将它们存储起来用于分割未来的帧。为了分割一个新的查询帧,Cutie使用编码的查询特征从像素记忆中检索初始像素读出R0。这个初始读出R0是通过低级像素匹配计算的,因此通常很嘈杂。我们通过对象变换器中的L变换器块,用对象记忆S和一组对象查询X的信息来丰富R0,从而增强其对象级语义(第3.2节)。对象变换器的丰富输出RL,或对象读出,被传递到解码器以生成最终的输出掩模。在接下来的部分,我们将首先描述Cutie的三个主要贡献:对象变换器、遮蔽注意力和对象记忆。注意,我们从现有作品[9]中衍生出像素记忆,我们只在第3.4.1节中将其描述为实施细节,而不声称有任何贡献。

4.2 对象变换器

4.2.1 overview

图2的底部展示了对象变换器。对象变换器接收一个初始读出R0 ∈ RHW×C,一组N个端到端训练的对象查询X ∈ RN×C,以及对象记忆S ∈ RN×C作为输入,并将它们与L个变换器块集成。注意H和W是在步长为16的编码后的图像尺寸。在第一个块之前,我们将静态对象查询与动态对象记忆相加,以更好地适应,即X0 = X + S。每个变换器块允许对象查询Xl−1双向地关注读出Rl−1,反之亦然,产生更新后的查询Xl和读出Rl作为第l个块的输出。最后一个块的读出RL是对象变换器的最终输出。

在每个块内,我们首先计算遮蔽交叉注意力,让对象查询Xl−1从像素特征Rl−1中读取。遮蔽注意力将一半的对象查询集中在前景区域,而另一半则针对背景(细节见第3.2.2节)。然后,我们将对象查询输入到标准的自注意力和前馈层[66]中,进行对象级推理。接下来,我们用一个反向交叉注意力层更新像素特征,将来自对象查询Xl的对象语义重新放入像素特征Rl−1中。然后我们将像素特征输入到前馈网络中,同时跳过标准变换器[66]中的计算成本较高的自注意力。在整个过程中,我们遵循[14, 15](第3.2.3节)向查询和键添加位置嵌入。在每个注意力和前馈层中都使用残差连接和层归一化[78]。所有注意力层都使用多头缩放点积注意力[66]实现。重要的是,

  1. 我们谨慎地避免了任何直接在高分辨率空间特征(例如R)之间的注意力,因为它们在内存和计算上都很密集。尽管如此,这些空间特征仍然可以通过对象查询进行全局交互,使每个变换器块既高效又富有表现力。
  2. 对象查询以残差贡献的方式重构像素特征,而不丢弃高分辨率的像素特征。这避免了不可逆的降维(将超过100倍),并保留了那些用于准确分割的高分辨率特征。

接下来,我们将描述我们的对象变换器块中的核心组件:前景/背景遮蔽注意力和位置嵌入的构建。

4.2.2 Foreground-Background Masked Attention

在我们的(像素到查询)交叉注意力中,我们的目标是通过关注像素特征Rl ∈ RHW×C来更新对象查询Xl ∈ RN×C。标准的交叉注意力带有残差路径,可以找到:
X l ′ = A l V l + X l = softmax ( Q l K l T ) V l + X l X'_l = A_l V_l + X_l = \text{softmax}(Q_l K_l^T) V_l + X_l Xl=AlVl+Xl=softmax(QlKlT)Vl+Xl

其中 Ql 是 Xl 的学习线性变换,Kl 和 Vl 是 Rl 的学习线性变换。亲和力矩阵 Al ∈ RN×HW 的行描述了每个对象查询在整个特征图上的关注点。我们注意到不同的对象查询有不同的关注模式——有些关注不同的前景部分,有些关注背景,有些关注干扰物(见图3顶部)。这些对象查询从不同的感兴趣区域收集信息,并将它们整合到后续的自注意力/前馈层中。然而,注意力的软性质使得这个过程嘈杂且不太可靠——主要关注前景的查询可能在背景中有小的权重分布,反之亦然。

在这里插入图片描述

图3。在对象变换器中可视化交叉注意力权重(AL的行)。中间的猫是目标对象。顶部:没有前景-背景遮蔽——一些查询混合了前景和背景的语义(用红色框出)。底部:有前景-背景遮蔽。最左边的三个是前景查询,最右边的三个是背景查询。语义因此被清晰地区分开。前景/背景查询可以在随后的自注意力层中进行通信。注意查询关注不同的前景区域、干扰物和背景区域。

受到 [15] 的启发,我们部署了遮蔽注意力来帮助清晰地区分前景和背景的语义。与 [15] 不同的是,我们发现除了关注前景外,还关注背景也是很有帮助的,特别是在有干扰物的具有挑战性的跟踪场景中。在实践中,我们让对象查询的前一半(即前景查询)始终关注前景,而后一半(即背景查询)关注背景。这种遮蔽在所有注意力头上是共享的。

形式上,我们的前景-背景遮蔽交叉注意力找到:

X l ′ = softmax ( M l + Q l K l T ) V l + X l X'_l = \text{softmax}(M_l + Q_l K_l^T) V_l + X_l Xl=softmax(Ml+QlKlT)Vl+Xl

其中 Ml ∈ {0, −∞}N×HW 控制注意力遮蔽——具体来说,Ml(q, i) 决定第 q 个查询是否被允许(= 0)或不被允许(= −∞)关注第 i 个像素。为了计算 Ml,我们首先找到当前层的遮蔽预测 Ml,它是从上一个像素特征 Rl−1 线性投影出来的,并用 sigmoid 函数激活。然后,Ml 被计算为:

M l ( q , i ) = { 0 , if  q ≤ N 2  and  M l ( i ) ≥ 0.5 0 , if  q > N 2  and  M l ( i ) < 0.5 − ∞ , otherwise Ml(q, i) = \begin{cases} 0, & \text{if } q \leq \frac{N}{2} \text{ and } Ml(i) \geq 0.5 \\ 0, & \text{if } q > \frac{N}{2} \text{ and } Ml(i) < 0.5 \\ -\infty, & \text{otherwise} \end{cases} Ml(q,i)= 0,0,,if q2N and Ml(i)0.5if q>2N and Ml(i)<0.5otherwise

其中第一种情况用于前景注意力,第二种情况用于背景注意力。图3(底部)可视化了前景-背景遮蔽后的注意力图。注意,尽管前景和背景被硬性分离,对象查询在随后的自注意力层中进行通信,以实现潜在的全局特征交互。
接下来,我们讨论在对象查询和像素特征中使用的位置嵌入,它们允许基于位置的注意力。

4.2.3 Positional Embeddings

由于标准的注意力操作是排列不变的,因此使用位置嵌入来提供每个标记的位置的额外特征[66]。按照之前的基于变换器的视觉网络[14, 15],我们在每个注意力层向查询和键特征添加位置嵌入(见图2),而不添加到值中。

对于对象查询,我们使用一个位置嵌入PX ∈ RN×C,它通过以下方式结合了一个端到端可学习嵌入EX ∈ RN×C和动态对象记忆S ∈ RN×C:

P X = E X + f O b j E m b e d ( S ) P_X=E_X+f_{ObjEmbed}(S) PX=EX+fObjEmbed(S)

其中f_ObjEmbed是可训练的线性投影。这样,位置嵌入为模型提供了关于每个对象查询在图像中位置的重要信息,有助于改善注意力机制对空间关系的敏感性。
对于像素特征,位置嵌入PR ∈ RHW×C结合了一个固定的2D正弦位置嵌入Rsin [14],它编码了绝对像素坐标,以及初始读出R0 ∈ RHW×C,通过以下方式:

P R = R s i n + f P i x E m b e d ( R 0 ) PR = Rsin + f_{PixEmbed}(R0) PR=Rsin+fPixEmbed(R0)

其中 f_{PixEmbed是另一个可训练的线性投影。注意,正弦嵌入Rsin在归一化的坐标上操作,并在测试时根据图像大小进行相应的缩放。

4.3 Object Memory

在对象记忆S ∈ RN×C中,我们存储一组紧凑的N个向量,这些向量构成了目标对象的高级摘要。这个对象记忆在对象变换器(第3.2节)中使用,以提供针对目标的特征。

从高层次来看,我们通过使用N个不同的遮蔽(mask)对所有编码后的对象特征进行遮蔽池化(mask-pooling)来计算S。具体来说,给定对象特征U ∈ RTHW×C和N个池化遮蔽{Wq ∈ [0, 1]THW, 0 < q ≤ N},其中T是记忆帧的数量,第q个对象记忆Sq ∈ RC通过以下方式计算:
S q = ∑ i = 1 T × H × W U ( i ) W q ( i ) ∑ i = 1 T × H × W W q ( i ) S_q = \frac{\sum_{i=1}^{T \times H \times W} U(i) W_q(i)}{\sum_{i=1}^{T \times H \times W} W_q(i)} Sq=i=1T×H×WWq(i)i=1T×H×WU(i)Wq(i)
在推理过程中,我们使用经典的流式平均算法,使得这个操作在时间上和内存上都与视频长度无关。有关详细信息,请参阅补充材料。注意,如果相应的池化权重为零,即 ∑ i = 1 H × W W q t ( i ) = 0 \sum_{i=1}^{H \times W} W_{qt}(i) = 0 i=1H×WWqt(i)=0,则对象记忆向量Sq不会被修改,这可以防止在相应对象区域不可见时(例如,被遮挡)出现特征漂移。

对于记忆帧,我们首先使用遮罩编码器对相应的图像I和分割遮罩M进行编码,以获得记忆特征F ∈ RTHW×C。我们使用一个2层的C维MLP(多层感知机)(f_{ObjFeat})来获得对象特征U。

U = f ObjFeat ( F ) U = f_{\text{ObjFeat}}(F) U=fObjFeat(F)
对于N个池化遮蔽{Wq ∈ [0, 1]^(T×H×W), 0 < q ≤ N},我们按照第3.2.2节中详细描述的那样,额外应用前景-背景分离,并将其与固定的2D正弦位置嵌入Rsin(如第3.2.3节所述)相结合。这种分离允许在池化过程中聚合干净的语义,而位置嵌入则实现了位置感知的池化。形式上,我们通过以下方式计算第q个池化遮蔽的第i个像素:

W q ( i ) = σ ( f PoolWeight ( F ( i ) + R sin ( i ) ) ) W_q(i) = \sigma(f_{\text{PoolWeight}}(F(i) + R_{\text{sin}}(i))) Wq(i)=σ(fPoolWeight(F(i)+Rsin(i)))

其中 σ \sigma σ 是sigmoid函数, f PoolWeight f_{\text{PoolWeight}} fPoolWeight是一个2层的N维MLP(多层感知机),F(i)是特征图在第i个像素的值, R sin ( i ) R_{\text{sin}}(i) Rsin(i) 是第i个像素的正弦位置嵌入。

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

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

相关文章

git eslint扩展,解决git提交因为空格差异而报错

项目场景&#xff1a; 在前端项目开发中&#xff0c;经常会使用eslint,这个方法的好处就是严格要求代码格式。让代码更为严谨。 问题描述 以为eslint格式过于严谨&#xff0c;在git提交的时候&#xff0c;经常会因为一个多了一个空格导致代码提交失败。 原因分析&#xff1a;…

【C++打怪之路Lv4】-- 类和对象(中)

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

C语言第三周课

目录 一、C语言中基本语句的分类&#xff1a; 二、数据的输入和输出 1.putchar函数 2.getchar函数 3.printf函数 printf() 的正常输出格式&#xff1a; 输出控制符大全 4.scanf函数 三、顺序结构 四、选择结构 1.if 2.switch 五、循环结构 1.for循环 2.while循环 3.…

【读书笔记-《网络是怎样连接的》- 1】Chapter1-从Web浏览器开始

网络之旅的第一章&#xff0c;我们从在浏览器中输入url开始。本章主要介绍三部分内容。首先是在Web浏览器中输入URL后&#xff0c;浏览器是如何解析URL并生成HTTP请求消息的。生成请求消息后&#xff0c;浏览器需要将请求发送给Web服务器&#xff0c;需要知道Web服务器的IP地址…

2024年必考这个人工智能AI大模型证书!

2024必考这个人工智能AI大模型证书&#xff1a;名额有限&#xff0c;报满截止&#xff01; Chat GPT 的发布&#xff0c;让大语言模型成了人工智能的焦点。尤其近期发布的大模型各业务场景应用应接不暇&#xff0c;为行业带来新的发展机遇&#xff0c;甚至将重构AI行业。AI行业…

C语言系列4——指针与数组(1)

我们开始C语言的指针与数组 这部分开始进阶了&#xff0c;得反复学习 在开始正题之前&#xff0c;写说一下我们都知道当写一个函数的时候需要进行传参&#xff0c;当实参传递给形参的时候&#xff0c;形参是有独立空间的&#xff0c;那么数组传参又是怎么样的呢&#xff0c;我…

Docker的入门详解

What is docker&#xff1f; Docker是一个开源的应用容器引擎&#xff0c;它基于Go语言开发&#xff0c;并遵从Apache2.0协议。Docker允许开发者将他们的应用以及依赖包打包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的Linux或Windows操作系统的机器上&am…

MySQL高阶2004-职员招聘人数

目录 题目 准备数据 分析数据 实现 题目 一家公司想雇佣新员工。公司的工资预算是 70000 美元。公司的招聘标准是&#xff1a; 雇佣最多的高级员工。在雇佣最多的高级员工后&#xff0c;使用剩余预算雇佣最多的初级员工。 编写一个SQL查询&#xff0c;查找根据上述标准雇…

【Spring基础3】- Spring的入门程序

目录 3-1 Spring的下载3-2 Spring的 jar 包3-3 第一个 Spring程序第一步&#xff1a;添加spring context的依赖&#xff0c;pom.xml配置如下第二步&#xff1a;添加junit依赖第三步&#xff1a;定义bean&#xff1a;User第四步&#xff1a;编写spring的配置文件&#xff1a;bea…

Qt开发第一讲

一、Qt项目里面有什么&#xff1f; 对各个文件的解释&#xff1a; Empty.pro文件 QT core gui # 要引入的Qt模块&#xff0c;后面学习到一些内容的时候可能会修改这里 #这个文件相当于Linux里面的makefile文件。makefile其实是一个非常古老的技术了。 #qmake搭配.pr…

【C++篇】启航——初识C++(下篇)

接上篇【C篇】启航——初识C&#xff08;上篇&#xff09; 目录 一、引用 1.引用的概念 2.引用的基本语法 3.引用的特点 3.1 别名 3.2 不占用额外内存 3.3 必须初始化 3.4 不能为 NULL 4.引用的使用 4.1 函数参数传递 4.2 返回值 4.3 常量引用 5.引用和指针的关…

从数字化到智能化,智慧园区让管理更高效

在当今科技飞速发展的时代&#xff0c;园区管理也正经历着从数字化到智能化的深刻变革。智慧园区的建设&#xff0c;让管理变得更加高效、便捷和智能。 数字化是智慧园区建设的基础。通过物联网、大数据、云计算等技术&#xff0c;园区内的各种设施、设备和系统实现了互联互通…

基于Java的建筑节能监测系统+能源管理+公共建筑能耗监测系统+建筑能耗监测系统+节能监测系统+能源管理系统

介绍 建筑节能监测系统是基于计算机网络、物联网、大数据和数据可视化等多种技术融合形成的一套节能监测系统 系统实现了对建筑电、水、热&#xff0c;气等能源、资源消耗情况的实时监测和预警、动态分析和评估&#xff0c;为用户建立了科学、系统的节能分析方法&#xff0c;…

【Python|接口自动化测试】使用requests库发送HTTP请求

1.requests模块介绍 Python的requests模块是一个非常流行的第三方库&#xff0c;用于发送HTTP请求。它简化了与Web服务进行交互的过程&#xff0c;使得开发人员可以更方便地处理HTTP请求和响应。 本篇文章需要对HTTP和Python有一定的了解&#xff0c;只会解释关键性的操作 安…

【刷点笔试面试题试试水】找错—使用strlen()函数代替sizeof计算字符串长度

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: #include <iostream> using namespace std;void UpperCase(ch…

【2024工业3D异常检测文献】CMDIAD: 基于跨模态蒸馏驱动的多模态工业异常检测

Incomplete Multimodal Industrial Anomaly Detection via Cross-Modal Distillation 1、Background 近年来&#xff0c;基于3D点云和RGB图像的多模态工业异常检测(IAD)研究强调了利用模态间的冗余性和互补性对于精确分类和分割的重要性。 在项目中&#xff0c;提出了CMDIAD方…

20240930编译orangepi5的Android12使用HDMI0输出

20240930编译orangepi5的Android12使用HDMI0输出 2024/9/30 9:44 缘起&#xff0c;3月份的时候&#xff0c;看PDD拼多多的优惠券给力&#xff01; 就入手了香橙派Orange Pi 5。 自从制作TF卡的启动卡的时候&#xff0c;坏了一张SanDisk的32GB的TF卡。 从此就对TF卡启动无比抵触…

【微信小程序前端开发】入门Day01 —— 小程序页面组成、组件使用及协同开发发布指南

小程序的项目结构 pages 用来存放所有小程序的页面 utils 用来存放工具性质的模块&#xff08;例如&#xff1a;格式化时间的自定义模块&#xff09; app.js 小程序项目的入口文件 app.json 小程序项目的全局配置文件 app.wxss 小程序项目的全局样式文件 project.config.json 项…

理解线程库和线程排斥(锁)

理解线程库 线程要有独立属性 a.独立栈结构 b.寄存器中的上下文 在进程地址库内&#xff0c;维护栈的设备只有一套&#xff0c;如何保证线程都有独立栈&#xff1f; 每个新线程的栈由库维护&#xff0c;库会在堆上开辟一段空间。 默认地址空间的栈由主线程使用 如何理解pt…

SpringBoot框架下体育馆管理系统的构建

1引言 1.1课题背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理&#xff0c;这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制&#xff0c;不仅提高了工作效率&#xff0c;而且大大的提高了其…