iDP3——改进3D扩散策略以赋能人形机器人的训练:不再依赖相机校准和点云分割(含DP3、Diff-Control、ControlNet详解)

前言

今天10.23日,明天1024则将作为长沙程序员代表,在CSDN和长沙相关部门举办的1024程序员节开幕式上发言,欢迎广大开发者来长工作 生活 考察 创业,​包括我司七月也一直在招聘大模型与机器人开发人员

后天,则将和相关开发同事出发去南京,因为我司于本周末10.25/10.26,在南京将举办「大模型机器人(具身智能)线下营」

该「机器人线下营」群内一学员提到:学umi这个成本好高,一套配下3万不知道够不够

  • 实话讲,搞机器人成本确实是比较大的,包括umi这套,在机械臂的迁移上 灵活度不太高,换个机械臂不是很顺畅
    但有一些工作 可以提高umi在机械臂上迁移的灵活度,比如fastumi,此外,dexcap的在机械臂上的可迁移性 更高些
  • 不过,相比起来,工业协作机器人还只是机械臂,人形成本更高,我最近一直在看各种人形paper,很多工作都想尝试,但有些系统开源了 但代码不全,而且不同的工作 换个人形 还不一定好work

正因为这里面的坑比较多,所以我一直在看各家的算法,看看他们是怎么解决一系列落地问题的,毕竟很多问题大家都会遇到

刚好我自己在视频号上看到了iDP3(且友人丁研究员也和我说了这个iDP3),于此便有了本文

PS,我司七月在线把umi/dexcap搞得差不多了,准备再复现下斯坦福的这个iDP3,24年年底之前再想办法把各个算法整合到一个统一的框架中, 欢迎人形厂商、科研机构一块合作搞(有意私我)

第一部分 3D扩散策略DP3

// 待更

第二部分 改进的3D扩散策略iDP3

24年10.14日,来自斯坦福大学、西蒙弗雷泽大学、宾夕法尼亚大学、伊利诺伊大学厄巴纳-香槟分校、卡内基梅隆大学的研究者们(Yanjie Ze, Zixuan Chen, Wenhao Wang, Tianyi Chen, Xialin He, Ying Yuan, Xue Bin Peng, Jiajun Wu),提出了改进的3D扩散策略iDP3,其对应的论文为《Generalizable Humanoid Manipulation with Improved 3D Diffusion Policies》

2.1 iDP3与之前扩散策略、3D扩散策略的不同

2.1.1  视觉运动策略学习

最近,越来越多的趋势是通过端到端方式学习视觉运动策略来解决机器人问题[12],[17-3d diffusion policy: Generalizable visuomotor policy learning via simple 3d representations],[25]–[28],其中主要有两种途径:

  • 模仿学习[12,即Diffusion policy],[15]–[21],[29]–[34]
  • sim-to-real 的强化学习[35]–[44],其中第41篇所述的UMI on Legs,详见此文第一部分

在此之前

  1. 基于图像的模仿学习方法,例如Diffusion Policy[12],已经取得了显著的成功[10], [17], [22],[30], [45],但其有限的泛化能力限制了它们在复杂真实环境中的应用
  2. 最近的一些工作旨在解决这些限制[17], [22], [45]–[47]。其中,3D扩散策略(DP3,[17])展示了显著的泛化能力和在多样化机器人任务中的广泛适用性[10], [11],[22], [23]

    尽管如此,3D视觉运动策略本质上依赖于精确的相机校准和细粒度的点云分割[17], [18], [21], [39], [47],这限制了它们在类人机器人等移动平台上的部署
  3. 另与iDP3类似的工作也有一些,比如Maniwhere [37]通过大规模模拟数据实现了真实场景的泛化。然而,由于显著的模拟到现实的差距,他们仅展示了在未见过的场景中推送等任务,而不是像拾取和放置这样的富含接触的任务

    机器人实用模型[48-Transic: Sim-toreal policy transfer by learning from online correction]也通过模仿学习将技能泛化到新环境中,而他们必须使用从20个场景收集的数据进行场景泛化,相比之下iDP3只使用1个场景

    此外,VISTA [47]使用视图合成模型展示了令人印象深刻的视图泛化。与他们复杂的流程相比,iDP3的自我中心3D表示自然地实现了稳健的视图不变性

2.1.2 iDP3所在系统的概述

iDP3所在的系统主要由四个部分组成:人形机器人平台、数据收集系统、视觉运动策略学习方法、现实世界的部署,如下图所示

在学习部分,作者开发了改进的3D扩散策略(iDP3)作为通用机器人的视觉运动策略

2.1.3 iDP3是如何对3D扩散策略做改进的

3D扩散策略(DP3,[17])是一种有效的3D视觉-运动策略,将稀疏点云表示与扩散策略相结合。尽管DP3在广泛的操作任务中展示了令人印象深刻的结果,但由于其固有依赖于精确的相机校准和细致的点云分割,无法直接部署在通用机器人上,如类人机器人或移动操作器

此外,为在更复杂的任务中有效执行,DP3的准确性需要进一步提高

最终作者改进的算法被称为改进的3D扩散策略(iDP3),其重点做了以下改进

  1. 以自我为中心的3D视觉表示
    DP3利用世界坐标系中的3D视觉表示,便于目标对象的分割[17],[53]。然而,对于类人机器人等通用机器人,相机安装位置并不固定,使得相机校准和点云分割变得不切实际
    为了解决这个问题,作者提出直接使用相机坐标系中的3D表示,如下图所示

    作者将这类3D表示称为以自我为中心的3D视觉表示
  2. 扩展视觉输入
    利用以自我为中心的3D视觉表示在消除多余点云(如背景或桌面)时存在挑战,特别是在不依赖基础模型的情况下
    为此,作者提出了一种简单但有效的解决方案:扩展视觉输入。与之前的系统[17],[22],[53]中使用标准稀疏点采样不同,他们显著增加了样本点的数量以捕获整个图像场景
  3. 改进的视觉编码器
    作者将DP3中的MLP视觉编码器替换为金字塔卷积编码器
    因为他们发现,在从人类数据中学习时,卷积层比全连接层产生更平滑的行为,并且结合来自不同层的金字塔特征进一步提高了准确性
  4. 更长的预测视野。人类专家的抖动和噪声传感器在从人类示范中学习时表现出很大的困难,这导致DP3在短期预测上遇到困难。通过延长预测视野,作者有效地缓解了这个问题
  5. 实现细节
    对于优化,他们使用AdamW [55]训练iDP3和所有其他方法,总计300个epoch
    对于扩散过程,他们使用DDIM [56]进行50个训练步骤和10个推理步骤
    对于点云采样,他们用体素采样和均匀采样的级联替换DP3 [17]中使用的最远点采样(FPS)「For the point cloud sampling, we replace farthest point sampling (FPS) used inDP3 [17] with a cascade of voxel sampling and uniform sampling」,这确保了采样点覆盖3D空间并具有更快的推理速度

2.2 iDP3相关的硬件配置、数据采集、学习与部署

2.2.1 人形机器人相关的硬件配置

  • 在人形机器人的选择上,他们使用Fourier GR1 [5],这是一款全尺寸人形机器人,配备了两个InspireHands [57]

    不过,他们只启用了整个上半身{头部、腰部、手臂、手},总共25个自由度(DoF),然后禁用了下半身以保持稳定,并使用推车进行移动
  • 激光雷达相机
    为了捕捉高质量的3D点云,他们使用了RealSense L515 [58],这是一款固态激光雷达相机。相机安装在机器人头部以提供自我中心视觉

    先前的研究表明,深度感知精度较低的相机,如RealSense D435 [59],可能导致DP3 [17], [60]的性能不佳
    然而,需要注意的是,即使是RealSense L515也无法产生完全精确的点云
  • 高度可调推车
    将操作技能推广到现实世界环境的一个主要挑战是场景条件的广泛变化,特别是桌面高度的不同。为了解决这个问题,作者使用了一个高度可调的推车,消除了对复杂全身控制的需求

2.2.2 数据采集

  • 为了遥操作机器人的上半身,作者采用了Apple Vision Pro(简称AVP,[61]),该设备能够精确跟踪人手、手腕和头部的姿态[62]。机器人使用Relaxed IK [63]来准确地跟随这些姿态

    且他们还将机器人的视觉流回传至AVP。与[9]不同,我们将腰部纳入了遥操作流程,从而实现了更灵活的工作空间
  • 遥操作的延迟
    使用LiDAR传感器会显著占用机载计算机的带宽/CPU,导致遥操作延迟大约为0.5秒。他们还尝试了两个LiDAR传感器(一个额外安装在手腕上),这引入了极高的延迟,因此使得数据收集变得不可行
  • 对于用于学习的数据。在遥操作过程中,他们收集了观察-动作对的轨迹,其中观察由两部分组成:
    1)视觉数据,如点云和图像
    以及2)本体感觉数据,如机器人关节位置。动作由目标关节位置表示。且他们还尝试使用末端执行器姿态作为本体感觉/动作,发现性能没有显著差异

2.2.3 学习与部署

最终,他们在收集的人类演示数据上训练 iDP3

值得注意的是,由于不依赖之前提到的相机校准或手动点云分割。因此,他们认为他们的iDP3策略可以无缝转移到新场景,而无需额外的校准/分割等工作

2.3 实验效果及与各个相似策略的对比

在测试中,让机器人完成下图所示的三个任务:拾取/放置、倒水和擦拭

2.3.1 iDP3与几个的基线的比较

作者将iDP3与几个强大的基线进行比较,包括:

  • DP:带有ResNet18编码器的扩散策略[12];
  • DP(❄R3M):带有冻结R3M [64]编码器的扩散策略;
  • DP (✶R3M):带有微调R3M编码器的扩散策略
  • iDP3 (DP3编码器):使用DP3编码器[12]的iDP3

所有基于图像的方法都使用与iDP3相同的策略骨干,并采用随机裁剪和颜色抖动增强来提高鲁棒性和泛化能力,且RGB图像的分辨率是224×224(从RealSense相机的原始图像调整而来)

如下表所示「在四种设置下训练Pick&Place任务:{1st-1, 1st-2, 3rd-1, 3rd-2}。“1st”使用自我中心视角,而“3rd”使用第三人称视角。后面的数字表示用于训练的示范次数,每个示范由20轮成功执行组成,比如1st-2中的2 即代表示范次数为40次

  1. iDP3显著优于普通DP、带冻结R3M编码器的DP以及带DP3编码器的iDP3
  2. 然而,我们发现带微调R3M的DP是一个特别强的基线,在这些设置中优于iDP3。作者认为这是因为微调预训练模型通常比从头开始训练更有效[26],而目前没有类似的用于机器人技术的预训练3D视觉模型。尽管DP+微调R3M在这些设置中更有效,但作者发现基于图像的方法过拟合于特定场景和对象,无法推广到一些比较极端的场景之下

作者在论文中表示,他们还进行了 iDP3 与 DP (✶R3M)(简称为 DP)之间的更多比较,并证明 iDP3 在具有挑战性和复杂性的现实世界中更具适用性


具体如下表所示

iDP3和DP在训练环境中对训练对象都取得了很高的成功率,并具备以下三个更好的属性

  1. 属性1:视图不变性View Invariance
    iDP3的自我中心3D表示展示了令人印象深刻的视图不变性
    如下图所示

    iDP3即使在视图发生较大变化时也能始终抓取物体,而DP即使是训练对象也难以抓取。DP仅在视图发生轻微变化时偶尔取得成功
    值得注意的是,与最近的工作[22],[45],[47]不同,他们没有采用特定的设计来实现等变性或不变性
  2. 属性2:对象泛化性
    他们评估了训练杯之外的新型杯子/瓶子,如下图所示

    由于使用了颜色抖动增强,DP偶尔可以处理未见过的对象,但成功率很低。相比之下,iDP3由于使用了3D表示,自然能够处理广泛的对象
  3. 属性3:场景泛化性
    他们进一步在各种真实世界场景中部署了iDP3的策略,如下图所示

2.3.2 iDP3的几个消融研究

最后,作者对DP3的几项修改进行了消融研究,包括改进的视觉编码器、缩放的视觉输入和更长的预测范围

实验表明如果没有这些修改,DP3要么无法有效地从人类数据中学习,要么表现出显著降低的准确性

更具体地说,他们观察到

  1. 他们改进的视觉编码器可以同时提高策略的平滑度和准确性

  2. 缩放视觉输入是有帮助的,但在他们的任务中更多的点数会使性能饱和(while the performance gets saturated in our tasks with more points)

  3. 一个合适的预测时间范围是关键,如果没有这个,DP3无法从人类演示中学习

最后论文中提到,iDP3的训练时间,与DiffusionPolicy相比,显示出显著的减少。这种效率即使在点云数量增加到DP3的几倍时仍然保持

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

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

3.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],有效学习状态转换模型能够识别潜在的动态模式

3.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

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

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

3.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是希望添加到网络中的条件向量

3.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

3.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,不足以解释条件图像,并在条件不足和无提示的情况下失败

3.3 Diff-Control的技术架构

3.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)是转移模型,这个转移模型描述了系统动力学演化的规律,而观测模型则确定了系统内部状态与观测到的噪声测量值之间的关系

3.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策略能够巧妙地捕捉时间动态,并有助于准确且一致地生成后续动作

3.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]

3.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」,这一修改可以提升策略在语言条件任务中的整体表现

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

3.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次专家示范

3.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.xdnf.cn/news/2763.html

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

相关文章

前端 react 面试题(二)

文章目录 hooks的使用规则为什么hooks要确保在函数组件的最顶层,而不能放置在循环或者条件语句中。react的事件模型react的合成事件是如何实现的react事件传参,可以使用箭头函数或bind方法,这两种哪一种更好使用箭头函数:使用`bind`方法:react的事件模型和vue的区别React …

【P2-10】ESP8266 WIFI模块连接原子云服务器与原子云APP通信

前言:本节实现ESP8266 WIFI模块连接原子云服务器与原子云APP通信。 演示视频: 【物联网】ESP8266 WIFI模块连接原子云服务器与原子云APP通信 目录 1.WIFI模块连接原子云服务器互相通信 2.WIFI模块与原子云APP通信 1.WIFI模块连接原子云服务器互相通信 原子云服务器登陆入…

2024-11-4 学习人工智能的Day21 openCV(3)

图像滤波 所为图像滤波通过滤波器得到另一个图像 什么是滤波器 在深度学习中,滤波器又称为卷积核,滤波的过程成为卷积 卷积核概念 卷积核大小,一般为奇数,如 3*35*57*7 为什么卷积核大小是奇数? 原因是&…

CSS基础知识六(浮动的高度塌陷问题及解决方案)

目录 1.浮动高度塌陷概念 2.下面是几种解决高度塌陷的几种方案: 解决方案一: 解决方案二: 解决方案三: 1.浮动高度塌陷概念 在CSS中,高度塌陷问题指的是父元素没有正确地根据其内部的浮动元素或绝对定位元素来计…

8、raid磁盘阵列

raid级别及概念 不同分区组成的逻辑硬盘,可以实现高可用,即阵列当中有一个分区的硬盘损坏,不影响整个阵列的使用,可以满足企业级的读写性能的要求。 raid磁盘阵列——raid级别: raid0,raid1,…

hivt实战

argoverse数据集和API forcasting包含tracking的结果,然后结合argo-api去获取hdmap数据 重要的api 数据结构 lane segment argoverse-api/argoverse/map_representation/lane_segment.py at master argoverse/argoverse-api GitHub 练习 get started with th…

CVE-2024-26229 Windows CSC服务权限提升漏洞复现

一、漏洞描述 csc.sys驱动程序中带有METHOD_NEITHER I/O控制代码的IOCTL地址验证不正确,导致任意地址写入漏洞。 METHOD_NEITHER是 Windows 驱动程序中的一种 I/O 控制代码数据传输方法。它允许驱动程序在处理 I/O 请求时,直接从用户模式缓冲区读取或向…

Chrome与傲游在隐私保护上的表现

在数字化时代,浏览器作为我们探索互联网世界的重要工具,其隐私保护功能的强弱直接关系到用户的信息安全。本文将深入对比Chrome与傲游两款主流浏览器在隐私保护方面的表现,并提供实用的教程,帮助用户更好地管理自己的隐私设置。&a…

zip文件加密成图片文件-到解密

加密 1,准备:图片 zip文件 2,新建一个.txt 根据自己的对应文件修改: copy 图片名.后缀/b压缩包名.后缀自定义图片名.后缀注意,图片后缀最后保持一至,测试了 jpg png 压缩包 zip 3,把上…

1-ARM Linux驱动开发-MIO控制

一、前言 MIO也属于是字符设备,将MIO复用为GPIO可以实现对LED等外设的控制,其本质是从寄存器层面对硬件的控制。这次主要记录一下GPIO控制LED的驱动。 官网ZYNQ寄存器手册https://docs.amd.com/r/en-US/ug1087-zynq-ultrascale-registers/Overview 二…

深入解析Sysmon日志:增强网络安全与威胁应对的关键一环

不断演进的网络安全领域中,保持对威胁的及时了解至关重要。Sysmon日志在这方面发挥了至关重要的作用,通过提供有价值的见解,使组织能够加强其安全姿态。Windows在企业环境中是主导的操作系统,因此深入了解Windows事件日志、它们的…

HTMLCSS:呈现的3D树之美

效果演示 这段代码通过HTML和CSS创建了一个具有3D效果的树的图形&#xff0c;包括分支、树干和阴影&#xff0c;通过自定义属性和复杂的变换实现了较为逼真的立体效果。 HTML <div class"container"><div class"tree"><div class"…

XingHan-Team团队官网系统源码 全开源

XingHan-Team 官网程序是一个现代化的企业官网管理系统&#xff0c;由星涵网络工作室开发。 本系统提供了完整的网站内容管理功能&#xff0c;包括用户管理、内容发布、成员查询、成员申请等功能。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/8995…

JAVA:常见 JSON 库的技术详解

1、简述 在现代应用开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已成为数据交换的标准格式。Java 提供了多种方式将对象转换为 JSON 或从 JSON 转换为对象&#xff0c;常见的库包括 Jackson、Gson 和 org.json。本文将介绍几种常用的 JSON 处理…

【贪心】【可行范围内最大边界】SCNU习题 P25.跳跃游戏

算法思想&#xff1a; 每次迭代更新可行至的最大范围r(r必保证>原位置&#xff09;&#xff0c;至到迭代结束&#xff0c;若r>length of array则说明可以跳跃至此 #include <iostream> #include <vector> #include <string> #include <sstre…

Redis 组网方式入门

文章目录 一、组网方式1. 单实例模式描述优点缺点适用场景 2. 主从复制模式&#xff08;Master-Slave Replication&#xff09;描述优点缺点适用场景基于docker的redis主从复制1. 配置主节点2. 配置从节点3. 查看节点状态4. 验证主从数据同步5. 查看同步进度 3. 哨兵模式&#…

【系统集成项目管理工程师教程】第5章 软件工程

软件工程是一门研究用工程化方法构建和维护有效、实用和高质量软件的学科&#xff0c;涵盖软件需求、设计、实现、测试、部署交付、质量管理和过程能力成熟度等方面&#xff0c;旨在提高软件生产率、质量并降低成本&#xff0c;确保软件项目的成功开发与维护。 5.1软件工程定义…

PowerDesigner使用教程:设置注释、默认值属性

使用场景: 进行表设计时&#xff0c;我们需要对字段增加注释、设置默认值 解决方案&#xff1a; 如下图设置即可实现

如果 MySQL 主库出现了问题,从库该何去何从呢?

🚀 博主介绍:大家好,我是无休居士!一枚任职于一线Top3互联网大厂的Java开发工程师! 🚀 🌟 在这里,你将找到通往Java技术大门的钥匙。作为一个爱敲代码技术人,我不仅热衷于探索一些框架源码和算法技巧奥秘,还乐于分享这些宝贵的知识和经验。 💡 无论你是刚刚踏…

C# 日志框架 NLog、log4net 和 Serilog对比

文章目录 前言NLog、log4net 和 Serilog 三个框架的详细对比:一、NLog优点:缺点:二、 log4net优点缺点三、Serilog优点缺点四、Serilog使用举例总结前言 NLog、log4net 和 Serilog 三个框架的详细对比: NLog、log4net 和 Serilog 是三个非常流行的 .NET 日志框架,它们各自…