π0.5:带开放世界泛化的视觉-语言-动作模型
25年4月来自具身机器人创业公司 PI 公司的论文“π0.5: a Vision-Language-Action Model with Open-World Generalization”。
为了使机器人发挥作用,它们必须在实验室之外的现实世界中执行实际相关的任务。虽然视觉-语言-动作 (VLA) 模型在端到端机器人控制方面已展现出印象深刻的效果,但此类模型在实际应用中的泛化能力仍是一个悬而未决的问题。本文提出一个基于 π0 的演进模型 π0.5,它利用异构任务的协同训练来实现广泛的泛化。π0.5 使用来自多个机器人、高级语义预测、网络数据和其他来源的数据,以实现泛化的现实世界机器人操作。该系统结合协同训练和混合多模态示例,这些示例结合图像观察、语言命令、目标检测、语义子任务预测和低级动作。实验表明,这种知识迁移对于有效的泛化至关重要,并且一个支持端到端学习的机器人系统可以在全新的家中执行长视野和灵巧的操作技能,例如清洁厨房或卧室。注:PI 公司在网站视频展示了在 AirBnB 搭建这种模型的机器人如何工作。
π0.5 如图所示:
开放世界的泛化是物理智能(PI)领域最大的开放性问题之一:机械臂、类人机器人和自动驾驶汽车等具身系统只有能够走出实验室,应对现实世界中发生的各种情况和意外事件时,才能真正发挥作用。基于学习的系统为实现广泛的泛化提供了一条途径,尤其是最近的进展,使得从自然语言处理 [79, 21, 10, 78] 到计算机视觉 [34, 66, 35, 43] 等领域的可扩展学习系统成为可能。然而,机器人在现实世界中可能遇到的情境千差万别,这不仅仅需要规模,还需要设计能够提供广泛知识的训练方案,使机器人能够在多个抽象层次上进行泛化。例如,如果一个移动机器人被要求清理一个它从未见过的厨房,如果数据中存在足够多的场景和物体(例如,拿起刀或盘子),某些行为很容易泛化;而另一些行为可能需要调整或修改现有技能,才能以新的方式或新的顺序使用它们;还有一些行为可能需要基于先验知识理解场景的语义(例如,打开哪个抽屉,或者柜台上哪个物体最有可能是晾衣架)。那么问题上:如何为机器人学习系统构建一个训练方案,使其能够实现这种灵活的泛化?
一个人可以借鉴一生的经验,综合出针对每个挑战的合适解决方案。并非所有经验都是第一手的,也并非所有经验都来自死记硬背——例如,可能会结合他人告知或从书中读到的信息,以及在不同情境下执行其他任务时获得的见解,并结合在目标领域的直接经验。类似地,可以假设,可泛化的机器人学习系统必须能够迁移来自各种信息源的经验和知识。其中一些来源是与当前任务直接相关的第一手经验,一些需要从其他机器人实例、环境或域迁移,还有一些则代表完全不同的数据类型,例如口头指令、基于网络数据的感知任务或高级语义命令的预测。这些不同数据源的异构性构成重大障碍,但幸运的是,视觉-语言-动作 (VLA) 模型的最新进展提供一个工具包,可以实现这一点:通过将不同的模态数据引入同一序列建模框架,VLA 可以适用于机器人数据、语言数据、计算机视觉任务以及上述数据的组合进行训练。
通才机器人操控策略。近期研究表明,将机器人操控策略的训练数据分布从狭窄的单任务数据集拓展到涵盖众多场景和任务的多样化数据集 [17, 25, 80, 63, 41, 6, 30, 67, 1],不仅可以使生成的策略开箱即用地解决更广泛的任务,还能提升其泛化到新场景和任务的能力 [9, 63, 62, 22]。训练此类通才策略需要新的建模方法,以应对通常涵盖数百个不同任务和场景的数据集的规模和多样性。视觉-语言-动作模型 (VLA) [23, 92, 42, 8, 83, 90, 55, 45, 3, 75, 64, 76, 84, 7, 37] 提供了一个颇具吸引力的解决方案:通过对用于机器人控制的预训练视觉-语言模型进行微调,VLA 可以利用从网络规模预训练中获得的语义知识,并将其应用于机器人问题。当与高表达力的动作解码机制(例如流匹配 [8]、扩散 [55, 84, 52] 或高级动作token化方案 [64])结合使用时,VLA 可以在现实世界中执行各种复杂的操作任务。然而,尽管 VLA 拥有印象深刻的语言跟随能力,但其评估环境通常仍与其训练数据高度匹配。虽然一些研究表明,只需在更广泛的环境中收集机器人数据,就能将拾取物体或打开抽屉等简单技能泛化到实际场景中 [14, 67, 28, 49, 64],但将相同方法应用于更复杂、更长期的任务(如清理厨房)却极具挑战性,因为通过强力扩展机器人数据收集来广泛覆盖所有可能场景是不可行的。
非机器人数据协同训练。许多先前的研究都试图利用多样化的非机器人数据来提升机器人策略的泛化能力。先前的方法包括从计算机视觉数据集初始化视觉编码器 [85, 58, 57, 18],或利用现成的任务规划器 [38, 48, 73, 81]。VLA 策略通常由预训练的视觉-语言模型初始化,该模型已接触过大量的互联网视觉和语言数据 [23, 92, 42]。值得注意的是,VLA 架构非常灵活,允许在多模态视觉、语言和动作 token 的输入和输出序列之间进行映射。因此,VLA 不仅支持在机器人动作模仿数据上,还支持在任何包含上述一种或多种模态的数据集上协同训练单一统一的架构,从而拓宽可能的迁移方法设计空间,使其超越简单的权重初始化。先前的研究已经证明,使用用于 VLM 训练的混合数据 [23, 92, 86] 协同训练 VLA 可以提升其泛化能力,例如在与新物体或未见过的场景背景交互时。
机器人运用语言进行推理和规划。许多先前的研究表明,通过高级推理增强端到端策略可以显著提升长周期任务的性能 [2, 36, 44, 74, 71, 4, 16, 11, 53, 88, 51, 59, 13, 70, 91, 65, 72, 47, 76, 89],尤其是当高级子任务推理能够受益于大型预训练的 LLM 和 VLM 时。
具有开放世界泛化的机器人学习系统。虽然大多数机器人学习系统在与训练数据高度匹配的环境中进行评估,但之前已有不少研究探索了更广泛的开放世界泛化能力。当机器人的任务仅限于一组较为狭窄的基本基元(例如拾取物体)时,允许特定任务假设的方法(例如,抓取预测或结合基于模型的规划和控制)已被证明能够实现广泛的泛化,甚至扩展到全新的家庭环境 [40, 20, 60, 56, 29]。然而,此类方法并不容易泛化到多面手机器人可能需要执行的所有任务。最近,来自多个领域的大规模数据集 [41, 68, 63, 67, 14, 49] 已被证明能够将简单但端到端学习的任务泛化到新环境 [33, 31, 67, 69, 26, 49, 28, 64]。然而,这些演示中的任务仍然相对简单,通常时长不到一分钟,而且成功率通常相对较低。
本文利用这一观察结果为 VLA 设计一个协同训练框架,该框架可以利用异构和多样化的知识源实现广泛的泛化。在 π0 VLA 的基础上,纳入一系列不同的数据源来创建 π0.5 模型(发音“pi oh five”),该模型可以控制移动机械手执行各种家务,即使在训练期间从未见过的家庭中也可以执行。如图所示:π0.5用于清扫一个新厨房
视觉-语言-动作模型 (VLA) 通常通过在不同机器人演示数据集 D 上进行模仿学习来训练,通过给定观察 o_t 和自然语言任务指令 l 来最大化动作 a_t(或更一般地,动作块 a_t:t+H)对数似然。
观察通常包含一个或多个图像 I1_t,…,I^n_t 和本体感受状态 q_t,用于捕捉机器人关节的位置。VLA 架构遵循现代语言和视觉语言模型的设计,具有特定于模态的token化器,将输入和输出映射到离散(“硬”)或连续(“软”)token 表征,以及一个大型自回归 transformer 主干,经过训练可从输入映射到输出 token。
这些模型的权重由预训练的视觉语言模型初始化。通过将策略输入和输出编码为 token 化的表征,上述模仿学习问题可以转化为一个简单的下一个 token 预测问题,针对一系列观察、指令和动作 token,可以利用现代机器学习的可扩展工具来优化它。在实践中,图像和文本输入的 token 化器的选择,遵循现代视觉语言模型的 token 化器。对于动作,先前的研究已经开发出有效的、基于压缩的 token 化方法 [64],在本文的预训练阶段使用这些方法。
许多近期的 VLA 模型也提出通过扩散 [55, 84, 52] 或流匹配 [8] 来表示动作分布,从而为连续-值动作块提供更具表现力的表征。在模型的后训练阶段,将以 π0 模型 [8] 的设计为基础,该模型通过流匹配来表示动作分布。在此设计中,与动作对应的 token 接收来自上一步流匹配的部分去噪动作作为输入,并输出流匹配向量场。这些 token还使用一组不同的模型权重,称为“动作专家”,类似于混合专家架构。该动作专家可以专注于基于流匹配的动作生成,并且比 LLM 主干的其余部分小得多。
以下介绍π0.5 模型及其训练方案。
如图概述 π0.5 模型及其训练方案。模型权重由基于网络数据训练的标准 VLM 初始化,训练分为两个阶段:预训练阶段,旨在使模型适应各种机器人任务;后训练阶段,旨在使模型专门用于移动操作,并为其配备高效的测试-时推理机制。在预训练阶段,所有任务(包括包含机器人动作的任务)都用离散的 token 表示,从而实现简单、可扩展且高效的训练 [64]。在后训练阶段,调整模型使其也包含一个动作专家,就像 π0 模型一样,以便以更细的粒度表示动作,并实现更高效的实时控制推理计算。在推理阶段,模型首先为机器人生成一个高级子任务,然后基于该子任务,通过动作专家预测低级动作。
π0.5 架构
π0.5 架构可以灵活地表示动作块分布和 token 化文本输出,后者既可用于协同训练任务(例如问答),也可用于在分层推理过程中输出高级子任务预测。该模型捕获的分布可以写成π_θ(a_t:t+H,l|o_t,ˆl),其中 o_t = [I0_t, …, In_t, q_t],由所有摄像机的图像和机器人的配置(关节角度、夹持器姿势、躯干升降姿势和基本速度)组成,l 是整体任务提示(例如,“收起盘子”),ˆl 表示模型的(token 化)文本输出,可以是预测的高级子任务(例如,“拿起盘子”)或对网络数据中视觉语言提示的答案,a_t:t+H是预测的动作块。
该分布可以分解为高级和低级推理两部分,其中动作分布取决于ˆl 而不是 l,高级推理捕获π_θ(l|o_t, ˆl),低级推理捕获π_θ(a_t:t+H|o_t, ˆl),这两个分布都由同一个模型表征。
该模型对应于一个 transformer,它接受 N 个多模态输入tokens x_1:N(宽泛地使用术语 token,指的是离散输入和连续输入)并产生一系列多模态输出 y_1:N,可以将其写成 y_1:N = f(x_1:N, A(x_1:N), ρ(x_1:N))。每个 x_i 可以是文本 token(xw_w)、一个图像补丁(xI_I)或流匹配中机器人动作的中间去噪值(xa_i)。观测值 o_t 和 l 构成 x_1:N 的前缀部分。根据 token 类型(如 ρ(x_i) 所示),每个 token 不仅可以由不同的编码器处理,还可以由transformer 内的不同专家权重处理。例如,图像补丁通过视觉编码器输入,文本 token 嵌入到嵌入矩阵中。按照 π0 [8],将动作 token x^a_i 线性投影到 Transformer 嵌入空间,并在 Transformer 中使用单独的专家权重来处理动作 token。注意矩阵 A(x_1:N) ∈[0, 1] 表示一个 token 是否可以关注另一个 token。与 LLM 中的标准因果注意相比,图像补丁、文本提示和连续动作 token 使用双向注意。
由于希望模型同时输出文本(回答关于场景的问题或输出接下来要完成的任务)和动作(在世界中采取行动),因此 f 的输出被拆分为文本 token logits 和动作输出 token,分别为 yl_1:M 和 y^a_1:H。第一个 M 对应于可用于对 lˆ 进行采样的文本 token logits,后面的 H 个 tokens 由单独的动作专家生成,就像在 π0 中一样,并通过线性映射投影到用于获得 a_t:t+H 的连续输出。请注意,M + H ≤ N,即并非所有输出都与损失相关。机器人本体感受状态被离散化,并作为文本 token 输入到模型中。
离散与连续动作表示的结合
与 π0 类似,使用流匹配[50]来预测最终模型中的连续动作。给定a^τ,ω_ t:t+H = τa_t:t+H + (1−τ)ω, ω∼N(0,I),其中 τ ∈ [0,1] 是流匹配时间索引,训练模型预测流向量场 ω − a_t。然而,如[64]所示,当动作用离散 token 表示时,VLA 训练速度会更快,尤其是在使用一个能够有效压缩动作块的 token 化方案(例如FAST)时。遗憾的是,这种离散表示不太适合实时推理,因为它们需要昂贵的自回归解码才能进行推理[64]。因此,理想的模型设计应该在离散动作上进行训练,但仍允许使用流匹配在推理时生成连续动作。
因此,模型通过对 token 进行自回归采样(使用 FAST token 化器)和对流场进行迭代积分来训练以预测动作,从而结合两者的优点。用注意矩阵来确保不同的动作表征不会互相关注。模型经过优化以最小化综合损失:一个是文本 tokens 和预测 logits(包括 FAST 编码的动作 token)之间的交叉熵损失,另一个是流匹配误差的损失。其中ya_1:H = f^a_θ (a_t:t+H^τ, ω, o_t, l) 是来自(较小)动作专家的输出,α 是一个权衡参数。这种方案能够首先通过将动作映射到文本 token(α = 0)将模型预训练为标准 VLM Transformer 模型,然后添加额外的动作专家权重,以非自回归方式预测连续动作 tokens,以便在训练后阶段进行快速推理。遵循此流程可使 VLA 模型获得稳定的预训练效果和出色的语言跟踪能力。在推理时,对文本 token lˆ 使用标准自回归解码,然后以文本 token 为条件进行 10 个去噪步骤,最终生成动作 a_t:t+H。
预训练
在第一个训练阶段,π0.5 使用广泛的机器人和非机器人数据进行训练,其总结在下图说明。它被训练为一个标准的自回归 transformer,用于对文本、物体位置和 FAST 编码的动作 token 进行下一个 token 预测。
多样化的移动机械手数据 (MM)。用大约 400 小时的移动机械手数据,这些机械手在大约 100 个不同的家庭环境中执行家务,其中一些环境如下图所示,使用 PI 公司设计的机器人。这部分训练集与评估任务最直接相关,该评估任务包括在新的、未见过的家庭环境中执行类似的清洁和整理任务。
多样化的多环境非移动机器人数据 (ME)。还收集各种家庭环境中的非移动机器人数据,包括单臂或双臂机器人。这些手臂固定在表面或安装平台上,由于它们重量明显更轻且更易于运输,能够利用它们在更广泛的家庭中收集更加多样化的数据集。但是,这些 ME 数据来自与移动机器人不同的具身。
跨具身实验室数据 (CE)。在实验室中收集各种任务的数据(例如,收拾桌子、折叠衬衫),使用更简单的桌面环境和各种类型的机器人。其中一些任务与评估高度相关(例如,将碗碟放入垃圾桶),而其他任务则不相关(例如,研磨咖啡豆)。这些数据包括单臂和双臂机械手,以及静态和移动基座。还包括开源 OXE 数据集 [15]。该数据集是 π0[8] 使用的数据集扩展版。
高级子任务预测 (HL)。将诸如“打扫卧室”之类的高级任务命令分解为诸如“调整毯子”和“拿起枕头”之类的较短的子任务,类似于语言模型的思维链提示,可以帮助训练的策略推理当前场景并更好地确定下一步操作。对于MM、ME和CE中的机器人数据,如果任务涉及多个子任务,会手动使用子任务的语义描述对所有数据进行注释,并训练π0.5,使其基于当前观察结果和高级命令,联合预测子任务标签(以文本形式)和操作(以子任务标签为条件)。这自然会形成一个既可以充当高级策略(输出子任务),又可以充当执行这些子任务操作低级策略的模型。还标记当前观察结果中显示的相关边框,并在预测子任务之前训练 π0.5 对其进行预测。
多模态网络数据 (WD)。最后,在预训练中引入一组多样化的网络数据,涉及图像字幕制作(CapsFusion [87]、COCO [12])、问答(Cambrian-7M [77]、PixMo [19]、VQAv2 [32])和目标定位。对于目标定位,进一步扩展标准数据集,添加带有边框注释的室内场景和家用目标的网络数据。
对于所有动作数据,训练模型预测目标关节和末端执行器的姿势。为了区分这两者,在文本提示中添加“<控制模式>关节/末端执行器<控制模式>”。使用单个数据集每个动作维度的 1% 和 99% 分位数,所有动作数据都归一化到 [-1, 1]。将动作 a 的维数设置为固定数,以适应所有数据集中最大的动作空间。对于具有低维配置和动作空间的机器人,对动作向量进行零填充。
后训练
在使用离散 token 对模型进行 28 万个梯度步长的预训练后,进行第二阶段的训练,称之为后训练。此阶段的目的是使模型针对用例(家庭中的移动设备操作)进行专业化,并添加一个能够通过流匹配生成连续动作块的动作专家。此阶段与下一个 token 预测联合训练,以保留文本预测能力,并为动作专家进行流匹配(在后训练开始时使用随机权重初始化)。优化前面组合损失的目标函数,使 α = 10.0,并额外训练 8 万个梯度步长。后训练动作数据集包含 MM 和 ME 机器人数据,并筛选出长度低于固定阈值的成功事件。加入网络数据 (WD) 以保留模型的语义和视觉能力,以及与多环境数据集对应的 HL 数据切片。此外,为了提升模型预测合适高级子任务的能力,收集口头指令演示 (VI)。这些演示由专家用户构建,提供“语言演示”,选择合适的子任务命令,逐步指挥机器人执行移动操作任务。这些示例是通过实时“遥操作”机器人,使用语言执行已学习的低级策略来收集的,本质上是为已训练策略提供良好的高级子任务输出演示。
机器人系统细节
如图展示在移动操控实验中使用的机器人系统。所有实验均采用两种类型的移动操控器。两个平台均配备两个 6 自由度(DOF)机械臂,机械臂配备平行钳口夹持器和腕式单目RGB摄像头、一个轮式完整基座以及一个躯干升降机构。基座的状态和动作空间分别对应线性(二维)和角(一维)速度,躯干升降机构则为一维(上下)或二维(上下和前后)。除了两个腕式摄像头外,机器人还在机械臂之间安装前后摄像头。用所有四个摄像头进行高级推理,腕式摄像头和前向摄像头进行低级推理。状态和动作空间的总维数为18或19,具体取决于平台。
控制系统非常简单:π0.5 模型直接控制手臂、夹持器和躯干升降的目标姿态,以及 50 Hz(带动作分块)的目标基准速度。这些目标通过简单的 PD 控制器进行跟踪,无需任何额外的轨迹规划或碰撞检测。所有操作和导航控制均为端到端。
π0.5 模型旨在泛化到新环境。虽然在与训练数据匹配的环境中评估 VLA 很常见,但所有的实验都是在训练中未曾见过的新环境中进行的。为了进行定量比较,使用一组模拟家庭环境来提供可控且可重复的设置,而最真实的最终评估是在三个不属于训练集的真实家庭中进行的(如图所示)。
π0.5 的泛化能力表明,这种协同训练方法能够促进有效的迁移,仅使用中等规模的移动操作数据集即可实现对移动机械手的高度泛化控制。π0.5 并非没有局限性。虽然 VLA 展现出泛化能力,但它仍然会犯错。某些环境会持续带来挑战(例如,不熟悉的抽屉把手,或者机器人难以打开的橱柜),某些行为会给部分可观测性带来挑战(例如,机械臂遮挡应该擦拭的溢出物),并且在某些情况下,高级子任务推理很容易分散注意力(例如,在收拾物品时多次打开和关闭抽屉)。通过更好的协同训练、迁移和更大的数据集来应对这些挑战,是未来工作的一个有希望的方向。
其他未来的工作方向可以解决方法的技术限制。虽然 π0.5 可以执行各种行为来清洁厨房和卧室,但它处理的提示相对简单。模型能够适应的提示的复杂度取决于训练数据,并且可以通过生成更复杂、更多样化的注释(使用人工标注器或合成方法)来整合更复杂的偏好和指令。该模型也使用相对有限的上下文,而融入更丰富的上下文和记忆,可以显著提升模型在部分可观测性更强的场景下的表现,例如需要在不同房间之间导航或记住物品存放位置的任务。更广泛地说,π0.5 探索的是异构数据源的特定组合,但具体的数据源可以进行更广泛的探索。例如,系统能够从口头指令中学习,这提供一种强大的新监督模式,未来的研究可以探索这种模式,以及人类能够为机器人提供额外上下文知识的其他方式。
相关文章:
π0.5:带开放世界泛化的视觉-语言-动作模型
25年4月来自具身机器人创业公司 PI 公司的论文“π0.5: a Vision-Language-Action Model with Open-World Generalization”。 为了使机器人发挥作用,它们必须在实验室之外的现实世界中执行实际相关的任务。虽然视觉-语言-动作 (VLA) 模型在端到端机器人控制方面已…...
ESP32开发入门(四):ESP32-s3多串口开发实践
摘要 本文详细介绍ESP32-S3芯片的UART外设开发方法,涵盖UART0(默认调试串口)、UART1和UART2的配置与使用技巧,并提供完整示例代码,帮助开发者快速实现多设备串口通信。 一、ESP32-S3串口硬件资源 ESP32-S3芯片提供3个UART控制器࿱…...
树莓派学习专题<10>:使用V4L2驱动获取摄像头数据--申请和管理缓冲区
树莓派学习专题<10>:使用V4L2驱动获取摄像头数据--申请和管理缓冲区 1. 申请和管理缓冲区代码2. 代码解析3. 实测结果 1. 申请和管理缓冲区代码 /* 数据缓冲区 */ typedef struct tag_BufDesc {void *pvBufPtr ;size_t szBuf…...
Android10.0 Android.bp文件详解,以及内置app编写Android.bp文件
1.前言 在10.0的系统rom定制化开发中,在内置app的时候都是常用的用法,用Android.mk的常用,但是某些时候,会 使用Android.bp的方式来内置app,接下来就来使用常用的方式来写内置so aar jar等文件 2.Android.bp文件详解,以及内置app编写Android.bp文件的介绍 根据设计,An…...
git回退commit
在Git中回退提交(commit)主要有两种方法:使用 `git reset` 或 `git revert`,具体取决于是否需要保留提交历史或是否已推送到远程仓库。以下是详细步骤: 一、使用 `git reset`(适合本地未推送的提交) `git reset` 会移动分支的 HEAD 指针到指定提交,可选择是否保留修改。…...
arcpy列表函数的应用(4)
动态获取字段信息 在处理要素类或表时,可能需要动态获取字段信息,以便根据字段类型或名称进行特定操作。可以使用arcpy.ListFields()函数获取字段列表,并根据需要筛选字段。 示例: python # 获取指定要素类的所有字段 fields …...
02 业务流程架构
业务流程架构提供了自上而下的组织鸟瞰图,是业务流程的全景图。根据所采用的方法不同,有时被称为流程全景图或高层级流程图,提供了业务运营中所有业务流程的整体视图。 这样有助于理解企业内部各个业务流程之间的相互关系以及它们如何共同工…...
「Mac畅玩AIGC与多模态01」架构篇01 - 展示层到硬件层的架构总览
一、概述 AIGC(AI Generated Content)系统由多个结构层级组成,自上而下涵盖交互界面、API 通信、模型推理、计算框架、底层驱动与硬件支持。本篇梳理 AIGC 应用的六层体系结构,明确各组件在系统中的职责与上下游关系,…...
如何有效防止 SQL 注入攻击?
🔒 如何有效防止 SQL 注入攻击? SQL 注入(SQL Injection)是黑客通过构造恶意输入,篡改 SQL 查询语句的攻击方式。以下是 7 大防御策略,涵盖开发、测试和运维全流程。 ✅ 1. 使用参数化查询(Pre…...
路由交换网络专题 | 第九章 | NAT地址转换 | NAT回流
拓扑图 (1)配置实现内网用户可以通过 NAT 转换地址访问外网。 // 配置一条静态路由通往PC2 [AR1]ip route-static 0.0.0.0 0 60.1.1.10 // 配置ACL匹配网段 [AR1]acl 2000 [AR1-acl-basic-2000]rule permit source 192.168.1.10 0.0.0.0 // 设置地址池(不…...
DFPatternFunctor遍历计算图
文件:include/tvm/relay/dataflow_pattern_functor.h 功能:定义 DFPatternFunctor 基类,为 DFPattern 提供访问者模式(Visitor Pattern)的实现框架,支持对不同类型的模式节点进行差异化处理。 继承关系: template &…...
Spring Boot中@RequestParam、@RequestBody、@PathVariable的区别与使用
Spring Boot中RequestParam、RequestBody、PathVariable的区别与使用 前言 在当今的Web开发领域,Spring Boot凭借其简洁、高效和强大的功能,成为了Java开发者构建Web应用的首选框架。在开发过程中,处理来自客户端的请求参数是一项常见且关键…...
大模型 SFT 中的关键技术总结学习
文章目录 微调策略LoRA 微调核心思想具体实现过程超参数与技巧实现步骤 QLoRA 相关技术1. 核心原理2. 技术优势3. 实现流程4. 应用场景 P-tuning核心思想关键技术点训练流程优点应用场景 P-tuning v2Prefix Tuning一、关键概念前缀(Prefix)虚拟标…...
AI如何重塑DDoS防护行业?六大变革与未来展望
一、AI驱动的攻击与防御:攻防博弈的全面升级 AI技术的引入使DDoS攻防进入“智能对抗”时代,攻击者与防御方均借助AI提升效率,形成新的技术平衡。 1. 攻击端:AI赋能攻击的智能进化 动态流量生成:攻击者利用生成对抗网…...
电池的寿命
思路: 首先,我们观察发现:由于每枚电池的使用时间不同,而我们又要减少浪费才能使所有电池加起来用得最久,不难发现:当n2时,输出较小值。 第一步:将电池分为两组,使两组…...
Android完整开发环境搭建/Studio安装/NDK/本地Gradle下载配置/创建AVD/运行一个Android项目/常用插件
目录 安装Android Studio 修改sdk位置 配置 HTTP 代理 安装 NDK 设置快捷键 Gradle 说明 setting.gradle init.gradle build.gradle 下载 相关设置 创建项目 阿里云加速 清理缓存并同步 创建AVD 实用插件 ADB Idea Android Drawable Importer GsonFormat …...
【KWDB 创作者计划】_KWDB引领数据库技术革新的璀璨之星
【KWDB 创作者计划】_KWDB引领数据库技术革新的璀璨之星 🌟嗨,我是LucianaiB! 🌍 总有人间一两风,填我十万八千梦。 🚀 路漫漫其修远兮,吾将上下而求索。 在当今数字化浪潮汹涌澎湃的时代&…...
设计模式--桥接模式详解
桥接模式(bridge pattern) 桥接模式时将抽象部分与它的实现部分分离,使他们可以独立的变化。它是一种对象结构型模式,又称为柄体(Handle and Body)模式或者接口(interface)模式&…...
Python+Selenium+Pytest+Allure PO模式UI自动化框架
一、框架结构 allure-report:测试报告base:定位元素封装data:数据log:日志文件page:页面封装文件夹report:缓存报告testcases:测试用例层utils:工具类run.py:执行文件 二…...
【C语言操作符详解(一)】--进制转换,原反补码,移位操作符,位操作符,逗号表达式,下标访问及函数调用操作符
目录 一.操作符的分类 二.二进制和进制转换 2.1--2进制转10进制 编辑 2.1.1--10进制转2进制数字 2.2--2进制转8进制和16进制 2.2.1--2进制转8进制 2.2.2--2进制转16进制 三.原码,反码,补码 四.移位操作符 4.1--左移操作符 4.2--右移操作符…...
回顾|Apache Cloudberry™ (Incubating) Meetup·2025 杭州站
2025 年 4 月 19 日,由酷克数据与中启乘数联合举办的 Apache Cloudberry™ (Incubating) Meetup 杭州站在浙江省杭州市滨江区滨江会展中心成功举办。本次活动邀请了 Cloudberry PPMC 团队成员、活跃内核贡献者以及中兴 EBASE-A、阿里云 ADB-PG、网易、中启乘数等多…...
使用 Autofac 实现依赖注入
前言:接上一篇文章,有了微软官方的依赖注入组件Microsoft.Extensions.DependencyInjection, 那么今天介绍一个新的开源的依赖注入组件Autofac 一、二者的差异Autofac和微软官方的依赖注入组件(Microsoft.Extensions.DependencyIn…...
HTTP:十二.HTTPS
HTTPS 概述 超文本传输安全协议(英语:HyperText Transfer Protocol Secure,缩写:HTTPS;常称为HTTP over TLS、HTTP over SSL或HTTP Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,利用TLS加密数据包。 HTTPS的主要目的是提供对网站服务器…...
《代码整洁之道》第12章 迭进 - 笔记
好的设计是如何形成的? 章节核心: 好的软件设计不是完全靠前期庞大的设计方案来完成的,而更多地是在持续的编码、测试和重构过程中,“涌现”或“演进”出来的。 设计不是一次性的前期活动 大白话: 作者认为&#x…...
数字巴别塔:全栈多模态开发框架如何用自然语言重构软件生产关系?
一、自然语言编程的范式革命 1. 从代码行数到语义密度 开发效率对比(某金融 SaaS 案例): 开发方式代码量(行)开发时间(天)维护成本($/年)传统 React5,2004512,000低代码…...
【C语言极简自学笔记】C 语言数组详解:一维数组与二维数组
在 C 语言中,数组是一种非常重要的数据结构,它可以将多个相同类型的元素组织在一起,以便于我们进行批量处理和操作。本文将详细介绍 C 语言中的一维数组和二维数组,包括它们的定义、初始化、元素访问以及内存存储等方面的内容。 …...
从零构建云原生秒杀系统——后端架构与实战
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:秒杀系统的挑战与机遇 在电商、票务、抢购等业务场景中,“秒杀”系统扮演着至关重要的角色。 秒杀活动通常会在极短时间内爆发出数十倍至数百倍的平时流量,这对后端系统的承载能力、响应…...
Linux Socket编程:从API到实战
Linux Socket编程完全指南:从API到实战 概述 Socket(套接字)是网络编程的基础,它允许不同主机或同一主机上的不同进程之间进行通信。在Linux系统中,Socket编程主要通过一系列系统调用来实现,这些API提供了…...
德州仪器(TI)—TDA4VM芯片详解(1)—产品特性
写在前面 本系列文章主要讲解德州仪器(TI)TDA4VM芯片的相关知识,希望能帮助更多的同学认识和了解德州仪器(TI)TDA4VM芯片。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 错过其他章节的同学…...
增强版wps-plugin-deepseek开源插件是DeepSeek 支持的 WPS 插件,在您的办公工作流程中提供智能文档自动化和 AI 驱动的生产力增强
一、软件介绍 文末提供程序和源码下载学习 增强版wps-plugin-deepseek开源插件专为WPS Office插件开发打造的Vue模板,搭配Vite构建工具,提供丰富的WPS API实操示例。虽然官方提供了TypeScript扩展包,但支持程度有限,因此本项目选…...
在 Cursor 中 配置 GitHub MCP Server
文章目录 1、简单回顾 sequentialthinking 的安装2、提出问题:如何在 cursor 配置 github mcp 呢3、结果如下How to Configure GitHub MCP in CursorPrerequisitesStep 1: Update Cursor (if needed)Step 2: Generate a GitHub Personal Access TokenStep 3: Open Cursor MCP S…...
uniapp-商城-40-shop 购物车 选好了 进行订单确认4 配送方式3 地址编辑
前面说了配送 和地址页面 当地址页面为空或需要添加地址时,需要添加地址。 我的地址页面有个按钮 就是添加地址 点击 添加地址 按钮 后,就会跳转到地址添加的页面 1、添加地址页面 2、添加地址文件夹以及文件的创建 3、添加地址的代码 <template…...
初步自定义layui的table(laravel 12)
layui的table是非常好的表格,有美观的样式,对接起来也很便捷。使用后端翻页传过来的数据,本地测试是好的,部署到服务器时,翻页不起作用。故而暂时采用一次性读取全部数据,发送给table,界面如下所…...
手写SpringMVC(基本框架)
服务器启动阶段处理 分析服务器启动阶段都都需要初始化什么? 1.初始化Spring容器 组件扫描包下的类纳入IOC容器管理创建视图解析器对象创建所有的拦截器对象扫描这和包下的所有类org.myspringmvc.web.servlet.mvc.method.annotation,全部实例化&#…...
JS-OCR-demo加载本地文件
背景: 在了解 Tesseract 的识别效果的时候,有个demo项目很好用。有个小毛病,就是没事都要从摄像头抓取图片,然后进行识别。如果可以从本地读取图,就更方便了。 实现: 下载项目代码:https://gi…...
MySQL 表的约束(一)
文章目录 表的约束空属性默认值列描述zerofill主键总结 表的约束 1. 为什么要有表的约束? 因为要保证数据的完整性和可约束性,合法性 空属性 两个值:null(默认的)和not null(不为空)数据库默认字段基本都是字段为空…...
论文导读 - 基于大规模测量与多任务深度学习的电子鼻系统实现目标识别、浓度预测与状态判断
基于大规模测量与多任务深度学习的电子鼻系统实现目标识别、浓度预测与状态判断 原论文地址:https://www.sciencedirect.com/science/article/abs/pii/S0925400521014830 引用此论文(GB/T 7714-2015): WANG T, ZHANG H, WU Y, …...
力扣hot100_子串_python版本
一、560. 和为 K 的子数组 思路:这就是一道典型的前缀和的题代码: class Solution:def subarraySum(self, nums: List[int], k: int) -> int:presum [0] * (len(nums) 1)for i, x in enumerate(nums):presum[i 1] presum[i] x # 前缀和序列需要n1个ans 0…...
cached-property - 类属性缓存装饰器
本文翻译整理自:https://github.com/pydanny/cached-property 文章目录 一、关于 cached-property相关链接资源关键功能特性 二、安装三、使用指南1、基础用法2、手动清除缓存3、线程安全版本4、异步支持5、缓存超时(TTL) 四、致谢 一、关于…...
「Mac畅玩AIGC与多模态03」部署篇02 - 在 Mac 上部署 Dify
一、概述 本篇介绍如何在 macOS 环境下本地部署 Dify 平台,作为多模型协同与工作流集成的可视化应用服务。Dify 提供了模型调用、对话管理、知识库问答、插件服务等功能,可与 Ollama、OpenAI、DeepSeek 等推理后端集成,适用于本地智能体应用的快速搭建与扩展。 二、部署流…...
扩散模型和马尔科夫链
1. 扩散模型的基本原理 扩散模型的灵感来源于热力学扩散(如一滴墨水在水中逐渐扩散的过程),其核心分为两个阶段: 前向过程(Forward Process):逐步向数据添加噪声,直到数据完全变为随…...
Dify框架面试内容整理-Dify如何处理知识库的集成?
Dify 在知识库集成方面采用了“检索增强生成(RAG)”的技术架构,核心实现思路如下: 一、知识库集成的整体流程 Dify处理知识库集成通常包括以下关键步骤: 文档上传↓...
第35课 常用快捷操作——用“鼠标左键”拖动图元
概述 拖动某个图元,是设计过程中常需要用到的操作,我们可以在原理图中拖动某个元器件符号,也可以在PCB图中拖动某个焊盘。 和常用的软件类似,用按住鼠标左键的方式来完成拖动操作。 用鼠标左键拖动图元 在想要拖动的图元上&…...
复盘笔记1
以下是一份专业股市投资操盘手的复盘清单,涵盖市场分析、交易策略、风险管理等核心环节,帮助系统化梳理每日交易并优化次日决策: --- ### **一、市场整体复盘** 1. **指数与成交量分析** - 主要指数表现(上证、深证、创业板、科…...
海思dump图原理
在海思中是用指令进行对应的dump。 例如./vi_chn_dump 0 0 1 1 第一个指令代表是dump哪里的数据。 第一个0代表是vi_pipe。 第二个0代表vi_chn。 第一个1代表需要dump帧的数量。 第二个dump代表dump帧的位置,如果是0表示dump的是在所有ISP模块后面的数据࿰…...
C++:STL——list
一简介 底层是一个带头双向循环列表 二、成员函数 (1)构造函数 三、迭代器 四、修饰函数 (1)insert 插入和删除不再使用下标,而是使用迭代器指针作为要插入位置的形参,这是因为:vector是连续的…...
在Azure Databricks中实现缓慢变化维度(SCD)的三种类型
在Azure Databricks中使用PySpark实现缓慢变化维度(SCD)的三种核心类型,需结合Spark SQL和DataFrame API的特性,并利用Delta Lake的事务支持。以下是具体设计与实现步骤,以及测试用例: 通过以下步骤&#…...
Segment Anything in Images and Videos
目录 摘要 Abstract SAM2 模型框架 图像编码器 记忆机制 提示编码器和掩码解码器 实验 代码 总结 摘要 SAM2是基于Meta公司推出的Segment Anything Model升级而来的先进分割模型。它在SAM的基础上,通过引入记忆注意力模块和优化图像编码器等改进…...
C++之异常
目录 一、异常的概念及使用 1.1、异常的概念 1.2、异常的抛出和捕获 1.3、栈展开 1.4、查找匹配的处理代码 1.5、异常重新抛出 1.6、异常安全问题 1.7、异常规范 1.8、C异常的优缺点 二、标准库的异常 一、异常的概念及使用 1.1、异常的概念 异常处理机制允许程序中…...
服务器不能复制粘贴文件的处理方式
1.打开远程的服务器,在服务器的任务栏随便一块空白处右击鼠标,选择“启动任务管理器”。 2.在打开的任务管理器中,我们找到“rdpclip.exe”这个进程,如果没有找到那么如图所示 任务管理器–文件–运行新任务,然后在弹出的对话框内输入rdpclip.exe 如下图࿱…...