VLA 论文精读(三)Diffusion Policy: Visuomotor Policy Learning via Action Diffusion
这篇笔记用来描述 2023年 发表在arxiv上的一篇有关VLA领域的论文,这篇笔记记录的是该论文 2024年03月的改版后。
写在最前面
为了方便你的阅读,以下几点的注意事项请务必了解:
- 该系列文章每个字都是我理解后自行翻译并写上去的,可能会存在笔误与理解错误,如果发现了希望读者能够在评论区指正,我会在第一时间修正错误。
- 阅读这个系列需要你有基础的VLA、VLM相关基础知识,有时候我会直接使用英文名词,因为这些词汇实在不容易找到符合语境的翻译。
- 原文可能因为版面限制存在图像表格与段落不同步的问题,为了更方便阅读,我会在博文中重新对图像表格进行排版,并做到引用图表的文字下方就能看到被引用的图表。因此可能会出现一张图片在博客中多处位置重复出现的情况。
- 对于原文中的图像,我会在必要时对图像描述进行翻译并附上我自己的理解,但如果图像描述不值得翻译我也不会强行写上去。
Basic Information
- 论文标题:Diffusion Policy: Visuomotor Policy Learning via Action Diffusion
- 原文链接:https://arxiv.org/abs/2303.04137
- 发表时间:2024年03月14日
- 发表平台:arxiv
- 预印版本号:[v5] Thu, 14 Mar 2024 04:36:31 UTC (9,772 KB)
- 作者团队:Cheng Chi, Zhenjia Xu, Siyuan Feng, Eric Cousineau, Yilun Du, Benjamin Burchfiel, Russ Tedrake, Shuran Song
- 院校机构:
- Toyota Research Institute;
- Columbia Engineering;
- Massachusetts Institute of Technology;
- GitHub仓库:https://github.com/real-stanford/diffusion_policy
Abstract
本文介绍了扩散策略 Diffusion Policy,这是一种通过将机器人的视觉运动策略表示为条件去噪扩散过程(conditional denoising diffusion process)来生成机器人行为的新方法。作者对来自 4 个不同机器人操作基准的 15 个不同任务中的扩散策略进行了测试,发现它始终优于现有的SOTA机器人学习方法,平均提高了 46.9%。扩散策略学习动作分布得分函数的梯度,并在推理过程中通过一系列随机Langevin动力学步骤(stochastic Langevin dynamics steps)针对该梯度场进行迭代优化。作者发现,扩散公式在用于机器人策略时具有强大的优势,包括优雅地处理多模态动作分布、适用于高维动作空间以及表现出显著的训练稳定性。为了充分释放扩散模型在物理机器人上进行视觉运动策略学习的潜力,列出了一组关键技术贡献,包括结合滚动视界控制、视觉调节和时间序列扩散变换器。我们希望这项工作将有助于激发新一代策略学习技术,这些技术能够利用扩散模型强大的生成建模功能。
代码、数据、训练详细信息可在 https://diffusion-policy.cs.columbia.edu 上找到。
1. Introduction
从示范中学习策略,最简单的形式可以表述为监督回归任务,即通过学习将观察结果映射到动作。然而在实践中,预测机器人动作这一任务特性(例如多模态分布、序列相关性、高控制精度要求等)使其与其他监督学习相比更具挑战性。
先前的研究尝试通过探索不同的动作表示(Fig.1 (a)
)来应对这一挑战,使用高斯混合;量化动作分类表示;切换策略从显式到隐式表示以更好地捕捉多模态分布(Fig.1 (b)
)。
在本文中,作者通过引入一种新型机器人视觉运动策略来解决上述问题,该策略通过“机器人动作空间上的条件去噪扩散过程”生成行为,即扩散策略 Diffusion Policy。在该策略中,不是直接输出动作,而是根据视觉观察推断动作得分梯度,进行 K 次去噪迭代(Fig.1 (c)
)。该策略允许机器人从扩散模型中继承以下几个特性以显著提高性能:
-
Expressing multimodal action distributions
通过学习动作得分函数的梯度并对该梯度场执行随机 Langevin 动力学采样,扩散策略可以表达任意可正则化的分布,包括多峰动作分布 multimodal action distributons,这个多峰动作分布正式策略学习的一个著名挑战。 -
High-dimensional output space
正如图像生模型,扩散模型已显示出对高维输出空间的可扩展性。此特性允许策略联合推断一系列未来动作而不是单步动作,这对于激励时间-动作一致性和避免短视规划至关重要。 -
Stable training
Energy-base 的训练策略通常需要负采样来估计难以处理的归一化常数,这会导致训练不稳定。扩散策略通过学习能量函数的梯度来绕过这一问题,从而实现稳定训练的同时保持分布表达力。
作者主要贡献是将上述优势带入机器人领域,并展示其在复杂现实世界中机器人操作任务的有效性。为了成功将扩散模型应用于视觉运动策略学习,提出了以下技术贡献,以增强扩散策略的性能并充分发挥其在物理机器人上的潜力:
-
Closed-loop action sequences
将策略预测高维动作序列的能力与滚动时域控制相结合,以实现稳健的执行。该设计允许策略以闭环方式不断重新规划其动作,同时保持时间动作一致性,实现长期规划和响应能力之间的平衡。 -
Visual conditioning
引入了视觉条件扩散策略,将视觉观察视为条件,而不是联合数据分布的一部分。无论去噪迭代如何,该策略都会提取一次视觉表征,从而大大减少了计算量并实现了实时动作推理。 -
Time-series diffusion transformer.
提出了一种新的 Transformer 的扩散网络,最大限度地减少了基于 CNN 模型的过度平滑效应,并在需要高频动作变化和速度控制的任务上实现了SOTA。
作者系统地评估了行为克隆模式下 4 个不同基准中 15 个任务的扩散策略,包括 模拟和真实环境、2DoF
到 6DoF
动作、单任务和多任务基准、刚性和流体物体上的完全驱动和欠驱动系统,并使用单个和多个用户收集的演示数据。
作者发现在所有基准测试中性能都一定提升,平均提升了 46.9%,有力地证明了扩散策略的有效性。作者还提供了详细的分析,以了解算法特点以及关键设计决策的影响。
这篇论文是先前他们发表的一篇会议论文的扩展,主要对以下内容进行了补充:
- 增加一个关于扩散政策和控制理论之间联系的新讨论部分;
- 在仿真中包含对可替代网络架构设计和不同的预训练与微调范例的消融研究;
- 新增三个需要双手的操作任务(打蛋器、展开垫子、折叠衬衫)扩展现实世界的实验结果。
2. Diffusion Policy Formulation
作者将视觉运动机器人策略制定为去噪扩散概率模型 (DDPM)。扩散策略能够表达复杂的多模态动作分布并具有稳定的训练行为,几乎不需要针对特定任务的超参数调整。以下部分将更详细地描述 DDPM,并解释如何调整它们以表示视觉运动策略。
2.1 Denoising Diffusion Probabilistic Models
DDPM 是一类生成模型,其中输出生成被建模为去噪过程,通常称为随机 Langevin 动力学。
从高斯噪声采样的 x K x^{K} xK 开始,DDPM 执行 K K K 次去噪迭代,以产生一系列噪声水平逐渐降低的中间动作 x k , x k − 1 , x 0 x^{k},x^{k-1},x^{0} xk,xk−1,x0 ,直到形成所需的无噪声输出 x 0 x^{0} x0,该过程遵循以下方程:
x k − 1 = α ( x k − γ ε θ ( x k , k ) + N ( 0 , σ 2 I ) ) \begin{equation} x^{k-1}=\alpha(x^{k}-\gamma\varepsilon_{\theta}(x^{k},k)+N(0,\sigma^{2}I)) \end{equation} xk−1=α(xk−γεθ(xk,k)+N(0,σ2I))
上式中 ε θ \varepsilon_{\theta} εθ 是参数为 θ \theta θ 训练后的噪声预测模型; N ( 0 , σ 2 I ) N(0,\sigma^{2}I) N(0,σ2I) 是每次训练迭代过程中添加进去的高斯噪声;该方程也可以被看作是单个噪声梯度下降的过程:
x ′ = x − γ ∇ E ( x ) \begin{equation} x^{'}=x-\gamma\nabla E(x) \end{equation} x′=x−γ∇E(x)
其中噪声预测网络 ε θ \varepsilon_{\theta} εθ 可以有效地预测梯度场 ∇ E ( x ) \nabla E(x) ∇E(x); γ \gamma γ 为学习率;
选择 α , γ , σ \alpha, \gamma, \sigma α,γ,σ 作为迭代步骤 k k k 的函数,也称为噪声schedule,可以解释为梯度下降过程中的学习率 schedule。研究表明略小于 1 的 KaTeX parse error: Undefined control sequence: \alpah at position 1: \̲a̲l̲p̲a̲h̲ 可以提高稳定性。
2.2 DDPM Training
训练过程从数据集中随机抽取未修改的case x 0 x^{0} x0 开始。对于每个样本,随机选择一个去噪迭代 步长 k k k ,然后为迭代 k k k 采样具有适当方差的随机噪声 ε k \varepsilon^{k} εk。要求噪声预测网络从添加了噪声的数据样本中预测噪声。
L o s s = M S E ( ε k , ε θ ( x 0 , + ε k , k ) ) \begin{equation} Loss=MSE(\varepsilon^{k},\varepsilon_{\theta}(x^{0},+\varepsilon^{k},k)) \end{equation} Loss=MSE(εk,εθ(x0,+εk,k))
最小化上面的损失函数等价于最小化数据分布 p ( x 0 ) p(x^{0}) p(x0) 与从 DDPM q ( x 0 ) q(x^{0}) q(x0) 中抽取的样本分布之间的 KL 散度的变分下限。
2.3 Diffusion for Visuomotor Policy Learning
虽然 DDPM 通常用于图像生成,但这里使用 DDPM 来学习机器人视觉运动策略。这需要对公式进行两项重大修改:(1). 更改输出 x x x 以表示机器人动作;(2). 使去噪过程以输入观察 O t O_{t} Ot 为条件进行。Fig.2
对该过程进行概述。
Closed-loop action-sequence prediction
有效的动作公式应激励长期规划中的时间一致性和平滑性,同时允许对意外观察做出迅速反应。为了实现这一目标,在重新规划之前对扩散模型产生的动作序列进行固定时间步长的预测。具体而言,在时间步长 t t t,策略将最新的 T 0 T_{0} T0 步观察数据 O t O_{t} Ot 作为输入并预测 T p T_{p} Tp 步动作,其中 T a T_{a} Ta 步的动作是无需重新规划即可直接在机器人上执行。定义 T 0 T_{0} T0 为观察范围; T p T_{p} Tp 为动作预测范围; T a T_{a} Ta 为动作执行范围,这将激励策略在保持响应性的同时保障时间动作一致性。有关 T a T_{a} Ta 的影响更多详细信息将在第 4.3 节中讨论。此外还允许滚动范围控制,将先前动作序列作为下一个推理的预热以启动下一个推理,来进一步提高动作平滑度。
Visual observation conditioning
使用 DDPM 来近似条件分布 p ( A t ∣ O t ) p(A_{t}|O_{t}) p(At∣Ot),而不是联合分布 p ( A t , O t ) p(A_{t},O_{t}) p(At,Ot) 。这允许模型基于观察结果预测动作,而无需推断未来状态,从而加快扩散过程并提高生成动作的准确性。为了获取条件分布 p ( A t ∣ O t ) p(A_{t}|O_{t}) p(At∣Ot) 将 Equ. 1
修改为:
A t k − 1 = α ( A t k − γ ε θ ( O t , A t k , k ) + N ( 0 , σ 2 I ) ) \begin{equation} A^{k-1}_{t}=\alpha(A^{k}_{t}-\gamma\varepsilon_{\theta}(O_{t},A^{k}_{t},k)+N(0,\sigma^{2}I)) \end{equation} Atk−1=α(Atk−γεθ(Ot,Atk,k)+N(0,σ2I))
对应的损失函数 Equ.3
变化为:
L o s s = M S E ( ε k , ε θ ( O t , A t 0 + ε k , k ) ) \begin{equation} Loss=MSE(\varepsilon^{k},\varepsilon{\theta(O_{t},A^{0}_{t}+\varepsilon^{k},k)}) \end{equation} Loss=MSE(εk,εθ(Ot,At0+εk,k))
从去噪过程的输出中将观察特征 O t O_{t} Ot 剔除可显著提高推理速度并更好地适应实时控制,还有助于提高端到端视觉编码器训练的可行性。有关视觉编码器的详细信息请参见第 3.2 节。
3. Key Design Decisions
在本节中,作者描述了扩散策略的关键设计决策及其使用神经网络架构的 ε θ \varepsilon_{\theta} εθ 的具体实现。
3.1 Network Architecture Options
第一部分是选择神经网络架构 ε θ \varepsilon_{\theta} εθ。作者研究了两种常见的网络架构类型,卷积神经网络 CNN 和 Transformers,并比较了两者之间的性能和训练特性。噪声预测网络 ε θ \varepsilon_{\theta} εθ 的选择与视觉编码器无关。
CNN-based Diffusion Policy
这部分采用了修改后的 1D temporal CNN。首先,仅使用 FiLM(Feature-wise Linear Modulation)以及去噪迭代 k k k 步对观察特征 O t O_{t} Ot 上的动作生成过程进行条件分布 p ( A t ∣ O t ) p(A_{t}|O_{t}) p(At∣Ot) 建模,如 Fig2 (b)
所示;其次,只预测动作轨迹而不是关联观察的动作轨迹;最后,删除了基于修正的目标状态条件,因为与利用滚动预测的框架不兼容。
在实践中,发现基于 CNN 的主干在大多数任务上都能很好地运行,无需进行太多超参数调整。然而,当所需的动作序列随时间快速急剧变化时(例如速度命令动作空间),其表现会很差,这可能是由于时间卷积倾向于低频信号的归纳偏差。
Time-series diffusion transformer
为了减少 CNN 模型中的过度平滑效应,作者引入了一种基于 Transformer 的新型 DDPM,它采用 minGPT
中的 Transformer 架构进行动作预测。带有噪声 A t k A^{k}_{t} Atk 的动作作为 Transformer 解码器 block 的输入 token,扩散迭代 k k k 的正弦嵌入作为第一个 token 。共享 MLP 将观测 O t O_{t} Ot 转换为观测嵌入序列,然后将其作为输入特征传入 Transformer 解码器堆栈。梯度 ε θ ( O t , A t k , k ) \varepsilon_{\theta}(O_{t},A^{k}_{t},k) εθ(Ot,Atk,k) 由解码器堆栈的每个相应输出 token 预测。
在基于状态的实验中,大多数表现最佳的策略都是通过 transformer 主干实现的,尤其是在任务复杂性和动作变化率较高的情况下。然而,作者发现 transformer 对超参数更敏感。transformer 难以训练并不是 Diffusion Policy 独有的,未来可能会通过改进 transformer 训练技术或增加数据规模来解决。
Recommendations
一般而言,作者建议在新任务的首次尝试中先使用基于 CNN 的扩散策略实现。如果由于任务复杂性或高速率动作变化导致性能低下,则可以使用时间序列扩散 Transformer 公式来潜在地提高性能,但需要进行额外的调整。
3.2 Visual Encoder
视觉编码器将原始图像序列映射到潜在嵌入 O t O_{t} Ot 中,并使用扩散策略进行端到端训练。不同的摄像机视图使用单独的编码器,每个时间步长中的图像都独立编码,然后连接起来形成 O t O_{t} Ot 。使用标准未训练的 ResNet-18
作为编码器,并进行了以下修改:1)用 spatial softmax pooling
替换 global average pooling
以维护空间信息;2)用 GroupNorm
替换 BatchNorm
以实现稳定训练。当normalization layer
与exponential moving average
结合使用时,这一点很重要。
3.3 Noise Schedule
噪声规划由 σ , α , γ \sigma, \alpha, \gamma σ,α,γ 和加性高斯噪声 ε k \varepsilon^{k} εk 定义为 k k k 的函数。底层噪声规划控制扩散策略捕获动作信号高频和低频特征的程度。在实际控制任务中,通过经验发现,iDDPM 中提出的Square Cosine Schedule
最适合当前的任务。
3.4 Accelerating Inference for Real-time Control
使用扩散过程作为机器人的策略。对于闭环实时控制来说,快速的推理速度至关重要。去噪扩散隐式模型 DDIM(Denoising Diffusion Implicit Models) 将训练和推理中的去噪迭代次数分离,从而使算法可以使用更少的迭代进行推理以加快该过程。在实际实验中,使用 DDIM 进行 100 次训练迭代和 10 次推理迭代可在 Nvidia 3080 GPU 上实现 0.1 秒的推理延迟。
4. Intriguing Properties of Diffusion Policy
本节中,作者提供了一些关于扩散策略及其相对于其他形式的策略表示的优势的理解。
4.1 Model Multi-Modal Action Distributions
在行为克隆文献中,对人类演示中的多模态分布建模挑战已得到广泛讨论。扩散策略能够自然而准确地表达多模态分布,这是其主要优势之一。
扩散策略动作生成的多模态性源自两个方面:底层随机采样过程 和 随机初始化。在随机Langevin 动力学中,每次采样过程开始时都会从标准高斯中抽取一个初始样本 A t k A_{t}^{k} Atk,这有助于为最终动作预测 A t 0 A_{t}^{0} At0 分配不同的可能收敛局部最优。然后,该动作会进一步随机优化,并在大量迭代中添加高斯扰动,从而使各个动作样本能够收敛并在不同的多模态动作局部最优之间移动。Fig. 3
展示了扩散策略在没有针对测试场景进行明确演示的条件下,平面推动物体任务中的多模态行为示例。
4.2 Synergy with Position Control
作者发现,基于 位置控制动作空间 的扩散策略始终优于基于速度控制 的扩散策略,如Fig. 4
所示,这一结果与大多数近期依赖于速度控制的行为克隆研究形成了鲜明对比。作者推测这种差异有两个主要原因:1). 动作多模态在位置控制模式下比使用速度控制时更为明显,由于扩散策略比现有方法更好地表达了动作多模态性,它本质上受此影响比现有方法要小。2). 位置控制比速度控制受到的复合误差效应更小,更适合动作序列预测。因此,扩散策略受位置控制天然缺陷的影响较小,并且能够更好地利用位置控制的优势。
4.3 Benefits of Action-Sequence Prediction
由于难以有效地从高维输出空间中采样,大多数策略学习方法通常会避免使用序列预测。例如,IBC
很难有效地从能量分布不平滑的高维动作空间中采样。同样 BC-RNN
和 BET
也很难指定动作分布中存在的模式数量。
相比之下,DDPM 可以很好地适应输出维度,而不会牺牲模型性能,这在许多图像生成应用中得到了证明。基于此,扩散策略以高维动作序列的形式表示动作,这自然解决了以下问题:
- Temporal action consistency:
以Fig.3
为例。要将 T 块从底部推入目标,策略可以从左侧或右侧绕过 T 块。但是,假设序列中的每个动作都被预测为独立的多模态分布(如BC-RNN
和BET
)。在这种情况下,连续的动作可能会从不同的模式中得出,从而导致在两个有效轨迹之间交替的抖动动作。 - Robustness to idle actions:
空闲动作是指执行暂停并引发一系列原地位置的动作或接近零速度的动作。这在遥操作中很常见,在倒出液体等任务中也必不可少。然而,单步策略很容易过拟合这种暂停行为。例如,当没有明确从训练中移除空闲动作时,BC-RNN
和 IBC
经常会在现实世界的实验中陷入暂停状态,即在需要运动的时候停止运动。
4.4 Training Stability
虽然从理论上讲,IBC
应该具有与扩散策略类似的优势。然而,由于 IBC
固有的训练不稳定性,在实践中从 IBC
获得可靠且高性能的模型具有挑战性。Fig.6
显示整个训练过程中的训练误差峰值和不稳定的评估性能,模型超参数配置与checkpoint选择变得十分困难。在现实环境中,这个训练流程需要在硬件上从许多策略中选择最终策略。这里讨论为什么扩散策略在训练中看起来明显更稳定。
隐式策略使用基于能量的模型 EBM 来表示动作分布:
p θ ( a ∣ o ) = e − E θ ( o , a ) Z ( o , θ ) \begin{equation} p_{\theta}(a|o)=\frac{e^{-E_{\theta}(o, a)}}{Z(o,\theta)} \end{equation} pθ(a∣o)=Z(o,θ)e−Eθ(o,a)
上式中 Z ( o , θ ) Z(o,\theta) Z(o,θ) 是一个难以处理的正则化常数,相对于 a a a。
为了训练 EBM
实现隐式策略,作者使用了 InfoNCE-style
的损失函数,它相当于 Equ.6
中的负对数似然:
L o s s i n f o N C E = − l o g ( e − E θ ) ( o , a ) e − E θ ( o , a ) + ∑ N j = 1 n e g e − E θ ( o , a ~ j ) ) \begin{equation} Loss_{infoNCE}=-log\left(\frac{e^{-E_{\theta)(o,a)}}}{e^{-E_{\theta}(o,a)}+\sum^{N^{neg}_{j=1}}e^{-E_{\theta}(o,\tilde{a}^{j})}}\right) \end{equation} LossinfoNCE=−log(e−Eθ(o,a)+∑Nj=1nege−Eθ(o,a~j)e−Eθ)(o,a))
上式中一组负样本 { a ~ j } j = 1 N n e g \{ \tilde{a}^{j}\}^{N^{neg}}_{j=1} {a~j}j=1Nneg 被用于评估正则化常数 Z ( o , θ ) Z(o,\theta) Z(o,θ)。在实际使用中,负采样的不准确性会导致 EBM
训练不稳定。
扩散策略和 DDPM 通过对Equ.6
中相同动作分布的得分函数进行建模,完全避开了估计 Z ( a , θ ) Z(a,\theta) Z(a,θ)的问题:
∇ a l o g p ( a ∣ o ) = − ∇ a E θ ( a , o ) − ∇ a l o g Z ( o , θ ) ⏟ = 0 ≈ − ε θ ( a , o ) \begin{equation} \nabla_{a}log p(a|o)=-\nabla_{a}E_{\theta}(a,o)-\underbrace{\nabla_{a}log Z(o,\theta)}_{=0}\approx -\varepsilon_{\theta}(a,o) \end{equation} ∇alogp(a∣o)=−∇aEθ(a,o)−=0 ∇alogZ(o,θ)≈−εθ(a,o)
其中预测模型 ε θ ( a , o ) \varepsilon_{\theta}(a,o) εθ(a,o) 近似于得分函数的负值 ∇ a l o g p ( a ∣ o ) \nabla_{a}logp(a|o) ∇alogp(a∣o),独立与常量 Z ( o , θ ) Z(o,\theta) Z(o,θ)。因此,扩散策略的推理Equ.4
和训练Equ.5
过程都不涉及估计 Z ( o , θ ) Z(o,\theta) Z(o,θ),使得扩散策略训练更加稳定。
4.5 Connections to Control Theory
当任务非常简单时,扩散策略具有简单的限制行为,这能够从控制理论中得到一些严格的解释。考虑有一个线性动力系统(标准状态空间形式)的情况,控制目标为:
s t + 1 = A s t + B a t + w t , w t ∼ N ( 0 , ∑ w ) s_{t+1}=As_{t}+Ba_{t}+w_{t}, w_{t}\sim N(0,\sum_{w}) st+1=Ast+Bat+wt,wt∼N(0,w∑)
从线性反馈策略中获得规划结果: a t = − K s t a_{t}=-Ks_{t} at=−Kst,通过求解线性二次调节器等线性最优控制问题获得。模仿此策略不需要扩散模型的能力,但可以看到扩散策略得到了同样相似的结果。
当预测范围为一个时间步长, T p = 1 T_{p}=1 Tp=1 时,最小化损失函数:
L o s s = M S E ( ε k , ε θ ( s t , − K s t + ε k , k ) ) \begin{equation} Loss=MSE(\varepsilon^{k},\varepsilon_{\theta}(s_{t},-Ks_{t}+\varepsilon^{k},k)) \end{equation} Loss=MSE(εk,εθ(st,−Kst+εk,k))
得到:
ε θ ( s , a , k ) = 1 σ k [ a + K s ] \varepsilon_{\theta}(s,a,k)=\frac{1}{\sigma_{k}}[a+Ks] εθ(s,a,k)=σk1[a+Ks]
其中 σ k \sigma_{k} σk 是迭代去噪 k k k 后的方差。在推理时,DDIM 采样将在 a = − K s a=-Ks a=−Ks 处收敛到全局最小值。
轨迹预测 T p > 1 T_{p}>1 Tp>1 自然而然地获得。为了将 a t + t ′ a_{t+t^{'}} at+t′ 预测为 s t s_{t} st 的函数,优化后的降噪器将产生 a t + t ′ = − K ( A − B K ) t ′ s t a_{t+t^{'}=-K(A-BK)}^{t^{'}}s_{t} at+t′=−K(A−BK)t′st;所有涉及 w t w_{t} wt 项的期望值为零。这表明,为了完美地克隆基于状态的行为,必须隐式学习与任务相关的动态模型。请注意,如果策略是非线性的,那么预测未来行动可能会变得更加困难,并且再次涉及多模态预测。
5. Evaluation
作者系统地评估了来自 4 个基准的 15 个任务的扩散策略。该评估内容包括模拟和真实环境、单任务和多任务基准、完全驱动和欠驱动系统、刚性和流体目标。作者发现扩散策略在所有测试基准上的表现始终优于之前SOTA,平均成功率提高了 46.9%。在以下部分将概述每个任务的评估方法以及关键要点。
5.1 Simulation Environments and datasets
Robomimic
是一个大规模机器人操作基准,旨在研究模仿学习和离线强化学习。该基准包括 5 个任务,每个任务都有一个熟练的人类遥控演示数据集,其中 4 个任务(总共 9 个变体)有一个混合的熟练与不熟练操作的数据集。对于每个变体,测试了基于状态和基于图像的观察结果。每个任务的表现总结在Table.3
中。
Push-T
改编自 IBC
数据集,需要使用圆形末端执行器 (蓝色) 将 T 形块 (灰色) 推到固定目标 (红色)。T 块和末端执行器的随机初始条件增加了变化性。该任务需要利用复杂且充分接触的物体动力学,使用点接触精确推动 T 块。对于输入有两个变体,一种使用 RGB 图像观测,另一种使用从 T 块真值姿势获得 9 个 2D 关键点,两者都使用第一人称观测来定位末端执行器。
Multimodal Block Pushing
多模态推动物体的数据改编自 BET
,通过任意顺序推动方格的任务来测试策略对多模态动作分布进行建模的能力。演示数据由包含真实状态信息脚本生成,随机选择要推动的初始块并将其移动到随机的方格中。然后将剩余的块推送到剩余的方格中。此任务包含长视多模态性,无法使用从观察到动作的单个函数映射来建模。
Franka Kitchen
用于评估 IL 和离线 RL 方法学习多个长期任务的能力。Franka Kitchen
环境由包含 7 个交互对象,并附带一个包含 566 个的人类演示数据集,每个演示以任意顺序完成 4 个任务。目标是执行尽可能多的演示任务,无论顺序如何,展示短期和长期多模态性。
5.2 Evaluation Methodology
作者从所有case中展示了每个基准上每种基线方法的最佳表现,实验结果来自 3 个训练集和 50 个初始化环境(平均总共 1500 次实验)中最后 10 个checkpoint(每 50 个 epoch 保存一次)的平均值。大多数任务的指标是成功率,但使用目标区域覆盖的 Push-T
任务除外。此外,还涵盖了机器人模拟和 Push-T
任务表现最佳的 checkpoint 的平均值。所有基于状态的任务都经过 4500 个 epoch 的训练,基于图像的任务经过 3000 个 epoch 的训练。每种方法都使用其表现最佳的动作空间进行评估,结果在 Table.1
和 Table. 2
中展示。
5.3 Key Findings
在模拟基准研究中,扩散策略在所有任务和变体上的表现均优于替代方法,包括状态和视觉观察,平均提升了 46.9%(Table.1
, Table.2
)。以下段落总结了关键要点。
Diffusion Policy can express short-horizon multi- modality
短期动作多模态可以被定义为直接实现同一个运动目标的多种方式,这在人类演示数据中很普遍。在 Fig.3
中,展示了 Push-T
任务中这类短期多模态case研究。扩散策略学习以同样的概率从左侧或右侧接近接触点,而 LSTM-GMM
表现出偏向一侧,BET
则无法完成这一任务。
Diffusion Policy can express long-horizon multimodality
长视多模态是指以不同顺序完成不同子目标的任务。例如,在推块任务中推动特定块的顺序,或在厨房任务中与 7 个可能物体之间的交互顺序是任意的。作者发现扩散策略可以很好地处理这种类型的多模态性;它在两个任务上的表现都远远优于基线:在推块的 p2 指标
上提高了 32%,在厨房的 p4 指标
上提高了 213%。
Diffusion Policy can better leverage position control
消融研究(Fig.4
)表明,选择位置控制作为扩散策略动作空间的效果明显优于速度控制。然而,评估的基线方法在速度控制下效果最佳。
The tradeoff in action horizon
活动范围大于 1
有助于策略预测时间动作一致性并补偿执行中的空闲部分,但行动范围过长会因反应时间的增加而降低性能。实验证实了这种权衡(Fig.5 左
),并发现 8 步活动范围对于模型的大多数任务而言是最佳的。
Robustness against latency
扩散策略采用滚动式位置控制来预测未来的一系列动作。这种设计有助于解决图像处理、策略推理和网络延迟造成偏差。作者对模拟延迟的消融实验表明,扩散策略能够在延迟高达 4 步的情况下保持峰值性能(Fig.5
)。同时发现速度控制比位置控制更容易受到延迟的影响,这可能是由于复合误差效应造成的。
Diffusion Policy is stable to train
作者发现,扩散策略的最佳超参数在各个任务之间大多是一致的。相比之下 IBC
容易出现训练难以收敛的情况。
5.4 Ablation Study
作者探索了仿真环境下机械臂规划正方形路径任务的替代视觉编码器决策。评估了 3 种不同的架构:ResNet-18
、ResNet-34
、ViT-B/16
。对于每种架构,评估了 3 种不同的训练策略:从头开始端到端训练、使用冻结的预训练视觉编码器、微调预训练视觉编码器。使用 ImageNet-21k
对 ResNet
进行预训练,并使用 CLIP
对 ViT-B/16
进行预训练。Table. 5
显示了正方形任务与人工熟练操作数据集的定量比较。
作者发现从头开始训练 ViT
的成功率只有 22%(这可能是由于数据量有限),同时发现使用冻结的预训练视觉编码器进行训练会产生较差的性能,这表明扩散策略偏向于与常规预训练方法不同的视觉表示。但是,当使用较小的学习率(比扩散策略网络小 10 倍)对预训练视觉编码器进行微调可以获得最佳整体性能。对于 CLIP
训练的 ViT-B/16
而言尤其如此,仅用 50 个epochs就达到了 98% 的成功率。总体而言,尽管不同架构在理论上的性能差距很大,但它们之间的最佳性能相差并不大。作者预计该性能差距在复杂任务上可能会更加明显。
6. Realworld Evaluation
我们在 2 个硬件设置中的 4 个任务中评估了扩散策略在现实世界中的表现——每个设置都有来自不同演示者的训练数据。在现实世界的 Push-T 任务中,我们执行消融,检查 2 个架构选项和 3 个视觉编码器选项上的扩散策略;我们还对具有位置控制和速度控制动作空间的 2 个基线方法进行了基准测试。在所有任务中,CNN 主干和端到端训练的视觉编码器的扩散策略变体均获得了最佳性能。
6.1 Realworld Push-T Task
由于以下三点条件,真实世界的 Push-T 比模拟版本难得多:
- 真实世界的
Push-T
任务是多阶段的,要求机器人首先将T
块推入目标,然后将其末端执行器移入指定的末端区域以避免遮挡; - 该策略需要进行微调,以确保
T
在前往末端区域之前完全位于目标区域,从而产生额外的短期多模态性。 IoU
指标是在最后一步评估的,而不是在所有步骤中取最大值。通过从人类演示数据集中获得的最小IoU
指标来确定成功率的阈值。基于UR5
的实验设置如Fig.6
所示。扩散策略以 10 Hz 的频率预测机器人命令,然后这些命令线性插值到 125 Hz 以供机器人执行。
Result Analysis
扩散策略的表现接近人类水平成功率为 95%,平均 IoU
为(0.8 vs. 0.84),而表现最佳的 IBC
和 LSTM-GMM
变体的成功率分别为 0% 和 20%。Fig.7
定性地说明了从相同初始条件开始的每种方法行为。由于多模态性很高且决策边界不明确,不同运动阶段之间的过渡期表现糟糕是基线方法最常见的失败情况。LSTM-GMM
在 20 次评估中有 8 次卡在 T
块附近(第 3 行),而 IBC
在 20 次评估中有 6 次过早离开 T
块(第 4 行)。由于任务要求,这里没有遵循从训练数据中删除空闲操作的常见做法,这也导致 LSTM
和 IBC
倾向于对小动作过拟合,进而并卡在任务中。在补充材料中有视频文件可供查阅。
End-to-end v.s. pre-trained vision encoders
使用预训练的视觉编码器测试了扩散策略,如表 6 所示。使用 R3M
的扩散策略成功率达到 80%,但预测的动作不稳定,与端到端训练的版本相比更容易卡住。使用 ImageNet
的扩散策略结果不太理想,动作突变型高且性能不佳。作者还发现端到端训练仍然是将视觉观察纳入扩散策略的最有效方法,表现最好的模型都是端到端训练的。
Robustness against perturbation
扩散策略对视觉和物理扰动的鲁棒性在 Table.6
中的实验中进行了单独评估。如 Fig.8
所示,施加了三种类型的扰动。1) . 前置摄像头被挥手遮挡 3 秒,虽然扩散策略表现出了一些抖动,但仍保持在航向上并将 T
块推入到位;2). 在扩散策略对 T
块的位置进行微调时移动了 T
块。扩散策略立即重新规划以从相反方向推动,从而消除了扰动的影响;3). 在机器人完成第一阶段后前往终点区途中移动了 T
,扩散策略立即改变航向,将 T
块调整回目标,然后继续前往终点区;该实验表明,扩散策略可能能够根据未见过的观察结果合成新行为。
6.2 Mug Flipping Task
杯子翻转任务旨在测试扩散策略在接近硬件运动极限的情况下处理复杂 3D 旋转的能力。目标是重新调整随机放置的杯子,使其 1 杯口朝下 2 杯柄朝左,如 Fig.9
所示。根据杯子的初始姿势,操作者可能会直接将杯子放置在所需方向,或者可以使用额外的推动手柄来旋转杯子。因此数据集是高度多模态的:抓握与推动、不同类型的抓握(正手与反手)或局部抓握调整(围绕杯子主轴旋转),并且对于基线方法而言更具有挑战性。
Result Analysis
扩散策略能够在 20 次试验中以 90% 的成功率完成此任务。尽管在数据集中从未出现过,但该策略还是能够在必要时对多次推动动作进行排序,或在杯子掉落时重新抓取。作者还训练了一个使用相同数据子集进行训练的 LSTM-GMM
策略。对于 20 个分布内的初始条件,LSTM-GMM
从未正确对齐杯子,并且在所有试验中都无法成功抓取。
6.3 Sauce Pouring and Spreading
液体倾倒和涂抹任务旨在测试扩散策略在现实世界设置中处理非刚性物体、6 自由度动作空间、周期性动作的能力。Franka Panda
任务Fig.10
所示。6DoF 倾倒任务的目标是将一满勺酱汁倒在披萨面团的中心,通过倾倒的酱汁mask和披萨面团中心的标称圆之间的 IoU
来衡量(Fig.10
中的绿色圆圈所示);周期性涂抹任务的目标是将酱汁涂抹在披萨面团上,性能通过酱汁覆盖率来衡量。评估过程中的变化来自面团和酱汁碗的随机位置。成功率是通过最低限度的人类表现阈值计算得到。两个任务都使用相同的 Push-T
超参数进行训练,并且在第一次尝试时就获得了成功的策略。
倒酱汁任务要求机器人静止一段时间,以便将粘稠的番茄酱倒入勺子中。由此产生的空闲动作对于行为克隆算法来说具有挑战性,因此通常会被避免或过滤掉。在酱汁倒出过程中需要进行精细调整,以确保覆盖并达到所需的形状。
涂抹酱汁策略灵感来自人类厨师技巧,该技术既需要长视循环来最大化覆盖面积,也需要短视界反馈来实现均匀分布(因为所用的番茄酱经常会滴成大小不可预测的块状)。由于周期性运动很难学习,通常需要通过专门的动作表示来解决。这两项任务都需要策略通过举起勺子/汤匙来自行终止。
Result Analysis
扩散策略在上述两项任务上的表现都接近人类,在倒料时覆盖率为 0.74 vs 0.79,在摊铺时覆盖率为 0.77 vs 0.79。扩散策略对外部扰动(例如在倒料和摊铺过程中用手移动披萨面团)反应灵敏。
LSTM-GMM
在酱汁倾倒和涂抹任务上表现不佳。在 20 次倾倒试验中,有 15 次在成功舀出酱汁后但未能举起勺子。而当成功举起勺子后,酱汁倾倒在偏离中心的位置。LSTM-GMM
在所有试验中都未能自行终止。作者怀疑 LSTM-GMM
的隐藏状态未能捕获足够长的历史信息以区分任务的舀取和提起阶段。对于涂抹酱汁,LSTM-GMM
总是在开始后立即举起勺子,并且在所有的 20 次实验中都未能接触到酱汁。
7 Realworld Bimanual Tasks
除了单臂配置之外,作者还在几个具有挑战性的双手任务上进一步展示了扩散策略。为了实现双手任务,大部分精力都花在扩展机器人堆栈以支持多臂遥控和控制上。扩散策略对于这些任务开箱即用,无需进行参数调整。
7.1 Observation and Action Spaces
本体的感知空间扩展包括两个末端执行器的姿势和两个夹持器的夹持器宽度,图像的感知空间由两个第三视角摄像机和两个腕部摄像机组成,每个手臂上都连接一个。动作空间扩展包括两个末端执行器的期望姿势和两个夹持器的期望夹持器宽度。
7.2 Teleoperation
同时使用 2 个 SpaceMouse
的任务相当具有挑战性,因此作者实现了两种新的远程操作模式:使用带有双手控制器的 Meta Quest Pro VR
设备,或使用 2 个 Haption Virtuose™ 6D HF TAO
设备进行触觉控制,使用双边位置-位置耦合。这种耦合是在 Haption
设备和 Franka Panda
手臂之间进行的。
7.3 Bimanual Egg Beater
Fig.11
说描述了双手打蛋器任务,使用 OXO™
打蛋器和 Room Essentials™
塑料碗。此任务可以说明触觉反馈对于远程操作双手操作的重要性,并且对协调使用工具等日常生活任务也是如此。如果没有触觉反馈,模型在 10 次试验中无法成功完成一次任务。5 次失败是因为机器人将曲柄手柄从打蛋器上拉下来;3 次失败是因为机器人丢失手柄的抓握;2 次失败是因为机器人触发扭矩限制。相比之下,在使用触觉反馈的情况下相同模型可以轻松完成此任务 10 次任务。使用触觉反馈使比没有反馈更快、质量更高。
Result Analysis
扩散策略能够在 20 次试验中以 55% 的成功率完成这项任务,使用 210 次演示进行训练。这些失败的主要原因是打蛋器的初始定位超出范围、没有找到打蛋器曲柄、无法抓住它。所有推出的初始状态和最终状态均在 Fig.18, Fig.19
进行了可视化。
7.4 Bimanual Mat Unrolling
Fig.12
展示并描述了展开垫子的任务,使用 XXL Dog Buddy™Dog Mat
。此任务使用 VR 进行远程操作演示,因为不需要丰富的触觉反馈来执行任务。在演示这些项技能是全方面的,这意味着可以根据初始条件向左或向右展开。
Result Analysis
扩散策略能够在 20 次试验中以 75% 的成功率完成这项任务,使用 162 个演示进行训练。这些失败的主要原因是在最初抓握垫子时抓握失误,且难以自我纠正,因此陷入重复相同行为的困境,如 Fig.16, Fig.17
所示。
7.5 Bimanual Shirt Folding
Fig.13
描述了T恤折叠任务,此任务也是使用 VR 进行远程操作演示的,因为不需要反馈来执行任务。由于运动学和工作空间的限制,此任务明显更长,可能需要多达九个离散步骤。最后几个步骤需要两个夹持器彼此非常接近,中级控制器处理防撞对于远程操作和策略推出都尤为重要。
Result Analysis
扩散策略能够在 20 次试验中以 75% 的成功率完成这项任务,使用 284 个演示进行训练。这些失败的主要原因是未能在初次抓住衣角、无法在最后停止调整衬衫。如 Fig.21, Fig.22
所示。
8 Related Work
不需要明确行为的编程让机器人具备创造力是该领域的长期挑战。虽然概念上很简单,但行为克隆在一系列现实世界的机器人任务中显示出各色的前景,当前的行为克隆方法可以根据策略的结构分为两类。
Explicit Policy
最简单的显式策略形式是从环境状态或观察内容直接映射到行动,通过一次前向传递可以用直接回归损失进行监督,该策略具有高效的推理时间。然而这种类型的策略不适合对多模态演示行为进行建模,同时在高精度任务中遇到困难。一种常见的多模态动作分布建模,保持动作方向映射简单性的方法是通过离散化动作空间,将回归任务转换为分类任务。然而随着维数的增加,近似连续动作空间所需的bins呈指数增长。另一种方法是结合分类分布和高斯分布,通过使用 MDN
来表示连续多模态分布,或使用偏移预测进行聚类。这些模型往往对超参数调整很敏感,表现出演示崩溃,并且在表达高精度行为的能力方面仍然有限。
Implicit Policy
隐式策略使用基于能量模型 EBM
定义动作的分布,每个动作都被分配一个能量值,动作预测对应于寻找最小能量动作的优化问题。由于不同的动作可能被分配低能量,隐式策略自然代表多模态分布。然而,现有的隐式策略训练起来不稳定,因为在计算底层 Info-NCE
损失时需要抽取负样本。
Diffusion Models
扩散模型是一种概率生成模型,迭代地将随机采样的噪声细化为来自底层分布的抽样,也可以在概念上理解为学习隐式动作得分的梯度场,然后在推理过程中优化该梯度。先前有研究探索了如何在规划的背景下使用扩散模型,并推断出在给定环境中可能执行的动作轨迹。在强化学习的背景下,使用扩散模型进行策略表示和基于状态的观察的正则化。作者则探索了如何在行为克隆的背景下有效地应用扩散模型,以实现有效的视觉运动控制策略。为了构建有效的视觉运动控制策略,作者建议将 DDPM
预测高维动作序列的能力与闭环控制相结合,以及一种用于动作扩散的新Tramsformers架构和一种将视觉输入集成到动作扩散模型中的方式。
还有学者对仿真环境中对基于扩散的策略进行了补充分析。那些研究更关注有效的采样策略,利用无分类器指导进行目标调节以及强化学习中的应用,而作者关注有效的行动空间,但在仿真环境中的效果基本一致,充分的真机实验为滚动时域预测方案的重要性、速度和位置控制之间的选择、优化实时推理、物理机器人系统的其他关键设计决策的必要性提供了强有力的证据。
9 Limitations and Future Work
尽管作者已经证明了扩散策略在仿真和真实系统中的有效性,但未来的工作仍有一些局限性需要改进。首先,作者的方法复线了行为克隆的局限性,例如在演示数据不足的情况下性能不佳。扩散策略可以应用于其他范式,以利用次优和负面数据。其次,与 LSTM-GMM
等更简单的方法相比,扩散策略具有更高的计算成本和推理延迟,动作序列预测方法部分缓解了这个问题,但仍然无法满足高速率控制的任务。未来的工作可以利用扩散模型加速方法的最新进展来减少所需的推理步骤数。
10 Conclusion
在本文中,作者评估了基于扩散的策略对机器人行为的可行性。通过对仿真和现实世界中的 15 项任务进行全面评估,证明了基于扩散的视觉运动策略始终如一地优于现有方法,同时还稳定且易于训练。实验结果还强调了关键的设计因素,包括后退视界动作预测、末端执行器位置控制和有效的视觉调节,这些对于充分发挥基于扩散的策略的潜力至关重要。虽然许多因素都会影响行为克隆策略的最终质量,包括演示的质量和数量、机器人的物理能力、策略架构和使用的预训练机制,但实验结果表明,策略结构在行为克隆过程中构成了显著的性能瓶颈。作者希望这项工作能够推动该领域对基于扩散的政策的进一步探索,并强调考虑行为克隆过程的所有方面的重要性,而不仅仅是用于政策训练的数据。
相关文章:
VLA 论文精读(三)Diffusion Policy: Visuomotor Policy Learning via Action Diffusion
这篇笔记用来描述 2023年 发表在arxiv上的一篇有关VLA领域的论文,这篇笔记记录的是该论文 2024年03月的改版后。 写在最前面 为了方便你的阅读,以下几点的注意事项请务必了解: 该系列文章每个字都是我理解后自行翻译并写上去的,…...
ASP.NET Core 中实现 SSE 流式响应的简单例子
[HttpGet] public async Task<IActionResult> SseExample() {// 请求头Response.Headers.Add("Content-Type", "text/event-stream");Response.Headers.Add("Cache-Control", "no-cache");Response.Headers.Add("Connectio…...
「Unity3D」TMP_InputField关闭虚拟键盘后,再次打开虚拟键盘,此时无法回调onSelect的问题
TMP_InputField可以注册一个onSelect回调函数,在InputField选中的时候回调,但在虚拟键盘手动关闭或被返回取消的时候,此时再打开虚拟键盘时,就不会调用onSelect。 原因在于,虚拟键盘有三种关闭的操作方式:…...
手工排查后门木马的常用姿势
声明!本文章所有的工具分享仅仅只是供大家学习交流为主,切勿用于非法用途,如有任何触犯法律的行为,均与本人及团队无关!!! 1. 检查异常文件 (1)查找最近修改的文件 # 查…...
VRRP协议
基础概念 Master 路由器:“Master 路由器”在一个 VRRP 组中承担报文转发任务。在每一个 VRRP 组中,只有 Master 路由器才会响应针对虚拟 IP 地址的 ARP Request。Master 路由器会以一定的时间间隔周期性地发送 VRRP 报文,以便通知同一个 VRRP 组中的 B…...
【JavaEE】MyBatis 综合练习(图书管理系统)
目录 一、数据库表二、引入依赖:三、Model创建四、用户登录五、添加图书六、图书列表七、修改图书八、删除图书九、批量删除十、强制登录 图书管理系统 一、数据库表 我们使用两张表,一张用户表uset_test来记录登录的用户信息,一张图书表boo…...
ArkUI —— 组件导航
创建导航页 // src\main\ets\pages\Index.ets Entry Component struct Index {// 路由栈Provide(pathInfos) pathInfos: NavPathStack new NavPathStack()build() {Navigation(this.pathInfos) {}} }创建导航子页 this.navPath.pushPathByName(AccountTag, 账本分类管理)// …...
数据处理与机器学习入门
一、数据处理概述 数据处理是通过统计学、机器学习和数据挖掘方法从原始数据中提取有价值信息的过程。数据处理的目标是将杂乱无章的原始数据转化为可用于分析和建模的结构化数据。对于小规模数据处理,常用工具分为两类: • 可视化分析工具:…...
Markdown在线转word格式
1、打开网址 https://dillinger.io/ 2、输入markdown格式文章 3、直接转换为右边的word格式 4、复制粘贴即可。...
Redis延时队列在订单超时未报到场景的应用分享
一、引言 在电商、医疗预约等众多业务场景中,经常会遇到需要处理超时任务的情况。比如医疗预约订单,如果患者在支付成功后,到了预约结束时间还未报到,系统需要自动取消订单。为了实现这样的功能,我们可以利用 Redis 延…...
vue前端代码作业——待办事项
美化样式示意图: 后端IDEA代码示意图: 代码解释: 1. isAllChecked 计算属性的作用 isAllChecked 用于实现 “全选 / 全不选” 功能,它是一个 双向绑定 的计算属性(因为 v-model 需要同时支持读取和设置值)…...
docker镜像拉取失败
hub.docker.com中提供的docker pull命令在服务器拉取镜像时报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) 这个错误通常表明Docker客户…...
Ruby 简介
Ruby 简介 引言 Ruby 是一种广泛使用的动态、开源的编程语言,自 1995 年由日本程序员 Yukihiro Matsumoto(通称 Matz)设计以来,它以其优雅的语法、强大的库支持和跨平台特性赢得了全球开发者的青睐。本文将详细介绍 Ruby 的起源、特点、应用领域以及它在现代软件开发中的…...
解决 FFmpeg 使用 C/C++ 接口时,解码没有 shell 快的问题(使用多线程)
一、问题 硬件设备为香橙派 5Plus,最近需要使用硬件视频解码来加速 YOLO 的检测,shell 窗口的FFmpeg已经调通,详见文章: 编译支持 RKmpp 和 RGA 的 ffmpeg 源码_rk3588 ffmpeg mpp-CSDN博客https://blog.csdn.net/plmm__/article…...
sqlalchemy:将mysql切换到OpenGauss
说明 之前python的项目使用的mysql,近期要切换到国产数据库OpenGauss。 之前的方案是fastapisqlalchemy,测试下来发现不用改代码,只要改下配置即可。 切换方案 安装openGauss-connector-python-psycopg2 其代码工程在:https:…...
缓存使用纪要
一、本地缓存:Caffeine 1、简介 Caffeine是一种高性能、高命中率、内存占用低的本地缓存库,简单来说它是 Guava Cache 的优化加强版,是当下最流行、最佳(最优)缓存框架。 Spring5 即将放弃掉 Guava Cache 作为缓存机…...
Qt之Service开发
一、概述 基于Qt的用于开发系统服务(守护进程)和后台服务,有以下几个优秀的开源 QtService 框架和库。 1. QtService (官方解决方案) GitHub: https://github.com/qtproject/qt-solutions/tree/master/qtservice 特点: 官方提供的服务框架 支持 Windows 服务和 Linux 守护…...
ssm框架之Spring
Spring框架介绍 Spring框架是一个轻量级的企业级应用框架 通过它可以贯穿表现层、业务层、持久层。集成方便,简单易用,具有如下特点: Spring框架特色 Spring设计理念 是面向Bean的编程 Spring两大核心技术 控制反转(IoC:Inver…...
Flutter 开发环境配置--宇宙级教学!
目录 一、安装环境(Windows)二、Android 创建Flutter项目三、VSCode 搭建环境四、补充 一、安装环境(Windows) Flutter SDK 下载 推荐使用中国镜像站点下载 Flutter SDK,速度更快:中国环境 或者从官网下载…...
音视频 YUV格式详解
前言 本文介绍YUV色彩模型,YUV的分类和常见格式。 RGB色彩模型 在RGB颜色空间中,任意色光F都可以使用R、G、B三色不同的分量混合相加而成即: F = R + G + B.。即我们熟悉的三原色模型。 RGB色彩空间根据每个分量在计算机中占用的存储字节数可以分为以下几种类型,字节数…...
力扣 第 153 场双周赛 讲题
文章目录 Q1.字符串的反转度Q2.操作后最大活跃区段数I3500.将数组分割为子数组的最小代价 Q1.字符串的反转度 签到题,直接建立一个映射表即可 class Solution:def reverseDegree(self, s: str) -> int:# 先建立映射表ss "abcdefghijklmnopqrstuvwxyz"store {}i…...
grafana 配置页面告警
添加告警规则 1.登录grafana 点击 Alerting > Alert rules 点击 New alert rule 2.填写告警规则名字 3.配置告警规则 选择数据源为 Loki 单机 Builder 单机Label brower 单机 node_name 标签,选择一个主机,选好后单机 Show logs 这时候查询语…...
Cent OS7+Docker+Dify
由于我之前安装了Dify v1.0.0,出现了一些问题:无法删除,包括:知识库中的文件、应用、智能体、工作流,都无法删除。现在把服务器初始化,一步步重新安装,从0到有。 目录 1、服务器重装系统和配置…...
【自学笔记】PHP语言基础知识点总览-持续更新
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1. PHP 简介2. PHP 环境搭建3. 基本语法变量与常量数据类型运算符 4. 控制结构条件语句循环语句 5. 函数函数定义与调用作用域 6. 数组7. 字符串8. 表单处理9. 会话…...
Android Gradle 下载插件或依赖太慢
问题与处理策略 问题描述 Android 项目中,settings.gradle 文件中,有如下配置,Gradle 插件或依赖下载速度慢 pluginManagement {repositories {gradlePluginPortal()google()mavenCentral()} }dependencyResolutionManagement {repositori…...
python-59-基于python内置库解析html获取标签关键信息
文章目录 1 html.parser1.1 初始化和基础使用1.1.1 handle_starttag(self, tag, attrs)1.1.2 handle_endtag(self, tag)1.1.3 handle_startendtag(self, tag, attrs)1.1.4 handle_data(self, data)1.1.5 handle_comment(self, data)1.2 解析HTML文档的流程2 百度搜索关键词链接…...
elementplus的el-tabs路由式
在使用 Element Plus 的 el-tabs 组件,实现路由式的切换(即点击标签页来切换不同的路由页面)。下面是一个基于 Vue 3 和 Element Plus 实现路由式 el-tabs 的基本步骤和示例。 步骤 1: 安装必要的库 在vue3项目安装 Vue Router 和 Element …...
ArcGIS地理信息系统空间分析实验教程学习
ArcGIS 作为地理信息系统领域的经典软件,以其强大的功能和广泛的应用场景,成为了众多学者、研究人员和专业人士的首选工具。它不仅可以高效地处理和可视化地理空间数据,还能通过复杂的空间分析模型,揭示地理现象背后的规律和趋势。…...
mac部署CAT监控服务
在 Mac 上部署美团点评开源的 CAT 监控服务端,可以按照以下步骤操作: 1. 环境准备 1.1 安装依赖 确保已安装以下工具: JDK 8(建议 OpenJDK 11) MySQL 5.7(存储监控数据)(8.0不支持…...
鸿蒙OS 5 架构设计探秘:从分层设计到多端部署
文章目录 鸿蒙OS架构设计探秘:从分层设计到多端部署一、鸿蒙的分层架构设计二、模块化设计的精髓三、智慧分发设计:资源的动态调度四、一次开发,多端部署的实践总结与思考 鸿蒙OS架构设计探秘:从分层设计到多端部署 最近两年来&a…...
深入解析:ElasticSearch Query 查询方式
全文目录: 开篇语前言摘要概述ElasticSearch Query 查询方式详解1. Match 查询(全文搜索)1.1 Match 查询示例1.2 Match 查询参数扩展 2. Term 查询(精准查询)2.1 Term 查询示例2.2 Terms 查询 3. Bool 查询(…...
HTML5贪吃蛇游戏开发经验分享
HTML5贪吃蛇游戏开发经验分享 这里写目录标题 HTML5贪吃蛇游戏开发经验分享项目介绍技术栈核心功能实现1. 游戏初始化2. 蛇的移动控制3. 碰撞检测4. 食物生成 开发心得项目收获后续优化方向结语 项目介绍 在这个项目中,我使用HTML5 Canvas和原生JavaScript实现了一…...
桥接模式_结构型_GOF23
桥接模式 桥接模式(Bridge Pattern)是一种结构型设计模式,核心思想是将抽象与实现分离,使两者能独立变化。它像一座连接两岸的桥梁,让“抽象层”和“实现层”自由组合,避免因多维度变化导致的“类爆炸”问…...
卡尔曼滤波入门(二)
核心思想 卡尔曼滤波的核心就是在不确定中寻找最优,那么怎么定义最优呢?答案是均方误差最小的,便是最优。 卡尔曼滤波本质上是一种动态系统状态估计器,它回答了这样一个问题: 如何从充满噪声的观测数据中,…...
有关pip与conda的介绍
Conda vs. Pip vs. Virtualenv 命令对比 任务Conda 命令Pip 命令Virtualenv 命令安装包conda install $PACKAGE_NAMEpip install $PACKAGE_NAMEX更新包conda update --name $ENVIRONMENT_NAME $PACKAGE_NAMEpip install --upgrade $PACKAGE_NAMEX更新包管理器conda update con…...
【Portainer】Docker可视化组件安装
Portainer Portainer 是用于管理容器化环境的一体化平台工程解决方案,提供广泛的定制功能,以满足个人开发人员和企业团队的需求。 官方地址: https://www.portainer.io/ 安装 在 WSL / Docker Desktop 上使用 Docker 安装 Portainer CE 通过命令或UI页…...
基于深度神经网络的图像防篡改检测方法研究
标题:基于深度神经网络的图像防篡改检测方法研究 内容:1.摘要 随着数字化时代的发展,图像篡改现象日益普遍,严重影响了图像信息的真实性和可靠性。本文旨在研究基于深度神经网络的图像防篡改检测方法,以有效识别被篡改的图像。通过收集大量真…...
MATLAB导入Excel数据
假如Excel中存在三列数据需要导入Matlab中。 保证该Excel文件与Matlab程序在同一目录下。 function [time, voltage, current] test(filename)% 读取Excel文件并提取时间、电压、电流数据% 输入参数:% filename: Excel文件名(需包含路径,如C:\data\…...
华为GaussDB数据库的手动备份与还原操作介绍
数据库的备份以A机上的操作为例。 1、使用linux的root用户登录到GaussDB服务器。 2、用以下命令切换到 GaussDB 管理员用户,其中,omm 为当前数据库的linux账号。 su - omm 3、执行gs_dump命令进行数据库备份: 这里使用gs_dump命令进行备…...
MySQL数据库BUG导致查询不到本该查到的数据
在数据库的日常使用中,我们常常会遇到一些看似匪夷所思的查询问。最近就看到一个因为MySQL BUG导致无法查到本该查询到数据的案例。 1. 问题背 数据库版本:MySQL8.0.40 假设我们创建了一个名为 product_info 的表,用于存储产品的相关信息。该…...
Dubbo(25)如何配置Dubbo的协议和端口?
配置Dubbo的协议和端口是设置分布式服务通信的基础步骤。Dubbo支持多种协议(如Dubbo、RMI、HTTP等),你可以根据需求选择合适的协议并配置相应的端口。下面以一个完整的Spring Boot项目为例,详细介绍如何配置Dubbo的协议和端口。 …...
服务器磁盘卷组缓存cache设置介绍
工具1: storcli a. 确认软件包是否安装 [rootlocalhost ~]#rpm -qa | grep storcli storcli-1.21.06-1.noarch 备注:若检索结果为空,需要安装对应的软件安装包。安装命令如下: #rpm -ivh storcli-xx-xx-1.noarch.rpm b. 查看逻辑…...
StarVector:开启多模态SVG生成的新纪元——开源AI模型的革新之作
在AI技术蓬勃发展的今天,图像生成模型已不再局限于像素级的输出。StarVector作为一款开源的多模态SVG生成模型,凭借其独特的代码与视觉融合能力,正在重新定义矢量图形的创作方式。它不仅让图像生成更灵活、更轻量化,还为设计师、开…...
MySQL日期时间函数
函数分类 函数名 功能描述 语法示例 获取当前日期和时间 NOW() 返回包含年、月、日、时、分、秒的完整时间戳,格式为 YYYY-MM-DD HH:MM:SS SELECT NOW(); CURDATE() / CURRENT_DATE() 获取当前日期,格式为 YYYY-MM-DD SELECT CURDATE(); 或 SE…...
WinSCP使用教程:(SFTP、SCP、FTP 和 WebDAV)
WinSCP 是一款免费开源的 Windows 环境下的 SFTP、SCP、FTP 和 WebDAV 客户端,主要用于在本地计算机与远程服务器之间安全地传输文件,并提供基本的文件管理功能。 WinSCP是Windows环境下使用SSH的开源图形化的SFTP的客户端 SSH 的全称是 Secure Shell&…...
备份是个好习惯
##解题思路 首先看到题目说备份是个好习惯,说明可能存在备份文件泄露 用dirsearch或者其他的目录扫描工具扫一扫,发现两个网址状态码正常,其中一个刚好是.bak的备份文件 至于flag文件,无法读取源码,都是空的 下载备份…...
centos 7 LVM管理命令
物理卷(PV)管理命令 pvcreate:用于将物理磁盘分区或整个磁盘创建为物理卷。 示例:sudo pvcreate /dev/sdb1 解释:将 /dev/sdb1 分区创建为物理卷。 pvdisplay:显示物理卷的详细信息,如大小、所属…...
使用 Spring Boot 3.2 集成 MinIO 8.5:实现高效对象存储
摘要 MinIO 是一款高性能的分布式对象存储服务,与云原生应用完美契合。本文将手把手教你如何在 Spring Boot 3.2 项目中集成 MinIO 8.5 版本,实现文件上传、下载和删除等核心功能,并提供完整代码示例和常见问题解决方案。 一、环境准备 JDK …...
【Qt】数据库管理
数据库查询工具开发学习笔记 一、项目背景与目标 背景:频繁编写数据库查询语句,希望通过工具简化操作,提升效率。 二、总体设计思路 1. 架构设计 MVC模式:通过Qt控件实现视图(UI),业务逻辑…...
C#:Time.deltaTime
目录 第一性原理:从最基本的问题开始 什么是Time.deltaTime? 1. 什么是“帧”? 2. 什么是“帧率”? 为什么需要它? 一个生活化的例子 更通俗的类比 在Unity中的特殊性 第一性原理:从最基本的问题开…...