弱监督语义分割-对CAM的生成过程进行改进1

一、仿射变换图像结合正则项优化CAM生成

论文:Self-supervised Equivariant Attention Mechanism for Weakly Supervised Semantic Segmentation (CVPR,2020)

1.SEAM方法

  • 孪生网络架构(Siamese Network Architecture):SEAM 方法采用了孪生网络结构,这种结构包含两个相似的网络分支,它们共享相同的权重和参数。每个分支都会处理输入图像,但是应用不同的变换(例如缩放、旋转等)。

  • 等变正则化(Equivariant Regularization,简称 ER):这是 SEAM 方法的一个组成部分,目的是通过正则化技术确保网络输出的类激活图(CAM)在各种仿射变换下保持一致性。这意味着无论输入图像如何变换,网络都应该产生相同类别的激活响应。

  • 像素相关性模块(Pixel Correlation Module,简称 PCM):这是 SEAM 方法的另一个组成部分,用于捕捉像素之间的上下文外观信息,并通过学习到的相似性来修正原始的 CAM,以提高 CAM 的精确度和一致性。

  • 特别设计的损失函数(Specially Designed Losses):SEAM 方法使用了特定的损失函数来训练网络,这些损失函数不仅促进了 CAM 在仿射变换下的一致性,还确保了 CAM 能够很好地贴合目标对象的轮廓。

  1. 仿射变换(Affine Transformation):仿射变换是指对图像进行的一系列线性变换,包括旋转、缩放、平移等。每个样本都有一个仿射变换 A(·)。

  2. 等变性(Equivariance):等变性是指一个函数在输入经过某种变换后,其输出也会经过相同的变换。对于分割任务,作者指出分割函数(记为 Fws(·))应该保持等变性,即对输入图像 I 应用仿射变换 A(·) 后,分割函数的输出 A(Fws(I)) 应该等于先将 I 变换为 A(I) 后再应用分割函数 Fws(·) 的结果。

  3. 不变性(Invariance):与等变性相对的是不变性,即不管输入如何变换,输出都保持不变。分类任务更关注于不变性,因为类别标签不应随图像的旋转或缩放而改变。文中提到 Pool(Fwc(A(I))) = l,这里的 Pool 表示池化操作(pooling),Fwc(·) 是分类函数,l 是类别标签。这意味着即使输入图像经过了仿射变换,分类函数的输出(即类别标签)应该保持不变。

  4. 分类函数的不变性原因:文章指出,分类函数的不变性主要是由于池化操作导致的,而分类函数 Fwc(·) 本身并没有等变约束。

  5. 全监督与弱监督学习的差距:由于分类函数缺乏等变约束,使得在网络学习过程中很难达到分割函数的目标,即难以学习到能够精确描述对象形状和轮廓的特征。因此,文章提出需要集成额外的正则化项(regularizers),以缩小全监督学习和弱监督学习之间的监督差距。

  • 分类损失(Classification Loss):使用全局平均池化层(global average pooling)和多标签软边界损失(multi-label soft margin loss)来训练网络。
  • 等变正则化损失(Equivariant Regularization Loss):确保原始 CAM 在不同变换下的一致性。
  • 等变交叉正则化损失(Equivariant Cross Regularization Loss):通过 PCM 进一步整合自监督学习,避免 CAM 在细化过程中退化。

公式一:这个公式定义了自注意力机制中的一个输出信号 𝑦𝑖yi​,它依赖于输入特征 𝑥x 在位置 𝑖i 上的表示。这里: 

  • yi​ 是位置 𝑖 的输出特征。
  • xi​ 是输入特征在位置 𝑖的表示。
  • C(xi​) 是一个归一化因子,确保输出信号的幅度保持一致,通常是 ∑∀𝑗𝑓(𝑥𝑖,𝑥𝑗)的总和,这样可以使不同位置的 𝑦𝑖 具有相同的尺度。
  • f(xi​,xj​) 是一个用于计算位置 𝑖和 𝑗之间相似度的函数,通常是一个嵌入空间中的点积,用于衡量两个位置的相关性。
  • g(xj​) 是一个用于转换输入信号 𝑥𝑗的函数,它可以是一个全连接层或1x1卷积层,用于为自注意力机制提供输入信号的不同表示。

公式二:这个公式定义了如何计算两个输入特征 𝑥𝑖和 𝑥𝑗之间的相似度 𝑓(𝑥𝑖,𝑥𝑗): 

  • θ(xi​) 和 𝜙(𝑥𝑗)是嵌入函数,它们将输入特征 𝑥𝑖和 𝑥𝑗映射到一个嵌入空间中。这些函数通常由1x1卷积层实现,用于提取特征的高级表示。
  • T 表示矩阵转置,确保 𝜃(𝑥𝑖)和 𝜙(𝑥𝑗)可以进行点积运算。
  • e 表示向量,用于将 𝜃(𝑥𝑖) 转换为一个列向量,以便进行矩阵运算。

2.Equivariant Regularization(等变正则化) 

  • 网络表示:𝐹(⋅)表示的是整个网络模型,它接受输入并产生输出。

  •  仿射变换:𝐴(⋅)表示任何空间仿射变换,如重新缩放(rescaling)、旋转(rotation)或翻转(flip)。这些变换可以改变图像的外观,但是不改变图像的语义内容。
  • 正则化整合:为了在原始网络上整合正则化,网络被扩展为一个共享权重的孪生(siamese)结构。孪生网络结构包含两个相同的网络分支,它们共享相同的权重和参数。

  • 变换应用

    • 一个分支在网络的输出上应用仿射变换,即对已经生成的CAM进行变换。
    • 另一个分支在网络的前馈(feedforward)之前,对输入图像应用相同的仿射变换,然后通过网络生成CAM。
  • 输出激活图的正则化:两个分支生成的输出激活图(即变换后的CAM和原始图像经过变换和网络处理后的CAM)通过正则化手段进行约束,以确保它们的一致性。这意味着无论图像如何变换,网络输出的CAM应该在语义上保持一致。

  • 一致性保证:通过这种方式,正则化项确保了无论输入图像经过何种仿射变换,网络都能够生成一致的、与变换前图像对应的CAM。

3.Pixel Correlation Module 

虽然等变正则化为网络学习提供了额外的监督,但仅使用经典卷积层很难达到理想的等变。自关注是捕获上下文信息和细化逐像素预测结果的有效模块。将Eq.(1)和Eq.(2)给出的经典自关注模块进行CAM细化,公式可以写成:

  • 其中^y表示原始cam,y表示修改后的cam。 
  • 三个嵌入函数θ;φ;G可以通过单独的1 × 1卷积层来实现。

  • 归一化特征空间的内积来计算当前像素i与其他像素之间的亲和力。 

  • ReLU激活函数:在 PCM 中,使用 ReLU(Rectified Linear Unit)激活函数来处理像素之间的相似性得分。ReLU 函数的作用是将所有的负值置为零,而保持正值不变。这样做的目的是为了抑制(suppress)负的相似性得分,确保只保留正的、有意义的相似性信息。

  •  相似性得分的归一化:在通过 ReLU 激活之后,相似性得分会被归一化(normalized)。归一化是一种数值处理方法,它可以确保相似性得分的总和为一个固定的值(如1),这样做有助于在不同的像素之间进行公平的比较。
  • 加权求和生成最终 CAM:最终的 CAM 是通过将原始 CAM 与归一化后的相似性得分进行加权求和来生成的。这意味着每个像素在最终 CAM 中的值不仅取决于它在原始 CAM 中的值,还取决于它与图像中其他像素的相似性。

 PCM 结构通过1×1卷积层处理原始 CAM,生成新的特征表示,然后利用这些特征表示来计算像素间的相似性,并将这些相似性信息整合回原始 CAM,从而生成修正后的 CAM。这个过程涉及到特征图的转换和融合,以及相似性计算,最终目的是生成一个更加精确的分割图。

4.Loss Design of SEAM

全局平均池化是一种池化操作,它将整个特征图的每个通道的数值取平均,生成一个单一的值作为该通道的池化结果。在生成预测向量z的过程中,全局平均池化层会对网络的输出特征图进行操作,将每个通道的数值取平均得到一个单一的值,然后将这些单一的值组合成一个向量z。

  • 其中c表示前景对象的类别索引,C是总的类别数,l是真实标签向量,zc是预测向量z的第c个元素。
  • 损失函数的目标是最小化预测向量z与真实标签l之间的差异。对于每个前景对象类别c,损失函数计算了预测值zc与真实标签lc之间的差异,并将这些差异进行汇总。如果预测值zc与真实标签lc一致,则损失函数趋近于0;否则,损失函数会增加,反映了预测值与真实标签之间的不一致性。
  • lc:真实标签向量l中的元素,表示第c个前景对象类别的标签。如果lc为1,表示该类别存在;如果lc为0,表示该类别不存在。
  •  预测向量zc经过sigmoid函数变换后的取值范围是(0,1)。

分类损失为目标定位提供了学习监督。为了保证输出的一致性,需要对原CAM进行等变正则化聚合。原始CAM的等变正则化(ER)损失可以简单地定义为:

  • ^y​o​:原始分支的网络输出的 CAM,即未经变换的 CAM。
  • 𝑦^𝑡:变换分支的网络输出的 CAM,即经过相同仿射变换的 CAM。
  • ∣∣⋅∣∣1​:L1 范数,也称为曼哈顿距离,用于计算两个 CAM 之间的差异。L1 范数对每个元素的差异求和,对大的差异更加敏感。
  • 等变正则化损失的目的是最小化原始分支和变换分支输出的 CAM 之间的差异。通过这种方式,网络学习到生成的 CAM 不仅在没有变换的情况下能够准确反映图像内容,而且在图像经过仿射变换后仍然保持一致性。

  • 避免在PCM优化过程中CAM退化。
  • 类激活图(CAMs)是通过前景对象的分类损失学习得到的。这意味着模型在训练过程中主要关注于识别和定位图像中的前景对象。
  • 尽管模型专注于前景对象,但背景像素也不应该被忽视。在语义分割任务中,准确地识别和区分背景同样重要,因为它们提供了对前景对象的上下文信息。
  • 在原始的 CAMs 中,背景像素的位置通常被赋予零向量(zero vectors),这意味着在这些位置的激活值为零。这样的表示方式无法产生梯度(gradients),从而无法通过梯度下降等优化算法推动背景像素的特征表示向更准确的方向更新。
  • 为了解决上述问题,作者定义了一个背景分数(background score),用于改善背景像素的特征表示。这个分数是通过对原始 CAMs 进行修改得到的,确保背景像素也能产生有用的梯度,从而在网络训练过程中得到更好的优化。

  •  在深度学习中,梯度用于指导网络参数的更新。如果背景像素的激活值为零,那么它们在反向传播过程中不会产生梯度,导致这些像素的特征表示无法得到改进。通过定义背景分数,可以确保即使在背景区域,模型也能学习到区分不同背景上下文的特征。
  • 通过引入背景分数,模型能够更好地学习到将背景像素的表示推向彼此更接近的方向,这有助于提高模型对背景的区分能力,从而在最终的分割任务中获得更准确的结果。
  • 𝑦^𝑖,𝑐​ 表示原始 CAM 中,对于类别 𝑐在位置 𝑖的激活分数。这个分数反映了 CAM 在特定位置识别特定类别的置信度。
  • 为了优化激活分数的表示,模型通过将前景(前景对象是指图像中用户感兴趣的对象,与背景相对)中非最大激活(non-maximum activations)置为零来归一化每个像素的激活向量。这意味着对于每个像素,只有最高激活分数的类别会被保留,其他类别的激活分数会被设置为零。
  • 在归一化之后,模型会将一个额外的背景分数添加到每个像素的激活向量中。这个背景分数是独立的,并且与前景对象的激活分数不同。
  • 在模型的推理阶段,即模型已经被训练完成并用于预测新图像的分割时,模型只保留前景对象的激活结果。这意味着只有那些对应于前景类别的最高激活分数会被用于最终的分割决策。
  • 对于背景分数,推理阶段会将其设置为一个固定的阈值 𝛼。这里的 𝛼是一个硬阈值参数,用于确定背景像素的激活分数。通过这种方式,模型可以区分前景对象和背景,即使在训练阶段背景分数被用来改善像素间的关系。
  • α 是一个预先设定的参数,用于在推理阶段确定背景像素的激活水平。如果一个像素的激活分数低于 𝛼,它可能被认为是背景的一部分。

  •  分类损失(Classification Loss):用于大致定位(粗略定位)图像中的对象。通过图像级别的分类标签来引导网络学习,使得网络能够识别出图像中的主要类别。
  • 等变正则化损失(Equivariant Regularization Loss,简称 ER Loss):作用:缩小像素级监督和图像级监督之间的差距。通过确保网络输出的CAM在不同的仿射变换下保持一致,ER Loss 强化了网络对图像变换的不变性,从而提高了分割的精度。
  • 等变交叉正则化损失(Equivariant Cross Regularization Loss,简称 ECR Loss):整合PCM(像素相关性模块)与网络主体(trunk of the network),以在各种仿射变换下做出一致的预测。ECR Loss 通过正则化原始 CAM 和经过 PCM 修改后的 CAM 之间的差异,促进了网络对输入图像变化的适应性。

为什么用仿射变换??

仿射变换是一种常见的数据增强技术,可以通过缩放、旋转、翻转等方式改变图像的外观,但不改变其语义内容。这有助于提高模型对不同图像变换的泛化能力。 

在全监督语义分割中,像素级标注会随着图像的变换而变换,因此模型学习到的特征图(如CAM)应该保持等变性。但在弱监督语义分割中,由于缺乏像素级标注,这种约束通常不存在。通过在训练过程中引入仿射变换,可以模拟这种约束,帮助模型学习到对变换不变的特征。

通过在训练过程中应用仿射变换,模型可以学习到即使在图像变换下也能保持一致性的分割特征。这提高了模型在面对真实世界中常见的视角变化和形变时的鲁棒性。

模拟真实世界条件:现实世界中的图像会因为各种因素(如相机移动、物体移动等)而发生变换。通过在训练集中引入仿射变换,可以更好地模拟这些条件,使模型更适应实际应用。

自监督学习:文章中提出的自监督等变注意力机制(SEAM)使用仿射变换作为一种自监督的手段。由于弱监督学习缺乏像素级标注,自监督学习通过设计不需要额外标注的任务(如预测图像变换)来提供额外的监督信号。

缩小监督差距:文章中提到,通过引入仿射变换,可以缩小全监督学习和弱监督学习之间的差距。这是因为全监督学习中的像素级标注隐含了等变性的约束,而弱监督学习通常缺乏这种约束。

改进分割质量:通过确保模型生成的CAM在仿射变换下保持一致,可以生成更精确的分割掩码,从而提高分割任务的性能。

5. Experiments

在训练阶段,为了避免像素相关性模块(PCM)和网络主体(trunk of the network)之间的相互干扰,作者选择在两者的连接点切断梯度的反向传播。这意味着PCM的权重不会通过梯度下降来更新,而是作为一个固定模块来使用。

尽管PCM的权重不通过梯度更新,但它仍然可以作为一个纯粹的上下文细化模块,与网络的主体同时进行训练。这允许PCM在训练过程中保持活跃,但不会对原始的CAM(类激活图)的学习过程产生负面影响。

由于梯度反向传播在PCM和网络主体之间被切断,原始CAM的学习过程不会受到PCM细化过程的影响。这样可以确保CAM能够专注于从图像级标注中学习到对象的分割。

在孪生网络中,两个分支之所以能够共享权重,是因为它们的参数(权重和偏置)是相同的。在训练阶段,两个分支都参与到梯度下降过程中,以学习等变性。但在推理阶段,由于模型已经训练完成,共享权重的一个分支就足以代表整个网络进行预测,因此没有必要激活另一个分支。

通过CAM进行分割的一般步骤和原理:

  1. 特征提取:使用深度学习模型(如卷积神经网络,CNN)从输入图像中提取特征。

  2. 生成原始CAM:基于提取的特征,网络生成原始的CAM。CAM是一种能够突出显示图像中与特定类别最相关的区域的热力图(heatmap)。

  3. 改进CAM:SEAM方法通过自监督学习和像素间的上下文信息来改进原始CAM。这包括:

    • 等变正则化:确保经过仿射变换(如旋转、缩放等)的图像生成的CAM与原始图像的CAM在变换后保持一致。
    • 像素相关性模块(PCM):利用像素间的相似性来细化CAM,使CAM更贴合目标对象的真实轮廓。
  4. 生成伪标签:通过改进后的CAM,可以为每个像素生成一个伪标签。这通常涉及到设置一个阈值,高于该阈值的像素被分配到特定的类别。

  5. 后处理:可能需要一些后处理步骤来优化分割结果,例如使用条件随机场(Conditional Random Fields, CRF)来进一步平滑分割边界,或者通过形态学操作来改善分割的连通性。

  6. 评估和优化:使用评估指标(如平均交并比,mIoU)来衡量伪标签的准确性,并根据需要调整模型参数或后处理步骤。

  7. 多尺度和翻转测试:在推理阶段,对不同尺度的图像和翻转后的图像进行测试,并将结果集成,以提高分割的鲁棒性和准确性。

通过上述步骤,SEAM方法能够在只有图像级标注的情况下,生成高质量的像素级分割结果。这对于弱监督语义分割任务特别有价值,因为它们通常缺乏详细的像素级标注信息。

OHEM代表在线难例挖掘(Online Hard Example Mining)。这是一种在训练深度学习模型时用于提高性能的技术,特别是在目标检测和语义分割等任务中。以下是OHEM的基本概念:

  1. 难例挖掘:在每次迭代或每个批次的训练中,模型会从训练数据中选择那些难以分类的样本。这些难例通常是模型当前状态下错误分类或者不太确定的样本。

  2. 在线:"在线"指的是难例挖掘是在模型训练过程中实时进行的,而不是预先在训练集上计算好。

  3. 损失函数聚焦:OHEM技术通过修改损失函数的计算方式,使得损失函数更多地聚焦在难例上。这意味着在反向传播过程中,模型参数的更新将主要由这些难例驱动。

  4. 提高鲁棒性:通过专注于难例,OHEM有助于模型学习到更加鲁棒的特征表示,从而提高模型对于新样本的泛化能力。

  5. 减少计算量:在每个训练批次中只关注难例,而不是整个训练集,可以减少不必要的计算量,使得训练过程更加高效。

在语义分割的上下文中,OHEM通常用于优化像素级别的分类损失,如交叉熵损失。在每个训练批次中,模型会计算所有像素的损失,然后选择损失最高的前一定比例的像素(这些像素是当前模型最难正确分类的)。然后,只有这些像素的损失会被用来进行反向传播和参数更新。

总的来说,OHEM是一种有效的训练策略,它通过专注于难例来提高模型的性能,尤其在标注数据稀缺或不平衡的情况下。在SEAM方法的消融研究中,OHEM被用来进一步提升模型生成的伪标签的质量,从而提高最终的分割性能。

  • 从表2给出的评价结果可以看出,GradCAM和GradCAM++都不能缩小完全监督和弱监督语义分割任务之间的监督差距,因为最好的mIoU结果并没有提高。我们认为改进后的定位机制只是为了表示对象相关的部分,没有底层信息的约束,不适合分割任务。由这些改进的定位方法生成的cam与地面真相掩模的匹配程度并没有提高。 

图4:cam的可视化。(a)原始图像。(b)地面真值分割。(c)基线cam。(d) SEAM生产的cam。SEAM不仅可以抑制过度激活,还可以将CAMs扩展到完整的对象激活范围。

 图5:前景和背景亲缘性注意图的可视化。红色和绿色的叉表示选择的像素,用蓝色表示相似的特征。

  • 所选择的前景和背景像素在空间上非常接近,而它们的亲和注意图却有很大的不同。证明了PCM可以通过自监督学习边界敏感特征

表3: 等变正则化的各种变换实验。简单地聚合不同的仿射变换并不能带来显著的改进。

  • 简单地合并不同的转换并不是很有效。当缩放变换分别与翻转、旋转、平移相结合时,只有翻转有微小的改进。在我们看来,这是因为翻转、旋转和平移之间的激活映射过于相似,无法产生足够的监督。 

 表4:扩大缩放范围的实验。这里SEAM的重缩放率被设置为0.5。

  • 单纯增加重尺度范围并不能提高生成伪标签的精度,这证明了性能的提高来自于PCM和等变正则化的结合,而不是数据增强

  •  为了验证我们提出的SEAM的有效性,我们评估了单尺度和多尺度测试产生的cam。表5表明,我们提出的模型在单尺度和多尺度测试中都以更高的峰值性能优于基线。

  •  其中TPc表示c类真阳性预测的像素数,FPc和FN c分别表示假阳性和假阴性。这两个指标排除了背景类别,因为背景的预测与前景相反。具体来说,当cam没有完全激活覆盖时,如果假阴性区域较多,则mFN值较大。相对而言,较大的mFP意味着有更多的假阳性区域,这意味着CAMs被过度激活

 图6:过激活和欠激活曲线。mFN曲线越低表示欠激活区域越少,mFP越低表示过激活区域越少。

  •  该曲线显示了基线和我们的方法之间的巨大差距。SEAM实现了较低的mFN和mFP,这意味着我们的方法生成的cam具有更完整的激活覆盖和更少的过度激活像素。因此SEAM的预测图更符合地面真值分割的形状。在不同的图像尺度上,SEAM的曲线比基线模型更一致,证明了等方差正则化在网络学习过程中是有效的,有助于改进CAM。

 6.Comparison with State-of-the-arts

为了进一步提高伪像素级注释的准确性,我们遵循[2]的工作,在我们修订的CAM基础上训练AffinityNet。最终合成的伪标签在PASCAL VOC 2012训练集上达到63.61% mIoU。然后在这些伪标签的完全监督下,用ResNet38主干训练经典分割模型DeepLab[5],得到最终的分割结果

表6给出了各类在val集合上的mIoU,表7给出了前人方法的更多实验结果。与基线方法相比,我们的SEAM在具有相同训练设置的val和test集上显著提高了性能。此外,我们的方法仅使用PASCAL VOC 2012测试集上的图像级标签就能呈现出最先进的性能。

我们的性能提升既不是来自更大的网络结构,也不是来自改进的显著性检测器。性能的提高主要来自于额外的自我监督和PCM的合作,它为分割任务产生了更好的cam。图7显示了一些定性结果,验证了我们的方法在大对象和小对象上都能很好地工作。

7.conclusion

在本文中,我们提出了一种自监督等变注意机制(SEAM),通过引入额外的自我监督来缩小完全监督和弱监督语义分割之间的监督差距。SEAM通过利用等变正则化将自我监督嵌入到弱监督学习框架中,这迫使从各种转换图像预测的cam保持一致。为了进一步提高网络生成一致性图像的能力,设计了像素相关模块(PCM),该模块通过学习像素间相似度对原始图像进行细化。我们的SEAM是由一个具有有效正则化损失的连体网络结构实现的。生成的凸轮不仅在不同的变换输入上保持一致,而且更符合地面真值掩模的形状。我们合成的像素级伪标签重新训练的分割网络在PASCAL VOC 2012数据集上达到了最先进的性能,证明了SEAM的有效性

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

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

相关文章

【网络编程】UDP协议和TCP协议1

UDP协议格式 UDP 报文分为 UDP 报头和 UDP 数据区两部分。报头由 4 个 16 位长(2字节)字段组成,分别说明该报文的源端口、目的端口、报文长度和校验值。 UDP协议如何将报头和有效载荷分离 UDP报头是一种定长报头,长度为8个字节。…

kaldi学习参考

HMM模型 https://www.cnblogs.com/baixf-xyz/p/16777438.htmlhttps://www.cnblogs.com/baixf-xyz/p/16777438.htmlGMM-HMM 基于GMM-HMM的语音识别系统https://www.cnblogs.com/baixf-xyz/p/16777439.html https://www.cnblogs.com/baixf-xyz/p/16777426.htmlhttps://www.cnbl…

全网最详细使用war包的方式结合Tomcat和向量数据库PostgreSQL本地部署Xwiki教学

部署 XWiki 在 CentOS 7 上的过程涉及多个步骤,主要包括安装环境依赖、配置数据库以及安装和配置XWiki。以下是一个详细的步骤说明: 1. 系统准备 首先,确保您的系统是最新的: sudo yum update2. 安装 Java 这里需要注意一下版本…

【静态分析】软件分析课程实验A4-类层次结构分析与过程间常量传播

官网:作业 4:类层次结构分析与过程间常量传播 | Tai-e 参考:https://www.cnblogs.com/gonghr/p/17984124 ----------------------------------------------------------------------- 1 作业导览 为 Java 实现一个类层次结构分析&#xf…

又被System.out.print给坑了一把

学过java的同学都应该知道,第一个程序很多人都是这样: public class Hello {public static void main(String[] args) { System.out.print("Hello,world!");} } 打印结果是:Hello,world! 接着可能会…

中国地面基本气象逐小时数据获取方式

环境气象数据服务平台提供了全国大约2100个点位,2023年1月1日至今的小时级数据。包括气温、气压、湿度、风、降水等要素。 数据基于ECMWF ERA5-Land Hourly陆面再分析资料和中国地面基本气象观测逐三小时数据,使用机器学习模型加工所得,对比…

记一次DNS故障导致用户无法充值的问题(下)

上一篇说到DNS故障导致无法充值,后来我们通过拨测发现业务域名的解析目标地址被解析到了【127.0.0.1】IP。 1、联系阿里云厂商,通过沟通,阿里云反馈我们的域名被XX省通管单位封禁了,导致解析到了不正确的地址。 2、为了解决用户问…

ADS基础教程11 - TouchStone文件的导出及导入

目录 一、 T o u c h S t o n e 介绍 \color{#4285f4}{ \mathbf{ 一、TouchStone介绍}} 一、TouchStone介绍 二、文件导出、导入方式 \color{#4285f4}{ \mathbf{ 二、文件导出、导入方式}} 二、文件导出、导入方式1.原理图操作1)原理图中导出2.原理图中导入 3.DDW中…

云服务器性能大揭秘:4核与8核你知道多少?

​  云计算服务中,通常使用具有多个 CPU 的服务器集群,以便为企业和个人等提供可扩展的计算资源。这使他们能够处理大量数据处理和存储,而无需自己投资昂贵的硬件。像术语“4核”和“8核”,在云服务器领域中就比较常见&#xff…

中国地面气候资料日值数据获取方式

数据简介 环境气象数据服务平台提供了全国大约2100个点位,2000年至2023年的逐日数据。包括气温、气压、湿度、风、降水等要素。 数据基于ECMWF reanalysis-era5-land、reanalysis-era5-single-levels 以及中国2100站点地面气候资料日值观测数据,使用机器…

winform植物大战僵尸

winform植物大战僵尸 植物大战僵尸源码 半成品 需要的拿去学习 登陆注册选择关卡 向日葵 豌豆射手 双枪豌豆射手 项目获取: 项目获取:typora: typora/img (gitee.com) 备用项目获取链接1:yifeiyixiang/kamo: 源码下载 (github.com) 备用…

Capl复合数据类型:枚举

用于定义一组有穷的、命名的常量。常量有了命名更容易理解和记忆,枚举中常量的命名,必须在整个capl程序中唯一。 定义的枚举类型变量,里面的成员如果没有赋值,默认从左到右,依次为012345...。如果有赋值就该成员就代表…

【全开源】Java外卖霸王餐免费吃外卖小程序+APP+公众号+H5多端霸王餐源码

一、特色功能 霸王餐活动管理:允许商家发布和管理霸王餐活动,包括设置活动时间、具体优惠、活动规则等。用户参与与浏览:用户可以在小程序中浏览霸王餐活动列表,查看活动的详情信息,如商品或服务的免费赠送、活动规则…

【NLP练习】使用seq2seq实现文本翻译

使用seq2seq实现文本翻译 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 from __future__ import unicode_literals, print_function, division from io import open import unicodedata import string impo…

Ubuntu/Linux 安装Docker + PyTorch

文章目录 1. 提前准备2. 安装Docker2.1. 卸载冲突软件(非必要)2.2. 在Ubuntu系统上添加Docker的官方GPG密钥2.3. 将Docker的仓库添加到Ubuntu系统的APT源列表中2.4. 安装最新Docker2.5. 检查 3. 安装Nvidia Container Toolkit3.1. 在Ubuntu系统上添加官方…

1688一键采购1000+商品||1688API数据采集接口||1688官方合作伙伴如何实现1688代采

货源采购是跨境电商卖家日常工作的一个重要部分,1688平台是很多卖家常用的货源采购平台。在1688平台采购时,很多卖家会进行批量采购,可能会达到上百甚至上千单,如果一件一件的采购,可能会浪费卖家大量的时间。我们可以…

【java9】java9新特性之改进JavaDocs

Java9在JavaDocs方面的主要新特性是,其输出现在符合兼容HTML5标准。在之前的版本中,默认的HTML版本是 HTML4.01,但在Java9及之后的版本中,JavaDocs命令行工具将默认使用HTML5作为输出标记语言。这意味着,使用JavaDocs工…

MemoryModule - exp - test

文章目录 MemoryModule - exp - test概述笔记测试环境GetModuleFileName不能正常执行GetModuleFileNameWntdll_LdrGetDllFullName猜测原因用LoadLibrary载入的DLL中功能是正常的 gLog可以正常使用内存载入DLL无法支持的功能的折中方法COM操作正常调用方代码接口代码 接口入参测…

Visual Studio的使用方法

目录 1. 下载软件 2. 软件安装 3. 软件使用 4. VS工具的字体背景美化 5. 程序调试 1. 下载软件 官网地址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具 (microsoft.com) 2. 软件安装 1.选中vs_Professional,鼠标右击选择“以管理员身份…