Class Re-Activation Maps for Weakly-Supervised Semantic Segmentation

摘要:

提取类激活映射(CAM)可以说是为弱监督语义分割(WSSS)生成伪掩码的最标准步骤。然而,我们发现伪掩码不理想的关键是在CAM中广泛使用的二进制交叉熵损失(BCE)。具体来说,由于BCE的池化方式是对类别求和,CAM中的每个像素可能对同一接受域中共同出现的多个类做出响应。因此,给定一个类,其热CAM像素可能会错误地侵犯属于其他类的区域,或者非热CAM像素实际上可能是该类的一部分。为此,我们介绍了一种简单有效方法:通过使用softmax交叉熵损失(SCE)(称为ReCAM)来重新激活具有BCE的聚合CAM。给定图像,我们使用CAM提取每个单个类的特征像素,并使用它们与类标签一起使用SCE学习另一个全连接层(在骨干之后)。一旦收敛,我们提取ReCAM的方法与CAM相同。由于SCE的对比性质,像素响应被分解成不同的类,因此期望较少的掩模模糊。对PASCAL VOC和MS COCO的评估表明,ReCAM不仅可以生成高质量的掩模,还可以在任何CAM变体中支持即插即用,开销很小。我们的代码在https://github.com/zhaozhengChen/ReCAM上公开

二进制交叉熵(Binary Cross-Entropy)损失是一种常用的损失函数,通常用于二分类问题中。它衡量了两个概率分布之间的差异,对于每个类别,该损失函数会计算预测概率与实际标签之间的交叉熵,然后对所有类别的交叉熵求和,得到最终的损失值。

热CAM(hot CAM)和非热CAM(non-hot CAM)是指在类激活映射(Class Activation Map,CAM)中的像素响应情况。热CAM指的是被激活为特定类别的像素,而非热CAM指的是未被激活为特定类别的像素。在语义分割中,热CAM表示被预测为某个类别的像素,而非热CAM表示未被预测为该类别的像素。

softmax交叉熵(Softmax Cross-Entropy)损失是一种常用的损失函数,通常用于多分类问题中。在softmax交叉熵损失中,首先对模型的原始输出进行softmax操作,将其转换为类别概率分布,然后计算预测概率与实际标签之间的交叉熵损失。这有助于模型更好地学习多个类别之间的关系,并提高分类的准确性。

 1. Introduction

弱监督语义分割(wssss)旨在通过使用“弱”标签来降低标注“强”像素级掩码的高成本,例如涂鸦[29,36],边界框[7,35]和图像级类标签[1,19,27,28,42,46]。最后一个是最经济但最具挑战性的预算,因此是我们在本文中的重点。常见的流程有三个步骤:

  • 训练一个基于图像级分类标签的多标签分类模型
  • 提取每个类别的类别激活图(class activation map, CAM)[51],生成0-1掩码,并进行侵蚀和扩张等潜在的细化
  • 以全类掩码作为伪标签,以标准的全监督方式学习分割模型

影响最终分割模型性能的因素有很多,但第一步的分类模型绝对是根。我们经常观察到两个常见的缺陷。在A类对象的CAM中,存在1)假阳性像素,它们被激活为A类,但实际标签为B类,其中B通常是对A的混淆类,而不是语义分割中的特殊类背景;2)属于A类但被错误标记为背景的假阴性像素。

Findings. 当使用具有sigmoid 激活函数的二元交叉熵(BCE)损失训练模型时,这些缺陷尤为明显。具体来说,sigmoid函数是\frac{e^{x}}{e^{x}+1},其中x表示任何单个类的预测logit(预测得分)。输出输入BCE函数来计算损失。这个损失代表了对应于x的错误分类的惩罚强度。因此,BCE损失不是类互斥的——一个类的错误分类不会惩罚其他类的激活。这对于训练多标签分类器是必不可少的。然而,当通过这些分类器提取CAM时,我们看到了缺点:跨不同类的非排他激活(导致CAM中的假阳性像素);由于部分激活是共享的,所以对所有类的激活是有限的(导致假负像素)。

logit通常指的是模型在softmax函数之前的输出,可以理解为未经过归一化的原始预测分数。对于多类别分类任务,每个类别都有一个对应的logit值,表示模型对该类别的置信度或得分。 

 Motivation.我们进行了一些小规模实验,以经验性地展示在使用二元交叉熵损失(BCE)时 CAM 的质量较差。我们从 MS COCO 2014 中挑选了单标签训练图像(约占训练集的20%),分别用于训练5类和80类分类器。其中,对于5类分类器,我们选择了5个有蹄动物类别(例如马和牛),这些类别在激活方面存在混淆。我们分别使用两种损失函数进行模型训练:BCE 损失和 softmax 交叉熵(SCE)损失——这是分类任务中最常用的损失函数之一。我们使用验证集中的单标签图像来评估模型的分类性能,如图1(a)所示,并使用训练集和验证集中的单标签图像来检查模型对对象上正确区域的激活能力——CAM 的质量,如图1(b)所示。

图1: 我们分别使用二进制交叉熵(BCE)和softmax交叉熵(SCE)损失来训练两个模型。我们的训练集和val集只包含MS COCO的单标签图像[30]。“80类”模型采用完整的标签集。“5蹄”模型只在5蹄动物的样本上进行训练,每个样本都会对另一个产生假阳性缺陷,例如牛和马之间

  • 对于80类模型,BCE和SCE产生的分类器质量相同,但cam明显不同;
  • SCE模型的cam具有更高的mIoU,并且这种优势在验证图像中几乎保持不变。

一个小而关键的观察是,对于5种有蹄类动物,BCE表现出较弱的分类能力。我们指出这是因为BCE的sigmoid激活函数不强制类独占学习,混淆了相似类之间的模型。 然而,SCE是不同的。它的softmax激活函数\frac{e^{x}}{e^{x}+\sum _{y}e^{y}},其中y表示任何负类的预测,通过在分母中使用指数项显式地强制类排除。SCE鼓励改进ground truth的logit,同时惩罚其他。这对CAM产生了两个影响:

  • 减少了混淆不同类别模型的假阳性像素;
  • 鼓励模型探索减少假负像素的特定类别特征。

我们在图1 (b)中展示了经验证据,其中SCE对BCE的mIoU改进对于5蹄动物尤其显著。请注意BCE和SCE的功能是不同的。为了对它们进行更具体的比较,我们在4.2节中从理论上和经验上阐述了它们产生的梯度之间的比较。 

Softmax函数的分母包含了所有类别的指数项之和,这意味着每个类别的预测都受到其他类别预测的影响。当某个类别的预测值增加时,其他类别的预测值相应地减少,因为Softmax函数的性质会使得所有类别的预测概率之和为1。

通过在Softmax函数的分母中使用指数项,SCE损失函数明确地表明了类别之间的排他性,即模型在进行预测时需要考虑所有类别的影响,并且通过指数项的方式强调了不同类别之间的竞争关系。这种设计有助于模型更好地学习类别之间的差异,提高分类任务的准确性和泛化能力。

 我们的解决方案是利用 softmax 交叉熵(SCE)损失函数来训练 CAM 模型。然而,直接用 SCE 替换 BCE 对于多标签分类任务并不合理,因为不同类别的概率不是独立的。因此,我们将 SCE 作为附加损失来重新激活模型并生成 ReCAM。具体而言,当模型使用 BCE 收敛时,对于图像中标记的每个个体类别,我们提取 CAM,并以标准化的软掩码格式呈现,即没有硬阈值。我们分别将所有掩码应用于特征(即由骨干网络输出的特征图块),每个掩码“突出显示”对特定类别分类贡献的特征像素。通过这种方式,我们将多标签特征分支到一组单标签特征上。因此,我们可以使用这些特征(和标签)来训练一个多类别分类器,例如,在骨干网络之后插入另一个全连接层。SCE 损失惩罚了由于特征不佳或掩模不佳而导致的任何错误分类。然后,反向传播其梯度会改善两者。一旦收敛,我们以与 CAM 相同的方式提取 ReCAM。

标准化的软掩码格式是指在生成类激活映射(CAM)时,将其表示为一种标准化的软掩码形式,而不是使用硬阈值。软掩码是指在像素级别上对特征图进行加权,以突出显示对特定类别分类有贡献的像素。软掩码通常是在0到1之间的值,表示每个像素对于特定类别的重要性程度。

相比之下,硬阈值是一种二值化处理方法,将连续的数值转换为0或1。在CAM中,硬阈值通常用于将连续的类激活映射转换为二值化的掩码,以便可视化和分割目标区域。硬阈值化后,只有大于阈值的像素被保留为1,其余像素被设为0。

因此,标准化的软掩码格式是指在CAM生成过程中,将类激活映射表示为连续的、标准化的像素权重值,而不是进行硬阈值化处理得到二值化的掩码。这种方法可以更好地保留像素级别的信息,提高对特定类别的定位准确性。

Empirical Evaluations.为了评估ReCAM,我们在两个流行的语义分割基准PASCAL VOC 2012[9]和MS COCO 2014[30]上进行了广泛的WSSS实验。WSSS的标准流程是使用CAM[51]作为种子,然后部署AdvCAM[23]或IRN[1]等改进方法将种子扩展为伪掩码-用于训练分割模型的标签。我们设计了以下的比较来展示ReCAM的通用性和优越性。1) ReCAM也是种子。我们对ReCAM进行了提取,并在此基础上进行了改进,结果表明,经过严格的改进步骤后,仍然保持了相对于CAM的优势。2) ReCAM作为另一种细化方法。我们将ReCAM与现有的细化方法进行比较,包括生成掩模的质量以及添加到基线CAM的计算开销[51]。在学习语义分割模型阶段,我们使用了基于resnet的DeepLabV2[5]、DeepLabV3+[6]和基于transformer的UperNet[41]。因此,我们在本文中的贡献是双重的。1)一种简单而有效的生成WSSS伪掩码的方法ReCAM。2)在两种流行的WSSS基准上对ReCAM进行了广泛的评估,无论是否纳入了先进的改进方法[1,23]。

2. Related Works

在WSSS的工作中,多标签分类和语义分割模型的训练几乎是一致的。下面,我们只介绍种子生成和掩码细化的变体。

“种子生成”是指在弱监督语义分割(WSSS)任务中生成用于训练的初步标记或伪标签的过程。

Seed Generation.

  • Vanilla CAM:最初的类激活映射(CAM)方法通过使用为每个单独类别学习的全连接(FC)权重来缩放特征图,然后通过通道平均、空间归一化和硬阈值化来生成种子掩码。这些种子掩码用于指导模型学习图像中不同类别的语义信息。
  • GAIN:GAIN方法将CAM应用于原始图像以生成掩码图像,并在这些图像上最小化模型的预测分数,从而迫使模型在新的训练中捕获其他区域(当前CAM之外)的特征。这种方法类似于基于擦除的方法,其中擦除方法直接扰动区域(在CAM内部)并将扰动图像馈送到模型中,以生成预期捕获新区域的下一轮CAM。

  • Score-CAM:Score-CAM是一种不同的CAM方法,它用新的分数替换了基本CAM中使用的FC权重,这些分数是根据通过通道方式(而非特定类别)激活图遮罩的图像预测而来。

  • EDAM:EDAM是一项最近的工作,利用基于CAM的扰动来优化额外的分类器。作者指出,他们的ReCAM与EDAM有相似之处,但也有两个主要区别:首先,EDAM使用额外的层来生成特定类别的软掩码,而ReCAM的软掩码是直接从CAM的副产品中获得的,无需任何参数;其次,EDAM仍然使用二元交叉熵(BCE)损失来训练扰动输入,而作者通过利用交叉熵损失(SCE)来检查BCE的局限性,并提出了一种不同的训练方法。

Mask Generation. 

种子掩码进行细化的方法:

  • 基于像素关系的方法:这些方法利用对象区域周围的语义相似像素来扩展种子掩码。其中一些方法使用随机游走来计算过渡矩阵,其中每个元素都是一个相关度分数。相关方法采用不同的过渡矩阵设计。例如,PSA 是一个用于预测相邻像素之间语义相关性的 AffinityNet。IRN 则是一个基于像素关系的网络,用于估计类别边界图,进而计算相关性。另一个方法是 BES,它通过使用 CAM 作为伪标签来学习预测边界图。
  • 利用显著性图的方法:这些方法使用显著性图来对 CAM 进行细化。例如,EPS 提出了一种联合训练策略,将 CAM 和显著性图结合起来。EDAM 引入了一种后处理方法,将显著性图中的自信区域与 CAM 结合起来。
  • 迭代后处理方法:这些方法利用迭代后处理来细化 CAM。例如,OOA 对多次训练迭代生成的 CAM 进行集成。CONTA 通过一系列模型训练和推断的过程来迭代整个 WSSS 过程。AdvCAM 利用相对于输入图像的梯度扰动图像,并迭代地寻找新激活的像素

 这些细化方法都是基于由 CAM 生成的种子掩码。我们的 ReCAM 则是利用 SCE 来重新激活 CAM 中更多的像素,因此很容易将其整合进去。在第 5 节中,我们进行了广泛的即插即用实验。其他改进 CAM 的想法包括学习特征流形上的类内边界(ICD)、学习细粒度分类模型(SCCAM)以及强化 CAM 在图像不同变换下的一致性(SEAM)。最近的工作 RIB 对信息瓶颈理论进行了仔细分析,并提出了重新训练多标签分类模型的方法。我们的 ReCAM 不删除任何激活函数,而是添加了基于 softmax 激活的损失函数(SCE)。另一个区别在于推断阶段。RIB 对每个测试图像需要进行 10 次前向传播和反向传播,而 ReCAM 只需要一次前向传播。例如,在 PASCAL VOC 2012 数据集上,RIB 的推断时间为 8 小时(其训练成本与基准 CAM 相同),而我们相对基准 CAM 的总成本仅为 0.6 小时。

显著性图的像素值表示了对应图像像素的显著性程度,数值越高表示该像素越突出或重要。这些值可以是基于像素的颜色、纹理、边缘等特征来计算的。显著性图可以用于图像分割、对象检测、注意力机制等任务中。

在对象检测中,显著性图可以帮助模型找到图像中的重要区域,从而提高检测性能。在注意力机制中,显著性图可以指导模型关注图像中的重要区域,从而提高模型的性能和鲁棒性。

学习特征流形上的类内边界是指在深度学习中的一种技术,旨在通过对特征空间中的数据进行建模,学习类别之间的边界和区分性特征。特征流形是指数据在高维特征空间中的分布形状和结构,类内边界则表示不同类别之间的边界或界限

3. Preliminaries

CAM.CAM[51]的第一步是用全局平均池化(GAP)训练一个多标签分类模型,然后是一个预测层(例如ResNet的FC层[12])。每个训练样例上的预测损失由BCE函数计算,公式如下:

 其中z[k]表示第k类的预测logit, σ(·)为sigmoid函数,k为前景对象类的总数(在数据集中)。Y [k]\epsilon \left \{ 0,1 \right \}是第k个类的图像级标签,其中1表示该类存在于图像中,否则为0。

一旦模型收敛,我们将图像x输入其中,提取出现在x中的第k类CAM:

wk表示第k类对应的分类权值(如ResNet的FC层),f(x)表示GAP之前的x的特征图。 

请注意,为了简单起见,我们假设模型的分类头始终是单个FC层,并使用w表示其权重。

如何从模型中提取特定类别的CAM。CAM是一种用于可视化深度学习模型在图像分类任务中的激活区域的技术。

具体来说,提取第k类CAM的公式通常包括以下步骤:

  1. 使用输入图像x通过模型(如卷积神经网络)得到特征图f(x)。
  2. 根据模型的结构和参数,计算第k类CAM的权重w_k。
  3. 使用特征图f(x)和权重w_k,应用相应的操作(如加权求和或卷积操作),得到第k类CAM的热力图M_k。

因此,提取第k类CAM的公式描述了如何从模型的特征图中提取出与第k类别相关的激活区域,以便可视化和理解模型在特定类别上的激活情况。这有助于解释模型的决策过程,并帮助理解模型对不同类别的响应方式。

通过除以 max(ReLU(A_k)),CAM_k(x) 的值被归一化到 0 到 1 之间,使得最大激活区域的数值为 1,其他区域相对于最大激活区域的重要性可以通过相对数值大小进行比较。

 Pseudo Masks.有几个选项可以从CAM生成伪掩码:

  1. 将CAM阈值设置为0-1掩码
  2. 采用IRN精炼CAM[1],这是一种广泛使用的精炼方法
  3. 通过分类模型迭代细化CAM,例如使用AdvCAM [23];
  4. 级联选项3和2。

在图2中,我们在插入ReCAM的情况下演示了这些选项。我们将在4.1节详细阐述这些内容。 

图2: 利用ReCAM为WSSS生成伪掩码的流水线。种子生成和掩码生成两个步骤,我们的ReCAM是一个插入种子生成步骤的模块。掩码生成有以下几种选择:1)直接将ReCAM作为伪掩码;2)用最常用的细化方法IRN对ReCAM进行细化[1];3)通过ReCAM模型迭代推断出更好的掩模;4)级联选项3和2。学习ReCAM模型的细节如图3所示。表2显示了这些选项的总体比较结果。

Semantic Segmentation.这是WSSS的最后一步。我们使用伪掩码以完全监督的方式来训练语义分割模型,目标函数为:

其中,yi;j和zi;j分别表示在像素(i;j) 的标签和预测logit,Yi;j [k]和zi;j [k]分别表示Yi;j和zi;j的第k个元素。H和W是图像的高度和宽度,K是类的总数。K+1意味着包括背景类。

 L_ss 是交叉熵损失函数,用于计算模型的损失值。交叉熵损失函数通常用于多分类任务中,用于衡量模型输出的概率分布与真实标签之间的差异。

在实现中,我们使用了 DeepLab 的变体 [5, 6],并结合了 ResNet-101 [12],参考了相关的研究工作 [1, 21, 23, 45]。此外,我们还采用了最近的模型 UperNet [41],其使用了更强大的主干网络——Swin Transformer [31]。

4. Class Re-Activation Maps (ReCAM)

在第4.1节中,我们详细阐述了重新激活分类模型并从中提取ReCAM的方法。需要注意的是,我们也将我们的方法命名为“ReCAM”。在第4.2节中,我们通过理论和实证比较SCE与BCE的梯度,来验证ReCAM中独占类别学习的优势。

4.1. ReCAM Pipeline

Backbone and Multi-Label Features.我们使用标准的ResNet-50[12]作为主干(即特征编码器)提取特征,遵循相关工作[1,21,23,45]。

给定一个输入图像x和它的多热类标签y\epsilon \left \{ 0,1 \right \}^{K},我们表示特征编码器的输出为f(x)\epsilon \mathbb{R}^{W\times H\times C}。C表示通道数,H和W分别表示高度和宽度。K是数据集前景类的总数,请注意图3:(1)为了简洁起见,特征提取过程被省略了。(2)特征f(x)在上面的块中写成f,通常表示多个对象。

图3:ReCAM的培训框架。在上面的块中,它是使用BCE的多标签分类器的常规训练。为简洁起见,省去了通过主干提取特征的过程。我们提取每个类的CAM,然后将其(作为规范化软掩码)应用于特征映射f上,以获得特定于类的特征fk。在下面的块中,我们使用fk及其单标签来学习具有SCE损失的多类分类器。这种损耗的梯度在包括骨干网在内的整个网络中反向传播。

在图三中,Sigmoid和Softmax模块是用于处理模型输出的激活函数,其作用如下:

  1. Sigmoid模块:Sigmoid函数将实数映射到0到1之间的区间,其公式为:σ(x) = 1 / (1 + e^(-x))。在二分类问题中,Sigmoid函数常用于将模型输出转换为概率值,表示某个类别的预测概率。在图三中,Sigmoid模块可能用于将模型输出的logits转换为0到1之间的概率值,以便进行二分类任务的预测。

  2. Softmax模块:Softmax函数将实数向量映射到一个概率分布,其公式为:softmax(x)_i = e^(x_i) / Σ_j e^(x_j)。Softmax函数常用于多分类问题中,将模型输出的logits转换为各个类别的概率分布,以便进行多分类任务的预测。在图三中,Softmax模块可能用于将模型输出的logits转换为多个类别的概率分布。

这些激活函数并不直接生成0到1的序列,而是将模型输出进行适当的转换,以便得到符合概率分布的输出结果,用于进行分类任务的预测。sigmoid和softmax函数在深度学习中常用于处理分类问题中的输出,将原始的logits转换为概率值,以便进行后续的决策和预测。

在图三中,激活函数后面的标签是通过模型的预测结果生成的。具体来说,模型在经过Sigmoid或Softmax激活函数后,会输出对每个类别的概率值或得分。这些概率值或得分可以被用来生成标签。

在多分类任务中,通常会选择概率值最高的类别作为预测结果,即将概率值最大的类别作为预测的标签。这样,模型的输出经过Softmax激活函数后,可以得到每个类别的概率分布,然后选择概率最高的类别作为预测结果。

在二分类任务中,经过Sigmoid激活函数后,输出的概率值可以被阈值(通常是0.5)进行判断,大于阈值的类别被认为是正类,小于阈值的类别被认为是负类。

因此,激活函数后面的标签是根据模型输出的概率值或得分生成的,根据任务的不同(二分类或多分类),选择不同的生成方式来确定最终的预测标签。

FC Layer-1 with BCE Loss. 在传统的CAM模型中,特征f(x)首先通过GAP层,然后将结果馈入FC层进行预测[51]。因此,预测logits可以表示为:

然后,使用z和图像级标签y来计算BCE损失。方程(1)给出了一个元素相关的公式。

Extracting CAM. 我们根据特征 f(x) 和相应的全连接层权重 wk,利用公式(2)提取每个单独类别 k 的 CAM。为了简洁起见,我们将 CAMk(x) 表示为 Mk ∈ \mathbb{R}^{W\times H}

Single-Label Feature. 如图3所示,我们使用Mk作为软蒙版应用于f(x)以提取类特定特征fk(x)。我们计算Mk和f(x)的每个通道之间的元素乘法,如下所示:

 其中,f^{c}\left ( x \right )f_{k}^{c}\left ( x \right )表示乘法前后的单个通道(通过使用Mk), c的取值范围为1 ~ c, c为特征映射(即通道)的个数。特征映射块fk(x)(每个包含C个通道)对应于图3中的示例f1;f2;f3。

FC Layer-2 with SCE Loss.每个fk(x)都有一个单一的对象标签(即第k个位置为1的one-hot标签),然后我们将其提供给FC Layer-2(见图3)学习多类分类器,因此我们对x有了新的预测logits:

 其中FC2具有与FC1相同的架构。

通过这种方式,我们成功地将基于bce的多标签图像模型转换为基于sce的单标签特征模型。SCE损失公式为:

 其中y[k]和z_{k}^{'}\left [ k \right ]分别表示y和z_{k}^{'}的第k个元素,我们使用Lsce的梯度来更新包含主干的模型。因此,我们重新激活BCE模型的总体目标函数如下:

 其中λ表示BCE和SCE之间的平衡。请注意,使用L_{bce}对FC1进行重新优化也包括在内,因为我们需要在学习期间使用FC1来生成更新的 soft masks Mk。

Extracting ReCAM. 重新激活后,我们将图像x输入其中,提取其每个类k的ReCAM如下:

式中w_{k}^{''}为第k类对应的分类权值。由于我们有两个FC层,我们的实现将w''可选为:1)w, 2) w', 3)w⊕w',或4)w⊗w',其中⊕和⊗分别是元素的加法和乘法。我们将在5.2节中展示这些选项的性能。

Refining ReCAM (Optional). 如第3节所述,改进ReCAM有几种选择:1)AdvCAM[23]通过对抗性逐步扰动图像x,迭代地改进ReCAM;

  •  t ∈ [1, T] 表示对抗性步骤的索引,即迭代的步数,t为第t步。x^t 表示在第t步的操作图像,即经过扰动后的图像。
  • k 和 j 分别代表正类和负类,用于区分CAM中的不同类别。
  • ξ 和 µ 是超参数,用于调节对抗性损失函数的权重,这些超参数与文献[23]中的相同。
  • M = 1 {ReCAM_{k}\left ( x^{t-1} \right ) > 0.5} 是用于正则化的限制性掩码,用于限制CAM的优化范围。
  • 最终经过优化的激活图M_{k}^{'} 是通过对所有迭代步骤中的ReCAM_{k}\left ( x^{t} \right ) 进行加权求和得到的,其中使用了AdvCAM [23]中的方法,不进行最大归一化处理。

2)IRN [1] 方法使用ReCAM作为输入,并训练一个像素间关系网络(IRNet)来估计类别边界图 B。然后,通过应用随机游走算法和转移概率矩阵 T 来进一步优化ReCAM。 

正则化的限制性掩码指的是一种用于限制CAM(Class Activation Map)优化范围的掩码。在AdvCAM方法中,通过引入这样的掩码,可以对CAM的生成过程进行约束,使得CAM在优化过程中只关注特定区域或特定像素,从而提高CAM的准确性和稳定性。

具体来说,这里的限制性掩码 M = 1 {ReCAM_k(x_{t-1}) > 0.5} 表示对上一步生成的CAM中大于0.5的像素位置进行标记,将其作为限制性掩码。这意味着在当前优化步骤中,CAM只会在这些被标记的像素位置上进行调整和优化,而其他像素位置则不会受到影响。

通过使用正则化的限制性掩码,可以有效地控制CAM的生成范围,避免过度优化或不必要的变化,同时确保CAM在关注的区域内得到更准确的激活响应,从而提高模型的性能和泛化能力。

 其中t表示迭代次数,vec(·)表示向量化。最后,我们使用\left \{ M_{k}^{'} \right \}作为图像的像素级标签,其中k表示图像中的每个正类,以训练语义分割模型。

4.2. Justification: BCE vs CE

在本节中,我们证明了在ReCAM中引入SCE损失的优势。从理论和实证两方面比较了SCE和BCE对分类模型优化的影响。

对于任何输入图像,设z表示预测logits,y表示独热标签。根据推导链式法则,BCE和SCE在logits上的损失梯度可推导为:

 其中,σsig和σ soft分别代表sigmoid和softmax函数。从理论上讲。为便于分析,我们考虑二元类(K = 2)的情形,其正类p负类q。Eq.(12)可进一步推导为:

 然后,我们考虑了zp和zq的不同情况,以比较正类p(1,3)和负类q(2,4)的梯度项的大小.A) zp \llzq:负类logit远大于正类logit。这种情况非常罕见,大多数是由于错误的标签。在这种情况下,||①||和||②||小于0.5,但是||③||和||④||趋近于1,SCE收敛更快,B) zp \gg zq。这在模型收敛时出现。4个梯度项都接近于0,不能区分。

正类别(positive class)和负类别(negative class)是指待分类的对象或样本所属的两个不同类别。这两个类别通常是模型需要区分和预测的目标类别。

  • 正类别(positive class):正类别是指模型需要识别或预测的目标类别,也可以称为“感兴趣类别”或“正例”。在二分类任务中,正类别通常表示某种特定的目标类别,例如“猫”、“狗”等。在多分类任务中,每个类别都有一个对应的正类别。

  • 负类别(negative class):负类别是指除了正类别之外的其他类别,通常表示不是目标类别的类别,也可以称为“非感兴趣类别”或“负例”。在二分类任务中,负类别通常表示与正类别相对的另一类别,例如在“猫狗分类”任务中,“狗”可能是负类别。在多分类任务中,除了正类别之外的所有类别都被视为负类别。

在训练和评估分类模型时,正类别和负类别的区分非常重要,因为模型的性能评估通常基于对这两个类别的预测准确性。通过对正类别和负类别进行有效的区分和预测,模型可以更好地完成分类任务并提高准确率。

梯度是损失函数对模型参数的偏导数,它表示了损失函数在参数空间中的变化率。梯度的大小代表了参数更新的速度和方向,即在当前参数值下,损失函数增加最快的方向。梯度项的大小可以反映以下几个方面的信息:

  1. 收敛速度:梯度的大小可以反映模型在当前参数值下的收敛速度。如果梯度的大小较大,说明当前参数值距离最优值较远,模型可能需要更大的步长来更新参数以减小损失函数。相反,如果梯度的大小较小,说明当前参数值已经比较接近最优值,模型可能只需要小的步长来微调参数。

  2. 模型的学习效率:梯度的大小也可以反映模型的学习效率。较大的梯度通常表示模型在当前参数值下对训练数据的拟合不够好,需要更大的调整来提高模型的性能。较小的梯度则表示模型已经在当前参数值下取得了较好的拟合效果。

  3. 参数更新的方向:梯度的方向是损失函数下降最快的方向,梯度的大小则表示在该方向上的下降速度。通过梯度的大小,可以确定参数更新的方向,以便更快地朝着损失函数的最小值移动。

总的来说,梯度项的大小是评估模型在当前参数值下的优化情况的重要指标,可以指导参数更新的步长和方向,帮助模型更快地收敛到最优解。

接下来,我们考虑最后一个也是最令人困惑的情况:c) zp≈zq。我们将其分为两个子案例: c1) zp和zq都很大,例如,大约在10左右(正如我们在MS COCO“5蹄”实验中观察到的那样)。我们可以发现,SCE 损失梯度的大小(||③||和||④||)都接近于 0.5,而 ||①|| ≈ 0 和 ||②|| ≈ 0.5。c2) 中,zp 和 zq 很小,例如,约为 -10。||③||和||④|| 保持不变(为 0.5),但 ||①||≈ 0.5 和 ||②||  ≈ 0。我们可以发现,在这两种混淆的情况下,SCE 损失产生的梯度既鼓励了对正类别的预测,也对负类别的预测进行了惩罚。原因是 softmax 函数中分母中的指数项明确涉及了两个类别。基于此,SCE 保证了类别排除学习——当遇到混淆时,同时提高正类别并抑制负类别。相比之下,在 BCE 中,每种情况都集中于正类别或负类别。它不保证在惩罚负类别时不减少正类别,或在鼓励正类别时不提升负类别,特别是对于混淆类别而言,这种学习效率低下。

Empirically. 

有人可能会认为,梯度的较大幅度可能不会直接导致更强的优化,因为常见的优化器(例如 Adam [18])使用自适应学习率。为了证明 SCE 在实践中的有效性,我们在运行真实模型时监控梯度。具体而言,我们回顾了“5 蹄类动物”玩具实验,其中模型使用 Adam 优化器进行训练。我们计算了两种独立模型产生的 BCE 和 SCE 损失相对于每个预测 logit 的梯度。如图 4 所示,我们分别显示了与目标类别(即唯一的正类别 p)和混淆类别(即具有最高 logit 值的负类别 q)的 logit 相关的梯度。我们可以看到,对于正类别和负类别,SCE 损失的梯度变化更为迅速,表明其模型学习更为积极和高效。

图4: 相对于目标类(即唯一的正类p)和混淆类(即logit值最高的负类q)的logit的梯度。BCE和SCE模型都使用MS COCO训练集中的5个有蹄动物类进行训练。这些梯度是在val集合上计算的。

在训练过程中,模型通过训练集学习参数,并通过验证集评估模型的性能和泛化能力。验证集的作用是用来调整模型的超参数、监控模型的训练过程以及评估模型在未见过的数据上的表现。

5. Experiments

5.1. Datasets and Settings

Datasets PASCAL VOC 2012[9]和MS COCO 2014[30]

VOC包含20个前景对象类和1个背景类。在训练集、val集和测试集中分别有1464、1449、1456个样本,根据相关研究 [1,23,45],我们使用了由 Hariharen 等人提供的包含 10,582 张训练图像的扩充训练集。MS COCO 数据集包含 80 个目标类别和 1 个背景类别。其训练集和验证集分别包含 80,000 张和 40,000 张样本。在这两个数据集上,我们仅在训练期间使用它们的图像级标签——这是 WSSS 中最具挑战性的设置。

Evaluation Metrics.

  • Mask Generation. 我们为训练集中的图像生成伪掩码,并使用它们对应的真值掩码来计算mIoU。
  •  Semantic Segmentation.我们训练分割模型,用它来预测val或测试集中图像的掩模,并根据它们的地面真值掩模计算mIoU。我们还在补充中提供了F1和像素精度的结果。
  1. F1分数(F1 score)是一个综合考虑了模型的精确度(Precision)和召回率(Recall)的指标。F1分数是精确度和召回率的调和平均值,可以用以下公式表示: F1=2×Precision+RecallPrecision×Recall​ 其中,精确度表示模型预测为正类别的样本中有多少是真正的正类别,召回率表示真正的正类别中有多少被模型成功预测为正类别。F1分数综合考虑了精确度和召回率,是一个常用的评估分类模型性能的指标。

  2. 像素精度(Pixel Accuracy)是用于评估图像分割模型性能的指标。在图像分割任务中,模型需要将每个像素分配给正确的类别。像素精度是指模型在所有像素中正确分类的像素数量占总像素数量的比例。像素精度是一个直观的评估指标,用于衡量模型在像素级别上的准确性。

 Network Architectures. 对于掩码生成,我们按照[1,23,45]使用ResNet-50作为主干,其生成的特征图大小为32 × 32 × 2048。对于语义分割,我们使用了ResNet-101(继[1,23,45])和Swin Transformer[31](首次在WSSS中使用)。两者都在ImageNet上进行了预训练[8]。我们将ResNet-101纳入DeepLabV2[5]和DeepLabV3+[6]中,由于篇幅限制,后者的结果在附录中。我们将Swin并入了UperNet[41]。

Implementation Details. 对于掩码生成,我们使用与[1]中相同的设置来训练FC Layer-1。我们通过以下方式训练FC layer-2:分别在VOC和MS COCO上设置λ为1和0:1;在两个数据集上运行4个epoch,初始学习率为5e−4,多项式学习率衰减。我们遵循IRN[1]来应用相同的数据增强和权重衰减策略。Eq.(10)和Eq.(11)中的所有超参数均遵循AdvCAM[23]和IRN[1]的原始论文。对于语义分割步骤中的DeepLabV2,我们使用与[1,21,23]相同的训练设置。详情请参阅附件。对于UperNet,首先将输入图像均匀地调整为2;048 ×512,比例范围从0:5到2:0,然后随机裁剪为512×512,然后输入模型。数据增强包括水平翻转和颜色抖动。我们在VOC和MS COCO数据集上分别训练了40k和80k次迭代的模型,批次大小为16。我们采用AdamW[32]求解器,初始学习率为6e−5,权重衰减为0.01。根据多项式衰减计划,学习率以1.0的幂次衰减。

5.2. Results and Analyses

SCE on FC Layer-1 (FC1) or Layer-2 (FC2).有人可能会争辩说,SCE没有必要应用于额外的分类器FC2。我们在FC1(即w/o FC2)上进行了SCE的实验,结果显示在表1的上半部分。

  1. “Lbce only”是将仅使用二元交叉熵(BCE)损失函数作为FC1层的基准线。这意味着模型在训练过程中只使用BCE损失函数来优化FC1层的参数。

  2. “Lsce only”是将仅使用Soft Cross Entropy(SCE)损失函数作为FC1层的训练方式。在这种设置下,原始的多热编码标签被修改为归一化的形式,使得每个标签的总和为1。这种设置的目的是尝试使用SCE损失函数来训练模型,以比较其在模型性能上的影响。

  3. “Lsce for single only”是将在多标签图像上应用BCE损失函数,在单标签图像(即包含一个对象类别的子集)上应用SCE损失函数。这种设置的目的是尝试结合两种损失函数来处理不同类型的图像,以探索是否可以提高模型的性能。

“Lsce only”表现最差的原因是因为SCE损失函数在多标签分类任务中并不适用,因为不同类别的概率并不是独立的。而“Lsce for single only”结合了两种损失函数来处理不同类型的图像,增加了方法的复杂性,并且在实践中并没有取得太大的收益,特别是在MS COCO数据集中,其中单标签图像数量较少,是一个更一般的分割场景。因此,根据实验结果,选择合适的损失函数对于模型的性能和训练效果至关重要。

表1: 上面的块显示了训练具有不同损失函数的传统多标签分类模型的mIoU结果(%):BCE, SCE及其混合(单标签图像的SCE和多标签图像的BCE)。下面的块显示了使用不同权重提取ReCAM的结果:FC Layer-1或FC Layer-2或它们的混合变体(元素加法或乘法)的权重。“rp。表示我们用来报告最终结果的选项(包括掩码细化和语义分割)。请注意使用其他选项的结果(例如,用于VOC的w’)在补充中。

Using the Weights of FC1 and FC2 in Eq.(9). 由于我们有两个FC层,我们的w''实现有几个选择:1) w, 2) w', 3)w⊕w',或4)w⊗w',其中⊕和⊗分别是元素的加法和乘法。我们在表1的下块中显示了结果。我们可以看到,所有选项的结果都比基线要好(即,“仅限Lbce”,没有FC2)。具有w⊗w'的ReCAM在VOC上的性能最好。原因是元素乘法增强了代表性的特征映射,抑制了混淆的特征映射。有趣的是,在MS COCO上,加入w的ream比w⊗w'的性能更好。这可能是因为输入到FC2的特征fk(x)在这个困难的数据集中很差,而FC2没有得到很好的训练。基于这些结果,我们用w⊗w'来进行所有关于VOC的实验,用w来进行MS COCO的实验。

ReCAM的局限性在于它的FC2可能会过度拟合不良骨干提取的噪声特征。我们希望在未来通过利用强大的预训练方法来升级骨干来解决这个问题

值得强调的是,如果将第二个数据块中的任何一行与表1中的第一行进行比较,ReCAM 的有效性在两个数据集上都得到了验证——使用 ReCAM 的任何选项都比基线生成了更好的掩码。

Effects of Different λ Values. 方程(8)中的 λ 控制了 BCE 和 SCE 之间的平衡。我们通过在 VOC 上变换 λ 的值来研究 ReCAM 的伪掩码质量(mIoU),如图 6 (a) 所示。我们可以观察到,λ 的最佳值是 1,但在使用其他值时差异不明显,即 ReCAM 对 λ 不敏感。

图6: (a) ReCAM对Eq.(8)中λ值对VOC的敏感性。(b)将表2前两行的mIoU结果分解为单标签图像(“Single”)和多标签图像(“Multi”)的结果。

表2:在VOC和MS COCO数据集上比较ReCAM与基线的伪掩码mIoU(%)和消耗时间。“时间”是指从训练模型(使用ImageNet预训练主干)到生成所有训练图像的0-1掩模的总计算时间。VOC的单位时间(ut)为0.7小时[9],MS COCO的单位时间为5.4小时[30]。*表示结果来自我们的重新实现(原始论文中没有MS COCO结果)。下划线突出我们最好的结果。

Generality of ReCAM.我们将 ReCAM 作为种子,通过以下方式评估其通用性:1)将其与vanilla CAM 进行比较——这是最常用的种子生成方法;2)在其之后应用不同的改进方法。从表 2 和表 3 的结果中,我们可以发现 ReCAM 在 VOC 和 MS COCO 上均显示出与 CAM 一致的优势。具体来说,在表 2 的第一行中,ReCAM 自身在 VOC 上的表现优于 CAM 6%。当使用 ReCAM 作为伪掩码来学习语义分割模型时,这一差距几乎保持不变,如表 3 的第一行所示。值得一提的是,在更强大的分割模型 UperNet-Swin 上,这一差距更大,例如,在 VOC 验证集上与使用 DeepLabV2 相比,差距为 6.1% 和 4.7%。

 表3:在两个基准上使用不同分割模型的WSSS的mIoU结果(%)。种子掩码由CAM或ReCAM生成,掩码细化方法是行标题。我们在补充资料中提供了DeepLabV3+的结果。

对于改进ReCAM,我们有两个观察结果:1)计算成本显着增加(表2),在使用ResNet-50上,通过使用IRN(Image Refinement Network)和AdvCAM(Adversarial CAM)相比于基准的ReCAM(Reactivated CAM),在性能上分别提高了大约4.5倍和160倍。这表明IRN和AdvCAM对于改进模型性能起到了显著的作用。2)从表格3中可以看出,在WSSS(Weakly Supervised Semantic Segmentation)任务中,总是在使用IRN时获得了最佳性能。这可以通过表格中下划线标记的数字来观察到,这些数字表示在不同条件下获得的最佳性能结果。

图6 (b)显示,ReCAM对单标签和多标签图像都能生成更好的掩码。当加入IRN时,ReCAM的改进得以保持。图5显示了4个例子,其中ReCAM减轻了我们在第1节中提到的两个缺陷:假阴性像素和假阳性像素。图5中最右边的块显示了一个失败的情况:CAM和ReCAM都无法捕获与周围遮挡或相似颜色的物体部分,例如“狗”和“人手”之间。

图5:在VOC数据集上使用CAM和ReCAM生成的0-1掩码的可视化(在训练分割模型之前)。剩下的两个块(每个块有四列)分别表示第1节中介绍的两个缺陷:假阴性像素和假阳性像素。红色虚线框突出了ReCAM改进的区域。最后一个块显示了一个失败案例的示例。

ReCAM的优越性。我们也可以将ReCAM作为一种细化方法,并与IRN、AdvCAM等相关方法进行比较。在表2中,与AdvCAM(55:6%)相比,ReCAM在VOC上达到了54:8%的类似结果,但它比AdvCAM (1:9 ut vs . 316:3 ut)效率高160倍。此外,通过级联IRN, ReCAM比AdvCAM高出1% (70:9% vs . 69:9%)。ReCAM效率更高(只有8:2)。此外,从表4中我们可以看到,ReCAM在不同的CAM变体中支持即插即用,包括基于显著性的方法。

表4:在使用或不使用显著性检测模型时,使用DeepLabV2对VOC的mIoU结果(%)。在左边,如果他们在论文中报告了这种组合,则方法是IRN(默认)。在右侧,我们分别将ReCAM插入EPS* (-E*)和EDAM* (-M*)中,或者等效地将它们的显著性编码模块分别添加到我们的框架中,其中*表示DeepLabV2在MS COCO上进行预训练。 

显著性检测是计算机视觉领域的一个重要任务,旨在识别图像中最引人注目的区域或目标。显著性检测模型可以帮助模型更好地理解图像内容,从而在语义分割任务中提高性能。

EPS和EDAM是两种显著性检测模型或方法。在这里,EPS和EDAM表示将这些显著性检测模型整合到DeepLabV2框架中的变种。通过将ReCAM整合到EPS和EDAM中,可以进一步提高语义分割模型的性能。

 6. Conclusions

我们从传统CAM的两个常见缺陷开始。指出问题的关键在于BCE损耗的广泛应用,并从理论上和经验上论证了SCE损耗的优越性。我们提出了一种简单而有效的方法——ReCAM,通过将SCE插入到基于bce的模型中来重新激活模型。我们通过在两个流行的WSSS基准上进行广泛的实验和各种案例研究,展示了它的通用性和优越性。

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

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

相关文章

Java | 时间日期API

大家好,我是程序员影子 一名致力于帮助更多朋友快速入门编程的程序猿 今天来聊一聊关于Java 中的时间日期API 一、使用LocalDate和LocalTime Java 8 引入了java.time包,其中LocalDate和LocalTime类用于处理日期和时间。 import java.time.LocalDate…

Linux课程____进程管理

记录工作日志 script 240319.log CTRLd 退出 cat 240319.log //查看 一、查看进程 1.静态 ps -aux ps -elf 2.动态 top 3.pgrep 查看特定条件的进程 pgrep -l “log” pgrep -l "ssh" pgrep -l -U redhat 4.pstree 查看进程树 pstree -aup 所有…

【Linux更新驱动、cuda和cuda toolkit】

目录 1. 更新显卡驱动1.1. 查看当前显卡驱动版本1.2. 删除原始显卡驱动1.3. 删除CUDA Toolkit1.4. 在NVIDIA官网找到2080Ti对应的最新驱动程序 2. 更新CUDA Toolkit2.1. 下载CUDA Toolkit2.2. 安装.run2.3. 添加环境变量2.4. 检查是否安装好了 最近需要更新服务器的显卡驱动和C…

10 Internet基本服务(3)

1.SMTP 邮件传递过程3 阶段 (1)连接建立阶段 在这一阶段,SMTP 客户机请求与服务器的25 端口建立一个TCP 连接。一旦连接建立,SMTP 服务器和客户机就幵始相互通拫自己的域名,同时确认对方的域名;&a…

目标检测——PP-YOLOv2算法解读

PP-YOLO系列,均是基于百度自研PaddlePaddle深度学习框架发布的算法,2020年基于YOLOv3改进发布PP-YOLO,2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet,2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列,所以放一起解…

Fork - 将 GitHub 的某个特定仓库复制到自己的账户下

Fork - 将 GitHub 的某个特定仓库复制到自己的账户下 1. ForeverStrongCheng/OpenCV-tutorials2. Fork -> ForeverStrongCheng/R2CNN_Faster-RCNN_TensorflowReferences 访问仓库页面,点击 Fork 按钮创建自己的仓库。 Fork 是将 GitHub 的某个特定仓库复制到自己…

BetterDisplay Pro for Mac(显示器校准软件) v2.0.11激活版

BetterDisplay Pro是一款由waydabber开发的Mac平台上的显示器校准软件,可以帮助用户调整显示器的颜色和亮度,以获得更加真实、清晰和舒适的视觉体验。 软件下载:BetterDisplay Pro for Mac v2.0.11激活版 以下是BetterDisplay Pro的主要特点&…

【No.8】蓝桥杯工具函数模板|迭代器|vector|queue|map|set|银行问题|费里的语言|快递分拣(C++)

迭代器讲解线性表的使用队列的使用集合(set)的使用映射(map)的使用 迭代器(Iterator) 迭代器是 C 的知识,但是下面讲容器就要用到这一点,所以我们必须要提前讲一下。迭代器的知识点…

ideaSSM 工程车辆人员管理系统bootstrap开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 idea 开发 SSM 工程车辆人员管理系统是一套完善的信息管理系统,结合SSM框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具 有完整的源代码和数据库&…

uniapp 云开发省钱之调整函数执行内存大小

我这个5块钱一个月的服务空间配置: 现在还只有少量的用户和自己测试之用,目前消耗的情况: 云函数的使用量还是挺高的,目前还是正好能覆盖一个月的使用量,等用户量上来肯定是不行的,所以得想想办法压榨一下云…

玩转C语言——深入理解指针

一、指针概念 1.1 内存和地址 在开始学习指针前,我们先来讲一个例子,假如你身处一栋楼中,你点了一份外卖,那么,外卖员如何能找到你?有两种方法。法一:直接一间一间找,这样做不仅消耗…

【Auth Proxy】为你的 Web 服务上把锁

Auth Proxy 一个极简的用于 Web 服务鉴权的反向代理服务 极其简约的 UI对你的真实服务无任何侵入性支持容器部署,Docker Image 优化到不能再小(不到 9MB)GitHub:https://github.com/wengchaoxi/auth-proxy 效果 我在 http://lo…

幻兽帕鲁游戏搭建(docker)

系列文章目录 第一章: 幻兽帕陆游戏搭建 文章目录 系列文章目录前言一、镜像安装1.创建游戏目录2.拉取镜像3.下载配置文件4.启动游戏 二、自定义配置总结 前言 这段时间一直在写论文还有找工作,也没学啥新技术,所以博客也很长时间没写了&am…

【YOLOv5改进系列(2)】高效涨点----Wise-IoU详细解读及使用Wise-IoU(WIOU)替换CIOU

WIOU损失函数替换 🚀🚀🚀前言一、1️⃣ Wise-IoU解读---基于动态非单调聚焦机制的边界框损失1.1 🎓 介绍1.2 ✨WIOU解决的问题1.3 ⭐️论文实验结果1.4 🎯论文方法1.4.1☀️Wise-IoU v11.4.2☀️Wise-IoU v21.4.3☀️…

原子操作好多问

一. 何谓"原子操作": 原子操作是指在执行过程中不会被中断或干扰的操作,是不可分割的操作单元,要么全部执行成功,要么全部不执行。 二. 为什么关注原子操作: 关注原子操作是为了确保多线程并发访问共享资源时的数据一致性&#xf…

算法笔记p335堆

目录 堆定义堆建堆(以大顶堆为例)删除堆顶元素插入元素 堆排序排序思路代码实现 堆 堆是一颗完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子结点的值。 大顶堆:父亲结点的值大于或等于孩子结点…

jmeter之并发和顺序执行与特殊线程组-第四天

1.jmeter的并发执行 并发执行:多个线程同时执行,不能确定谁先结束 以上案例中http请求里面没有写任何内容,只是为了看这个并发执行的效果 2.jmeter的顺序执行 顺序执行:多个线程顺序执行 再测试计划中勾选“独立运行每个线程组…

VBA之Word应用:利用Bookmark属性返回选择区域的开始和结束位置

《VBA之Word应用》(版权10178982),是我推出第八套教程,教程是专门讲解VBA在Word中的应用,围绕“面向对象编程”讲解,首先让大家认识Word中VBA的对象,以及对象的属性、方法,然后通过实…

什么是子网掩码、ip地址的网段?如何区分?

IP地址优化网写了很多相关的文章。 有些朋友对于子网掩码、IP地址网段等还不太了解,我们来看看网友经常问到的一些相关问题。 255.255.255.192 的位掩码是什么? 1.什么是子网掩码? 在了解IP地址的网段之前,我们先来了解一下子网…

在sql server 2016 always on集群里新增一个数据库节点

本篇博客有对应的word版本,有需要的可以点击这里下载。 一 环境介绍 二 操作步骤 2.1 在新节点上安装sql server软件 略 2.2 在新节点上开启‘故障转移群集功能’ 打开‘服务管理器’: 点击‘添加角色和功能’: 勾选’DNS服务器’&#…