[论文精读]序列建模使大视觉模型的规模化学习成为可能

本博客是一篇最新论文的精读,论文为UC伯克利大学及约翰·霍普金斯大学相关研究者新近(2023.12.1)在arxiv上上传的《Sequential Modeling Enables Scalable Learning for Large Vision Models》 。知名科技新媒体“新智元”给与本文极高评价,并以《计算机视觉GPT时刻!UC伯克利三巨头祭出首个纯CV大模型,推理惊现AGI火花》为题进行了专题报道。

导读:

  • 本文提出了一种新的序列建模方法,可以在不使用任何语言数据的情况下,通过大量视觉数据训练出大视觉模型(LVM)。方法的关键是提出“视觉句子”的概念,它可以表示原始图像、视频及各种带标注的数据,并转换成统一的序列格式。在420亿个token(相当于16亿幅图像)的数据上训练后,LVM展现出随着模型和数据规模增长而scaling的良好特性。同时,许多不同的下游视觉任务可以通过在测试时设计合适的视觉提示来“解决”。
  • 实验结果表明,LVM从无标注图像、视频及含标注数据的多样性中受益明显。此外,LVM还展现出进行一般视觉推理的潜力,如处理分布之外的数据并执行新任务,但还有待进一步探索。当前的一些局限包括:视觉提示定义任务时常常欠约束,请求的任务可能超出模型能力,图像tokenize存在问题等。尽管LVM是迄今最大的视觉模型之一, 但与语言模型相比仍较小,真正的泛化仍有待研究。
  • 总体而言,基于“视觉句子”理念的序列建模为构建单模型执行多任务的大规模视觉系统提供了有前景的途径。

摘要

我们提出了一种新的序列建模方法,这种方法无需使用任何语言数据就可以学习大视觉模型(Large Vision Model,LVM)。为此,我们定义了一种通用格式:“视觉句子(visual sentences)”,通过这种格式,我们可以将原始图像和视频以及语义分割和深度重建等有标注数据源表示成序列,而无需任何像素之外的元知识。一旦这种各种视觉数据(包括4,200亿个tokens)表示为序列,模型就可以通过下一token的预测来最小化交叉熵损失(cross-entropy loss)进行训练。通过在各种规模的模型体系结构和数据多样性上进行训练,我们提供了模型可以有效扩展的实验证据。通过在测试时设计合适的视觉提示(visual prompts),我们可以解决许多不同的视觉任务。

引言

G P T GPT GPT [11]和 L L a M A LLaMA LLaMA [80]这样的大语言模型(LLM)风靡全球。那么构建一个大视觉模型(LVM)需要什么?从动物世界中,我们知道视觉能力与语言无关。特别是,许多实验表明,非人灵长类动物的视觉世界与人类惊人地相似。因此,尽管像 L L a V A LLaVA LLaVA [54]这样的视觉语言模型(vision-language models)空间很有趣,很值得探索,但在本文中,我们试图回答一个不同的问题——仅从像素出发,我们能走多远?

我们在LVM中试图模仿的当代LLM的关键特征是:1)在大数据环境下的规模化学习,2)通过提示(上下文学习)灵活地指定任务。我们如何实现这一点?和往常一样,有三个主要组成部分需要确定:

数据:我们想利用视觉数据的显著多样性。首先是原始的无标注图像和视频。此外,我们想利用过去几十年中产生的各种带标签的视觉数据源的多样性——语义分割、深度重建、关键点、3D对象的多视图等。我们定义了一种通用格式“视觉句子”,可以在不需要任何像素之外的元知识的情况下表示这些不同的注释。我们的训练数据集总共包含16亿张图像或视频帧。

架构:我们使用一个大的transformer架构(30亿个参数)在视觉数据上训练,这些数据表示为token序列: 使用学习得到的tokenizer将每个图像映射到256个矢量量化token的字符串。

损失函数:我们汲取自然语言社区的灵感,其中masked token modeling已经为sequential autoregressive prediction让路。一旦图像/视频/标注图像都可以表示为序列,我们就可以训练模型以最小化预测下一个token的交叉熵损失。

通过这个非常简单的设计,我们展示了一些值得注意的性质:

  • 随着模型大小和数据大小的增加,可以观察到适当的scaling行为。

  • 现在可以通过在测试时设计合适的提示来“解决”许多不同的视觉任务。尽管与专用特定训练模型的结果相比,结果的表现还不高,但是一个单一的视觉模型可以解决这么多任务,这是非常令人鼓舞的。

  • 我们看到无监督数据对各种标准视觉任务的性能有明确的好处。

  • 我们看到了进行一般视觉推理的能力的迹象——处理分布之外的数据并执行新任务。但尚需要进一步的研究。

相关工作

预训练视觉模型。使用预训练模型(例如在ImageNet上预训练的AlexNet [46])的价值可以追溯到2015年的R-CNN [35],从那时起它就成为计算机视觉的标准实践。自监督预训练则是一种可以大大增加预训练中可用数据量的方法[17,26,38,62,63,99]。不幸的是,这并没有取得很大成功,可能是因为当时的基于CNN的体系结构没有足够的容量来吸收数据。随着transformer [84]的引入,其容量远高于CNN,研究人员重新审视了自监督预训练,结果表明基于transformer的 masked im- age reconstruction 方法(如BEiT [7]、MAE [39]、SimMIM [91])的表现远远优于其基于CNN的对应方法[63]。然而,尽管最近取得了成功,当前仅视觉预训练的模型在像LAION [72]这样的大型数据集上scaling up仍有困难。

多任务学习和上下文学习。 从经典的每个任务一个模型的设置出发,计算机视觉正在慢慢向单个模型执行多个不同任务的方向发展。存在各种多任务学习方法[25,41,44,73,97],但它们通常限于固定的、预定义的任务数目。更近期的方法受大语言模型中上下文学习的启发,摒弃了任何任务的概念,而是让模型直接从输入提示中推断任务。例如,视觉提示[8,87]在测试时采用任务输入/输出示例对和query图像,将它们连接成一个2×2图像,并使用图像补全生成所需的输出。 但由于图像补全是使用MAE [39]的变体执行的,因此这些方法继承了MAE在scaling上的同样问题。

自回归视觉模型。 使用自回归模型合成视觉数据的想法至少可以追溯70年。 受香农使用 N N N-grams合成语言的启发[74,75], 从Attneave 1954年的开创性论文[5]开始,一系列工作将这一想法应用于序列的合成像素[29,32,40,65]、图像块[28]、视频帧[69]和运动捕捉数据[4,45,49]。 当深度模型流行起来时,更新的工作用RNN或CNN替换了 N N N-grams 来合成像素[81,82]。 最近,基于transformer的自回归视觉生成方法也被提出[16,30,94,96],并且与语言相结合,已经展示了令人印象深刻的图像合成结果,例如Parti [95]。

数据

“数据!数据!数据! 没有泥土,我无法制造砖石!”
— 夏洛克·福尔摩斯

任何大规模预训练模型的关键要求是它必须在大量数据上进行训练。 对于语言模型,获得数量极大且极为多样化的数据集相对比较容易。例如,流行的Common Crawl[1] 包含来自整个网络的250亿个网页,极为多样化,并包括诸如语言翻译、问答等“自然演示”。 在计算机视觉方面,我们距离拥有可比规模和多样性的数据源还相距甚远。

我们工作的一个核心贡献是向汇编这样一个数据集迈出了第一步,我们称之为统一视觉数据集$v1 (Unified Vision Dataset v1,UVDv1)。为构建该数据集,我们利用了许多不同来源的视觉数据:(1)无标注图像,(2)含视觉标注的图像,(3)无标注视频,(4)含视觉标注的视频,以及(5)3D合成物体。无标注图像占我们的数据的80%以上,捕捉了我们的视觉世界中的很大部分,提供所需的多样性,代价是质量较低。带标注的图像分布更加约束,但质量通常更高。视频数据的约束性甚至更强(典型的,以人类为中心的活动为主), 但它是宝贵的时序数据来源。 3D合成物体渲染的多样性最低,但可以为3D结构的行为提供有价值的提示。重要的是,UVDv1 是一个纯粹的视觉数据集,不包含非视觉元数据(例如文本)。 UVDv1 总共包含 16.4 亿张图像

另一个与大模语言模型的重要区别是,语言数据具有自然的、统一的一维结构 —— 文本流。不幸的是,这在视觉数据的情况并非如此,不同来源的数据具有不同的结构。在这项工作中,我们提出视觉句子(visual sentences)作为统一的视觉数据单元,这使我们能够从各种来源进行规模化模型训练。简单来说,视觉句子是一个序列,包含一个或多个图像,后跟句子结束(end-of-sentence,EOS) token。

在这里插入图片描述

图1显示了如何将各种数据源划分为视觉句子。具体而言:

单个图像。单个图像本身代表了最简单的视觉句子形式 —— {image, EOS}。我们使用来自LAION 5B [71]数据集中过滤后的1.49亿张图像子集[88]。这是我们数据中最大的一部分,占88.5%。

图像序列。图像序列是一种自然的视觉语句形式。我们通过从各种现有数据集中获取视频数据来创建这样的序列[12,13,22,36,37,47,51,52,56,58-60,64,68,76-78,92,93]。通过三种不同的步幅(10、20和30)随机对视频进行采样,形成16帧的视觉语句。

此外,我们利用Objaverse数据集[23]中的合成3D对象为各种物体生成以物体为中心的多视图序列。 对于每个物体,我们在物体中心与相机之间采样一个从1.5到2.2的半径长度,并采样一个从-45度到45度的常量仰角,然后通过改变方位角以15度的步长遍历物体的不同视图并渲染24个视图。我们总共渲染了42000个这样的训练序列和8000个测试序列。最后,我们也可以将属于相同语义类别的图像表示为(部分)序列。我们使用ImageNet中的类别,将属于同一类别的图像组(2、4、8或16个)连接成16幅图像长的视觉语句。

含标注的图像。 为了以统一的方式处理不同类型的图像标注,我们选择将所有标注表示为图像。某些数据类型(例如语义分割图[100]、边缘图[79]、深度[66]和法线图像[6])已经以这种方式表示。对于其他类型,我们为每种特定的标注类型应用定制的方法:

1)目标检测:我们通过在每个对象周围绘制颜色编码的边界框来创建标注,遵循[15]中的方法;

2)人体姿态:人体骨架在像素空间中渲染,遵循OpenPose格式,利用MMPose[20];

3)深度估计、表面法线和边缘检测:给定ImageNet和COCO图像,我们根据[55]中的协议生成标签;

4)风格迁移[9]、去雨[98]、去噪[85]、低光照增强[89]和立体数据集[34]: 这些都表示为图像对(例如输入/输出)。

5)着色:我们将ImageNet图像转换为灰度图像,生成图像对。

6)补全:该过程涉及在图像中随机添加黑色框以模拟损坏,生成图像对。

对于上述所有标注类型, 我们可以通过将8个属于相同标注类型的图像对连接成一个16幅图像的视觉语句来创建视觉语句。对于包含相同图像的 k k k种不同注释的数据集,我们使用不同的方法:对于每组 1 + k 1 + k 1+k幅图像(输入及 k k k个标注),我们随机选择 m m m个元素,其中 m < = n + 1 < = 16 m<=n+1<=16 m<=n+1<=16。然后将这些 m m m元组连接成形成视觉序列。

含标注的图像序列。在将含标注的视频数据(VIPSeg [57]、Hand14K [31]、AVA [60]、JHMDB [42])转换为视觉语句时,我们应用两种互补的策略。第一种与我们处理含成对标注的图像数据的方式类似:每个视觉语句都是通过连接帧及其标注构建的 —— {frame1,annot1,frame2,annot2,…}。第二种方法涉及组合多个帧,后跟对应的标注 —— {frame1,frame2,annot1,annot2,…}。

我们在附录中详细总结了UVDv1的所有数据源、标注类型和数据统计信息。

方法

在这一节中,我们描述了我们的自回归大视觉模型的设计。与自然表现出离散序列结构的文本数据不同,它不是直接对视觉句子中的图像像素进行建模。在这项工作中,我们采用两阶段方法:
1)训练一个大规模的视觉tokenizer(作用于单个图像上)将每个图像转换成一系列视觉tokens;
2)在视觉句子上训练一个自回归transformer模型,每个句子表示为一系列token。我们在图2中总结了我们的方法。
在这里插入图片描述

图像Token化

尽管连续图像之间的视觉语句展现出序列结构,但我们在图像内部没有这样的自然序列结构。因此,为了将transformer模型应用于图像,先前的工作通常执行以下一种操作:要么按扫描线顺序将图像划分成patches, 并将其视为一个序列[27],要么使用预训练的图像tokenizer(如VQVAE [83]或VQ-GAN [30])将图像特征聚类成一个离散tokens的网格, 这些tokens再次按扫描线顺序转换为序列。我们采用后一种方法,因为模型的离散分类输出自然形成一个概率分布,人们可以轻松对其进行采样,从而在视觉语句内灵活的条件生成新的图像。

具体地,我们采用Esser等人[30]提出的VQGAN模型进行语义token生成。该框架由编码和解码机制组成,具有量化层,该量化层将输入图像分配给从已建立的codebook中获得的一系列离散tokens。我们的编码器和解码器完全由卷积层构建。编码器配备了几个下采样模块来缩减输入的空间维度,而解码器配备了等量的上采样模块系列来将图像恢复到其初始大小。对于给定图像,我们的VQGAN tokenizer产生256个离散tokens。

我们需要注意,我们的tokenizer独立地对单个图像进行操作,而不是一次对整个视觉语句进行操作。这种独立性使我们能够将tokenizer的训练与下游Transformer模型解耦,以便tokenizer可以在不考虑视觉语句分布的单图像数据集上进行训练。

实现细节:我们采用Chang等人[14]的开源VQ-GAN体系结构。我们遵循Chang等[14]中的同样设置,使用下采样因子 f = 16 f=16 f=16, codebook大小为8192。这意味着对于大小为 256 × 256 256×256 256×256的图像,我们的VQGAN tokenizer会产生 16 × 16 = 256 16×16=256 16×16=256个标记,其中每个token可以取8192个不同的值。我们发现,使用ImageNet预训练tokenizer的结果不能很好地推广到ImageNet图像之外。因此,我们在LAION 5B数据集[71]的1.5B子集上训练了自己的tokenizer。

视觉语句的序列建模

在用VQGAN将图像转换成离散token后,我们通过将多个图像的离散token连接成1D序列来将我们的视觉语句视为统一序列(unified sequence)。重要的是,所有视觉语句都是平等对待的——我们不使用任何特殊tokens来标识特定任务或格式。我们训练一个因果Transformer模型,其目标是预测下一个token,使用与标准语言模型[11]方法[11]类似的交叉熵损失。以相同的方式在所有视觉语句上训练模型可以使模型从上下文(而非从特定任务或格式的tokens中)中推断图像之间的关系。这为模型提供了推广到其他未见视觉语句结构的机会。

实现细节:在将视觉语句中每个图像tokenize成256个token后,我们将它们连接成1D token 序列。在视觉token序列之上,我们的Transformer模型与自回归语言模型几乎相同,因此我们采用LLaMA [80]的Transformer体系结构,这是一种流行的开源语言模型,具有广泛可用的实现。我们使用4096个token的上下文长度,在我们使用VQGAN tokenizer条件下可以容纳16幅图像。与语言模型类似,我们在每个视觉语句的开头添加 [BOS] token,在结尾添加 [EOS] token,并在训练期间使用序列连接[19]来提高效率。我们使用整个UVDv1数据集(420亿个token)对模型进行一轮训练(在语言模型中,进行simple epoch training是标准操作,以避免潜在的过拟合)。我们按照相同的训练配置训练了4个不同参数数量的模型:3亿、6亿、10亿和30亿。我们在附录6中提供了详细的训练超参数。

视觉提示(Visual Prompting)推理

由于我们模型中的自回归Transformer输出了基于前面token的下一个token的概率分布,我们可以轻松地从这个分布中采样以生成新的视觉token,从而完成一个视觉语句。要将模型用于下游任务,可以在测试时构造一个部分视觉语句来定义任务,并应用模型生成输出。这类似于语言模型中的上下文学习[10]或计算机视觉中的视觉提示[8,40]。

实验结果和分析

在这一节中,我们评估了所训练的模型的规模化特性以及其理解和回答各种提示任务的能力。

可扩展性

我们研究了随着模型大小和训练过程中看到的tokens数增加,我们从训练损失和下游任务性能的角度研究模型的规模化特性。

训练损失。我们首先检查了不同参数大小的LVM的训练损失,结果在图3中呈现。由于我们的所有模型都仅针对数据集进行了一轮训练,因此模型在训练期间的任何时间点都只看到给定的数据样本一次,因此训练中的任何时刻的训练损失与验证损失非常相似。可以观察到:

1)不管模型的大小如何,模型的训练损失(困惑度)都在持续下降;
2)随着模型大小(参数数量)的增加,损失下降得更快。

这些观察表明,LVM随着更大的模型和更多的数据表现出强大的规模化性。

在这里插入图片描述
在下游基准上的规模化特性。尽管LVM的整体损失在训练期间表现良好的规模化特性,但不能保证更好的整体模型在给定的特定下游任务上也会表现更好。因此,我们在4个下游任务上评估不同大小的模型:语义分割、深度估计、表面法线估计和边缘检测。我们在ImageNet验证集上评估这些任务,并使用第3节中描述的相应方法生成所有标签。 对于每个任务,我们提供5对输入及其相应的ground-truth标注以及query图像作为输入提示,并评估ground-truth标注在我们模型对下256个token(一幅图像)的预测下的困惑度。我们在图4中给出结果。我们可以看到,更大的模型在所有任务上确实获得更低的困惑度,表明我们的整体规模化特性确实转移到了一系列下游任务中。
在这里插入图片描述

Dataset ablation。 尽管LVM随着更大的模型和更多的数据而获得更好的性能,但是自然会产生一个问题,即我们在UVDv1中收集的每个数据组件是否都有帮助。 为了回答这个问题,我们通过在数据集的子集上训练几个30亿参数的模型来进行数据集上的ablation study,并比较它们在下游任务上的性能。 我们与前面相同使用4个下游任务和设置,并在图5中呈现结果。 我们观察到每个数据组件都对下游任务有正面贡献。 LVM不仅从更大的数据中受益,而且随着图像和视频中无监督数据和标注数据的多样性的增加也有改进。
在这里插入图片描述

序列提示

我们从最直观和直接的方法开始视觉提示LVM: 序列推理。这里的提示构造非常简单:我们向模型展示一系列7个图像,并要求它预测下一个图像(256 tokens)。

视频帧预测。 最直接的序列提示任务是视频预测。 图6展示了几个下一帧预测示例,通过Kinetics-700验证集中的序列进行提示。 在顶部,7帧提示(蓝边框)后跟预测帧(红边框)。 我们观察到一定程度的推理能力,关于空间定位、视点和对象理解。 Kinetics val集上的预测困惑度为49.8。 最后4行显示了更长的上下文(15帧)和更长的预测(4帧)。 请参见附录中的图17至22以获取更多示例。

在这里插入图片描述

旋转和类别预测。 相同类型的简单序列提示也可以以其他方式使用。 例如,图 16 展示了如何通过合成对象绕任意轴的一系列 3D 旋转来提示模型使其能够预测进一步的旋转。 或者,我们可以将给定类别的类目列表视为一个序列,并预测同一类别中的其他ideas,如图 15 所示。请注意,虽然系统是根据来自相同 ImageNet 类别的图像组进行训练的,但这里的提示由草图(sketches)组成,而这些草图在任何标注数据中都没有见过。
在这里插入图片描述
在这里插入图片描述
上下文长度分析。 接下来我们问需要多少时序上下文才能准确预测后续帧? 当提示不同长度(1 到 15 帧)的上下文时,我们评估了模型的帧生成困惑度。 如图 7 所示,在 Kinetics-700 验证集上,我们看到困惑度从 1 帧到 11 帧有明显改善,之后趋于稳定(从 62.1 → 48.4)。
在这里插入图片描述

类比提示

我们的研究通过评估更复杂的提示结构(我们称之为“类比提示(Analogy Prompting)”)来取得进展。 该方法挑战模型理解任意长度和复杂性的类比,从而测试其高级解释能力。

定性结果。 图 8 显示了对许多任务进行类比提示的定性结果抽样。 提示由一系列 14 个图像组成,给出了各种任务的示例,后面的第 15 个是query图像。 给定每个提示,预测的下一个图像就是结果。 该图的顶部显示了几个示例提示,这些提示定义训练集一部分任务,但这些实际图像在训练中从未见过。 该图的底部展示了对训练中从未展示过的任务的泛化。 有关更多定性示例,请参阅附录。
在这里插入图片描述
未见任务和数据集。我们展示了在Pascal 3D+ [90]上的关键点检测结果,使用标准的正确关键点百分比(Percentage of Correct Keypoints,PCK)指标进行评估,阈值为0.1。值得注意的是,LVM在没有在此数据集上训练的情况下达到了81.2的PCK,展示了令人印象深刻的泛化能力。相比之下,我们展示了一些现有的特定任务模型:StackedHourglass[61]得分为68.0 PCK,MSS-Net[43]达到68.9 PCK,StarMap[101]为78.6 PCK。

与视觉提示的比较。与我们的方法最接近的也允许定义任意任务的方法是视觉提示(Visual Prompting) [8]。在表1中,我们在分割、目标检测和着色等少样本任务上比较了各种视觉提示模型。注意,我们的序列LVM在几乎所有任务上都优于之前的方法。
在这里插入图片描述
任务复合。图9演示了在单个提示内复合多个任务。在这里,我们演示了旋转任务与新的关键点对应任务,并要求模型继续这个模式。该模型能够在测试时成功组合这两个任务,展示了一定程度的组合性。
在这里插入图片描述

多样提示

在这里,我们尝试通过提供模型以前未见过的各种提示来看我们的模型能走多远。图10显示了一些正常工作的提示。图11显示了一些不易用文字描述的提示——这是LVM最终可能会战胜LLM的任务类型。
在这里插入图片描述
在这里插入图片描述

在图13中,我们展示了在典型的视觉推理问题上的初步定性结果,这些问题常见于非语言人类智商测试(Raven’s Progressive Matrices [67])。通过适当的猜测,人们可以想象LVM具有理解抽象视觉模式并将所掌握的模式应用于推断所示视觉序列的潜在能力。这个激动人心的结果值得进一步研究。
在这里插入图片描述

局限性

图12显示了当前模型的一些典型失败案例。一个共同点在于: 使用视觉提示来定义任务通常是欠约束的(比语言中更甚,因为图像是非常高维的),或者请求的任务可能超出当前系统的能力。其他更为琐碎的失败涉及tokenizer问题和高质量视频训练数据的缺乏。
在这里插入图片描述
有限的计算资源对我们探索一系列有趣问题施加了严格的约束,包括不同数据集的影响和详细的ablation study。值得注意的是,尽管这是迄今为止最大的视觉模型之一,但与现代大语言模型相比,它仍然相当小。因此,大视觉模型中涌现和真正泛化的问题仍然是开放的,值得进一步研究。

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

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

相关文章

Linux(统信UOS) 发布.Net Core,并开启Https,绑定证书

实际开发中&#xff0c;有时会需要为小程序或者需要使用https的应用提供API接口服务&#xff0c;这就需要为.Net Core 配置https&#xff0c;配置起来很简单&#xff0c;只需要在配置文件appsettings.json中添加下面的内容即可 "Kestrel": {"Endpoints": …

一文带你了解云计算的未来发展趋势与优势

试问现在IT圈还有什么技术比较火&#xff1f;云在数字世界中扮演一个非常重要的角色&#xff0c;目前云计算还不算技术“红海”&#xff0c;它正处于高速发展前期的技术领域&#xff0c;现在早早转型过去&#xff0c;可能还能赶上一波技术红利&#xff0c;连目前大火的ChatGPT …

STM32-新建工程(标准库)

目录 STM32F10x新建工程&#xff08;标准库&#xff09; 移植文件夹 新建工程 添加启动文件和必需文件 在工程中加载新添加的文件 在工程中添加文件路径 在工程中添加main函数 添加lib库 添加必需文件 添加宏定义 点亮LED&#xff08;标准库&#xff09; STM32F10x新…

力扣题:字符的统计-12.4

力扣题-12.4 [力扣刷题攻略] Re&#xff1a;从零开始的力扣刷题生活 力扣题1&#xff1a;657. 机器人能否返回原点 解题思想&#xff1a;进行统计即可 class Solution(object):def judgeCircle(self, moves):""":type moves: str:rtype: bool""&qu…

安装获取mongodb

目录 本地安装 获取云上资源 获取Atlas免费数据库 本地连接数据库 在Atlas中连接数据库 本文适合初学者或mongodb感兴趣的同学来准备学习测试环境&#xff0c;或本地临时开发环境。mongodb是一个对用户非常友好的数据库。这种友好&#xff0c;不仅仅体现在灵活的数据结构和…

pre标签展示代码块

pre样式 添加背景色、边框、以及调整了字体大小。 pre { border: 1px solid #999; page-break-inside: avoid; display: block; padding: 3px 3px 2px; margin: 0 0 10px; font-size: 13px; line-height: 20px; word-break: break-all; word-wrap: break-word; /* white-space:…

​HTML代码混淆技术:原理、应用和实现方法详解

​HTML代码混淆技术&#xff1a;原理、应用和实现方法详解 HTML代码混淆是一种常用的反爬虫技术&#xff0c;它可以有效地防止爬虫对网站数据的抓取。本文将详细介绍HTML代码混淆技术的原理、应用以及实现方法&#xff0c;帮助大家更好地了解和运用这一技术。 一、HTML代码混淆…

HarmonyOS学习--初次下载安装和配置环境

一、Windows下载与安装软件 运行环境要求&#xff1a; 为保证DevEco Studio正常运行&#xff0c;建议电脑配置满足如下要求&#xff1a; 操作系统&#xff1a;Windows10 64位、Windows11 64位内存&#xff1a;8GB及以上硬盘&#xff1a;100GB及以上分辨率&#xff1a;1280*80…

springBoot3.2 + jdk21 + GraalVM上手体验

springBoot3.2 jdk21 GraalVM上手体验 SpringBoot2.x官方已经停止维护了&#xff0c;jdk8这次真的得换了&#x1f923; 可以参考官方文章进行体验&#xff1a;https://spring.io/blog/2023/09/09/all-together-now-spring-boot-3-2-graalvm-native-images-java-21-and-virt…

行云海CMS SQL注入漏洞复现

0x01 产品简介 行云海cms是完全开源的一套CMS内容管理系统,简洁,易用,安全,稳定,免费。 0x02 漏洞概述 行云海cms中ThinkPHP在处理order by排序时可利用key构造SQL语句进行注入,LtController.class.php中发现传入了orderby未进行过滤导致sql注入。攻击者除了可以利用 SQL 注入…

Web开发-问题-前后端交互数据不一致

0x01 问题描述 所用的技术&#xff1a;VueSpring Boot后端传给前端数据&#xff1a; [Student(studentId1, personorg.fatmansoft.teach.models.Person4abe6020, major软件工程, className一班, grade一年级), Student(studentId2, personorg.fatmansoft.teach.models.Person…

产品学习之路(一)

在做好开发的同时&#xff0c;还需要熟悉产品业务逻辑&#xff0c;不能为了功能而做功能&#xff0c;要从产品经理的角度去看待每个需求和客户痛点所在&#xff0c;这样针对产品设计出来的东西自己也有发言权&#xff1b; 目前作为一名前端开发人员&#xff0c;也在自学产品知识…

mysql原理--InnoDB记录结构

1.InnoDB行格式 我们平时是以记录为单位来向表中插入数据的&#xff0c;这些记录在磁盘上的存放方式也被称为 行格式 或者 记录格式 。 设计 InnoDB 存储引擎的大叔们到现在为止设计了4种不同类型的 行格式 &#xff0c;分别是 Compact 、 Redundant 、Dynamic 和 Compressed 行…

多线程--11--ConcurrentHashMap

ConcurrentHashMap与HashMap等的区别 HashMap线程不安全 我们知道HashMap是线程不安全的&#xff0c;在多线程环境下&#xff0c;使用Hashmap进行put操作会引起死循环&#xff0c;导致CPU利用率接近100%&#xff0c;所以在并发情况下不能使用HashMap。 ConcurrentHashMap 主…

arcgis图上添加发光效果!

看完本文, 你可以不借助外部图片素材, 让你的图纸符号表达出你想要的光! 我们以之前的某个项目图纸为例,来介绍下让符号发光的技术! 第一步—底图整理 准备好栅格影像底图、行政边界的矢量数据,确保“数据合适、位置正确、边界吻合”。 确定好图纸的大小、出图比例、投…

基于SpringBoot的仓库管理系统设计与实现附带源码和论文

博主24h在线&#xff0c;想要源码文档部署视频直接私聊&#xff0c;全网最低价&#xff0c;9.9拿走&#xff01; 【关键词】仓库管理系统&#xff0c;jsp编程技术&#xff0c;mysql数据库&#xff0c;SSM&#xff0c;Springboot 目 录 摘 要 Abstract 第1章 绪论 1.1 课题…

springboot整合swagger

1&#xff09;简介&#xff1a; 作为后端开放人员&#xff0c;最烦的事就是自己写接口文档和别人没有写接口文档&#xff0c;不管是前端还是后端开发&#xff0c;多多少少都会被接口文档所折磨&#xff0c;前端会抱怨后端没有及时更新接口文档&#xff0c;而后端又会觉得编写接…

windows下DSS界面本地集成linkis管理台

说明&#xff1a;当前开发环境为windows&#xff0c;node版本使用16.15.1。启动web时&#xff0c;确保后端服务已准备就绪。 1.linkis web编译 #进入项目WEB根目录 $ cd linkis/linkis-web #安装项目所需依赖 $ npm install参考官方编译说明&#xff0c;windows下编译一直异常…

【Delphi】一个函数实现ios,android震动功能 Vibrate(包括3D Touch 中 Peek 震动等)

一、前言 我们在开发移动端APP的时候&#xff0c;有时可能需要APP能够提供震动功能&#xff0c;以便提醒操作者&#xff0c;特别是ios提供的3D Touch触感功能&#xff0c;操作者操作时会有触感震动&#xff0c;给操作者的感觉很友好。那么&#xff0c;在Delphi的移动端FMX开发中…

超使用的十个JavaScript技巧

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 JavaScript 作为最流行的语言之一&#xff0c;其语法灵活且每年都在不断吸纳新特性&#xff0c;即使是一个从业多年的老手&#xff0c; 偶尔也会有一些被…