AIGC视频生成模型:Meta的Emu Video模型

大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video,作为Meta发布的第二款视频生成模型,在视频生成领域发挥关键作用。

在这里插入图片描述

🌺优质专栏回顾🌺:

  1. 机器学习笔记
  2. 深度学习笔记
  3. 多模态论文笔记
  4. AIGC—图像

文章目录

    • 论文
    • 摘要
    • 引言
    • 相关工作
      • 文本到图像(T2I)扩散模型
      • 视频生成/预测
      • 文本到视频(T2V)生成
      • 分解生成
    • 方法
      • 预备知识
      • Emu Video
        • 生成步骤
        • 图像条件
        • 模型结构
        • 零终端信噪比 噪声调度
        • 插值模型
        • 实现简单性
        • 稳健的人类评估(JUICE)
      • 实现细节
        • 架构与初始化
        • 高效的多阶段多分辨率训练
        • 高质量微调
        • 插值模型
    • 实验
    • 伦理问题

论文

项目:https://emu-video.metademolab.com/assets/emu_video
论文:https://arxiv.org/pdf/2311.10709

摘要

本文提出Emu Video,这是一种文本到视频生成模型,将生成过程分解为两个步骤

  1. 先根据文本生成图像;
  2. 再基于文本生成的图像生成视频

该模型在性能上超越了RunwayML的Gen2和Pika Labs等商业解决方案。

引言

T2I模型大规模的图像文本对上训练,已经很成功了,可使用视频文本对进一步拓展文本到视频(T2V)生成,但视频生成质量和多样性方面仍落后于图像生成。原因在于:

  • 需要对更高维度的时空输出空间进行建模,且仅以文本提示作为条件;
  • 视频文本数据集通常比图像文本数据集小一个数量级

当前视频生成的主流范式是使用扩散模型一次性生成所有视频帧。而不是NLP中的自回归问题不同,自回归方法在视频生成中具有挑战性,因为从扩散模型生成单个帧就需要多次迭代

Emu Video通过显式的中间图像生成步骤,将文本到视频生成分解为两个子问题

  1. 根据输入文本提示生成图像;
  2. 基于图像和文本的强条件生成视频。

直观地说,给模型一个起始图像和文本会使视频生成更容易,因为模型只需要预测图像未来的演变

由于视频文本数据集远小于图像文本数据集,使用预训练的文本到图像(T2I)模型初始化T2V模型,并冻结其权重。在推理时,这种分解方法能显式生成图像,从而保留T2I模型的视觉多样性、风格和质量。

Emu Video证明了将文本到视频(T2V)生成过程分解为:先生成图像,再用生成的图像和文本生成视频。可以大幅提高生成质量。

到此,作者确定了他们的关键设计决策 —— 改变扩散噪声调度采用多阶段训练,从而能够绕过先前工作中对深度级联模型的需求高效生成 512 像素高分辨率的视频。该模型也可以根据用户提供的图像和文本提示生成视频。

相关工作

文本到图像(T2I)扩散模型

相比于先前的生成对抗网络(GAN)或自回归方法,扩散模型是文本到图像生成的前沿方法,通过加噪声和预测加入的噪声并去除来学习数据分布,生成输出。

扩散模型去噪可以在像素空间使用,也可以在低维潜在空间使用,本文采用潜在扩散模型进行视频生成

视频生成/预测

许多先前工作,如掩码预测、LSTMs、GANs 等通常在有限的领域中进行训练和评估。它们适用的场景较为狭窄,可能只在特定类型的视频数据、特定的任务要求或特定的应用场景中表现良好。

本文的研究中,目标是开放集的文本到视频(T2V)生成。开放集意味着处理的数据和任务场景更为广泛和多样,没有预先设定的严格限制,这与之前这些方法所适用的有限领域形成对比。

文本到视频(T2V)生成

多数先前工作通过利用T2I模型来解决T2V生成问题

  • 采用无训练方法,通过在T2I模型中注入运动信息进行零样本T2V生成
  • 通过微调T2I模型实现单样本T2V生成

这些方法生成的视频质量和多样性有限。

也有许多工作通过向T2I模型引入时间参数学习从文本条件到生成视频的直接映射,来改进T2V生成。如

  • Make-A-Video利用预训练的T2I模型和先验网络,在无配对视频文本数据的情况下训练T2V生成;
  • Imagen Video基于Imagen T2I模型构建级联扩散模型

为解决高维时空空间建模的挑战,部分工作在低维潜在空间训练T2V扩散模型,但这些方法学习从文本到高维视频空间的直接映射具有挑战性

本文则 采用分解方法来增强条件信号

分解生成

与Emu Video在分解方面最相似的工作是CogVideo和Make-A-Video:

  • CogVideo基于预训练的T2I模型,使用自回归Transformer进行T2V生成,其自回归性质在训练和推理阶段与Emu Video的显式图像条件有根本区别。
  • Make-A-Video 利用从共享图像文本空间中学习到的图像嵌入作为条件。

Emu Video直接利用第一帧作为条件,条件更强

此外,Make-A-Video从预训练的T2I模型初始化,但对所有参数进行微调,无法像Emu Video那样保留T2I模型的视觉质量和多样性。Stable Video Diffusion是一项与Emu Video同时期的工作,也引入了类似的分解方法进行T2V生成。

Make-A-Video是Meta于2022年发布的模型/论文中:MAKE-A-VIDEO: TEXT-TO-VIDEO GENERATION WITHOUT TEXT-VIDEO DATA
CogVideo是国产的视频生成模型,之前清华大学和智谱AI一起研发了CogView文本生成图像模型,CogVideo由清华大学发布的论文:CogVideo: Large-scale Pretraining for Text-to-Video Generation via Transformers

方法

文本到视频(T2V)生成的目标:构建一个模型,该模型以文本提示 P 作为输入,生成由 T 个 RGB 帧组成的视频 V

近期的一些模型仅使用文本作为条件,一次性直接生成 T 个视频帧。作者在本论文中认为:通过文本和图像共同提供更强的条件能够提升视频生成效果(验证参见 3.2 节 )。

预备知识

条件扩散模型是一类生成模型,通过迭代对高斯噪声去噪,根据条件输入c生成输出

在训练时:

  • 将时间步 t ∈ [ 0 , N ] t \in[0, N] t[0,N]相关的高斯噪声 ϵ t ∼ N ( 0 , 1 ) \epsilon_{t} \sim N(0, 1) ϵtN(0,1)添加到原始输入信号X上,得到有噪输入 X t = α t X + 1 − α t ϵ t X_{t}=\alpha_{t} X+\sqrt{1-\alpha_{t}} \epsilon_{t} Xt=αtX+1αt ϵt,其中 α t \alpha_{t} αt定义 “噪声调度”,N是扩散步骤总数。
  • 扩散模型通过预测噪声 ϵ t \epsilon_{t} ϵt x x x v t = α t ϵ t − 1 − α t X v_{t}=\alpha_{t} \epsilon_{t}-\sqrt{1-\alpha_{t}} X vt=αtϵt1αt X来对 x t x_{t} xt进行去噪。时间步t的信噪比(SNR)为 ( α t 1 − α t ) 2 (\frac{\alpha_{t}}{1-\alpha_{t}})^{2} (1αtαt)2,并随着 t → N t \to N tN而降低。

在推理时:

  • 纯噪声/高斯噪声 X N ∼ N ( 0 , 1 ) X_{N} \sim N(0, 1) XNN(0,1)开始去噪生成样本。

x t x_{t} xt去噪的三种预测方式:

  • 预测 ϵ t \epsilon_{t} ϵt常用):
    • ϵ t \epsilon_{t} ϵt是在时间步 t t t添加到原始输入信号 X X X的高斯噪声 ϵ t ∼ N ( 0 , 1 ) \epsilon_{t}\sim N(0, 1) ϵtN(0,1)。如果模型能够准确预测出这个噪声,那么就可以从含噪输入 X t = α t X + 1 − α t ϵ t X_{t}=\alpha_{t}X +\sqrt{1-\alpha_{t}}\epsilon_{t} Xt=αtX+1αt ϵt中减去预测的噪声,从而达到去噪的目的。
  • 预测 x x x
    • 这里的 x x x是指原始输入信号 X X X。模型直接预测原始信号本身,在得到预测的原始信号 X ^ \hat{X} X^后,就可以将含噪输入 X t X_{t} Xt中的噪声部分去除。在实际操作中,直接预测原始信号可能会比较复杂,因为模型需要学习从含噪信号中还原出原始信号的复杂映射关系。
  • 预测 v t v_{t} vt
    • v t = α t ϵ t − 1 − α t X v_{t}=\alpha_{t}\epsilon_{t}-\sqrt{1 - \alpha_{t}}X vt=αtϵt1αt X是一种组合了噪声 ϵ t \epsilon_{t} ϵt和原始信号 X X X的形式。当模型预测出 v t v_{t} vt v ^ t \hat{v}_{t} v^t时,可以通过一定的数学变换来去除噪声,恢复原始信号。这种方式综合考虑了噪声和原始信号之间的关系,也是一种有效的去噪策略。

Emu Video

在这里插入图片描述

图3描述了分解的文本 - 视频生成过程。

  • 首先根据文本 p p p生成图像 I I I
  • 然后使用更强的条件,即生成的图像和文本来生成视频 V V V

为了使我们的模型 F \mathcal{F} F以图像为条件,我们在时间维度上对图像进行零填充,并将其与一个二进制掩码连接起来,该掩码指示哪些帧是零填充的【类似Trandformer的填充遮蔽(Padding Masking)与未来遮蔽(Future Masking)】,以及含噪输入。

生成步骤

将文本到视频生成分解为两个步骤:

  • 首先,根据文本提示 p p p 生成第一帧(图像);
  • 然后,利用文本提示 p p p 和图像条件【下面会介绍图像条件怎么来的】生成T帧视频。

这两个步骤均使用潜在扩散模型 F \mathcal{F} F实现,使用预训练的文本到图像模型初始化 F \mathcal{F} F,确保其在初始化时能够生成图像

只需训练 F \mathcal{F} F解决第二步,即根据文本提示和起始帧/图像推出视频。使用视频文本对训练 F \mathcal{F} F,通过采样起始帧/图像 I I I,让模型根据文本提示 P P P和图像 I I I条件预测 T T T帧( T T T帧会被独立地添加噪声,以生成含噪输入 x t x_{t} xt,而扩散模型的训练目标就是对这个含噪输入进行去噪)。

首先通过逐帧应用图像自动编码器的编码器将视频 v v v转换到潜在空间 X ∈ R T × C × H × W X \in \mathbb{R}^{T×C×H×W} XRT×C×H×W,这会降低空间维度。潜在空间中的数据可以通过自动编码器的解码器转换回像素空间。

图像条件

通过将起始帧 I I I与噪声拼接(如上图的concatenate),为模型提供条件。将 I I I表示为单帧视频( T = 1 T=1 T=1),并对其进行零填充,得到 T × C × H × W T ×C ×H ×W T×C×H×W张量,同时使用形状为 T × 1 × H × W T ×1 ×H ×W T×1×H×W二进制掩码m,在第一时间位置设置为1表示起始帧位置,其他位置为0。将掩码m、起始帧I和有噪视频 x t x_{t} xt按通道连接作为模型输入。

Make-a-video等模型中基于语义嵌入设定条件的方法不同,Emu Video 的拼接的方式让模型利用起始帧 I 的全部信息。基于语义嵌入的方法会在条件设定时丢失部分图像信息,而 Emu Video 的设计避免了这一问题,为生成高质量视频提供了更多有效信息。

掩码 m 用于标记起始帧在序列中的位置帮助模型识别起始帧,对后续视频生成过程进行更精准的指导。

模型结构

使用预训练的T2I模型Emu初始化潜在扩散模型 F \mathcal{F} F,并添加新的可学习时间参数

  • 在每个空间卷积层之后添加一维时间卷积层;
  • 在每个空间注意力层之后添加一维时间注意力层 ;
  • 原始的空间卷积层和注意力层保持冻结状态。

在Runway的Gen-1中的时空潜在扩散中也使用了可学习时间参数:

  • 在每个残差块中的每个 2D 空间卷积之后引入一个1D 时间卷积。
  • 在每个空间 2D 空间注意力块后引入一个时间1D 时间注意力块。

预训练的 T2I 模型以文本作为条件与上一节的图像条件相结合后,模型 F \mathcal{F} F 同时以文本和图像作为条件。

Emu是Meta发布的一款T2I模型,论文为:Emu: Enhancing Image Generation Models Using Photogenic Needles in a Haystack

零终端信噪比 噪声调度

作者发现,先前工作(Emu和SD模型)中使用的扩散噪声调度存在训练 - 测试差异,这会阻碍高质量视频的生成

在训练过程中,该噪声调度会留下一些残留信号,也就是说,即使在扩散的终端时间步N,信噪比(SNR)仍不为零。当我们从不含真实数据信号的随机高斯噪声中采样时,这会导致扩散模型在测试时无法很好地泛化。由于高分辨率视频帧在空间和时间上存在冗余像素,其残留信号更为明显。

作者通过缩放噪声调度并将最终的 α N = 0 \alpha_N = 0 αN=0来解决这个问题,这使得在训练过程中的时间步为N时(扩散过程的最后一个阶段),信噪比也为零。我们发现这个设计决策对于高分辨率视频的生成至关重要

这个问题和缩放噪声调度方法并非本文首创,在之前的:Common diffusion noise schedules and sample steps are flawed也发现了这个问题。【来源于字节跳动】

插值模型

使用与 F \mathcal{F} F结构相同的插值模型 I I I,将低帧率的 T T T帧视频转换为高帧率的 T p T_{p} Tp帧视频。 输入的 T T T帧通过零交错生成 T p T_{p} Tp帧,并将指示 T T T帧存在的二进制掩码m连接到有噪输入。为提高效率,从 F \mathcal{F} F初始化 I I I,并仅针对插值任务训练 I I I的时间参数。

将低帧率的 T T T帧视频转换为高帧率的 T p T_p Tp帧,能提升视频流畅度与视觉效果,适应多样化应用场景,增强模型竞争力,为用户带来更好体验。

实现简单性

Emu Video在实现方面的简单且高效:

  1. 训练数据与模型结构简单
    • 标准数据集训练:Emu Video采用标准视频文本数据集进行训练,这意味着其训练数据来源广泛且具有通用性,不需要特殊定制的数据集,降低了数据准备的难度和成本。
    • 无需深度级联模型:在生成高分辨率视频时,Emu Video不需要像某些其他方法(如Imagen Video中使用7个模型的深度级联结构)那样复杂的模型架构,简化了模型构建和训练流程。
  2. 推理过程
    • 图像与视频生成:推理时,先运行去除时间层的模型F根据文本提示生成图像I再将I和文本提示作为输入,通过F直接生成高分辨率的T帧视频,这种推理方式简洁高效。
    • 帧率提升:借助插值模型I可提高视频帧率,进一步增强视频的视觉效果,且这一操作融入到了整体的推理流程中。
  3. 模型初始化与风格保留
    • 初始化策略:空间层从预训练的T2I模型初始化并保持冻结,这样可以利用T2I模型在大规模图像文本数据集上学习到的概念和风格多样性。
    • 风格保留优势:相比Imagen Video需要在图像和视频数据上联合微调以维持风格,Emu Video不需要额外的训练成本就能保留并运用这些风格来生成图像I。许多直接的T2V方法,如Make-a-video,虽然也从预训练T2I模型初始化并冻结空间层,但由于没有采用基于图像的分解方法,无法像Emu Video一样保留T2I模型的质量和多样性 。
稳健的人类评估(JUICE)

由于自动评估指标不能反映质量的提升,主要使用人类评估来衡量T2V生成性能,从视频生成质量(Quality,Q)和生成视频与文本提示的对齐或 “保真度”(Faithfulness,F)两个正交方面进行评估。提出JUICE评估方案,要求评估者在成对比较视频生成结果时说明选择理由,显著提高了标注者之间的一致性。评估者可选择像素清晰度、运动平滑度、可识别对象/场景、帧一致性和运动量等理由来评价视频质量;使用空间文本对齐和时间文本对齐来评价保真度。

实现细节

附录第 1 节提供完整的实现细节,详细内容可以参考附录第 1 节,这里只介绍关键细节。

架构与初始化

采用Emu中的文本到图像 U-Net 架构构建模型,并使用预训练模型初始化所有空间参数。

预训练模型使用一个 8 通道、64×64 的潜在向量,经自动编码器在空间上进行 8 倍下采样,生成 512px 的方形图像。
该模型同时使用一个冻结的 T5-XL 和一个冻结的 CLIP 文本编码器从文本提示中提取特征

高效的多阶段多分辨率训练

为降低计算复杂度,分两个阶段进行训练

  1. 先在低分辨率下,训练更简单的任务,即生成256px、8fps、1s的视频。
  2. 然后在期望的高分辨率下训练,对4fps、2s的视频进行15K次迭代训练。
    a. 使用同SD一样的噪声调度进行256px训练。
    b. 在512px训练中使用零终端信噪比噪声调度,扩散训练步数 N = 1000 N = 1000 N=1000
    c. 使用DDIM采样器进行采样,采样步数为250步。

SD中的噪声调度是:线性调度。
SD 系列文章参考:Stable Diffusion

高质量微调

通过在一小部分高运动和高质量视频上微调模型,可改善生成视频的运动效果。从训练集中自动识别出1600个具有高运动(根据H.264编码视频中存储的运动信号计算)的视频作为微调子集,并根据美学分数和视频文本与第一帧CLIP相似度进行筛选。

插值模型

插值模型I从视频模型F初始化,输入8帧,输出 T p = 37 T_{p} = 37 Tp=37帧,帧率为16fps。在训练时使用噪声增强,在推理时对F的样本进行噪声增强。

实验

参照论文原文

伦理问题

参照论文原文

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

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

相关文章

面向对象的程序设计:以对象的方式进行思考

1 理解接口与实现的区别 以上一篇文章的电视机需要插电使用的例子继续来讲解: 对电视而言,插电使用,只需要标准的插座即可,具体的电从哪里来,是火力发电厂,或是太阳能发电,亦或是畜电池逆变供电,电视机是不需要关心的。 发电厂或供电设备属于实现,220V交流电插座属于…

网络协议如何确保数据的安全传输?

网络协议作为计算机网络通信的基石,其设计不仅旨在实现数据的有效传输,更在于确保数据在传输过程中的安全性。对于网络协议如何保障数据安全传输,是很多企业和网络IT部门的重点,本文将从多方面概述相关方法。 加密与解密机制 1. …

C# 以管理员方式启动程序全解析

引言 在 Windows 应用程序开发的领域中,C# 语言凭借其强大的功能和广泛的适用性,被众多开发者所青睐。然而,在实际的开发过程里,我们常常会遭遇这样的情况:程序需要访问特定的系统资源,像是系统文件夹、注…

要获取本地的公网 IP 地址(curl ifconfig.me)

文章目录 通过命令行查询(适用于 Linux/Mac/Windows)Linux/MacWindows 注意事项 要获取本地的公网 IP 地址,可以通过以下简单的方法: 通过命令行查询(适用于 Linux/Mac/Windows) Linux/Mac 打开终端。输入…

MySQL 数据库 UDF 提权

免责声明 本博客文章仅供教育和研究目的使用。本文中提到的所有信息和技术均基于公开来源和合法获取的知识。本文不鼓励或支持任何非法活动,包括但不限于未经授权访问计算机系统、网络或数据。 作者对于读者使用本文中的信息所导致的任何直接或间接后果不承担任何责…

VUE3 vite下的axios跨域

在使用 Vite 开发时,如果你的前端项目需要请求后端 API,且后端和前端不在同一个域上,可能会遇到跨域问题。跨域是指浏览器出于安全考虑,阻止了前端网页向不同源(域名、协议、端口)发送请求。 解决跨域问题…

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据!本次我们为大家带来的就是具体到气象监…

rust学习-函数的定义与使用

rust学习-函数的定义与使用 1. 函数的基本定义2. 函数的参数多个参数 3. 返回值提前返回 4. 函数调用5. 函数的所有权和借用传递所有权借用 6. 函数作为参数和返回值函数作为参数函数作为返回值 7. 泛型函数8. 函数注释(文档注释) 1. 函数的基本定义 在R…

【Linux 源码】内核态到用户态

文章目录 1. 由来2. 流程图3. 中断3.1 概念3.2 8259A芯片3.4 中断时的栈处理3.4.1 相同特权级3.4.2 不同特权级 3.5 中断流程3.6 定位中断程序3.7 中断流程步骤总结 4. 源码4.1 move_to_user_mode4.2 0号进程4.3 TSS和LDT在GDT表排布4.4 ldt中的0x17栈段 5. 总结 1. 由来 ​ 首…

雷电9最新版安装Magisk+LSPosd(新手速通)

大家好啊!我是NiJiMingCheng 我的博客:NiJiMingCheng 在安卓系统的定制与拓展过程中,获取 ROOT 权限以及安装各类框架是进阶玩家常用的操作,这可以帮助我们实现更多系统层面的个性化功能。今天,我将为大家详细介绍如何…

【vim】vim编辑器如何设置行号

vim编辑器如何设置行号 一、**临时设置行号**二、永久设置行号2.1. **用户配置文件方式(针对当前用户)**2.2. **全局配置文件方式(谨慎使用,会影响所有用户)** 在Vim中设置行号有以下两种常见的方法: 一、…

《Linux服务与安全管理》| 邮件服务器安装和配置

《Linux服务与安全管理》| 邮件服务器安装和配置 目录 《Linux服务与安全管理》| 邮件服务器安装和配置 1.在Server01上安装dns、postfix、dovecot和telnet,并启动 2.在Server01上配置DNS服务器,设置MX资源记录 3.在server1上…

基于 K-Means 聚类分析实现人脸照片的快速分类

注:本文在创作过程中得到了 ChatGPT、DeepSeek、Kimi 的智能辅助支持,由作者本人完成最终审阅。 在 “视频是不能 P 的” 系列文章中,博主曾先后分享过人脸检测、人脸识别等相关主题的内容。今天,博主想和大家讨论的是人脸分类问题。你是否曾在人群中认错人,或是盯着熟人的…

计算机毕业设计Python电商品推荐系统 商品比价系统 电商比价系统 商品可视化 商品爬虫 机器学习 深度学习 京东爬虫 国美爬虫 淘宝爬虫 大数据

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

【银河麒麟高级服务器操作系统】业务访问慢网卡丢包现象分析及处理过程

了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:product.kylinos.cn 开发者专区:developer.kylinos.cn 文档中心:document.kylinos.cn 交流论坛:forum.kylinos.cn 服务器环境以及配置 【内核版本…

鸿蒙开发中的骨架图:提升用户体验的关键一环

大家好,我是小 z,今天要给大家分享一个提升用户体验的超实用技巧 —— 骨架图🎯 文章目录 一、什么是骨架图二、骨架图的作用三、鸿蒙开发中实现骨架图的方法1. 利用 opacity 奠定视觉基础2. animateTo 驱动动态变化3. 二者协同触发与展示 四…

owasp SQL 手工注入 - 02 (技巧)

SQL 注入分为: 布尔注入,还有union 注入,布尔注入是指" 或“ 和”,这个注入,写成语句就是OR 11 , and 这种语句。 下面重点说一下union 注入的原理: 1: 先看两个表union 的结果: mysql> select user,passwor…

第16章:Python TDD实现多币种货币运算

写在前面 这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许…

leetcode刷题记录(七十三)——543. 二叉树的直径

(一)问题描述 543. 二叉树的直径 - 力扣(LeetCode)543. 二叉树的直径 - 给你一棵二叉树的根节点,返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 r…

【esp32小程序】小程序篇02——连接git

一、创建仓库 进入gitee官网,登录(如果没有gitee账号的就自行注册一下)。 点击号-->新建仓库 填写好必填信息,然后点击“创建” 二、微信开发者工具配置 在微信开发者工具打开我们的项目。按下面的步骤依次点击 三、验证 点…