【论文精选】TPAMI2020 - PFENet_先验引导的特征富集网络_小样本语义分割

news2024/11/24 13:02:09

【论文精选】TPAMI2020 - PFENet_先验引导的特征富集网络_小样本语义分割

精选精析:

【论文原文】: Prior Guided Feature Enrichment Network for Few-Shot Segmentation (当前引用次数:184)

【论文代码】: https://github.com/Jia-Research-Lab/PFENet/ (当前Star:231)

获取地址:https://ieeexplore.ieee.org/abstract/document/9154595
CSDN下载:https://download.csdn.net/download/qq_36396104/87381592

博主关键词: 小样本学习,语义分割, 先验引导,特征富集

推荐相关论文:

【论文速递】TPAMI2022 - 小样本分割的整体原型激活
- https://phoenixash.blog.csdn.net/article/details/128664715
- 关联创新点:一种无需训练的派生基类先验表示的方案

【作者信息】: Zhuotao Tian, Student Member, IEEE, Hengshuang Zhao, Member, IEEE, Michelle Shu, Student

Member, IEEE, Zhicheng Yang, Member, IEEE, Ruiyu Li, Member, IEEE, Jiaya Jia, Fellow, IEEE

【作者单位】:

• Z. Tian (tianzhuotao@link.cuhk.edu.hk), H. Zhao and J. Jia are with
the Department of Computer Science and Engineering, The Chinese
University of Hong Kong. 
• M. Shu is with Johns Hopkins University.
• Z. Yang and R. Li are with SmartMore.
• Corresponding Author: H. Zhao.

摘要精析:

由于训练类的高级语义信息使用不当,查询目标与支持目标的空间不一致,目前的小样本分割框架仍然面临着对未见类的泛化能力降低的挑战。为了缓解这些问题,PFENet提出了先验引导特征富集网络(PFENet)。它包括:(1)一种无需训练的先验掩码生成方法,不仅保留了泛化能力,还提高了模型性能;(2)特征富集模块(FEM),通过自适应地用支持特征和先验掩码丰富查询特征来克服空间不一致性。 在PASCAL-5i和COCO上的大量实验证明,所提出的先验生成方法和FEM方法都显著改进了基线方法。PFENet在没有效率损失的基础上,性能超出最先进的方法很多。而且,PFENet模型甚至可以推广到无支持样本的情况。代码可以在https://github.com/Jia-Research-Lab/PFENet/上找到。

关键词 -小样本分割,小样本学习,语义分割,场景理解。

简介精析:

如果没有足够的完全标注的数据,或者在处理没有见过的类别时,已有深度学习框架的性能会迅速恶化。即使提供了额外的数据,模型调优仍然需要消耗大量的时间和资源。为了解决这个问题,需要设计模型快速适应新的类别,由此提出了小样本语义分割[33],并将模型输入数据分为support(支持)集和query(查询)集。如图1所示,首先将support集和query集的图像发送到骨干网提取特征。可以通过为分类器生成权重[33],[41],余弦相似度计算[5],[45],[23],或卷积[15],[54],[49],[9],[1]来处理得到的特征并生成最终的预测。

在这里插入图片描述

Fig. 1. 小样本分割框架总结。被用于提取support和query特征的骨干网络可以用一个共享网络或两个孪生神经网络

论文中指出现有的小样本分割方法普遍存在的两个问题:

1.由于滥用高层特征而导致的泛化性能损失

常规语义分割模型在很大程度上依赖于具有语义信息的高级特征。CANet[54]的实验表明,在小样本模型的特征处理过程中,简单地添加高级特征会导致性能下降。在few-shot设置中利用语义信息的方法并不简单。

PFENet使用ImageNet[32]预训练的query和support图像的高层特征来为模型生成“先验”。这些先验值有助于模型更好地识别query图像中的目标。由于之前的先验的过程无需训练,因此尽管在训练过程中经常使用已见类别的高层语义信息,但所得到的模型并没有失去对未见类别的泛化能力。

2.query和support样本之间的空间不一致性

由于样本有限,每个support目标对象的规模和姿态可能与其对应query目标对象有很大差异,我们称之为空间不一致性

PFENet提出了一种新的特征富集模块(Feature Enrichment module, FEM)来自适应地充实query特征。论文中的消融研究表明,仅仅结合多尺度来解决空间不一致性是次优的,FEM提供了有条件的特征选择,有助于保留跨越不同尺度传递的重要信息。实验证明FEM的性能优于HRNet[44]、PPM[60]、ASPP[4]和GAU[53]等多尺度结构。

基于ResNet-50的PFENet仅包含10.8 M可学习参数,在PASCAL-5i[33]和COCO[21]基准测试中,分别以15.9和5.1 FPS(1-shot和5-shot设置)获得了SOTA结果。此外,论文中还将模型应用于没有标记数据可用的 zero-shot场景来证明有效性。

PFENet模型精析:

在这里插入图片描述

Fig. 2. PFENet与先验生成和特征富集模块概述。用H和M标记的白色块分别代表从骨干提取的高级和中级语义特征。

先验生成模块:

重要动机说明:

作者首先说明他们在先验生成模块中采用高层语义特征的动机:CANet[54]中解释了中间层语义特征的性能更好,因为它构成了未见类共享的目标块,高层语义特征(例如ResNet-50的conv5_x)会导致性能降低。但PFENet的另一种解释是,高层语义特征中包含的语义信息比中层特征更具有类特异性,这表明中间层语义特征更容易对模型对未见类的泛化能力产生负面影响。此外,高层语义特征直接提供训练类C_{train}的语义信息,比中层信息更有助于识别属于C_{train}的像素,减少训练损失。 因此,使用中间层语义特征导致了对C_train的偏好。缺乏泛化性和对用于训练的类别的偏好都不利于对未见测试类的评估。

先验掩膜生成方法:

PFENet试图将ImageNet[32]预训练模型中提取的support高级语义特征和support mask转换为一个先验掩码,该掩码能够表示query特征图上每一个像素属于目标类的概率。 训练时,骨干网络参数固定为PANet[45],CANet[54]中的参数。因此,先验生成过程不偏向训练类C_{train},并在对未见的测试类C_{test}进行评估时保持类不敏感。I_Q, I_S表示输入query和support图像,M_S表示二进制支持掩码,F表示骨干网,X_Q, X_S表示高级query和support特征,然后在公式(1)中,support高层语义特征X_S矩阵乘二进制的support mask进行背景去除:

在这里插入图片描述

矩阵乘采用的是哈达玛积(Hadamard product)对形状相同的矩阵进行运算,并产生相同维度的第三个矩阵。骨干网F的输出用ReLU函数处理。

作者定义先验特征图为Y_Q,先验Y_Q可以量化X_Q和X_S之间像素级的对应关系。一个像素在Y_Q上的值高,意味着该像素与support特征中的至少一个像素具有高度的对应相似关系。作者还通过将support特征上的背景像素位置用support掩膜设置为零,使得query特征的像素与support特征上的背景没有对应关系,它们只与前景目标区域相关。

先验掩膜计算公式:

PFENet计算support和query特征之间像素级的余弦相似度来生成先验掩膜Y_Q:

在这里插入图片描述

在这里插入图片描述

其中x_q和x_s分别是query和suppot特征上对应像素位置的特征向量,即计算query特征上每个像素位置和support特征上所有像素位置的向量的余弦相似度,然后保留最大的那个作为Y_Q的特征值c_q。

在这里插入图片描述

然后接一个min-max归一化处理YQ,将值归一化到0到1之间。epsilon设置为 1e 7防止除0。

特征富集模块:

在这里插入图片描述

Fig. 4. FEM的可视化说明(虚线框部分)与四个尺度的自上而下的流程。C,1x1和圈出的M分别代表特征拼接、1×1卷积和跨尺度合并模块。激活函数是ReLU。

重要动机说明:

作者同样说明了从support图像上进行全局池化提取类别向量会导致空间信息不一致,因为query图像上目标的面积可能比support样本大得多或小得多,使用全局池化support特征直接匹配query特征的每个像素不够理想。目前的替代方案是添加PPM[60]或ASPP[4],以向特征提供多层次的空间信息。但这两个模块的不足之处在于:1)它们只提供被合并特征的空间信息,没有在每个尺度内进行细化;2)忽略了不同尺度间的层次关系。为了缓解这些问题,作者提出了特征富集模块(FEM)对多尺度结构进行了分解: 1)在每个尺度上,将query特征与support特征和先验掩码横向交互;2)垂直利用层次关系,通过自顶向下的信息路径,将从精细特征中提取的基本信息丰富粗略的特征图。通过横向和纵向优化,收集投影到不同尺度的特征,形成新的query特征。

特征富集方法:

如图4所示,特征富集模块(FEM)将query特征、先验掩码和扩张到对应尺度后的support特征作为输入,输出带有来自support特征的丰富信息的精炼后的query特征。

步骤1 - Inter-Source Enrichment:

将输入投影到不同的尺度上,然后在每个尺度上query特征分别与support特征和先验掩码进行交互。

在这里插入图片描述

这个简单,如图4,就是将之前提取的特征变换尺度后(C)串联叠加到一起。i ∈ {1, 2, …, n}代表n个不同的尺度。紧接着用1×1卷积,产生c = 256个输出通道的合并后的特征。

步骤2 - Inter-Scale Interaction:

跨尺度的交互,在不同尺度合并的query和support特征之间选择性地传递重要信息。

作者注意到在向下采样的特征图中可能不存在极小的对象。因此采用自适应的自顶向下过程将信息从较细的特征传递到较粗的特征,有利于在特征富集模块中建立层次关系。不仅要在每个尺度上进行query和support特征之间的交互(水平),还要在不同尺度上的合并特征之间进行交互(垂直),从而有利于整体性能。

图4中圈出的M表示跨尺度合并模块M,该模块通过选择性地将上一层的辅助特征X{Aux}中有用的信息传递给该层主特征X{Main},在不同尺度之间进行交互,从而生成细化的特征。

在这里插入图片描述

在这里插入图片描述

Fig. 5. 跨尺度合并模块M。C是拼接操作,+是像素级特征相加。α表示1×1卷积,β表示两个3×3卷积。激活函数是ReLU。对于不具有辅助特征的主特征,不与辅助特征进行拼接,仅由具有α和β的主特征产生细化特征。

如图5所示说明了提出的跨尺度合并模块M。首先将从其他尺度下获取的辅助特征调整为与主特征相同的空间大小。然后使用1×1卷积α从主特征和辅助特征拼接后的特征中提取有用的信息,然后与主特征进行一次像素级相加操作。后续使用两个3×3卷积,命名为β完成交互,然后再次和主特征进行一次像素级相加操作,输出细化后的特征。对于那些没有辅助特征的特征(例如,自顶向下路径上的第一个合并特征和自底向上路径上的最后一个合并特征),则简单地忽略了与辅助特征的拼接——细化后的特征只由主特征产生。

步骤3 - Information Concentration:

将不同尺度的特征采样到同样大小后进行拼接,使用一个1×1卷积最终产生细化的query特征。

在这里插入图片描述

在这里插入图片描述

在FEM的输出特征上,PFENet应用一个卷积块(图7(a))和一个分类头来产生最终的预测。分类头由一个带有Softmax函数的3×3卷积和1×1卷积组成,如图7(b)所示。

此外作者还在训练过程中添加了辅助损失操作。对 Inter-Scale Interaction操作后获得的Merged特征添加一个分类头如图7(b)所示,获得每个尺度下输出的预测图,并和query的图像标签计算的交叉熵进行累加操作,平均后得到最终的辅助损失。对应代码如下:

for idx_k in range(len(out_list)):    
	inner_out = out_list[idx_k]
	inner_out = F.interpolate(inner_out, size=(h, w), mode='bilinear',align_corners=True)
	aux_loss = aux_loss + self.criterion(inner_out, y.long())   
aux_loss = aux_loss / len(out_list)

损失函数:

在这里插入图片描述

PFENet中采用交叉熵损失计算所有的损失函数。Merge后的特征的预测结果产生多个中间辅助监督损失L1,PFENet的最终预测产生了第二个损失L2。总损失L为L1^i和L2的加权和。其中σ用于平衡中间监督的效果。在所有实验中作者经验性地将σ设为1.0。

其他设置说明:

对于所有骨干网络,PFENet将conv3_x和conv4_x的最后一层输出作为中层特征M,串联生成query和support特征,将conv5_x的最后一层输出作为高层特征H,生成先验掩码。在5-shot设置中,PFENet仅简单地将5个池化后的support特征的平均值作为与查询特征关联之前的新support特征。同样,FEM中拼接前的最终先验掩码也是一个由不同support特征和query特征产生的5个先验掩码的平均值得到的。

实验精析:

数据集:

使用PASCAL-5i[33]和COCO[21]的数据集进行评估。

PASCAL-5i由PASCAL VOC 2012[6]和来自SDS[12]数据集的扩展注释组成。20个类平均分为4个folds,i∈{0,1,2,3},每个fold包含5个类。参考OSLSM[33],PFENet在每次测试中随机抽取1000个query-support对

COCO包含80个类别。参考[28],PFENet通过从80个类中拆分4个folds,每个fold包含20个类,来进行模型评估。作者考虑到COCO验证集包含40,137张图像(80个类),比PASCAL- 5 i中的图像多得多。因此,作者认为使用的1000个随机抽样的query-support对不足以在20个测试类上产生可靠的测试结果。因此,PFENet在COCO数据集每个fold的评估过程中随机采样20,000个query-support对,使得结果比在以前的工作中使用的1,000个query-support对测试更稳定。

当在一个fold上测试模型时,PFENet使用其他三个fold来训练模型进行交叉验证。取不同随机种子的5个测试结果的平均值进行比较。

实验设置:

PFENet中骨干网络采用VGG-16, ResNet-50和ResNet-101,其中VGG是原始版本,ResNet是之前工作[28],[54],[15]中使用的扩展版本。在训练过程中训练样本被随机裁剪为473 × 473的patch。因为[54]中说过mIoU比FB-IoU更合理,PFENet选择mIoU作为主要评估参数。

特征富集模块(FEM)消融实验:

PFENet首先对所提出的特征富集模块(FEM)比较了不同的尺度间交互策略。并与HRNet[44]、ASPP[4]和PPM[60]的其他特征富集设计进行了比较,还比较了最近sota的小样本分割方法PGNet[53]中使用的图注意力单元(GAU)。

尺度间四种交互方式比较:

自上而下(TD)、自下而上(BU)、自上而下+自下而上(TD+BU)和自下而上+自上而下(BU+TD)。在表4中的实验结果表明,TD和TD+BU比BU和BU+TD更能帮助FEM获得比没有(W/O)信息富集的情况下更好的结果。TD+BU模型包含的可学习参数(16.0M)比TD (10.8M)更多,但性能相当。

在这里插入图片描述

不同于一般的语义分割,上下文信息是取得良好性能的关键,在小样本分割中查询信息的表示和获取方式尤为重要。这些实验证明,使用更细的特征(辅助)为粗特征(主)提供额外的信息比使用粗特征(辅助)细化更细的特征(主)更有效,没有目标信息的下采样粗查询特征对提高最终预测质量的帮助较小。因为如果目标对象小规模消失,粗特征不足以在后期信息聚合阶段对query类别进行定位。设计的FEM在不同尺度上匹配query和support特征,以解决query和support样本之间的空间不一致问题。

其他尺度特征富集模块的比较:

PFENet尝试比较了PPM[60],ASPP[4],HRNet,图形注意单元(GAU)几个流行的特征富集模块。通过实验证明提出的FEM模块产生了更好的小样本分割性能,而没有垂直自顶向下信息传递(用WO标记)的模型产生的结果更差。

在这里插入图片描述

ASPP:ASPP的扩张率设置为{1, 6, 12, 18}并得到了接近PPM的结果。得出结论:小样本分割[53],扩张卷积的效果不如自适应平均池化。

PPM:PSPNet[60]的实验表明,空间大小为{6,3,2,1}的金字塔池化模块(PPM)具有最佳的性能。当小空间尺寸应用于FEM时,它仍然优于PPM。但是小的空间尺寸在FEM中并不是最优的,因为集合为{6,3,2,1}这样的空间尺寸的特征对于查询和支持特征的交互和融合来说太粗糙了。类似地,空间大小为{60,30,15,8,4}的模型比使用{60,30,15,8}的FEM产生更差的性能。因此,PFENet选择{60,30,15,8}作为FEM源间丰富的特征尺度。

GAU:图注意力单元GAU (Graph Attention Unit) [53]利用图注意力机制在每个尺度上建立query和support特征之间的元素到元素的对应关系。support特征像素由GAU进行加权,新的support特征是原始support特征的加权和。作者直接将FEM替换为GAU,并保留其他设置。GAU实验结果没有放入表5中,在1-shot和5-shot评估中GAU分别达到mIoU 55.4和56.1。此外还使用FEM中的尺度{60,30,15,8}(记为GAU+)来评估mIoU(1-shot 54.9,5-shot 55.4)。虽然GAU也通过自适应池化形成了金字塔结构来捕获多层次语义信息,但它忽略了自适应地提供从其他尺度提取的信息以帮助改进合并的特征的层次尺度间关系。
在这里插入图片描述

HRNet的深度比较与分析: HRNet通过在所有网络中保持一个高分辨率特征,并逐步融合多尺度特征来丰富高分辨率特征。作者认为所提出的FEM可以看作是HRB的一种变体,类似于HRB中的多分辨率并行卷积,如图9所示。但FEM的尺度间交互作用将条件信息从大尺度传递到小尺度,而不是HRB中没有选择的所有尺度之间的密集交互作用。

在这里插入图片描述

为了进行比较,作者在HRB中生成与FEM中相同比例尺的特征图({60,30,15,8})。结果如表6所示。直接将HRB应用到基线(Baseline+ HRB)比PPM和ASPP产生更好的结果。没有选择的密集传递信息会导致目标特征的冗余,并产生次优结果。作者的解决方案是,在HRB的多分辨率融合阶段,应用所提出的跨尺度合并模块M从辅助特征中提取必要信息,如图10所示。条件特征选择模型(HRB-Cond)具有更好的性能。当只允许自顶向下的传递特征(记为HRB- td),HRB- td比HRB获得了更好的性能,因此作者也将其应用在了HRB-Cond得到HRB-TD-Cond

在这里插入图片描述

先验掩膜生成的消融实验:

作者说明了先前的掩膜生成方法的两个缺点:1,掩膜生成过程包含可训练的元素,因此生成的掩膜会在训练过程中偏向于训练中使用的类。2,对支持特征进行掩膜平均池化导致判别能力的损失,在池化操作中,支持特征中最相关的信息可能会被不相关的信息淹没。在PFENet的设计中,作者选择了固定的高级特征进行先验掩膜的生成,因为它可以在不牺牲泛化能力的情况下为准确的分割提供足够的语义信息。先验掩膜可以在评估过程中为已见和未见数据提供来自高级特征的无偏差先验信息,而由可学习特征映射(例如[45],[58],[28])产生的掩膜会在训练过程中受到参数学习的影响产生不可避免的偏好。

在这里插入图片描述

表7显示,由可学习的或固定的中间层特征(Prior_{LM}或Prior_{FM})生成的掩膜比提出的Prior_{FH}带来的提升得要少,因为中层特征在揭示查询和支持特征之间的语义对应方面效果较差。为了验证设计的有效性,在表7中作者训练了另外两个模型:一个具有通过平均相似度生成的先验掩膜(Prior-A_{FH}),另一个具有通过mask池化的支持特征获得的先验掩码(Prior-P_{FH})。

作者在实验中也指出,提出的先验生成方法从大小为hw × hw的相似矩阵中取最大值来生成大小为h × w的先验掩膜(Eq.(3)),与prior - p从大小为hw × 1的相似矩阵中生成掩膜相比,计算复杂度远远小于网络的其余部分,速度差异很小。基于VGG-16基线的PriorFH、Prior-AFH、PriorPFH和Prior-FWFH的FPS值都在23.1 FPS左右。输出特征为2048通道的基于ResNet-50基线的PriorFH、Prior-AFH、PriorPFH和Prior-FWFH的FPS值分别为16.5、16.5、17.4和17.0。

在这里插入图片描述

作者还在图11可视化了生成的先验掩膜。由可学习的高级特征映射(L-H)生成的未见类的掩膜不能清楚地揭示潜在的感兴趣区域,而使用固定的高级特征映射(F-H)则保持了目标区域的总体完整性。与高级特征相比,中级特征(L-M和F-M)产生的先验掩膜更偏向于背景区域。

在这里插入图片描述

此外作者还对样本进行了可视化嵌入进行深入分析,如图12所示。其中1000个基类样本(灰色)和1000个新类样本(绿色、红色、紫色、蓝色和橙色),然后进行t分布-随机邻近嵌入(t-SNE[42])。可以看到,图12(a)和©中的中层特征的辨别能力低于图12(b)和(d)中的高级特征。其次,(a)和(b)中的可学习特征失去了辨别能力,因为新类的嵌入偏向于基类的嵌入,这不利于对未见类的泛化。

在这里插入图片描述

作者认为ImageNet[32]中包含了PASCAL-5 i和COCO的许多对象,用于骨干预训练,可能会出现见过测试类的情况,影响模型性能。为了进一步证明PFENet对完全看不见的物体的泛化能力,作者在最近提出的FSS-1000[19]数据集上进行了实验。FSS-1000由1000个类组成,其中486个类不包含在任何其他现有数据集中[19]。作者使用ResNet-50骨干在已见类上训练模型100个epoch,批大小为16,初始学习率为0.01,然后在未见类上进行测试。用于测试的抽样查询支持对的数量等于未见样本数量的5倍。如表8所示,在1-shot和5shot评估中,带有先验掩码的基线分别达到80.8和81.4前景IoU,在两种设置中都比普通基线(79.7和80.1)的前景IoU高出1.0个点以上。

Zero-Shot分割:

Zero-shot学习的目的是学习一个即使在没有给定标注数据的情况下也健壮的模型。这是小样本学习的一个极端例子。为了进一步证明提出的PFENet在极端情况下的鲁棒性,作者用类标签嵌入替换了池化的support特征。因此,先验这时是无用的,只验证在基线上的FEM与VGG-16骨干在Zero-shot的设置。

Word2Vec[27]和FastText[25]的嵌入分别在谷歌News[46]和Common Crawl[26]上进行训练。Word2Vec和FastText嵌入的拼接特征直接取代了原始模型中的池化support特征,而不需要归一化。如表11所示,基础结构在没有支持样本的未见类上达到53.2的mIoU,甚至在OSLSM[33]的few-shot设置下,在PASCAL-5i上优于一些有5个支持样本的模型。此外,所提出的FEM解决了Zero-shot设置中的空间不一致性,并提高了1.0的基线mIoU(从53.2提高到54.2)。

在这里插入图片描述

其他:

为了更好地理解主干如何影响提出的方法,作者也展示了用所有主干参数训练的四个模型的结果。结果表明,FEM和先验掩码对可训练骨干网模型的改善效果不如对固定骨干网模型的改善效果显著。可学习的高级特征给固定骨干带来了较差的性能,如表7所示,但对可训练骨干是有益的。在5shot的评估中,先验产生了比FEM更高的性能增益,因为先验是在5个支持样本上平均的,为查询图像提供了比1shot更准确的先验掩模,以对抗过拟合。

作者进行了参数量和速度的实验。如表6所示,最佳模型(Baseline + FEM + Prior)只有10.8M的可训练参数,这比表1中的其他方法要少得多。为了证明FEM带来的改进不是由于更多的可学习参数,还展示了具有更多参数(12.9M)的FEM‡模型的结果,但它产生的结果甚至比FEM (10.8M)更差。速度评估时,测试图像大小调整为473 × 473。如表6所示,FEM对推理速度的影响不大(从17.7 FPS到17.3 FPS)。虽然先验掩膜生成过程将基线从17.7 FPS降低到16.5 FPS,但最终模型仍然具有15+ FPS的效率。

因为在PASCAL-5i和COCO上计算1,000个query-support对可能会导致结果不稳定。作者通过使用不同的支持样本进行多次实验来分析结果的稳定性。

总结:

作者提出了先验掩膜生成方法和特征富集模块(FEM),即先验引导的特征富集网络(PFENet)。先验掩膜生成方法通过在预先训练的高层语义特征上利用余弦相似度计算来获得掩膜提高性能。先验淹没哦鼓励模型在不损失泛化能力的情况下更好地本地化query的目标。FEM方法通过自适应地合并多尺度的query和support特征,并辅以中间辅助监督和条件特征选择,解决了空间不一致性问题。有了这些模块,PFENet在PASCAL-5i和COCO数据集上都获得了SOTA的结果,而没有增加太多的模型尺寸和显著的效率损失。在Zero-shot场景下的实验进一步证明了我们工作的稳健性。未来可能的工作包括将这两种设计扩展到小样本目标检测和小样本实例分割

【社区访问】

img 【论文速递 | 精选】

img阅读原文访问社区

https://bbs.csdn.net/forums/paper

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

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

相关文章

【爪洼岛冒险记】第5站:多图解,超详细讲解Java中的数组、二维数组--建议收藏

🌱博主简介:是瑶瑶子啦,一名大一计科生,目前在努力学习JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛! 📜所属专栏:爪洼岛冒险记【从小白到大佬之路】 ✈往期博文回顾: 【爪洼岛冒险记】…

【GD32F427开发板试用】RT-THREAD标准版 移植使用

本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:打盹的消防车 前言: 无意在微信看到了GD做活动,想到了第一时间体验一下,搭配RT-THREAD,也很方…

【Java】【系列篇】【Spring源码解析】【三】【体系】【BeanDefinition体系】

整体结构图 1. BeanDefinition 用于保存 Bean 的相关信息,包括属性、构造方法参数、依赖的 Bean 名称及是否单例、延迟加载等, 它是实例化 Bean 的原材料,Spring 就是根据 BeanDefinition 中的信息实例化 Bean。 2. 我们获取对象的方式一般有…

AioDnsBrute:一款功能强大的异步DNS爆破工具

关于AioDnsBrute AioDnsBrute是一款功能强大的异步DNS爆破工具,该工具基于Python 3.5开发,并使用了asyncio库以实现针对目标域名的异步爆破。 该工具的运行速度非常快,在一台小型VPS主机上,可以实现在1.5-2分钟之内处理大约10万…

【计数DP】P4933 大师

这道是洛谷官方题单的简单DP为啥我放上来呢,因为我因为各种各样的细节原因没做出来感觉计数的DP有点点难,得多写了P4933 大师 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)题意:思路:第一眼肯定是设dp[i][j]为以a[i]为结尾&…

8. 【Redisson源码】分布式信号量RSemaphore

目录 一、RSemaphore的使用 二、RSemaphore设置许可数量 三、RSemaphore的加锁流程 四、RSemaphore的解锁流程 【本篇文章基于redisson-3.17.6版本源码进行分析】 基于Redis的Redisson的分布式信号量RSemaphore采用了与java.util.concurrent.Semaphore相似的接口和用法。 …

从首个「数实融合」公益球场,看元宇宙奏响创新「三重奏」

作者 | 曾响铃 文 | 响铃说 2022年的元宇宙,一半是海水,一半是火焰。 一边是刮起元宇宙热潮的Roblox股价跌去大半,Meta也因元宇宙亏损深陷泥潭。另一边,经过2021年元宇宙概念落地和普及,2022年却也是元宇宙相关产业…

分享86个PHP源码,总有一款适合您

PHP源码 分享86个PHP源码,总有一款适合您 下面是文件的名字,我放了一些图片,文章里不是所有的图主要是放不下..., 86个PHP源码下载链接:https://pan.baidu.com/s/1fsoGdkr_-wZUaJvVMOlihQ?pwdlhyo 提取码&#xff…

Java 泛型是什么?一文带你吃透泛型

文章目录1. Java 泛型2. 泛型类3. 泛型接口4. 泛型方法5. 泛型集合Java编程基础教程系列1. Java 泛型 Java 泛型是 JDK1.5 中引入的一个新特性,其本质是参数化类型,把类型作为参数传递。其主要的形式有泛型类,泛型接口和泛型方法。泛型概念的…

sqoop安装(linux)

一、前期准备安装好hadoop伪分布安装好MySQL下载sqoop压缩文件实验环境:实验环境版本CentOS 6.5MySQL5.7.37hadoop3.3.0sqoop1.4.7sqoop1.4.7 下载链接:https://pan.baidu.com/s/16AUdtBmSv7OG2PTyA1XcgQ?pwdqu7lmysql驱动包下载地址:https:…

易于设置的倒计时页面Easy countdown

今天开始放假了 什么是 Easy countdown ? Easy countdown 是一个易于设置的倒计时页面。可以设置为倒计时或计时器。 先看看官方提供的动图 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 easy-countdown ,选择第一个 yooooomi/easy-countdown&am…

【前端学习指南】基础开发环境搭建

🍭 Hello,我是爱吃糖的范同学 邻近春节,虽然学校的事情已经处理的差不多了,又开始要忙着找实习......时间安排上还是有很多问题,希望大家多多包涵,我已经加班加点在写作了😂😂&…

高盐废水如何处理,离子交换树脂在高盐废水中的应用

什么是高盐废水? 高盐废水是工业废水中较常见的一种,它是指总含盐量(以NaCl计)至少为1%的废水,属于难处理的废水之一。 高盐废水中的总溶解固体物TDS,多在10000-25000mg/L,含盐成分复杂,有Na、…

vue3中echarts组件的最佳封装形式

项目中经常用到echarts,不做封装直接拿来使用也行,但不可避免要写很多重复的配置代码,封装稍不注意又会过度封装,丢失了扩展性和可读性。始终没有找到一个好的实践,偶然看到一篇文章,给了灵感。找到了一个目…

【数据结构】并查集

目录1.概述2.代码实现3.应用本文参考: LABULADONG 的算法网站 《数据结构教程》(第 5 版)李春葆主编 1.概述 (1)并查集支持查找一个元素所属的集合以及两个元素各自所属的集合的合并运算。当给出两个元素的一个无序对…

氨氮废水如何处理,离子交换树脂在氨氮废水中的应用点

近几年来重点污染源考核结果及地表水监测结果表明,氨氮超标现象仍较严重。认清氨氮的来源,了解其危害,采取有效的处理措施成为保护水环境不被氨氮污染的必要环节。 北京科海思科技有限公司利用离子交换特种树脂可以做到有针对性的氨氮的去除…

vue2之生命周期

生命周期 生命周期是指组件从创建,运行到销毁的阶段。而生命周期函数(也叫生命周期钩子)是vue在关键的时刻帮我们调用的一些特殊名称的函数,会根据生命周期的阶段,依次执行。 beforeCreatecreatedbeforeMountmountedb…

基本的SELECT语句与显示表结构

文章目录基本的SELECT语句SELECT...SELECT ... FROM列的别名去除重复行空值参与运算着重号查询常数(查询同时添加常数字段)显示表结构过滤数据练习题基本的SELECT语句 SELECT… SELECT 11, 22;# 直接这样写相当于下面这句 SELECT 11, 22 FROM DUAL; # 这里DUAL:伪…

【云攻防系列】从攻击者视角聊聊K8S集群安全(上)

前言 作为云原生管理与编排系统的代表,Kubernetes(简称K8S)正受到越来越多的关注,有报告[1]显示,96% 的组织正在使用或评估 K8S,其在生产环境下的市场占有率可见一斑。 K8S 的功能十分强大,其…

day38【代码随想录】动态规划之斐波那契数、爬楼梯、使用最小花费爬楼梯

文章目录前言一、斐波那契数(力扣509)二、爬楼梯(力扣70)三、使用最小花费爬楼梯(力扣746)总结前言 1、斐波那契数 2、爬楼梯 3、使用最小花费爬楼梯 一、斐波那契数(力扣509) 思路…