【论文通读】CLIP改进工作综述

CLIP改进工作综述

  • 前言
  • 1. 语义分割
    • 1.1 Lseg
    • 1.2 GroupViT
  • 2. 图像检测
    • 2.1 ViLD
    • 2.2 GLIP
    • 2.3 GLIPv2
  • 3. 图像生成
    • 3.1 CLIPasso
  • 4. 视频理解
    • 4.1 CLIP4Clip
    • 4.2 ActionCLIP
  • 5. 其它领域
    • 5.1 CLIP-VIL
    • 5.2 AudioCLIP
    • 5.3 PointCLIP
    • 5.4 DepthCLIP
  • 总结
  • 参考链接

前言

CLIP作为多模态对比学习里程碑式工作,在创新性,有效性和领域性三个方面都拉满了。本篇博客就来探讨在CLIP之后,各个领域是如何利用CLIP去提升当前领域的性能,以及如何利用CLIP信息整合的能力在多模态领域做大做强。


1. 语义分割

1.1 Lseg

LSeg是一种基于语言驱动的语义分割模型,通过将像素嵌入和相应的文本嵌入对齐,帮助模型学习多模态的特征表示。本质上,LSeg是基于CLIP做语义分割任务的模型,其零样本的表现如下图所示:
image.png
LSeg整体流程如下图所示,形式上和CLIP几乎一致,只是多了下游任务的过程。首先将图像和文本分别输入各自编码器中,图像的编码器是DPT模型,由ViT和decoder模块组成,decoder的目的是将降维的特征scale up,匹配语义分割任务。接着将具有相同通道大小的图像编码和文本编码相乘,将结果输入到空间正则化块得到分割结果。
image.png
LSeg本质上还是和CLIP有很大区别的,首先其文本编码器就是采用的CLIP中的文本编码器,并且冻住参数不让其更新。这是因为分割领域的数据集规模都很小,如果进行微调,很容易造成训练不稳定,将模型带跑偏,不如就用原始的优良的CLIP文本编码器参数。其次,这里并没有选择无监督对比学习的方式训练,而是采用有监督的ground-truth,通过交叉熵计算损失,这里的思想就是将文本语义信息融入到图像中,通过有监督的方式将文本和图像编码对齐,这种方式最大的缺陷在于并没有真正学习到文本的语义信息。
image.png
image.png
实验上,模型的差距还是非常明显的。虽然LSeg在zero-shot上取得了最好的结果,但是缺乏对比意义,因为ViT-L/16要比ResNet101大得多,此外,LSeg远远不如one-shot的结果,可见分割领域在语言驱动上还有很大的进步空间。

1.2 GroupViT

GroupViT来自CVPR2022,它通过结合ViT和对比学习,采用分组机制俩处理CV中语义分割问题,其整体流程如下:
image.png
图像方面,首先将图像分割成图像块输入到线性层中通过映射得到196×384的 embedding,接着将图像token嵌入和group token一起输入到ViT块中,这里group token相当于聚类中心,维度为64×384,用于代表整个图像的特征。经过6层Transformer块后,将输出输入到Grouping块中,这可以认为是聚类的过程,如图b所示。 { g ^ i l } \{\mathrm{\hat{g}}^l_i\} {g^il} { s ^ i l } \{\mathrm{\hat{s}}^l_i\} {s^il}的维度分别为64×384和196×384,二者通过线性映射相乘得到相似度矩阵,并利用该相似度矩阵帮助原始的图像块进行聚类中心的分配,为了能够进行端到端的训练,作者设计了gumbel softmax让参数可导。经过聚类操作后,得到64×384的输出,为了进一步聚类,作者将该输出和7×384的token块再次输入到Transformer块和Grouping块中,最终得到8×384的输出,即整个图像可以由8个聚类中心表示。接下来的部分就和CLIP异曲同工了,作者将得到的8×384的特征经过平均池化层得到全局的表征,和文本编码结果进行对比学习得到loss,从而进行训练学习。
GroupViT在ViT基础上并没有加太多复杂的模块,因此具有良好的可扩展性。作者在2900万个文本对上进行训练,理论上说,如果GroupViT在CLIP的4亿条文本对上进行训练,会带来进一步性能上的提升。
CLIP最令人惊叹的是其零样本的能力,因此GroupViT也设计了零样本的实验,用于测试GroupViT的迁移能力。其过程如下:
image.png
将图像和添加prompt的文本分别输入到各自的编码器中,然后计算文本和8个聚类中心的相似度,这里的局限性在于如果图像中的类别超过8个,那么就无法准确识别所有类别,当然这里聚类中心的数目是可调节的。
image.png
那么grouping token是否在工作呢?作者分别对stage1和stage2中的部分grouping token进行可视化,如上图所示。可以看到,在stage中,grouping token对图像中较小的部分进行分类,如眼睛,手肘,在stage2中,grouping token可以分类身体、脸这些占据图像更大内容的物体,可见grouping token确实起到了聚类作用,并且随着聚类中心的减少,类别会更加抽象。
image.png
实验上,GroupViT性能不仅最好,还能做零样本任务,但是和有监督学习的模型相比还是差距明显。作者发现,grouping token的分割其实做得很好,做的不好的地方在于分类部分,如果仅仅是考虑分割,那么这种无监督的方式是可以达到监督效果的。

2. 图像检测

2.1 ViLD

ViLD来自于ICLR2022,但是这篇工作在CLIP出来才两个月时间就已经挂到了arXiv上,可谓是内卷之王。这篇工作的主要内容,可以由下面这张图直接概括:
image.png
图中是三个动物玩具,但是基础类只有玩具这一类,作者提出,能否设计出一种目标检测器,除了识别训练中存在的标签类别,还能够扩展词表检测新的类别。这就是本文的目标,训练一个开放词汇对象检测器,仅使用基本类别中的检测注释来检测文本输入描述的任何新类别中的对象。
image.png
上图是ViLD的结构以及和之前模型的对比。(a)中的head是普通的两级检测器分类头,如Mask R-CNN。输入N个proposals得到的N个位置表征进行分类。proposals是指算法生成的一组可能包含目标物体的候选区域或区域建议。ViLD模型总体上由ViLD-text和ViLD-image组成,ViLD-text用固定的文本嵌入和可学习的背景嵌入途欢了原先的分类器,CLIP的应用体现在ViLD-image部分,CLIP模型作为teacher模型,ViLD作为student模型,将二者的输出进行知识蒸馏,让ViLD的输出尽可能靠近CLIP的输出,采用L1损失来更新参数。
ViLD的完整结构如(d)所示,N+M个proposals输入到Head中得到各自的表征后剥离开来,N个和ground-truth进行比较,通过计算交叉熵损失更新参数,M个和CLIP得到的表征进行知识蒸馏,采用L1损失来更新参数。

这里需要注意(d)中proposals,ViLD-text部分的proposals为N个,ViLD-image部分的proposals为M个,因此在输入的时候同时输入Head中,得到最后的embedding后再剥离开来。为什么不能同时采用N个proposals呢?因为CLIP模型规模是很大的,在训练中每次前向过程就需要M次用CLIP抽取特征的过程,时间开销是巨大的。因此会在训练前提前抽取所有M个proposals的特征,模型训练时直接从磁盘中读取,大大减少了计算开销。

下图是ViLD具体执行过程。
image.png
绿色是原始类别,蓝色是新类别。首先原始类别和新类别通过构造template输入到文本编码器中得到文本表征,以便训练和推理时使用。训练阶段,图像输入到backbone和RPN得到proposals,proposals分别输入到CLIP和RoIAlign中得到各自的表征,二者的表征进行知识蒸馏,通过L1损失进行学习,此外,后者表征和对应的文本编码计算交叉熵损失,从而进行梯度的反向传输。推理阶段,将图像经过Backbone+RPN和RoIAlign得到proposals的表征后,和所有的文本表征进行相似度计算,从而得到判别结果。
image.png
由于本篇工作作者强调的是模型面对新类别的预测能力,因此主要关注模型的零样本结果,即 A P r \mathrm{AP}_r APr结果。可以看到ViLD大幅超过之前的基线模型。并且ViLD迁移到其它未见的数据集性能表现也很良好,结果如下:
image.png
ViLD可以说是目标检测领域一个里程碑式的工作,能够在未见的类别上表现良好,具有很强的零样本能力和迁移学习能力。

2.2 GLIP

GLIP可以说就是目标检测领域的CLIP,CLIP受益于4亿对图文数据,可以预训练得到很好的模型,但是目标检测领域并没有如此丰富的数据集,因此GLIP利用自我训练的方式,即半监督学习,根据提供的文本prompt生成大量的带有锚框的数据,从而学习到丰富的图文表征。GLIP具有强大的零样本能力,在COCO数据集上,zero-shot可以达到49.8,超过了不少监督baseline,经过微调后更能达到60以上的AP。下图是GLIP的零样本迁移表现:
image.png
那么模型是如何做半监督学习的呢?所采用的数据集如下所示:
image.png
首先作者收集了物体检测数据集,但是其规模显然不够,于是作者又收集了Grounding和Caption数据集,Grounding数据集是文本描述和其对应内容锚框的数据集,而Caption数据集是图文数据集。前者和检测数据集类似,可以直接用于模型预训练,后者需要模型生成对应的锚框,再进行训练,即自训练过程。通过这样的操作就可以得到大规模丰富的数据集了。
image.png
上图是GLIP整体的流程图,形式上和CLIP很像,将图像和其对应的文本输入到各自的编码器中得到表征,由于是监督训练,所以输出的锚框和文本通过计算相似度和ground-truth对比,计算Alignment损失从而梯度反传。中间的Fusion即Cross Attention,可以让文本和图像之间的联系更强。此外还有一个关键是定位损失,帮助模型训练更好的锚框,从而进行半监督学习。
image.png
实验结果如上图所示,可见GLIP在零样本上取得了很好的结果。

2.3 GLIPv2

受到GLIP中多任务数据集进行半监督训练的影响,GLIPv2将多种任务统一起来,既可以做对象检测,实例分割等定位任务,又可以做VQA,图文对的理解任务,如下图所示:
image.png
GLIPv2实现了定位和理解任务之间的互惠互利,单个GLIPv2模型有我在各种定位和理解任务上接近SOTA。该模型还展示了在开放词表上强大的零样本和few-shot性能,并且在VL理解任务上有着卓越的能力。

3. 图像生成

3.1 CLIPasso

image.png
CLIPasso这篇工作是会议SIGGRAPH最佳论文,它将物体的图像抽象成不同程度的草图,同时保留其关键的视觉特征。即使是非常少的表示,人们也能够识别出描绘主题的语义和结构。
image.png
上图是毕加索名画“一头公牛”,表现的就是对原始画像不断抽象的过程,要想实现这样的模型,就需要收集相应的数据集进行训练,常见的数据集如下图所示。但是现有数据集的抽象都是固定好的,这会限制抽象出的形式和风格,违背了图像生成的初衷。
image.png
如何摆脱对有监督训练集的依赖,并抽取出更好的图像语义?作者自然而然就想到了CLIP。
image.png
主体方法如上图所示,首先根据原始图像生成采样范围,接着采样点生成贝兹曲线,一条贝兹曲线是空间上多个二维的点控制的曲线,点的个数可以调整。模型训练的过程本质上是更改点的位置,从而改变曲线的形状,得到想要的简笔画。具体来说,将采样得到的n个笔画输入到光栅化器Rasterizer,从而得到图像的简笔画,接下来就是工作的创新点,作者采用了CLIP模型,将原始图像和简笔画输入到CLIP中得到的特征尽可能相似,计算损失 L s L_s Ls,让模型学习到图像的语义信息。但是光有语义信息,位置不匹配也会导致生成的简笔画和原始图像不一致。因此作者又设计了另外一个几何损失函数 L g L_g Lg,计算原始图像和简笔画在模型前几层特征的相似性,因为模型的前几层包含更多的几何特征信息。通过语义损失和几何损失的加持,就可以保证训练好的模型生成的简笔画无论在语义信息和几何位置上都和原始图像尽可能一致。
本文工作另一个创新点就在于点初始化saliency部分,因为不同的初始化结果会导致简笔画差异很大。具体来说,作者将原始图像输入到训练好的ViT中,把最后一层多头注意力取加权平均,做成saliency MAP,让点在显著的区域采样。下图是不同初始化生成的结果,可以看到本文的初始化得到的简笔画效果显然更好。
image.png
CLIPasso效率高,性能好,成本低,在一张V100上只需要6分钟就能够完成2000轮迭代,迭代100轮的时候就可以看出模型的效果如何。
image.png
此外对生成的简笔画,作者还做了进一步的后处理,对输出的三张简笔画计算两种loss,将最低loss的简笔画作为最终的输出,如下所示:
image.png
CLIPasso可以为不常见的物体生成简笔画,这是之前的模型所不能做到的。比如下面的结果:
image.png
image.png
此外,CLIPasso另一个卖点在于可以通过控制笔画的个数来控制生成简笔画抽象的程度。当笔画数越少,生成的简笔画相应就会更抽象。
实验部分,作者将CLIPasso和其它模型进行了生成简笔画结果的对比如下:
image.png
image.png
image.png
可以看到对于任意物体,CLIPasso生成的简笔画都更能体现原始图像的特征。
当然,CLIPasso也有如下几点局限性:

  1. 有背景的图像会降低模型的性能,本文采用了自动掩码的方法,将目标从原图中抠出来再进行简笔画的生成,但是这样two step的过程显然不够便捷,一个可行的方向是设计一个损失函数让模型学习不被背景干扰。
  2. 简笔画的笔画是同时生成的,这和真实场景下的素描不同,如果能够一笔一笔生成,生成的简笔画可能更合理,更具艺术性。
  3. 笔画的个数必须提前确定,但是不同图像在相同抽象程度所需笔画数量不同,如果能够将其变为可学习的参数,那么就可以规定抽象级别对不同的图像执行简笔画任务了。

4. 视频理解

4.1 CLIP4Clip

CLIP4Clip是一篇以端到端的方式将CLIP模型的知识转移到视频语言检索中的工作。其核心的思想和CLIP一模一样,如下图所示:
image.png
一段视频的文本输入到文本编码器得到文本表征,视频以帧为单位进行线性投影得到帧的token,然后经过ViT得到帧的表征。在之前CLIP的工作中,文本的表征只对应一张图像的表征,而这里文本表征对应多张图像的表征,那么该如何计算相似度呢?
image.png
作者提出了三个解决方案,第一个就是最简单的直接将所有图像表征取平均,然后再和文本表征计算相似度,这种方法的缺点是缺少视频的时序信息。为了加入时序信息,作者又设计了第二个方案,将连续的图像编码输入到Transformer或者LSTM中,这样最后得到的表征就带有时序信息。最后一个方案是将文本和视频帧的表征同时扔给Transformer Encoder,让文本和视频帧的表征通过不同交互得以融合,最后文本表征的输出直接作为相似度。这种方法既加入了时序信息,又融合了文本和视频帧信息。
image.png
实验部分,本文的模型显著好于之前的模型,这很大一部分原因得益于CLIP模型的优越性。进一步观察可以发现,平均的相似度计算方法效果是最好的,为此作者又在更大的训练集上进行训练,得到如下的结果:
image.png
当训练数据集增多后,模型在下游任务上微调效果慢慢显露出来,模型也就不容易过拟合,参数学习的方式效果就会好一些。
本文的工作完全是CLIP在视频理解领域的迁移工作,模型的整体架构几乎没有变化,只是根据应用场景加入了一些特别的处理工作,并在五个数据集上取得了最好的结果。这篇工作属于CLIP在视频理解领域的开山之作,因此作者提出了很多想法:

  1. 图像特征也可以促进视频文本的检索。
  2. 即使是优秀的图文预训练CLIP后也可以提高视频文本检索的性能。
  3. 3D块线性投影直接融合了时序信息,是很有前途的方法。
  4. 视频检索的CLIP对学习率很敏感。

4.2 ActionCLIP

ActionCLIP是一篇基于CLIP的视频理解动作识别的工作。动作识别本质上是分类任务,只不过在视频里加入了时序信息。之前的做法是将视频输入到视频编码器得到表征向量,过一个分类头得到分类结果,和最后的Ground-truth作对比计算损失。这样的方式需要大量人工标注的监督数据,成本较高,并且会出现遇到新的类别无法分类的问题。那么CLIP就特别适合这种需要大量图文数据进行预训练的任务,之后只需要做zero-shot或few-shot就能有很好的结果。本文的ActionCLIP基于CLIP,将视频和标签分别编码计算相似度,由于标签是人工标注的数据,所以和一般的对比学习有所不同,之前是图片和其对应的caption为正样本,也就是对角线上都是正样本,但是其它部分都是负样本,而这里会出现标签相同的不同样本,处理的方法也很简单,将之前的交叉熵损失换成了KL散度,利用分布的相似度计算损失。
image.png
当然ActionCLIP作为视频理解领域的工作,肯定相比于CLIP加入了更多领域的特性。如下图所示:
image.png
其最核心的地方在于视频的表征。之前的CLIP是一图对一文,但是视频领域是多个视频帧对应一段文字。首先在视频帧表征部分,作者设计了Pre-network Prompt和In-network Prompt,前者是加入了时序位置信息,后者加入了shift模块,增强模型时序建模的能力,又不引入过多的参数。视频帧token序列经过这两层Prompt网络得到表征序列,那么这里将表征序列合并成一个表征的操作就和CLIP4Clip如出一辙,Post-network也是有三个方法,MeanP,Conv1D/LSTM和Transf,具体如何实现这里就不过多赘述了。
image.png
消融实验部分作者首先探讨多模态框架是否有效,可以看到在Top-1上提升了3个点,效果还是非常显著的。作者接着又探讨预训练初始化的作用,如下图所示:
image.png
可以看到视觉的CLIP初始化对结果影响最大,而文本的初始化反而没有那么大的影响。最后是prompt的消融实验:
image.png
image.png
文本的prompt对结果没有太大影响,Pre-network和In-network反而让模型掉点显著,只有Post-network中的方法对模型性能有一定提升。
既然采用了CLIP,那么一定要测试一下其强大的零样本能力,如下图所示:
image.png
ActionCLIP果然是不负众望,零样本的结果甚至比之前方法few-shot的结果要好。

5. 其它领域

5.1 CLIP-VIL

CLIP-VIL这篇工作证实了CLIP模型作为预训练参数可以进一步提高下游视觉语言任务的性能。
image.png
它的本质就是将之前方法的编码器换成了CLIP模型,然后直接在下游任务上微调,取得了很好的效果。

5.2 AudioCLIP

语音领域也应用了CLIP,AudioCLIP这篇工作融合了文本、视频和音频三个模态的信息,以CLIP的方式进行正负样本对的学习。image.png
左边部分完全是CLIP,即文本和视频帧的编码,右边是对音频的编码,该网络称为ESResNeXt,得到的三个表征两两进行正负样本的学习。

5.3 PointCLIP

如何把CLIP学习到的2D表征迁移到3D场景,PointCLIP给出了答案。
image.png
作者将3D点云投射到2D平面,得到了2D的深度图,即2D的图像,文本的Prompt提示模型这是一个点云的深度图,帮助模型适应3D变成2D后图像的改变。这样模型既可以训练,也可以做零样本的推理。此外,Inter-view Adapter还融入了相应的领域知识。
image.png

5.4 DepthCLIP

CLIP对物体十分敏感,但是对抽象的概念理解较弱,因此很少将CLIP应用到概念任务。DepthCLIP这篇工作巧妙将深度估计问题转换为文本理解的问题,在图像深度估计任务上取得了很好的效果。它将深度估计看做是分类问题,而不是回归问题,将深度距离强制分为了7个大类。因此文本的Prompt就是对这7个类的扩充,文本和图像分别编码,然后计算相似度矩阵,最后通过softmax进行分类得到深度图,流程如下所示:
image.png
该工作和PointCLIP的一作都是同一个作者,这表明CLIP可以在CV或多模态的很多小领域略加一些改动,就可以取得成功。

总结

通过对上面工作的阅读,当前对CLIP的应用可以分为三个方面:

  1. 将图文通过CLIP得到特征,然后将这些特征融合起来去做之前的任务,加强模型的训练。
  2. 把CLIP特征作为teacher,和当前的模型做蒸馏,学习到更好的预训练知识。
  3. 借鉴CLIP的思想,应用到当前领域,自己定义对比学习和正负样本。

CLIP模型通过对比学习的方式,将多模态的信息融合在了一起,这种信息增强的方式是让模型无论是当前任务还是迁移到别的数据集甚至是不同任务都能表现优异的真正原因。通过上面的工作也可以看到,CLIP的思想已经被应用在了各个领域,大家早早就占好了坑,能做的领域大家都做了个遍,所以未来可以做的方向,一个是让CLIP在部分领域又专又精,加入更多领域的方法和知识,另一个方向就是改进CLIP这种信息融合的学习方式,通过设计一些其他的代理任务来帮助模型更好融合多模态的知识,这样又会掀起另一波CLIP浪潮。

参考链接

https://arxiv.org/pdf/2201.03546.pdf
https://arxiv.org/pdf/2202.11094.pdf
https://arxiv.org/pdf/2104.13921.pdf
https://arxiv.org/pdf/2112.03857.pdf
https://proceedings.neurips.cc/paper_files/paper/2022/file/ea370419760b421ce12e3082eb2ae1a8-Paper-Conference.pdf
https://arxiv.org/pdf/2202.05822.pdf
https://arxiv.org/pdf/2104.08860.pdf
https://arxiv.org/pdf/2109.08472.pdf
https://arxiv.org/pdf/2107.06383.pdf
https://arxiv.org/pdf/2106.13043.pdf
https://openaccess.thecvf.com/content/CVPR2022/papers/Zhang_PointCLIP_Point_Cloud_Understanding_by_CLIP_CVPR_2022_paper.pdf
https://arxiv.org/pdf/2207.01077.pdf

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

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

相关文章

递归算法学习——N皇后问题,单词搜索

目录 ​编辑 一,N皇后问题 1.题意 2.解释 3.题目接口 4.解题思路及代码 二,单词搜索 1.题意 2.解释 3.题目接口 4.思路及代码 一,N皇后问题 1.题意 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上…

CSP-J初赛复习大题整理笔记

本篇全是整理&#xff0c;为比赛准备. 在这里插入代码片 #include<cstdio> using namespace std; int n, m; int a[100], b[100];int main() {scanf_s("%d%d", &n, &m);for (int i 1; i < n; i)a[i] b[i] 0;//将两个数组清0&#xff0c;这…

【zookeeper】zookeeper介绍

分布式协调技术 在学习ZooKeeper之前需要先了解一种技术——分布式协调技术。那么什么是分布式协调技术&#xff1f;其实分布式协调技术主要用来解决分布式环境当中多个进程之间的同步控制&#xff0c;让他们有序的去访问某种临界资源&#xff0c;防止造成"脏数据"的…

5分钟生成10条短视频,AI重构电商营销

点击关注 文&#xff5c;姚 悦&#xff0c;编&#xff5c;王一粟 “我们将正式告别过去单一渠道投放的时代&#xff0c;走向一站式跨渠道品效联合经营的全新时代。”9月6日&#xff0c;在2023年其最重要的营销峰会上&#xff0c;淘天集团阿里妈妈市场部总经理穆尔说道。 当天…

小程序实现摄像头拍照 + 水印绘制

文章标题 01 功能说明02 使用方式 & 效果图2.1 基础用法2.2 拍照 底部定点水印 预览2.3 拍照 整体背景水印 预览 03 全部代码3.1 页面布局 html3.2 业务核心 js3.3 基础样式 css 01 功能说明 需求&#xff1a;小程序端需要调用前置摄像头进行拍照&#xff0c;并且将拍…

OpenCV 06(图像的基本变换)

一、图像的基本变换 1.1 图像的放大与缩小 - resize(src, dsize, dst, fx, fy, interpolation) - src: 要缩放的图片 - dsize: 缩放之后的图片大小, 元组和列表表示均可. - dst: 可选参数, 缩放之后的输出图片 - fx, fy: x轴和y轴的缩放比, 即宽度和高度的缩放比. - …

stable diffusion实践操作-大模型介绍-SDXL1大模型

系列文章目录 大家移步下面链接中&#xff0c;里面详细介绍了stable diffusion的原理&#xff0c;操作等&#xff08;本文只是下面系列文章的一个写作模板&#xff09;。 stable diffusion实践操作 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生…

2023-9-8 求组合数(三)

题目链接&#xff1a;求组合数 III #include <iostream> #include <algorithm>using namespace std;typedef long long LL;int p;int qmi(int a, int k) {int res 1;while(k){if(k & 1) res (LL) res * a % p;k >> 1;a (LL) a * a % p;}return res; }…

FAT32文件系统f_mkfs函数详解

1.f_mkfs参数 参数path&#xff1a;要挂载/卸载的逻辑驱动器号;使用设备根路径表示。 参数opt&#xff1a;系统的格式&#xff0c;如图所示&#xff0c;选择FM_FAT32即可&#xff0c;选择其他的可能无法格式化。 参数au&#xff1a;每簇的字节数&#xff0c;以字节为单位&#…

安全模型中的4个P

引言&#xff1a;在安全模型中&#xff0c;经常会碰到PDR,PPDR&#xff0c;IPDRR&#xff0c;CARTA-PPDR等模型&#xff0c;其中的P&#xff0c;是predict&#xff1f;是prevent&#xff1f;还是protect&#xff1f;还是policy呢&#xff1f; 一、4P字典意思解释 1、predict&a…

使用内网负载机(Linux)执行Jmeter性能测试

一、背景 ​ 在我们工作中有时候会需要使用客户提供的内网负载机进行性能测试&#xff0c;一般在什么情况下我们需要要求客户提供内网负载机进行性能测试呢&#xff1f; 遇到公网环境下性能测试达到了带宽瓶颈。那么这时&#xff0c;我们就需要考虑在内网环境负载机下来执行我们…

中国ui设计师年终工作总结

一、萌芽阶段 记得初次应聘时&#xff0c;我对公司的认识仅仅局限于行业之一&#xff0c;对UI设计师一职的认识也局限于从事相对单纯的界面的设计创意和美术执行工作。除此之外&#xff0c;便一无所知了。所以&#xff0c;试用期中如何去认识、了解并熟悉自己所从事的行业&…

【Sword系列】Vulnhub靶机HACKADEMIC: RTB1 writeup

靶机介绍 官方下载地址&#xff1a;https://www.vulnhub.com/entry/hackademic-rtb1,17/ 需要读取靶机的root目录下key.txt 运行环境&#xff1a; 虚拟机网络设置的是NAT模式 靶机&#xff1a;IP地址&#xff1a;192.168.233.131 攻击机&#xff1a;kali linux&#xff0c;IP地…

哭了,python自动化办公,终于支持 Mac下载了

想了解更多精彩内容&#xff0c;快来关注程序员晚枫 大家好&#xff0c;这里是程序员晚枫&#xff0c;小红薯/小破站也叫这个名。 在我的主页发布的免费课程&#xff1a;给小白的《50讲Python自动化办公》&#xff0c;一直在更新中&#xff0c;昨晚12点多&#xff0c;有朋友在…

类,这一篇文章你就懂了!

提示&#xff1a;本文主要介绍C中类相关知识及基础概念总结 渺渺何所似&#xff0c;天地一沙鸥 文章目录 一、面向对象与面向过程二、类的框架知识2.1 类的定义2.2 类的封装性2.2.1 访问限定符2.2.2 封装的概念以及实现 2.3 类的作用域及实例化2.4 类中this指针 三、六大默认成…

网络分层的真实含义

复杂的程序都要分层&#xff0c;这是程序设计的要求。比如&#xff0c;复杂的电商还会分数据库层、缓存层、Compose 层、Controller 层和接入层&#xff0c;每一层专注做本层的事情。 当一个网络包从一个网口经过的时候&#xff0c;你看到了&#xff0c;首先先看看要不要请进来…

【ALM工具软件】上海道宁与Perforce为您带来用于整个生命周期的应用程序生命周期管理软件

Helix ALM是 用于整个生命周期的 应用程序生命周期管理的ALM软件 具有专用于 需求管理&#xff08;Helix RM&#xff09;、测试用例管理&#xff08;Helix TCM&#xff09; 问题管理&#xff08;Helix IM&#xff09;的功能模块 Helix ALM提供了 无与伦比的可追溯性 您将…

Fiddler如何比较两个接口请求?

进行APP测试时&#xff0c;往往会出现Android和iOS端同一请求&#xff0c;但执行结果不同&#xff0c;这通常是接口请求内容差异所致。 我习惯于用Fiddler抓包&#xff0c;那此时应该如何定位问题呢&#xff1f; 分别把Android和iOS的接口请求另存为TXT文件&#xff0c;然后用…

BMS电池管理系统——电芯需求数据(三)

BMS电池管理系统 文章目录 BMS电池管理系统前言一、有什么基础数据二、基础数据分析1.充放电的截至电压2.SOC-OCV关系表3.充放电电流限制表4.充放电容量特性5.自放电率 总结 前言 在新能源产业中电芯的开发也占有很大部分&#xff0c;下面我们就来看一下电芯的需求数据有哪些 …

JavaEE初阶(1)(冯诺依曼体系、CPU、CPU基本原理、如何衡量CPU的好坏?指令、操作系统、操作系统“内核”)

目录 冯诺依曼体系&#xff08;Von Neumann Architecture&#xff09; CPU CPU基本原理&#xff1a; 如何衡量CPU的好坏&#xff1f; 1、主频&#xff08;时钟速度&#xff09;&#xff1a; 2、核心数&#xff1a; 指令 操作系统 操作系统“内核” 冯诺依曼体系&#x…