Diffusion Policy——斯坦福刷盘机器人UMI所用的扩散策略(含Diff-Control、ControlNet详解)

news2024/11/24 8:33:50

前言

本文一开始是属于此文《UMI——斯坦福刷盘机器人:从手持夹持器到动作预测Diffusion Policy(含代码解读)》的第三部分,考虑后Diffusion Policy的重要性很高,加之后续还有一系列基于其的改进工作

故独立成本文,且把原属于另一篇文章的Diff-Control、ControlNet详解都已归纳至本文

第一部分 Diffusion Policy

1.1 什么是Diffusion Policy及其优势

1.1.1 什么是扩散策略

所谓扩散策略,是指将机器人的视觉运动策略表示为条件去噪扩散过程来生成机器人行为的新方法,如下图所示

  • a)具有不同类型动作表示的显式策略(Explicit policy with different types of action representations)
  • b)隐式策略学习以动作和观察为条件的能量函数,并优化能够最小化能量景观的动作
    Implicit policy learns an energy function conditioned on both action and observation and optimizes for actions that minimize the energy landscape
  • c)通过“条件去噪扩散过程在机器人行动空间上生成行为”,即该扩散策略策略不直接输出一个动作,而是推断出「基于视觉观察的动作-评分梯度」,进行K次去噪迭代
    instead of directly outputting an action, the policy infers the action-score gradient, conditioned on visual observations, for K denoising iterations

1.1.2 扩散策略的优势:表达多模态动作分布、高维输出空间、稳定训练

扩散策略有以下几个关键特性

  • 可以表达多模态动作分布
    通过学习动作评分函数的梯度(Song和Ermon,2019),并在此梯度场上执行随机朗之万动力学采样,扩散策略可以表达任意可归一化的分布(Neal等,2011),其中包括多模态动作分布
    By learning the gradient of the action score function Song and Ermon (2019) and performing Stochastic Langevin Dynamics sampling on this gradient field,Diffusion policy can express arbitrary normalizabledistributions Neal et al. (2011), which includes mul-timodal action distribution
  • 高维输出空间
    正如其令人印象深刻的图像生成结果所示,扩散模型在高维输出空间中表现出了极好的可扩展性。这一特性使得策略能够联合推断一系列未来动作,而不是单步动作,这对于鼓励时间上的动作一致性和避免比较短浅的规划至关重要
  • 稳定训练
    训练基于能量的策略通常需要负采样来估计难以处理的归一化常数,这已知会导致训练不稳定(Du et al., 2020;Florence et al., 2021)
    扩散策略通过学习能量函数的梯度绕过了这一要求,从而在保持分布表达能力的同时实现了稳定训练

进一步,为了充分释放扩散模型在物理机器人上进行视觉运动策略学习的潜力,作者团队提出了一套关键的技术贡献,包括将闭环动作序列、视觉条件化和时间序列扩散transformer结合起来

  1. 闭环动作序列
    结合策略预测高维动作序列的能力与递推视界控制来实现稳健执行(We combine the policy’s capability to predict high-dimensional action sequences with receding-horizon control to achieve robust execution)
    这种设计允许策略以闭环方式持续重新规划其动作,同时保持时间上的动作一致性,从而在长视距规划和响应性之间实现平衡
  2. 视觉条件化
    引入了一种视觉条件化扩散策略,其中视觉观测被视为条件而不是联合数据分布的一部分。在这种公式化中,策略只需提取一次视觉表示,而无需考虑去噪迭代,从而大大减少了计算量,并实现了实时动作推理
    where the visual observations are treated as conditioning instead of apart of the joint data distribution. In this formulation,the policy extracts the visual representation onceregardless of the denoising iterations,which drastically reduces the computation and enable sreal-time action inference
  3. 时间序列扩散transformer
    提出了一种基于transformer的新型扩散网络,该网络最小化了典型CNN模型的过度平滑效应,并在需要高频动作变化和速度控制的任务中实现了最先进的性能

1.2 Diffusion for Visuomotor Policy Learning

1.2.1 扩散策略背后的扩散过程回顾

  1. 众所周知,从高斯噪声中采样的\mathbf{x}^{K}开始,DDPM执行K次去噪迭代,以生成一系列噪声逐渐减少的中间动作:\mathbf{x}^{k}, \mathbf{x}^{k-1} \ldots \mathbf{x}^{0},直到形成所需的无噪声输出x_0 (说白了,就是去噪)
    该过程遵循下述所示的公式1

    其中\varepsilon_{\theta}为通过学习优化参数的噪声估计网络,为每次迭代时加入的高斯噪声
  2. 且上面的公式1也可以理解为一个单一的噪声梯度下降步长,定义为如下公式2
    \mathbf{x}^{\prime}=\mathbf{x}-\gamma \nabla E(\mathbf{x})

    其中噪声估计网络\varepsilon_{\theta}(\mathbf{x}, k)有效地预测了梯度场\nabla E(\mathbf{x})\gamma为学习速率

    此外,公式1中的\alpha\gamma\sigma作为与迭代步长k相关的函数选择被称为噪声调度,可以理解为梯度下降过程中学习速率的调整策略。经证明,将\alpha设定略小于1能够改善稳定性
  3. 再之后,训练过程首先从数据集中随机抽取未修改的样本x_0开始
    对于每个样本,随机选择一个去噪迭代k,然后为迭代k采样一个具有适当方差的随机噪声\varepsilon^{k}
    然后要求噪声估计网络从添加噪声的数据样本中预测噪声,如下公式3

    最小化公式3所示的损失函数,也同时最小化了数据分布p\left(\mathbf{x}^{0}\right)和从DDPM q\left(\mathbf{x}^{0}\right)中提取的样本分布之间KL-散度的变分下界「minimizing the loss functionin Eq 3 also minimizes the variational lower bound of the KL-divergence between the data distribution p(x0) and the distribution of samples drawn from the DDPM q(x0) usingEq 1

1.2.2 改造DDPM,使其表达机器人视觉运动策略

虽然DDPM通常用于图像生成,但该团队使用DDPM来学习机器人的视觉运动策略。这需要针对DPPM的公式进行两大修改

  1. 之前输出的是图像,现在需要输出:为机器人的动作(changing the output x to represent robot actions)
  2. 去噪时所依据的去噪条件为输入观测\mathbf{O}_{t} (making the denoising processes conditioned on input observation Ot)

为了达到以上这两个修改的目的,需要做以下措施

  • 一、闭环动作序列预测
    一个有效的动作制定应该鼓励在长期规划中的时间一致性和平滑性,同时允许对意外观察做出迅速反应
    为了实现这一目标,应该在重新规划之前,采用扩散模型生成的固定持续时间行动序列预测
    即如论文原文所说:“An effective action formulation should encourage temporal consistencyand smoothness in long-horizon planning while allowingprompt reactions to unexpected observations. To accomplishthis goal, we commit to the action-sequence prediction produced by a diffusion model for a fixed duration beforere planning

    具体来说,在时间步骤t,策略将最新的T_{o}个观察数据O_t作为输入,并预测T_{p}个动作,其中T_{a}个动作在不重新规划的情况下在机器人上执行
    (在此定义中,T_{o}表示观测范围,T_{p}表示动作预测范围,而T_{a}则代表了动作执行范围)

    这样做既促进了时间动作的一致性,又保持了响应速度

如下图所示

  • a) 一般情况下,该策略在时间步长t时,将最新的T_{o}步观测数据O_{t}作为输入,并输出T_{a}步动作A_{t}
    General formulation. At time step t, the policy takes the latest To steps of observation data Ot as input and outputs Ta steps of actions At
  • b) 在基于CNN的扩散策略中,对观测特征O_{t}应用FiLM(Feature-wise Linear Modulation)来调节每个卷积层通道
    In the CNN-based Diffusion Policy, FiLM (Feature-wise Linear Modulation) [Film: Visual reasoning with a general conditioning layer] conditioning of the observation feature Ot is applied to every convolution layer, channel-wise.

    然后从高斯噪声中提取的\mathbf{A}_{t}^{K}减去噪声估计网络\varepsilon_{\theta}的输出,并重复K次,得到去噪动作序列\mathbf{A}_{t}^{0} 「这个过程是扩散模型去噪的本质,如不了解DDPM,请详看此文:《图像生成发展起源:从VAE、扩散模型DDPM、DETR到ViT、Swin transformer
    Starting from AtK drawn from Gaussian noise, the outputof noise-prediction network εθ is subtracted, repeating K times to get At0, the denoised action sequence. 
  • c) 在基于Transformer的扩散策略中,观测\mathbf{O}_{t}的嵌入被传递到每个Transformer解码器块的多头交叉注意力层
    每个动作嵌入使用所示注意力掩码进行约束,使其仅关注自身和之前的动作嵌入(因果注意力,类似GPT的解码策略)
    In the Transformer-based [52]Diffusion Policy, the embedding of observation Ot is passed into a multi-head cross-attention layer of each transformer decoder block.
    Each action embedding is constrained to only attend to itself and previous action embeddings (causal attention) using the attention mask illustrated.
  • 二、视觉观察条件化
    总之,他们使用DDPM来近似条件分布p\left(\mathbf{A}_{t} \mid \mathbf{O}_{t}\right),而不是Janner等人[20]用于规划的联合分布p\left(\mathbf{A}_{t}, \mathbf{O}_{t}\right)We use a DDPM toapproximate the conditional distribution p(At|Ot) instead of the joint distribution p(At,Ot) used in Janner et al. (2022a)for planning. 

    这种形式使得模型能够在不推断未来状态的情况下预测基于观察的动作(This formulation allows the model to predict actionsconditioned on observations without the cost of inferringfuture states),加快了扩散过程并提高生成动作的准确性

    为了获取条件分布p\left(\mathbf{A}_{t} \mid \mathbf{O}_{t}\right),将下述公式1

    修改为如下公式4


    将训练损失由下述公式3

    修改为如下的公式5

1.3 几个关键设计:涉及模型选型等

第一个设计决策是选择\varepsilon_{\theta}的神经网络架构,对此,作者研究了两种常见的网络架构类型,即CNN和Transformer

1.3.1 噪声估计网络架构的选型:基于CNN还是基于transformer

1.3.1.1 CNN-based Diffusion Policy

基于CNN的扩散策略中,采用Janner等人[21]的1D temporal CNN,并做了一些修改,如下图所示

  1. 首先,仅通过特征线性调制(FiLM)将动作生成过程条件化在观察特征\mathbf{O}_{t}上, 并进行去噪迭代k来建模条件分布p\left(\mathbf{A}_{t} \mid \mathbf{O}_{t}\right)
    we only model the conditional distribution p(At|Ot)by conditioning the action generation process  on observation features Ot  with Feature-wise Linear Modulation (FiLM)
  2. 其次,仅预测动作轨迹,而非连接的观察动作轨迹
    we only predict the action trajectory instead of the concatenated observation action trajectory
  3. 第三,利用receding prediction horizon,删除了基于修复的目标状态条件反射。然而,目标条件反射仍然是可能的,与观测所用的FiLM条件反射方法相同
    we removed inpainting-based goal state conditioning due to incompatibility with our framework utilizing a receding prediction horizon.

    However, goal conditioning is still possible with the same FiLM conditioning method used for observations

在实践中发现,基于CNN的骨干网络在大多数任务上表现良好且无需过多超参数调优。然而,当期望的动作序列随着时间快速而急剧变化时(如velocity命令动作空间),它的表现很差,可能是由于时间卷积的归纳偏差[temporal convolutions to prefer lowfrequency signals],以更倾向低频信号所致

1.1.1.2 Time-series diffusion transformer

此外,为减少CNN模型中过度平滑效应[49],他们还提出了一种基于Transformer架构、借鉴minGPT[42]思想的DDPM来进行动作预测,如下图所示

  1. 行动和噪声A_{t}^{k}作为transformer解码器块的输入tokens传入,扩散迭代k的正弦嵌入作为第一个token(Actions with noise At k are passed in as input tokens for the transformer decoder blocks, with the sinusoidal embedding for diffusion iteration k prepended as the first token)

    观测\mathbf{O}_{t}通过共享的MLP转换为观测嵌入序列,然后作为输入特征传递到transformer解码器堆栈中(The observation Ot is transformed into observation embedding sequence by a shared MLP, which is then passed into the transformer decoder stack as input features)

    “梯度”\varepsilon_{\theta}\left(\mathbf{O}_{\mathbf{t}}, \mathbf{A}_{\mathbf{t}}^{k}, k\right)由解码器堆栈的每个对应输出token进行预测(The "gradient" εθ (Ot ,At k , k) is predicted by each corresponding output token of the decoder stack)
  2. 在基于状态的实验中,大多数性能最佳的策略都是通过Transformer骨干实现的,特别是当任务复杂度和动作变化率较高时。然而,他们发现Transformer对超参数更敏感

    当然了,Transformer训练的困难[25]并不是Diffusion Policy所独有的,未来可以通过改进Transformer训练技术或增加数据规模来解决
    However, we found the transformer to be more sensitive to hyperparameters. The difficulty of transformer training [25] is not unique to Diffusion Policy and could potentially be resolved in the future with improved transformer training techniques or increased data scale

故,一般来说

  1. 建议从基于CNN的扩散策略实施开始,作为新任务的第一次尝试
    In general, we recommend starting with the CNN-based diffusion policy implementation as the first attempt at a new task
  2. 如果由于任务复杂性或高速率动作变化导致性能低下,那么可以使用时间序列扩散Transformer来潜在地提高性能,但代价是额外的调优
    If performance is low due to task complexity or high-rate action changes, then the Time-series Diffusion Transformer formulation can be used to potentially improve performance at the cost of additional tuning

1.3.2 视觉编码器:把图像潜在嵌入化并通过扩散策略做端到端的训练

视觉编码器将原始图像序列映射为潜在嵌入O_t,并使用扩散策略进行端到端的训练(The visual encoder maps the raw image sequence into a latent embedding Ot and is trained end-to-end with the diffusion policy)

不同的相机视图使用不同的编码器,以对每个时间步内的图像独立编码,然后连接形成O_t,且使用标准的ResNet-18(未进行预训练)作为编码器,并进行以下修改:

  1. 使用空间softmax池化替代掉全局平均池化,以维护空间信息
    1) Replace the global average pooling with a spatial softmax pooling to maintain spatial information[29]
  2. 采用GroupNorm代替BatchNorm来实现稳定训练,这个修改对于把归一化层与指数移动平均一起使用时(通常应用于DDPM)很有必要
    2) Replace BatchNorm with GroupNorm [57] for stabletraining. This is important when the normalization layer isused in conjunction with Exponential Moving Average [17](commonly used in DDPMs)

1.4 扩散策略的稳定性与好处

1.4.1 动作序列预测的好处

由于高维输出空间采样困难,在大多数策略学习方法中一般不做序列预测。例如,IBC将难以有效地采样具有非光滑能量景观的高维动作空间。类似地,BC-RNN和BET难以确定动作分布中存在的模式数量(需要GMM或k-means步骤)

相比之下,DDPM在不降低模型表现力的前提下,在输出维度增加时仍然保持良好扩展性,在许多图像生成应用中已得到证明。利用这种能力,扩散策略以高维动作序列的形式表示动作,它自然地解决了以下问题:

  • 时间动作一致性,如下图所示,为了将T块从底部推入目标,策略可以从左或右绕T块走

    然而,如果序列中的每个动作被预测为独立的多模态分布(如在BC-RNN和BET中所做的那样)。连续动作可能会从不同模式中提取出来,并导致两个有效轨迹之间交替出现抖动动作
    However, suppose each action in the sequence is predicted as independent multimodal distributions (as done in BCRNN and BET). In that case, consecutive actions could be drawn from different modes, resulting in jittery actions that alternate between the two valid trajectories.
  • 对于空闲动作的鲁棒性:当演示暂停并导致相同位置或接近零速度的连续动作序列时,则会发生空闲行为。这在远程操作等任务中很常见
    然而,单步策略容易过度适应这种暂停行为。例如,在实际世界实验中使用BC-RNN和IBC时经常会卡住,未删除训练数据集中包含的空闲行为(BC-RNN andIBC often get stuck in real-world experiments when the idleactions are not explicitly removed from training)

// 待更

1.4.2 扩散模型在训练中的稳定

隐式策略使用基于能量的模型(EBM)表示动作分布(An implicit policy represents the action distribution using an Energy-Based Model (EBM)),如下公式6所示:

p_{\theta}(\mathbf{a} \mid \mathbf{o})=\frac{e^{-E_{\theta}(\mathbf{o}, \mathbf{a})}}{Z(\mathbf{o}, \theta)}

其中Z(\mathbf{o}, \theta)是一个难以计算的归一化常数(相对于a)

为了训练用于隐式策略的EBM,使用了infonce风格的损失函数,它相当于公式6的负对数似然

在实践中,负采样的不准确性会导致EBMs的训练不稳定[11,48]

而扩散策略和DDPM通过建模公式6中相同动作分布的得分函数[46],回避了Z(\mathbf{a}, \theta)的估计问题:

\nabla_{\mathbf{a}} \log p(\mathbf{a} \mid \mathbf{o})=-\nabla_{\mathbf{a}} E_{\theta}(\mathbf{a}, \mathbf{o})-\underbrace{\nabla_{\mathbf{a}} \log Z(\mathbf{o}, \theta)}_{=0} \approx-\varepsilon_{\theta}(\mathbf{a}, \mathbf{o})

因此,扩散策略的推理过程(公式4)和训练过程(公式5)都不涉及对Z(\mathbf{o}, \theta)的评估,从而使扩散策略的训练更加稳定

// 待更

第二部分(选读) Diff-Control:改进UMI所用的扩散策略(含ControlNet简介)

2.1 Diff-Control是什么及其提出的背景

2.1.1 背景

自从24年年初斯坦福等一系列机器人横空出世以来,模仿学习已经成为训练机器人的重要方法,其中,基于扩散的策略「4-Diffusion policy: Visuomotor policy learning via action diffusion,至于扩散策略的详解请见此文《UMI——斯坦福刷盘机器人:从手持夹持器到动作预测Diffusion Policy(含代码解读)》的第三部分」——因其有效建模多模态动作分布的能力而脱颖而出,从而提升了性能

然而,在实践中,动作表示的不一致性问题仍然是一个持续的挑战,这种不一致性可能导致机器人轨迹分布与底层环境之间的明显差异,从而限制控制策略的有效性[5-Robot learning from human demonstrations with inconsistent contexts]

这种不一致性的主要原因通常源于

  • 人类演示的丰富上下文性质[6-What matters in learning from offline human demonstrations for robot manipulation]
  • 分布转移问题[7- A reductionof imitation learning and structured prediction to no-regret online learning]
  • 以及高动态环境的波动性
    其实本质上是无状态的,缺乏将记忆和先验知识纳入控制器的机制,从而导致动作生成的不一致性,即they are fundamentally stateless, lackingprovisions for incorporating memory and prior knowledgeinto the controller, potentially leading to inconsistent actiongeneration

先前的方法,如

  1. 动作分块「8-Learning fine-grained bimanual manipulation with low-cost hardware,即ACT,其原理详见此文《ACT的原理解析:斯坦福炒虾机器人Moblie Aloha的动作分块算法ACT》」和预测闭环动作序列[4-扩散策略],已被提出以解决这一问题
  2. 此外,Hydra[9]和基于航点的操作[10]修改动作表示以确保一致性

然而,这些方法通过改变动作表示来解决问题,而不是直接使用原始动作

相反,能否通过在扩散策略中加入时间转换来明确地施加时间一致性?在深度状态空间模型领域[11- Deep state space models for time series forecasting]–[13-How to train your differentiable filter],有效学习状态转换模型能够识别潜在的动态模式

2.1.2 什么是Diff-Control:通过ControlNet将状态信息融入扩散策略中

对此,作者团队于2024年7月提出了Diff-Control,一种基于扩散的状态策略,它生成动作并同时学习动作转换模型,其基于[14- Adding conditional control to text-to-image diffusion models]在图像生成中引入的ControlNet框架,利用它作为转换模型,为基础扩散策略提供时间调控

如下图所示,先前的动作序列(蓝色)在生成新的动作序列(红色)时用作条件

Diff-Control的关键目标是学习如何将状态信息融入扩散策略的决策过程中

下图展示了这种行为的一个示例:

  • 如上图中部所示,一个学习近似余弦函数的策略,在时间点t给定单一观测值时,无状态策略(Diffusion Policy)在生成轨迹的延续方面遇到困难。由于存在歧义,扩散策略[4]往往会学习到多种模式
  • 相比之下,如上图左侧所示,Diff-Control通过整合时间条件,使其能够在生成轨迹时考虑过去的状态
    为此,所提出的方法利用了最新的ControlNet架构,以确保机器人动作生成中的时间一致性
    在CV领域中,ControlNet用于稳定扩散模型,以在生成图像或视频序列时启用额外的控制输入或附加条件

Diff-Control团队将ControlNet的基本原理从图像生成扩展到动作生成,并将其用作状态空间模型,在该模型中,系统的内部状态、观测(摄像头输入)、和人类语言指令共同影响策略的输出Our method extends the basic principle of ControlNet from image generation to action generation, and use it as a state-space model in which the internal state of the system affects the output of the policy in conjunction with observations (camerainput) and human language instructions

如下图所示,是Diff-Control在“打开盖子”任务中的实际应用

  • 每个时间窗口内(如红色所示),Diff-Control 生成动作序列
    Within each time window (depicted in red), Diff-Control generates action sequences
  • 在生成后续动作序列时,它利用先前的动作作为额外的控制输入,如蓝色所示
    When generat-ing subsequent action sequences, it utilizes previous actionsas an additional control input, shown in blue.

    这种时间过渡是通过贝叶斯公式实现的,有效地弥合了独立策略与状态空间建模之间的差距
    This temporaltransition is achieved through Bayesian formulation, effec-tively bridging the gap between standalone policies and statespace modeling

2.2 详解ControlNet:Diff-Control的构建基础

为了更好的理解Diff-Control,接下来,咱们来重点讲下ControlNet

2.2.1 给stable diffusion附加上ControlNet:类似LoRA微调

在此文《AI绘画原理解析:从CLIP、BLIP到DALLE、DALLE 2、DALLE 3、Stable Diffusion》中,我们已经了解到,可以通过文本提示类似stable diffusion之类的生图工具生成图像,然而有的时候,想生成符合预期的图像,刚有文本提示还不够,可能还会给生图工具一些参考的图像,相当于文本可以作为prompt条件、参考图像也可以作为prompt条件

而ControlNet可以通过锁定原base模型stable diffusion的参数,并制作SD的可训练副本,其中,可训练副本通过零卷积层与原始锁定SD模型链接,而这个零卷积层的权重可以初始化为0,具体如下图所示

其中

  • 一个神经模块将特征图x作为输入,并输出另一个特征图y
    可以表示为\boldsymbol{y}=\mathcal{F}(\boldsymbol{x} ; \Theta)
    且x和y通常是二维特征图,即x \in \mathbb{R}^{h \times w \times c},其中{h, w, c}分别表示特征图中的高度、宽度和通道数
  • 为了在这样的模块中添加一个ControlNet,锁定原始模块并克隆一个可训练的副本,并使用零卷积层连接被锁定的原模型
    该零卷积层表示为\mathcal{Z}(\cdot ; \cdot),是一个1×1的卷积层,其权重和偏置均初始化为零
    顺带提一下,为何这里用的零卷积呢,而非别的某种卷积呢?你还真别说,作者团队还真曾尝试过用高斯权重初始化的标准卷积层替换零卷积,但性能会出现下降,具体情况在2.2.3节最后还会解释

    当然,具体实践时,会用两个零卷积实例,参数分别为\Theta_{\mathrm{z} 1}\Theta_{\mathrm{z} 2},从而有
    \boldsymbol{y}_{\mathrm{c}}=\mathcal{F}(\boldsymbol{x} ; \Theta)+\mathcal{Z}\left(\mathcal{F}\left(\boldsymbol{x}+\mathcal{Z}\left(\boldsymbol{c} ; \Theta_{\mathrm{z} 1}\right) ; \Theta_{\mathrm{c}}\right) ; \Theta_{\mathrm{z} 2}\right)
  • 至于下图右上角的c是希望添加到网络中的条件向量

2.2.2 用于文本到图像扩散的ControlNet——微调扩散模型

Stable Diffusion 本质上是一个包含编码器(如上面说过的,SD的原理详见此文)、中间块和跳跃连接解码器的 U-Net 「73-U-net: Convolutional networks for biomedical image segmentation,关于U-net的详解详见此文《图像生成发展起源:从VAE、VQ-VAE、扩散模型DDPM、DETR到ViT、Swin transformer》的2.1.1 从扩散模型概念的提出到DDPM(含U-Net网络的简介)

  • 编码器和解码器各包含 12 个块,整个模型包含25 个块,包括中间块
    在这 25 个块中,8 个块是下采样或上采样卷积层,而另外 17 个块是主块,每个主块包含 4 个 resnet 层和 2 个视觉transformer(即ViT),每个 ViT 包含若干交叉注意力和自注意力机制

    例如,在上图左侧a图 中,“SD 编码器块 A” 包含 4 个 resnet 层和 2 个 ViTs,而“×3”表示该块重复三次
    \rightarrow  文本提示被编码为CLIP文本编码器[66-Learning transferable visual models from natural language supervision]
    \rightarrow  而扩散时间步通过使用位置编码的时间编码器Time Encoder进行编码
    Text prompts are encoded using the CLIP text encoder [66], and diffusion timesteps are encodedwith a time encoder using positional encoding
  • 最终,ControlNet结构应用于U-net的每个编码器层级(相当于ControlNet作用在了U-net的每个编码器的副本上,即The ControlNet structure is applied to each encoder levelof the U-net),如上图右侧b图的右上角所示

    具体来说,使用ControlNet创建了Stable Diffusion的12个编码块和1个中间块的可训练副本。这12个编码块分为4种分辨率resolutions(64×64,32×32, 16×16, 8×8),每种分辨率重复3次

    最终这块的输出(通过13个领卷积层)添被加到U-net的12个跳跃连接和1个中间块上
    the outputs are added to the 12 skip-connections and 1 middle block of the U-net

另,我必须负责任的指出:

  1. 上图b中ControlNet右上角是复制过来的参数,称之为可训练的副本
  2. 上图b中ControlNet右下角那些零卷积层 它们的参数只是一开始被0初始化,后续经过反向传播后,零卷积层变为非零并影响输出「反向传播更新 ControlNet 中的可训练副本和零卷积层,使零卷积权重通过学习过程逐渐过渡到优化值

    对于这点,从ControlNet的GitHub主页也可以证实到,即
    Q: If the weight of a conv layer is zero, the gradient will also be zero, and the network will not learn anything. Why "zero convolution" works?
    A: This is wrong. Let us consider a very simple:ControlNet/blob/main/docs/faq.md
  3. 上图b中ControlNet右下角的零卷积层会连接 上图b中ControlNet右上角的可训练副本和上图左侧a中Stable Diffusion被冻结的u-net

这种方法加快了训练速度并节省了GPU内存。根据在单个NVIDIA A100PCIE 40GB上的测试,使用ControlNet优化Stable Diffusion仅需大约23%的额外GPU内存和34%的计算资源

关于上面的64×64,再具体说明下,Stable Diffusion 使用类似于 VQ-GAN [19] 的预处理方法将 512×512像素空间图像转换为较小的 64×64 潜在图像

  1. 为了将 ControlNet 添加到 Stable Diffusion 中,首先将每个输入条件图像(例如,边缘、姿势、深度等)从 512×512 的输入大小转换为 64×64的特征空间向量,以匹配 Stable Diffusion 的大小
  2. 特别地,作者团队使用一个小型网络\mathcal{E}(\cdot),由四个卷积层组成,使用 4×4 的卷积核和 2×2 的步幅(通过 ReLU 激活,分别使用 16、32、64、128通道,用高斯权重初始化并与完整模型一起训练)将图像空间条件c_{\mathrm{i}}编码为特征空间条件向量 c_{\mathrm{f}}

c_{\mathrm{f}}=\mathcal{E}\left(c_{\mathrm{i}}\right)

此外,条件向量c_{\mathrm{f}}被传入ControlNet

2.2.3 ControlNet的训练、推理、消融实验

首先,对于ControlNet的训练

给定一个输入图像z_0,图像扩散算法逐步向图像添加噪声,并生成一个噪声图像z_t,其中t表示添加噪声的次数

给定一组条件,包括时间步t、文本提示c_t以及特定任务条件c_f,图像扩散算法学习一个网络\epsilon_{\theta}来预测添加到噪声图像z_t的噪声

\left.\mathcal{L}=\mathbb{E}_{\boldsymbol{z}_{0}, \boldsymbol{t}, \boldsymbol{c}_{t}, \boldsymbol{c}_{\mathrm{f}}, \epsilon \sim \mathcal{N}(0,1)}\left[\| \epsilon-\epsilon_{\theta}\left(\boldsymbol{z}_{t}, \boldsymbol{t}, \boldsymbol{c}_{t}, \boldsymbol{c}_{\mathrm{f}}\right)\right) \|_{2}^{2}\right]

整个扩散模型的总体学习目标是\mathcal{L},这个学习目标直接用于通过ControlNet微调扩散模型

在训练过程中,随机将50%的文本提示替换为空字符串。这种方法增强了ControlNet直接识别输入条件图像(如边缘、姿态、深度等)语义的能力,以替代提示

在训练过程中,由于零卷积不会向网络添加噪声,模型应始终能够预测高质量的图像。且观察到,模型并不是逐渐学习控制条件,而是突然成功地遵循输入条件图像;通常在不到1万次优化步骤内完成,如下图所示,一般称之为“突然收敛现象”

其次,对于ControlNet的推理

可以通过多种方式进一步控制ControlNet的附加条件如何影响去噪扩散过程

比如无分类器引导的分辨率加权

  1. Stable Diffusion依赖于一种称为无分类器引导(CFG)的技术来生成高质量的图像
    CFG的公式为\epsilon_{\mathrm{prd}}=\epsilon_{\mathrm{uc}}+\beta_{\mathrm{cfg}}\left(\epsilon_{\mathrm{c}}-\epsilon_{\mathrm{uc}}\right),其中\epsilon_{\mathrm{prd}}\epsilon_{\mathrm{uc}}\epsilon_{\mathrm{c}}\beta_{\mathrm{cfg}}分别是模型的最终输出、无条件输出有条件输出和用户指定的权重
  2. 当通过ControlNet添加条件图像时,可以将其添加到\epsilon_{\mathrm{uc}}\epsilon_{\mathrm{c}},或者仅添加到\epsilon_{\mathrm{c}}
    在具有挑战性的情况下,例如没有提示时,将其添加到\epsilon_{\mathrm{uc}}\epsilon_{\mathrm{c}}会完全移除CFG引导(下图b);仅使用\epsilon_{\mathrm{c}}会使引导非常强(下图c)

  3. 作者团队的解决方案是首先将条件图像添加到\epsilon_{\mathrm{c}}然后根据每个块的分辨率,将权重w_{i} 乘以 Stable Diffusion 和 ControlNet 之间的每个连接,公式为w_{i}=64 / h_{i},其中h_{i}是第i^{\text {th }}个块的大小,例如h_{1}=8, h_{2}=16, \ldots, h_{13}=64

    通过降低 CFG 引导强度,可以得到上图d 中所示的结果,可称之为 CFG 分辨率加权——组合多个 ControlNet
  4. 为了将多个条件图像(例如,Canny 边缘和姿态)应用于单个 Stable Diffusion 实例,还可以直接将相应 ControlNet的输出添加到 Stable Diffusion 模型中,如下图所示

    这种组合不需要额外的加权或线性插值

最后,在消融实验方面(证明两个零卷积结构的必要性)

研究了ControlNets的替代结构:

  • 用高斯权重初始化的标准卷积层替换零卷积——如下图b所示
  • 用一个单一的卷积层替换每个模块的可训练副本,称之为ControlNet-lite——如下图c所示

且提出了4种提示设置,以测试现实世界用户可能的行为:

  1. 无提示
  2. 不充分的提示,这些提示未能完全涵盖条件图像中的对象,例如本文的默认提示“高质量、详细且专业的图像”
  3. 条件图像语义的冲突提示
  4. 完美提示,描述必要的内容语义,例如“漂亮的房子”

可以很明显的看到

  • 如上图a所示,4种设置中不论是哪一种设置,ControlNet的表现都是最好的
  • 当零卷积被替换时(比如被替换成高斯权重初始化的标准卷积层),ControlNet的性能下降到与ControlNet-lite大致相同,这表明可训练副本的预训练骨干在微调过程中被破坏——上图b
  • 轻量级的ControlNet-lite——上图c,不足以解释条件图像,并在条件不足和无提示的情况下失败

2.3 Diff-Control的技术架构

2.3.1 从扩散模型到递归贝叶斯公式

回顾一下扩散模型的背景知识

扩散模型通过迭代的将高斯噪声映射到目标分布,且可以选择性的基于上下文信息进行条件生成

  1. 比如给定初始点\mathbf{a}_{T} \sim \mathcal{N}(\mathbf{0}, \mathbf{I}),扩散模型预测输出序列为\mathbf{a}_{T-1}, \mathbf{a}_{T-2}, \cdots, \mathbf{a}_{0},其中每个后续输出都是前一个输出的去噪版本(说白了,整个过程就是去噪的过程),故\mathbf{a}_{0}就是扩散过程的输出
  2. 然后使用去噪扩散概率模型(DDPM)作为骨干网络。在训练过程中,噪声输入可以通过不同的噪声水平生成:\mathbf{a}_{\tau}=\sqrt{\bar{\alpha}_{\tau}} \mathbf{a}+\sqrt{1-\bar{\alpha}_{\tau}} \mathbf{Z},其中\bar{\alpha}_{\tau}是方差调度,\mathbf{z}是随机噪声,\mathbf{z} \sim \mathcal{N}(\mathbf{0}, \mathbf{I})
  3. 接下来,可以训练一个神经网络\epsilon(\cdot)来预测添加到输入中的噪声,通过最小化以下公式
    \mathcal{L}_{\mathrm{DDPM}}:=\mathbb{E}_{\mathbf{o}, \mathbf{a}, \tau, \mathbf{z}}\left[\|\epsilon(\mathbf{o}, \mathbf{a}, \tau)-\mathbf{z}\|_{2}^{2}\right]
    其中,(\mathbf{o}, \mathbf{a})表示观察和动作对,\tau是去噪时间步,\tau \in[1, T]

    在采样步骤中,迭代运行去噪过程
    \mathbf{a}_{\tau-1}=\frac{1}{\sqrt{\alpha_{\tau}}}\left(\mathbf{a}_{\tau}-\frac{1-\alpha_{\tau}}{\sqrt{1-\bar{\alpha}_{\tau}}} \epsilon\left(\mathbf{o}, \mathbf{a}_{\tau}, \tau\right)\right)+\sigma_{\tau} \mathbf{z}
    整个过程相当于不断减掉每一步添加的噪声

接下来,目标是学习一个以条件\mathbf{c}和观察\mathbf{o}为输入的策略

在这个背景下,定义\mathbf{a}为包含机器人末端执行器姿态的轨迹。与之前的方法[4],[32]一致,现在的目标也是将多个条件作为输入。然而,正如在上文所提到的,尽管之前的工作[4], [8], [9]已经努力探索稳健的动作生成,但它们并没有考虑到a的状态性

故下面通过在动作空间中引入转移,从贝叶斯的角度解决动作一致性问题(We address the action consistency from a Bayesian perspective by introducing transition in action spaces)

  1. 首先,有如下方程
    \begin{array}{l} p\left(\mathbf{a}_{t} \mid \mathbf{a}_{1: t-1}, \mathbf{o}_{1: t}, \mathbf{c}\right) \\ \quad \propto p\left(\mathbf{o}_{t} \mid \mathbf{a}_{t}, \mathbf{c}\right) p\left(\mathbf{a}_{t} \mid \mathbf{a}_{1: t-1}, \mathbf{o}_{1: t-1}, \mathbf{c}\right) \end{array}
  2. \operatorname{bel}\left(\mathbf{a}_{t}\right)=p\left(\mathbf{a}_{t} \mid \mathbf{a}_{1: t-1}, \mathbf{o}, \mathbf{c}\right),应用马尔可夫性质,即假设下一个生成的轨迹仅依赖于当前的轨迹,得到

\operatorname{bel}\left(\mathbf{a}_{t}\right)=\eta \underbrace{p\left(\mathbf{o}_{t} \mid \mathbf{a}_{t}, \mathbf{c}\right)}_{\text {observation model }} \prod_{t=1}^{t} \overbrace{p\left(\mathbf{a}_{t} \mid \mathbf{a}_{t-1}, \mathbf{c}\right)}^{\text {transition model }} \operatorname{bel}\left(\mathbf{a}_{t-1}\right)

其中,\eta是归一化因子,p\left(\mathbf{o}_{t} \mid \mathbf{a}_{t}, \mathbf{c}\right)是观测模型,p\left(\mathbf{a}_{t} \mid \mathbf{a}_{t-1}, \mathbf{c}\right)是转移模型,这个转移模型描述了系统动力学演化的规律,而观测模型则确定了系统内部状态与观测到的噪声测量值之间的关系

2.3.2 Diff-Control Policy:结合贝叶斯公式与扩散模型

接下来,展示如何将贝叶斯公式和扩散模型结合在一起,使得一个策略可以生成有状态的动作序列,从而促进一致的机器人行为

他们提出了如下图所示的Diff-Control策略\pi_{\boldsymbol{\theta}}\left(\mathbf{a}_{\left[W_{t}\right]} \mid \mathbf{o}, \mathbf{a}_{\left[W_{t-h}\right]}, \mathbf{c}\right),其参数为\theta

其中,h代表执行时间范围,\mathbf{c}表示以自然人类指令形式出现的语言条件,\mathbf{o}表示由场景的RGB相机捕获的一系列图像

策略\pi_{\boldsymbol{\theta}}生成一个轨迹窗口\mathbf{a}_{\left[W_{t}\right]}=\left[\mathbf{a}_{1}, \mathbf{a}_{2}, \cdots \mathbf{a}_{W}\right]^{T} \in \mathbb{R}^{7 \times W},其中W指的是窗口大小或预测时间范围

贝叶斯公式中的Diff-Control策略包含两个关键模块

  1. 转换模块接收先前的动作\mathbf{a}_{\left[W_{t}\right]}并生成潜在的嵌入,以供基础策略后续使用
  2. 作为观测模型,基础策略结合了与\mathbf{a}_{\left[W_{t}\right]}相关的时间信息,并生成一个新的动作\mathbf{a}_{\left[W_{t+h}\right]}

这种双模块结构使得Diff-Control策略能够巧妙地捕捉时间动态,并有助于准确且一致地生成后续动作

2.3.3 基础策略与转换模型

对于基础策略,如下图左侧所示

  1. 首先,按照第2.2.1节中的步骤训练一个基于扩散的策略[4]作为基础策略\bar{\pi}_{\boldsymbol{\psi}}\left(\mathbf{a}_{\left[W_{t}\right]} \mid \mathbf{o}, \mathbf{c}\right)
  2. 然后采用[15-Planning with diffusion for flexible behavior synthesis]中的一维时间卷积网络,并构建U-net骨干网络
  3. 策略\bar{\pi}_{\boldsymbol{\psi}}可以自主执行并生成动作,而无需依赖任何时间信息

对于转换模型,如下图右侧所示,作者团队将ControlNet纳入为转换模块「Diff-Control Policy通过使用锁定的 U-net 扩散策略架构来实现。该策略复制了编码器和中间模块,并引入了零卷积层,即The Diff-Control Policy is implemented through the utilization of a locked U-net diffusion policy architecture. It replicates the encoder and middle blocks and incorporates zero convolution layers

这种利用有效地扩展了策略网络的能力,使其包含时间条件(This utilization extends the capability of the policy networkto include temporal conditioning effectively)

  1. 为实现这一目标,利用先前生成的动作序列\mathbf{a}_{\left[W_{t-h}\right]}作为ControlNet的提示输入
    To achieve this,we utilize the previously generated action sequences as the prompt input to ControlNet.
  2. 通过这样做,基础策略\bar{\pi}_{\boldsymbol{\psi}}可以了解先前的动作\mathbf{a}_{\left[W_{t-h}\right]},且通过创建一个可训练的\bar{\pi}_{\boldsymbol{\psi}}编码器副本来实现ControlNet,然后冻结基础策略\bar{\pi}_{\boldsymbol{\psi}}
    By doing so, the base policy¯πψψψ becomes informed about the previous actions a[Wt−h].We implement ControlNet by creating a trainable replica of the ¯πψψψ encoders and then freeze the base policy ¯πψψψ.

    且可训练的副本通过零卷积层[33]连接到固定模型
    The trainable replica is connected to the fixed model with zero convolutional layers [33]
  3. 最终,ControlNet可以将\mathbf{a}_{\left[W_{t-h}\right]}作为条件向量,并重用训练好的基础策略\bar{\pi}_{\boldsymbol{\psi}}来构建下一个动作序列\mathbf{a}_{\left[W_{t}\right]}
    ControlNet can then take a[Wt−h] as the conditioning vector and reuses the trained base policy¯πψψψ to construct the next action sequence a[Wt]

2.3.4 策略的训练与相关模型的选择

在策略的训练上,其中

  • 对于基础策略\bar{\pi}_{\boldsymbol{\psi}}\left(\mathbf{a}_{\left[W_{t}\right]} \mid \mathbf{o}, \mathbf{c}\right)的训练
    首先将观察\mathbf{o}和语言条件\mathbf{c}编码到相同的嵌入维度
    然后我们利用方程\mathcal{L}_{\mathrm{DDPM}}:=\mathbb{E}_{\mathbf{o}, \mathbf{a}, \tau, \mathbf{z}}\left[\|\epsilon(\mathbf{o}, \mathbf{a}, \tau)-\mathbf{z}\|_{2}^{2}\right]中定义的学习目标来训练基础策略
  • 在微调ControlNet时也使用相同的学习目标:\mathcal{L}:=\mathbb{E}_{\mathbf{o}, \mathbf{c}, \mathbf{a}, \mathbf{a}_{\left[W_{t}\right]}, \tau, z}\left[\left\|\epsilon_{\theta}\left(\mathbf{o}, \mathbf{c}, \mathbf{a}_{T}, \mathbf{a}_{\left[W_{t}\right]}, \tau\right)-\mathbf{z}\right\|_{2}^{2}\right]
    整个扩散模型的总体学习目标是\mathcal{L}\epsilon_{\boldsymbol{\theta}}(\cdot)是对应的由\boldsymbol{\theta}参数化的神经网络,且基础策略和Diff-Control策略都是端到端训练的

在模型的选择上,他们采用了基于CNN的U-net架构。这种基于CNN的骨干网络选择已被证明适用于多种任务,无论是在模拟环境还是现实场景中

在整个的模型架构中,如之前的下图所示

编码器和解码器块使用了具有不同核大小的1D卷积层

  1. 为了实现ControlNet的零卷积层,采用了权重初始化为零的1D1×1卷积层
    这种方法确保在训练的初始阶段,任何潜在的有害噪声不会影响可训练神经网络层的隐藏状态[14]
  2. 且在所有实验中使用窗口大小W=24作为默认预测范围,执行范围h在\mathbf{a}_{\left[W_{t-h}\right]}\mathbf{a}_{\left[W_{t}\right]}之间为12步,故在实验中默认只执行12步(h=12),以与[4-Diffusion policy: Visuomotor policy learning via action diffusion]保持一致
    因为根据[4],执行范围过大或过小都可能导致性能下降

此外,在实施语言条件任务时,他们还观察到基于扩散的策略在利用复杂的CLIP语言特征作为条件学习多样化动作时达到了某种能力上限

为了解决这个问题,更实用的方法是引入融合层并增加视觉和语言表示的嵌入大小,而不是直接将它们拼接在一起「To address this,a more practical approach is to incorporate a fuse layerand increasing embedding size for visual and language representations, instead of concatenating them directly」,这一修改可以提升策略在语言条件任务中的整体表现

2.4 实验与评估:围绕4个任务与4种基线方法PK

2.4.1 对4个任务的一般性建模

通过将Diff-Control策略与四种基线方法在五个不同的机器人任务上进行比较,包含的任务包括:(a)语言条件下的厨房任务,(b)厨房场景中的开盖任务,作为高精度任务,(c)动态场景中的捞鸭任务,(d)作为周期性任务的打鼓任务

  • UR5机器人手臂的动作表示为\mathbf{a}\left[W_{t}\right],其中每个动作表示为\mathbf{a}_{i}=[x, y, z, \alpha, \beta, \gamma]^{T}i \in[1, W]其中,包括末端执行器在笛卡尔坐标系中的位置(x, y, z)、方向(\alpha, \beta, \gamma)和夹爪的关节角度\text { g }
  • 且对于所有任务,输入模态包括两种模态:\text { o }\mathbf{c}
    第一种模态,\mathbf{o} \in \mathbb{R}^{224 \times 224 \times 3},对应于RGB图像
    第二种模态,\mathbf{c},指的是从自然语言序列中提取的语言嵌入。这个嵌入作为机器人理解和决策过程的语言输入

下表 按主观难度升序排列任务,提供了任务特征的摘要,如干扰物数量(Dis)、专家演示数量(Dem)、不同动作数量(Act)以及是否需要高精度(HiPrec)

以下是具体的4个任务

  1. 语言条件厨房任务:该任务旨在模拟厨房场景中的多个任务 [35], [36]
    机器人工作区由一个缩小的现实模型厨房组成,如下图所示

    厨房环境包含各种物体,包括锅、平底锅、碗和类似毛绒蔬菜的干扰物。在数据收集过程中,干扰物会被随机放置。训练有素的专家负责远程操作机器人在厨房环境中执行两个特定动作。这些动作包括取回一个西红柿,并根据给定的语言指令将其放置在炉灶上的锅中(A)或水槽中(B)
  2. 高精度开盖:任务包括抬起盖子并随后将其放置在附近的碗上,这需要精确的控制,如下图所示,盖子的把手相对较小,且盖子的表面是反光的

    为了收集此任务的数据,他们获得了50次专家示范。每次示范中,引入了5个或更多干扰物体的随机放置,以及锅的位置和盖子的旋转的轻微变化
  3. 鸭子舀取:受[37]的启发,他们为机器人配备了一个勺子,机器人的目标是将鸭子从水中舀出来,如下图右下角所示,这一任务由于勺子进入水中引起的扰动而具有挑战性

    水流影响橡皮鸭的位置,要求机器人执行精确而谨慎的动作,以成功捕捉鸭子
  4. 鼓点:该任务专门为机器人学习周期性动作而设计,由于需要独特的动作表示,这是一项具有挑战性的任务[38],如下图所示

    该任务的难点在于机器人必须准确地计数鼓点的次数并确定何时停止敲鼓。通过远程操作机器人在每次示范中敲击鼓三次,共获得了150次专家示范

2.4.2 与4种基线在性能上的PK

为了评估diff-control的泛化能力、整体性能及其优势,他们提出的基线如下:

  1. Image-BC:这个基线采用图像到动作的代理框架,类似于BC-Z[2],它基于ResNet-18骨干网络,并使用FiLM [39]通过CLIP语言特征进行条件处理
  2. ModAttn[32]:该方法采用transformer风格的神经网络,并使用模块化结构通过神经注意力来处理任务的各个子方面,它需要人类专家正确识别每个任务的组件和子任务
  3. BC-Z LSTM:这个基线代表了一种受BC-Z架构启发的有状态策略。通过使用MLP和LSTM层将先前的动作和语言条件融合,实现了先前输入的整合
  4. 扩散策略[4]:这个基线是一个标准的扩散策略

所有基线模型均使用相同的专家演示数据进行再现和训练,总共训练3,000个周期

  • 在整个训练过程中,每300个周期保存一次检查点。在他们的分析中,他们报告了这些保存的检查点中每种基线方法所获得的最佳结果
  • 每个实验均在单个NVIDIA Quadro RTX 8000 GPU上以64的批量大小进行,持续约24小时
  • 对于所有任务,使用Adamw优化器,学习率为1e-4

具体PK结果详见原论文

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

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

相关文章

计算机毕业设计 | SpringBoot慈善公益平台 爱心互助活动发布管理系统(附源码)

1,项目介绍 爱慈善公益平台(love-charity)是一个基于 SpringBoot 开发的标准 Java Web 项目。整体页面非常的简约大气,项目的完整度较高,是一个偏向公益论坛的系统。非常适合刚刚接触学习 SpringBoot 的技术小白学习&…

【深入浅出】之Linux进程(二)

📃博客主页: 小镇敲码人 💚代码仓库,欢迎访问 🚀 欢迎关注:👍点赞 👂🏽留言 😍收藏 🌏 任尔江湖满血骨,我自踏雪寻梅香。 万千浮云遮碧…

bert-base-chinese模型使用教程

向量编码和向量相似度展示 import torch from transformers import BertTokenizer, BertModel import numpy as npmodel_name "C:/Users/Administrator.DESKTOP-TPJL4TC/.cache/modelscope/hub/tiansz/bert-base-chinese"sentences [春眠不觉晓, 大梦谁先觉, 浓睡…

Qt/C++ 海康SDK开发示例Demo

*** 工业相机在机器视觉中起到关键作用,本文基于海康 SDK 详细解读了设备连接与控制的各个步骤。内容涵盖设备枚举、句柄创建、图像采集回调以及设备异常处理,帮助开发者快速理解如何通过代码控制相机,实时采集并处理图像数据。*** 1. 搜索并…

RabbitMQ的应用

七种工作模式介绍 1.Simple(简单模式) P:生产者,也就是要发送信息的程序 C:消费者,消息的接收者 Queue:消息队列。图中黄色背景部分,类似一个邮箱,可以缓存发送信息;生产者向其中…

K8S网络插件故障处理

1网络插件故障 1此故障问题处理方法 查询ip是否正常是否是主节点IP地址如果不是需要更改 更改方式 1 修改calico.yaml文件的相应参数 # Cluster type to identify the deployment type - name: IP_AUTODETECTION_METHOD #增加内容value: "interfaceens*" 或者 value…

【论文速看】DL最新进展20241109-图像超分、物理信息神经网络、扩散模型

目录 【图像超分】【物理信息神经网络】【扩散模型】 【图像超分】 [2024 红外图像超分] Infrared Image Super-Resolution via Lightweight Information Split Network 论文链接:https://arxiv.org/pdf/2405.10561v2 代码链接:无 单图像超分辨率&…

Python学习从0到1 day26 第三阶段 Spark ① 数据输入

要学会 剥落旧痂 然后 循此新生 —— 24.11.8 一、Spark是什么 定义: Apache Spark 是用于大规模数据处理的统一分析引擎 简单来说,Spark是一款分布式的计算框架,用于调度成百上千的服务器集群,计算TB、PB乃至EB级别的海量数据…

[Python学习日记-63] 继承与派生

[Python学习日记-63] 继承与派生 简介 继承 派生 简介 上一篇文章我们学习了类如何使用,以及相关特性,也做了相关的练习,在练习当中发现类与类之间有时也会存在重复代码,其实在类中我们还有一个继承和派生的概念没有说&#xf…

基于 Encoder-only 架构的大语言模型

基于 Encoder-only 架构的大语言模型 Encoder-only 架构 Encoder-only 架构凭借着其独特的双向编码模型在自然语言处理任务中表现出色,尤其是在各类需要深入理解输入文本的任务中。 核心特点:双向编码模型,能够捕捉全面的上下文信息。 En…

Python学习------第四天

Python的判断语句 一、布尔类型和比较运算符 二、 if语句的基本格式 if语句注意空格缩进!!! if else python判断语句的嵌套用法:

uniapp实现H5和微信小程序获取当前位置(腾讯地图)

之前的一个老项目,使用 uniapp 的 uni.getLocation 发现H5端定位不准确,比如余杭区会定位到临平区,根据官方文档初步判断是项目的uniapp的版本太低。 我选择的方式不是区更新uniapp的版本,是直接使用高德地图的api获取定位。 1.首…

测试网空投进行中 — 全面了解 DePIN 赛道潜力项目 ICN Protocol 及其不可错过的早期红利

随着云计算技术的飞速发展,越来越多的企业和个人对云服务的需求变得多样化且复杂化。然而,传统的中心化云服务平台(如AWS、微软Azure等)往往存在着高成本、数据隐私保护不足以及灵活性差等问题。 为了解决这些挑战,Imp…

IntelliJ IDEA 使用心得与常用快捷键

刚开始学习写Java的时候,用的eclipse,正式工作后,主要用的myeclipse,去年初在前辈的推荐下,在2折的时候买了正版的 IntelliJ IDEA 和 Pycharm,12.0版终生使用,一年更新。 使用前早就久闻其名&am…

【rust】rust基础代码案例

文章目录 代码篇HelloWorld斐波那契数列计算表达式(加减乘除)web接口 优化篇target/目录占用一个g,仅仅一个actix的helloWorld demo升级rust版本, 通过rustupcargo换源windows下放弃吧,需要额外安装1g的toolchain并且要…

施工企业为什么要用工程项目管理软件?工程项目管理软件的用处是什么?

施工企业一定会遇到哪些问题?工人怠工、材料浪费、数据造假、工期拖延、质量问题、安全隐患等。这些问题正在悄然侵蚀建施工业的经济效益。每一个环节的失控都可能导致巨大的经济损失,还可能损害企业的声誉。面对日益复杂的工程管理环境,如何…

【C++】详解RAII思想与智能指针

🌈 个人主页:谁在夜里看海. 🔥 个人专栏:《C系列》《Linux系列》 ⛰️ 丢掉幻想,准备斗争 目录 引言 内存泄漏 内存泄漏的危害 内存泄漏的处理 一、RAII思想 二、智能指针 1.auto_ptr 实现原理 模拟实现 弊端…

所谓的情商高,其实就是会说话!

所谓的情商高,其实就是会说话! 1.当遇到不知道的事情时,不要直截了当地说“不知道”。而应委婉地表达为“我想听听你的看法”。 如此既能避免尴尬,又能展现出对对方见解的尊重和期待。 2.不要简单地说“我迟到了”,…

ALB搭建

ALB: 多级分发、消除单点故障提升应用系统的可用性(健康检查)。 海量微服务间的高效API通信。 自带DDoS防护,集成Web应用防火墙 配置: 1.创建ECS实例 2.搭建应用 此处安装的LNMP 3.创建应用型负载均衡ALB实例 需要创建服务关联角…

【spark面试】spark的shuffle过程

概述 所有的shuffle的过程本质上就是一个task将内存中的数据写入磁盘,然后另一个task将磁盘中的数据读入内存的过程。 对于mapreduce来说,我们将内存中的数据写入磁盘成为maptask,将磁盘中的数据读入内存称为reducetask。 而对于spark来说&…