论文解读:(CAVPT)Dual Modality Prompt Tuning for Vision-Language Pre-Trained Model

v1文章名字:Dual Modality Prompt Tuning for Vision-Language Pre-Trained Model

v2文章名字:Class-Aware Visual Prompt Tuning for Vision-Language Pre-Trained Model

文章汇总

对该文的改进:论文解读:(VPT)Visual Prompt Tuning_vpt 代码实现-CSDN博客

存在的问题

比如对于第一张图,图像编码器提取对象的所有视觉特征,即Zero-Shot CLIP和CoOp(看b图)的注意图同时突出了人和摩托车。然而,下游任务要求输出类标签为“motorbike”

解决办法

将任务相关信息和视觉实例信息同时编码到视觉提示中,类感知的视觉提示是通过文本提示特征和视觉图像补丁嵌入之间的交叉关注来动态生成的。

流程解读

文本提示

Text Encoder g(·)的输入为t_i=\{u_1,u_2,..., u_M,c_i\},i =\{1,...,K\}其中c_i为类别token。为了将我们的CAVPT生成器的计算复杂性降低为常数,我们借助Zero-Shot CLIP Inference模块从Text Encoder 生成的Text Prompts Features(图的右侧)选择top-K_N(me:与类别相似度最高的
top-K_N个文本)文本提示特征。

视觉提示

这与VPT一样,采用的是VPT-deep

训练过程如下

s,P,E分别为CLS,视觉提示,图像编码

CAVPT Generator

结构如下:

me:核心就是将包含视觉提示的视觉输入[s,P,E]与Top-Kn Text Prompts Features 进行Cross Attention,最终与文本视觉相关联的 Class-Aware Visual Prompts,之后Class-Aware Visual Prompts与[s,P,E]一起通过transformer进行训练。

损失函数的设计

总损失如下:\alpha为超参数

下面的是来自CAVPT Generator的损失

摘要

随着大型预训练视觉语言模型(如CLIP)的出现,可转移表征可以通过及时调整适应广泛的下游任务。从存储在预训练模型中的一般知识中,提示调优探测下游任务的有益信息。最近提出了一种名为上下文优化(CoOp)的方法,该方法从语言方面引入了一组可学习向量作为文本提示。然而,单独调整文本提示符只能调整合成的“分类器”,而不能影响图像编码器的计算视觉特征,从而导致次优解。在本文中,我们提出了一种新的双模态提示调谐(DPT)范式,通过同时学习文本和视觉提示。为了使最终的图像特征更集中于目标视觉概念,我们在DPT中进一步提出了类感知视觉提示调优(CAVPT)方案。在该方案中,通过文本提示特征和图像补丁令牌嵌入之间的交叉关注,动态生成类感知的视觉提示,对下游任务相关信息和视觉实例信息进行编码。在11个数据集上的大量实验结果证明了该方法的有效性和泛化能力。我们的代码可在GitHub - fanrena/DPT: The official implementation of paper Dual Modality Prompt Tuning for Vision-Language Pre-Trained Model. If you find our code or paper useful, please give us a citation.中获得。

介绍

近年来,大规模视觉语言模型(VLM)的研究,如CLIP[1]和ALIGN[2],在表示学习方面取得了显著进展[3]-[5]。得益于大量的图像-文本数据,预训练的大规模视觉语言模型能够学习由自然语言生成的开放集视觉概念,从而进一步实现向下游任务的零样本转移。具体来说,视觉语言模型由图像编码器和文本编码器两部分组成。当出现新的分类任务时,可以通过将类的自然语言描述输入文本来作为文本编码器。然后,计算“分类器”与图像编码器生成的图像特征之间的相似度。

然而,将这些预训练的大规模视觉语言模型有效地应用于下游任务本身就存在挑战。最近的研究表明,“提示”是一种简单有效的方法[1],而设计一个合适的提示是一项非常重要的任务。它总是需要广泛的领域专业知识,并且需要大量的时间进行手动单词调优。通常,即使进行了大量调优,我们也不能保证获得的提示符对于下游任务来说是最优的。

最近关于视觉表征的提示学习的研究主要受到自然语言处理(NLP)中的一些提示调优方法的启发[6]-[8],例如具有代表性的CoOp[9]。这些方法提出了在提示中使用连续表示建模可学习上下文,然后在保持预训练参数固定的情况下,使用这些可学习提示以端到端方式训练模型。虽然这些方法取得了很大的成功,并显示出良好的性能,但它们只是为文本编码器学习提示。

从传统视觉识别的角度来看,典型的视觉模型大致可以分为特征提取模块和分类器模块。同样,将文本提示输入文本编码器的过程可以看作是分类器的综合,并且用图像编码器提取图像特征。 我们认为大规模预训练的视觉语言模型已经捕获了下游任务的大部分一般知识(视觉概念)。提示机制的作用是从预训练的模型中查询到适合下游任务的信息。如图1所示,对于具有多个视觉对象(概念)的输入图像,例如第一种情况包含一个人和一辆摩托车,图像编码器提取对象的所有视觉特征,即Zero-Shot CLIP和CoOp的注意图同时突出了人和摩托车。然而,下游任务要求输出类标签为“motorbike”——ground-truth注释。CoOp试图在保持给定的高亮“人”和“摩托车”视觉特征不变的情况下,通过单独调整“分类器”使模型输出“摩托车”。在视觉社区中有一个共识,那就是功能很重要[10]!因此,我们认为仅对文本编码器进行即时调整,而直接使用固定图像编码器进行下游任务是次优的。在本文中,我们在图像输入空间中引入了视觉提示,并提出了一种双模态提示调整(DPT)范式,通过同时学习文本和图像编码器的文本提示和视觉提示,从而通过调整“分类器”和“视觉特征”使预训练模型适应下游任务。

图1所示。图像编码器的注意图的可视化。(a)原始图像。(b)零射击CLIP/CoOp。(c)我们的DPT。图片选自牛津宠物和加州理工大学101。GT注释对象用红色框标记。

具体来说,对于基于vit的图像编码器中的视觉提示调谐,我们在保持预训练图像编码器固定的同时,在transformer的输入中引入少量可训练参数。插入可视提示可以直接调整图像补丁令牌嵌入。图像特征,通过自关注权值和吸收提示衍生的值向量。为了使预训练模型更好地转移到下游任务,我们进一步在DPT框架中引入了类感知视觉提示调谐(CAVPT)机制,以帮助最终获得的图像特征更集中于目标视觉概念。因此,我们的目标是将任务相关信息和视觉实例信息同时编码到视觉提示中,类感知的视觉提示是通过文本提示特征和视觉图像补丁嵌入之间的交叉关注来动态生成的,有望包含目标视觉对象更丰富的语义特征。因此,通过吸收图像补丁嵌入和我们的类件可视化提示信息来计算最终获得的图像特征,可以更专注于下游任务对应的类。最后,建议的总体DPT范例是通过文本提示、视觉提示和类感知的视觉提示同时学习的。如图1所示,使用我们的DPT调优预训练模型显示了一个更集中的任务感知视觉注意区域。

•提出的方法展示了一种新的双模态提示调整范式,通过同时从文本和图像编码器的末端学习视觉和文本提示来调整大型预训练的视觉语言模型。

•为了鼓励可视化提示显式地包含与下游任务相关的信息,我们进一步在DPT中引入了类感知的可视化提示。它是通过在文本提示功能和视觉标记嵌入之间执行交叉注意来动态生成的。

•在11个数据集上的大量实验结果证明了所提出方法的有效性,并显示了其与其他提示调优方法的巨大优势,以及其泛化能力。

本文的其余部分组织如下。第二部分介绍了相关工作。第三节详细阐述了我们提出的方法。在第四节中,我们报告了在11个数据集上进行的综合实验结果,证明了我们的方法的有效性。最后,第五节对我们的工作进行了总结。

3.方法

在本节中,我们首先回顾CLIP模型。然后,我们详细阐述了所提出的双模态提示调优(DPT)范式的每个组件,包括文本提示、视觉提示和类感知视觉提示。我们提议的DPT的框架如图2所示。最后,我们给出了DPT的损失函数和预热策略来加速训练过程。

A.对比语言图像预训练(CLIP)模型

CLIP模型旨在对齐图像特征空间和文本特征空间,使模型具有向下游任务的零射击转移的能力。CLIP由两个编码器组成:一个是为图像设计的,另一个是为文本设计的。文本编码器采用变压器[51]对文本信息进行编码,图像编码器可以是CNN模型,如ResNet[5],也可以是视觉变压器,如ViT[52]。在我们的方法中,为了兼容[23]中的视觉提示,我们选择了ViT作为图像编码器。

CLIP拥有4亿对图像文本样本,在对比学习框架下进行训练,其中将关联的图像和文本作为正样本,而将非关联样本作为负样本。之后,预训练的CLIP模型的所有参数被冻结,用于下游任务,不进行任何微调。在下游任务中,通过嵌入目标数据集的类名,将手工制作的提示输入文本端,以合成零射击线性分类器。

以分类任务为例,“[CLASS]”令牌可以先通过模板进行扩展,如“一张[CLASS]的照片”。然后,将该句子视为提示符,并由文本编码器进行编码,以导出权重向量w_i,i =\{1,...,K\},其中K为类别的总数。同时,图像编码器获得图像特征x。预测概率可由

其中sim(·,·)表示余弦相似度的计算,τ为CLIP

B.文本提示和视觉提示

文本提示

众所周知,为CLIP模型手工制作提示可能需要相当长的时间,并且需要专业的单词调优,因为措辞上的细微变化可能会导致显著的性能下降。CoOp[9]受NLP模型的提示调优的启发,引入了一组可调词嵌入向量来学习对文本端的机器有利的提示,我们称之为文本提示。设\{u_1,u_2,...,u_M\}表示M个可学习的上下文向量,文本类令牌的词嵌入用c_i, i =\{1,...,K\};然后是第i类别的提示可以表示为t_i=\{u_1,u_2,..., u_M,c_i\},i =\{1,...,K\}。通过将t_i转发到文本编码器g(·)中,我们可以得到第i个视觉概念的分类权向量。相应的预测概率可由

式中,x表示提取的图像特征,g(·)表示文本编码器。

视觉提示

对于视觉语言模型,有两个用于视觉和语言模态的编码器。仅调优文本提示不足以缩小预训练任务和下游任务之间的差距,从而导致次优结果。受视觉提示微调(visual prompt tuning, VPT)[23]的启发,我们在CLIP模型的图像编码器中引入了视觉提示。首先将图像patch
\{I_j\in R^{3\times h \times w}|j\in N,1\le j\le N_p\}嵌入到d维潜在空间中,如下所示:

E_l=\{e^j_l\in R^d|j\in N,1\le j\le N_p\},P_l=\{p^i_l\in R^d|i\in N,1\le i\le P\}分别表示第i个transformer层的图像贴片嵌入集合和视觉提示集合。假设s_l\in R^d是图像编码器中的可学习类令牌,与文本提示中使用的文本类令牌不同,后者是与类别相关的词嵌入。在[23]中有两种版本的视觉提示,VPT-Shallow和VPT-Deep。我们从经验上发现,VPT-Deep可以获得更好的性能(见表1),因此我们在第四节中将VPT-Deep纳入我们的实现中。

每个transformer层都引入了视觉提示,即:

一般来说,表现与提示深度呈正相关。因此,我们在模型中使用了VPT-Deep。然后用线性投影层LP对s_L进行投影,得到最终的图像特征。为简单起见,图像特征提取的整个过程可以表示为

式中f(·)为图像编码器。

需要注意的是,图像编码器的计算过程,即ViT模型,可以看作是一个全局场景推理的过程,它将图像patch嵌入中的视觉概念逐层池化。借助视觉提示,通过各变压器层的自关注操作,可以在sl中进一步突出下游任务对应的目标视觉概念。通过在每个变压器层中插入视觉提示,可以通过两种方式影响s_l的自注意操作,因为键和值都是通过视觉提示预先添加的:1)可以影响注意权重,使sl更多地集中在包含目标概念的图像补丁嵌入上;2)视觉提示也是自注意操作的价值向量,因此sl可能会吸收视觉提示学习到的额外信息。

然而,朴素的视觉提示被设计为无约束的可学习向量,它们只能通过对下游任务数据集的提示进行调优来隐式地学习一些下游任务相关的信息。在这项工作中,我们提出了类感知视觉提示调优(CAVPT),通过利用来自文本端的任务相关信息和来自视觉端的实例相关信息来生成视觉提示

C.类感知视觉提示调优

类感知的视觉提示旨在显式地编码与任务相关的信息。我们的CAVPT生成器接受两方面的输入,即来自视觉方面的实例信息和来自文本方面的任务相关信息。文本编码器使用所有文本类令牌计算出的文本提示特性很好地表示了与任务相关的信息。

然而,当我们将带有所有文本类令牌的文本提示特征输入到CAVPT生成器中时,CAVPT生成器的计算复杂度随着每个下游任务上的类数量线性增加。为了将我们的CAVPT生成器的计算复杂性降低为常数,我们借助Zero-Shot CLIP Inference模块(图2的右侧)选择top-K_N文本提示特征。请注意,最终性能对K_N不敏感,当设置不同的K_N时,最终性能仅波动0.1% ~ 0.2%。然后,将
top-K_N文本类令牌[class]的文本提示输入文本编码器,生成K_N特征向量,即
g_j\in R^D,1\le j\le K_N,其中编码任务相关信息。

图2所示。我们提出的DPT方法的总体体系结构。它由三个可学习的组件组成:文本提示、视觉提示和由类感知视觉提示调优(CAVPT)生成器模块生成的类感知视觉提示,其详细架构如图3所示。

通过在来自文本端的文本提示特性和来自可视端的变压器块的输入之间执行交叉关注,动态地生成一个类感知的可视提示,如图3所示。

图3所示。所建议的类感知可视化提示调优(CAVPT)生成器模块的详细体系结构。

对全连通层进行映射后,可得到K_N查询向量q_j\in R^d,1\le j\le K_N。关键向量和值向量
k\in R^{n\times d}均来自于相应的视觉变换层的输入,包括图像patch嵌入、图像类令牌嵌入、视觉提示(n为其总数)。我们提出的第l层的类感知视觉提示符\tilde P^j_l \in R^d计算为

式中LN(·)表示层归一化。W_q\in R^{d\times d_k},W_k\in R^{d\times d_k},W_v\in R^{d\times d_k}为交叉关注参数。

为了保证类感知视觉提示的效果,我们在LN层的KN输出上额外引入K-way分类器,并对K-way logits进行交叉熵损失,如下所示:

其中p_iLN(o^j_l)分类的第i个logit, K为类数,y为对真目标类的one-hot编码。注意,只有从q_j派生的o^j_l(对应于ground-truth目标类)将被分类。

由于嵌入更深层次的图像类令牌通常包含更多与任务相关的语义信息,因此在我们的实现中,类感知视觉提示仅应用于图像编码器的最后几层。

D.DPT的训练

采用交叉熵损失最小化ground-truth注释与式(2)计算的预测概率之间的距离。

式中,y为真值标注,p(y=i|x^n)为式(2)的预测概率,x”为最终得到的图像特征,

总损失函数将两个交叉熵损失与一个平衡超参数α结合如下:

E.温和策略

为了加速训练过程,我们在训练的前几个阶段采用了一般知识引导的热身策略。考虑到CLIP模型存储了一般知识,我们训练我们的模型学习零样本CLIP。我们在前几个epoch使用的损失函数可以描述如下:

其中L_{coop}是用于CoOp训练的损失函数,L_{vpt}是用于VPT训练的损失函数,L_{ce}是用于VLP训练的损失函数。β是一个平衡超参数。对于L_{coop},我们使用交叉熵损失来最小化ground-truth注释与由式(2)计算的预测概率之间的距离。

对于L_{vpt},预测概率由式(1)代替式(2)计算。

通过将训练前几次的损失函数L_{ce}转化为式(12),我们利用一般知识指导热身过程。在训练过程中,本文提出的DPT在对文本提示、视觉提示和生成类感知视觉提示的参数进行优化的同时,保持图像和文本编码器的整个参数不变。

F.关于CAVPT的讨论

图3给出了所提出的类感知可视化提示的详细计算过程。如图3所示,CAVPT生成器接受两种类型的输入。来自文本端的文本提示功能包括任务相关信息,而来自图像端的图像补丁嵌入表示可视化实例信息。首先,CAVPT生成器在文本提示特征和图像补丁嵌入之间进行交叉关注,其中从文本提示特征映射查询向量,而从图像补丁嵌入派生键和值。通过交叉注意操作,那些包含更多语义信息的图像补丁嵌入将更加突出,这些图像补丁嵌入属于下游任务类的对象。因此,交叉注意的输出将包含更多的ground-truth对象的特征。然后,我们的类感知的可视化提示被进一步生成,附带一个类似于典型转换器层的“添加和规范”操作。由于我们的类感知视觉提示包含了更丰富的ground-truth目标对象的语义特征,因此通过吸收图像补丁嵌入和我们的类感知视觉提示的信息计算得到的最终图像特征可以更集中于下游任务对应的类。

4.实验

A.数据集和实现细节

为了评估我们方法的有效性,我们在11个分类数据集上进行了实验,分别是EuroSAT[53]、Caltech101[54]、OxfordFlowers[55]、Food101[56]、fgvc - aircraft[57]、DTD[58]、OxfordPets[59]、StanfordCars[60]、ImageNet1K[61]、Sun397[62]和UCF101[63],如[1]、[9]所示。这些数据集涵盖了广泛的计算机视觉任务,包括通用对象的图像分类,细粒度分类,卫星,纹理,场景理解和动作识别图像。

遵循CLIP中常用的少枪评估方案[1],我们也采用1、2、4、8和16枪进行模型训练,并在完整的测试数据集上进行测试。为了公平比较,报告的结果是三次运行的平均值。

所有实验均采用viti - base /32作为骨干网。所有实验均基于CoOp[9]和CLIP[1]的官方发布代码进行。对于VPT,每层网络的提示符长度设置为10,初始化方式与CoOp中的文本提示符相同[9]。在模型训练过程中,我们采用SGD优化方法,学习率采用余弦规则衰减。VPT的最大历元与CoOp相同[9]。在前10个epoch采用热身技术,在VPT上固定学习率为10−5。首先在{0.01,0.001,0.0001,0.00001}中搜索VPT的学习率,所有实验的视觉提示保持不变。对于文本提示,我们遵循CoOp[9],上下文长度为16。

对于我们提出的VLP和DPT方法,除了DPT中的Caltech101和OxfordPets,在16/8/4/2次拍摄时,最大epoch数设置为100,1次拍摄时最大epoch数设置为60 (ImageNet的最大epoch数设置为20),DPT中的Caltech101和OxfordPets在16次拍摄时设置为60。预热技术与CoOp和VPT中相同(两端ImageNet的预热epoch设置为1)。KN设置为10。将CAVPT插入到图像编码器的最后一层。

平衡α设为0.3,β设为0.1。对于VLP和DPT的早期训练,使用一般知识作为前30个epoch (ImageNet为10个epoch)的指导。

B.与现有方法的比较

现有具有代表性的提示调优方法包括著名的CoOp方法[9],以及用于零弹分类的CLIP模型[1]本身(即zero-shot CLIP)。因此,我们采用这两种模型作为我们的主要比较方法。

由于与CoOp中单独的文本提示相比,我们的DPT额外引入了视觉提示和类感知的视觉提示,为了揭示每种成分对性能改进的贡献,我们在DPT之外额外实现了VPT和VLP,具体如下:•VPT标准用于将单纯的视觉提示单独引入CLIP模型的视觉端[1]并手工制作文本端采用文字提示,例如“一张[班级]的照片”。

•VLP表示同时学习视觉(V)和文本(L)提示符的双模态提示调优范式,其中文本提示符的设计方式与CoOp[9]相同,视觉提示符与VPT[23]中的VPT- deep完全相同。

•DPT表示我们将CAVPT进一步集成到基于VLP的图像编码器中。

总体评估结果如图4所示,报告了所有few-shot设置下11个数据集的分类准确率。与基线方法相比,我们的DPT在11个数据集上的平均性能优于基线方法。图4和表1清楚地显示了以下内容:1)DPT大大优于CoOp和零射击CLIP。性能的提高基本上与射击次数成正比。具体来说,在11个数据集的16发射击设置下,DPT比零射击CLIP平均高出17.6%,比CoOp平均高出3.53%。结果验证了所提出的DPT范式的优越性。

2) VPT与CoOp的结果比较,VPT的平均效果优于CoOp。在16次射击设置下,VPT在所有11个数据集上平均可以获得1%的性能提升。结果表明,从图像端调优视觉提示而不是文本提示可以获得更有效的结果。值得注意的是,VPT和CoOp在不同的数据集上得到的结果不一致,这表明调优视觉提示和文本提示可能具有互补的效果。3)将VLP与VPT和CoOp的结果进行比较,VLP的效果优于VPT和CoOp,这表明对下游任务的双模态提示进行视觉和文本两端的调优明显优于对任何单模态提示进行调优。4)在类感知视觉提示的帮助下,我们的DPT的结果与VLP相比有明显的提高。具体而言,在16次射击设置下,DPT在11个数据集上平均比VLP获得1%的性能提升,这表明我们的CAVPT具有重要意义。

图4所示。1、2、4、8、16个镜头在11个数据集上的主要结果,vitb /32。注意,我们还将我们的方法与CPT[33]在平均准确率上进行了比较。

C.域泛化

在本节中,我们的目标是揭示与基线方法相比,我们的方法对分布位移的鲁棒性。

数据集

按照CoOp[9]中的设置,我们使用ImageNet作为源数据集。目标数据集为ImageNetV2[64]、ImageNet-Sketch[65]、ImageNet-A[66]、ImageNet-R[67]。

设置

我们选择CoOp和VPT作为我们的基准方法。三种方法均在源数据集上进行训练,每类训练1个样本,在目标数据集上进行零射击推理。

结果

如表三所示,我们的方法在ImageNet、ImageNetV2、ImageNetSketch和ImageNet- r上达到了最好的性能,而我们的方法在ImageNet- a上的效果较差,因为ImageNet- a包含自然的对抗性样例。这表明我们的方法比基线方法具有更强的鲁棒性,但与CoOp相比,在面对对抗性示例时往往更脆弱。相比之下,VPT模型在目标数据集上得到的结果较差,这表明VPT模型的鲁棒性不如CoOp和我们的方法。

D.进一步分析

AVPT插入深度分析

CAVPT是一个即插即用模块,可用于ViT骨干的任意层。为了研究最适合CAVPT的层,我们在所有11个数据集上进行了自底向上和自顶向下两种不同深度值的综合实验,即自顶向下为{1→12,4→12,8→12,12},自下而上为{1,1→4,1→8,1→12},在VLP模型之上。另外,通过共享CAVPT参数,以自顶向下的方式进行了跨层共享CAVPT的实验设置。如图6所示,自顶向下方式的结果要比自底向上方式的结果好得多,并且Transformer的最后一层是最适合CAVPT的层,这表明CAVPT在更深的层中起着更重要的作用。此外,通过比较共享CAVPT和普通CAVPT,共享CAVPT可以在参数较少的情况下获得稍好的结果。

CAVPT长度分析

为了探讨合适的CAVPT长度,我们对不同长度的CAVPT进行了综合实验,即:{0,1,5,10,20,50,100}。长度为0表示该方法退化为VLP,但在ViT骨干的最后一层没有可视提示。对于一些数据集,以EuroSAT[53]为例,它只包含10个类,不足以获得10个以上的cavpt。因此,当所需的cavpt数量大于类的个数,我们将类的个数作为CAVPT的长度,得到相应的结果。如表5所示,将长度设置为10可以获得最佳精度。

E.注意图的可视化

图7所示。不同注意图可视化方法的比较。(a)原始图像。(b)零射击CLIP/CoOp。(c) VPT-Deep。(d)车牌区域。DPT (e)。GT注释对象用红色框标记。最后两行是模型未能关注GT注释对象的失败情况。

结论

在本文中,我们提出了一种新的双模态提示调整范式,通过同时学习视觉和文本提示,将大型预训练的视觉语言模型调整到下游任务。为了使最终获得的图像特征更集中于目标视觉概念,我们进一步将下游任务相关信息和图像实例信息编码到视觉提示中,并提出了类感知的视觉提示,通过文本提示特征和图像标记嵌入之间的交叉关注动态生成。在11个数据集上的大量实验结果证明了该方法的有效性,并显示了其与其他快速调优方法的巨大优势。

参考资料

论文下载

https://arxiv.org/pdf/2208.08340.pdf

https://arxiv.org/pdf/2208.08340v2.pdf

https://arxiv.org/abs/2208.08340v4

代码地址

GitHub - fanrena/DPT: The official implementation of paper Dual Modality Prompt Tuning for Vision-Language Pre-Trained Model. If you find our code or paper useful, please give us a citation.

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

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

相关文章

ClickHouse 数据类型、表引擎与TTL

文章目录 数据类型注意事项 表引擎1.TinyLog 引擎2.MergeTree 引擎3.ReplacingMergeTree 引擎4.AggregatingMergeTree 引擎5.SummingMergeTree 引擎6.CollapsingMergeTree 引擎7.Distributed 引擎 TTL列级 TTL表级TTL 数据类型 ClickHouse 数据类型Java 数据类型数据范围UInt8…

在控制台实现贪吃蛇

在控制台实现贪吃蛇 前备知识Win32APICOORD这个结构体的声明如下:GetStdHandle 函数GetConsoleCursorInfo 函数SetConsoleCursorInfo 函数 SetConsoleCursorPosition 函数getAsyncKeyState 函数 控制台窗口的大小以及字符打印介绍控制台中的坐标宽字符及本地化介绍s…

使用 Gradio 的“热重载”模式快速开发 AI 应用

在这篇文章中,我将展示如何利用 Gradio 的热重载模式快速构建一个功能齐全的 AI 应用。但在进入正题之前,让我们先了解一下什么是重载模式以及 Gradio 为什么要采用自定义的自动重载逻辑。如果你已熟悉 Gradio 并急于开始构建,请直接跳转到第…

UE4 拍摄、保存并浏览相册

效果: 1.新建CameraActor类 2.修改截图保存路径 3.编写BP_Camera蓝图 注意路径 Save Image函数要在执行拍照和BeginPlay事件执行一次 按钮执行拍摄事件 3.编写UMG蓝图 技巧:让Index加1、减1循环赋值 4.把BP_Camera挂在玩家上

SVN--基本原理与使用(超详细)

目录 一、SVN概述二、SVN服务端软件安装三、SVN服务端配置四、SVN客户端软件安装与使用五、SVN三大指令六、SVN图标集与忽略功能6.1 图标集6.2 忽略功能 七、SVN版本回退八、SVN版本冲突九、SVN配置多仓库与权限控制9.1 配置多仓库9.2 权限控制 十、服务配置与管理十一、模拟真…

新建云仓库

1.GitHub新建云仓库: LICENSE:开源许可证;README.md:仓库说明文件;开源项目;cocoaPodsName.podspec: CocoaPods项目的属性描述文件。 2.Coding新建云仓库: 备注: Coding新建项目:

每日一题(力扣45):跳跃游戏2--贪心

由于题目已经告诉了我们一定可以跳到,所以我们只需去考虑前进最快的方法。即 判断当前下一步能跳的各个位置中,哪个能带你去去向最远的地方(why? 因为其他位置所能提供的最大范围都没最远那个大,所以最远的那个已经可以…

The Log-Structured Merge-Tree (LSM-Tree) 论文阅读笔记

原论文:The Log-Structured Merge-Tree (LSM-Tree) LSM-Tree的简介和关键技术要点 LSM-Tree(Log-Structured Merge-Tree)是一种为高吞吐量读写操作优化的数据结构,特别适用于写入密集型的应用场景。它由Patrick O’Neil等人开发…

Vue 组件分类、局部注册和全局注册

文章目录 背景知识组件分类安装 vue-cli示例设置组件局部注册设置组件全局注册 背景知识 开发 Vue 的两种方式: 核心包传统开发模式:基于 html / css / js 文件,直接引入核心包,开发 Vue。工程化开发模式:基于构建工…

国产麒麟系统下打包electron+vue项目(AppImage、deb)

需要用到的一些依赖包、安装包以及更详细的打包方法word以及麒麟官网给出的文档都已放网盘,链接在文章最后!!!!!!!!!!!!&a…

13 c++版本的五子棋

前言 呵呵 这大概是 大学里面的 c 五子棋了吧 有一些 面向对象的理解, 但是不多 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 然后 貌似 放在 win10 上面执行 还有一些问题, 渲染的, 应该很好调整 五子棋 #include<Windows.h> #include<io…

elaticsearch windows安装

es下载地址 https://www.elastic.co/cn/downloads/elasticsearch https://www.elastic.co/cn/downloads/past-releases#elasticsearch 在这里插入图片描述 下载直接解压&#xff0c;解压后目录 双击bin目录下的elasticsearch.bat开启服务 注意&#xff1a;9300 端口为 Elas…

阶跃星辰:探索智能科技的星辰大海

引言 在当今快速发展的科技时代&#xff0c;人工智能已经成为推动社会进步的重要力量。阶跃星辰&#xff0c;正是在这一背景下诞生的。 阶跃星辰是一家专注于通用人工智能探索的公司&#xff0c;成立于2023年4月。该公司的创始团队由一群对人工智能充满热情和渴望的人组成&am…

半导体行业的隐形翅膀:国产RFID技术突破封锁,助力生产

半导体行业的隐形翅膀&#xff1a;国产RFID技术突破封锁&#xff0c;助力生产 RFID技术&#xff0c;简单来说&#xff0c;就是一种自动识别技术&#xff0c;通过无线电波实现对标签信息的读取和写入。而这些标签&#xff0c;就像给物品贴上的小标签&#xff0c;上面存储着它们…

《系统架构设计师教程(第2版)》第15章-面向服务架构设计理论与实践-05-SOA设计模式

文章目录 1. 服务注册表模式1.1 服务注册表1.2 SOA治理功能1.3 注册表中的配置文件 2. 企业服务总线&#xff08;ESB&#xff09;模式3. Synchro ESB3. 微服务模式3.1 概述3.2 微服务架构模式方案3.2.1 聚合器微服务1&#xff09;概述2&#xff09;几种特殊的聚合微服务 3.2.2 …

C++解方程组的库

解决多元多次方程组的问题&#xff0c;你可以考虑以下几个C库&#xff1a; Eigen: Eigen库是一个高性能的C模板库&#xff0c;用于线性代数运算。它提供了强大的矩阵运算功能&#xff0c;可以用来解多元一次方程组。对于多次方程组&#xff0c;你可能需要结合Eigen和一些数值优…

javascript(第三篇)原型、原型链、继承问题,使用 es5、es6实现继承,一网打尽所有面试题

没错这是一道【去哪儿】的面试题目&#xff0c;手写一个 es5 的继承&#xff0c;我又没有回答上来&#xff0c;很惭愧&#xff0c;我就只知道 es5 中可以使用原型链实现继承&#xff0c;但是代码一行也写不出来。 关于 js 的继承&#xff0c;是在面试中除了【 this 指针、命名提…

计算机网络-IS-IS路由计算

前面已经学习了建立IS-IS邻接关系和同步LSDB&#xff0c;然后基于此路由器会进行路由计算。 一、路由计算 因为IS-IS路由器有不同的级别&#xff0c;只维护自身级别的LSDB&#xff0c;因此就是Level-1只有区域内的路由信息&#xff0c;Level-2有Level-2的路由信息&#xff0c;L…

开源协议与商业许可:选择与遵循

文章目录 一、开源协议1.1 MIT许可证&#xff08;MIT License&#xff09;1.2 BSD许可证&#xff08;BSD License&#xff09;1.3 Apache许可证 2.0&#xff08;Apache License 2.0&#xff09;1.4 GNU宽松通用公共许可证&#xff08;GNU Lesser General Public License&#x…

C++笔试强训day7

目录 1.字符串中找出连续最长的数字串 2.岛屿数量 3.拼三角 1.字符串中找出连续最长的数字串 链接 我的思路很简洁&#xff0c;就是双指针遍历&#xff0c;然后不断更新左位置left和右位置right和长度len。 然后我写代码的时候代码思路没跟上原本思路&#xff0c;直接把所有…