VASA-1: Lifelike Audio-Driven Talking Faces Generated in Real Time

TL;DR

  • 2024 年微软发表的数字人工作 VASA-1,支持基于单人头像照片和语音音频输入,来实时生成数字人视频。支持在线生成高达 40 FPS 的 512×512 分辨率视频,目前为数不多能做到实时推理且效果很好的 talking face 工作。

Paper name

VASA-1: Lifelike Audio-Driven Talking Faces Generated in Real Time

Paper Reading Note

Paper URL: https://arxiv.org/abs/2404.10667

Project URL: https://www.microsoft.com/en-us/research/project/vasa-1/


Introduction

背景

  • 人脸不仅仅是一个面孔,而是一个动态的画布,每一个微妙的动作和表情都能表达情感、传达未言之语,并促进共情联系。
  • 人工智能生成的会说话的面孔的出现,为我们打开了一扇窗,让我们看到了一个技术增强人与人之间、人与人工智能互动丰富性的未来。这样的技术有望丰富数字通信,为沟通障碍者增加可及性,通过互动式人工智能辅导转变教育方法,并在医疗保健中提供治疗支持和社交互动。
  • 当前的技术主要关系唇部动作,同时生成效率较慢,难以实时处理

本文方案

  • VASA:根据单个静态图像和语音音频剪辑生成具有吸引力的视觉情感技能(VAS)的逼真会说话的面孔
    • 生成与音频完美同步的唇部动作
    • 产生一系列面部细微表情和自然头部动作
    • 支持在线生成高达40 FPS的512×512视频,几乎没有启动延迟
      在这里插入图片描述

Methods

  • 采用单张人脸图像、可选的控制信号和语音音频片段来生成逼真的说话人脸视频。不是直接生成视频帧,而是在潜在空间中根据音频和其他信号生成整体面部动态和头部运动。
    • 首先构建面部潜在空间并训练面部编码器和解码器。我们设计了一个富有表现力和解耦的面部潜在学习框架,并在真实人脸视频上进行训练。
    • 然后我们训练一个简单但功能强大的扩散 transformer(Diffusion Transformer),在测试时根据音频和其他条件对运动分布进行建模并生成运动潜在编码

富有表现力和解耦的面部潜在空间构建

  • 给定一个未标记的说话人脸视频集,旨在为人脸建立一个具有高度解耦性和表现力的潜在空间
    • 解耦使得能够在大量视频上对人头和整体面部行为进行有效的生成建模,而不受主体身份的影响。它还实现了输出的解耦因素控制,这在许多应用中都是有用的。
    • 另一方面,面部外观和动态运动的表现力确保解码器能够输出具有丰富面部细节的高质量视频,而潜在生成器能够捕捉细微的面部动态。
  • 参考 Megaportraits 等工作中的 3D 辅助面部重演框架 (face reenactment framework) 构建模型。与 2D 特征图相比,3D 外观特征体能更好地表征 3D 中的外观细节。显式的 3D 特征扭曲 (warping) 在对 3D 头部和面部运动建模方面也很强大。
    • 具体来说,我们将面部图像分解为规范的 3D 外观体积 V a p p V_{app} Vapp、身份代码 z i d z_{id} zid、3D 头部姿势 z p o s e z_{pose} zpose 和面部动态代码 z d y n z_{dyn} zdyn。除了 V a p p V_{app} Vapp 外,其余都是通过独立编码器从面部图像中提取的,而 V a p p V_{app} Vapp 是通过先提取带姿势的 3D 体积,然后进行刚性和非刚性 3D 扭曲到规范体积来构建的,这种方法参考了 Megaportraits。单个解码器 D D D 将这些潜在变量作为输入并重建人脸图像,其中,首先对 V a p p V_{app} Vapp 应用类似的逆方向扭曲场以获得带姿势的外观体积。读者可以参考文献 Megaportraits 以了解该架构的更多细节。
    • 为了学习解耦的潜在空间,核心思想是通过在视频中的不同图像之间交换潜在变量来构建图像重建损失。我们的基本损失函数改编自 Megaportraits,但我们发现原始损失在面部动态和头部姿势之间的解耦较差,同时身份与运动之间的解耦也不完善。因此,我们引入了几种额外的损失来实现我们的目标。
      • 受文献 Dpe 启发,我们添加了一种成对的头部姿势和面部动态传递损失,以改善它们的解耦。设 I i I_i Ii I j I_j Ij 为从同一视频中随机采样的两个帧。我们使用编码器提取它们的潜在变量,将 I i I_i Ii 的头部姿势传递给 I j I_j Ij 得到 I ^ j , z p o s e i = D ( V a p p j , z i d j , z p o s e i , z d y n j ) \hat{I}_{j,z_{pose}^i} = D(V_{app}^j, z_{id}^j, z_{pose}^i, z_{dyn}^j) I^j,zposei=D(Vappj,zidj,zposei,zdynj),并将 I j I_j Ij 的面部运动传递给 I i I_i Ii 得到 I ^ i , z d y n j = D ( V a p p i , z i d i , z p o s e i , z d y n j ) \hat{I}_{i,z_{dyn}^j} = D(V_{app}^i, z_{id}^i, z_{pose}^i, z_{dyn}^j) I^i,zdynj=D(Vappi,zidi,zposei,zdynj)。然后最小化 I ^ j , z p o s e i \hat{I}_{j,z_{pose}^i} I^j,zposei I ^ i , z d y n j \hat{I}_{i,z_{dyn}^j} I^i,zdynj 之间的一致性损失 l c o n s i s t l_{consist} lconsist
      • 为了强化身份与运动之间的解耦,我们为跨身份姿势和面部运动传递结果添加了面部身份相似性损失 l c r o s s _ i d l_{cross\_id} lcross_id。设 I s I_s Is I d I_d Id 为两个不同主体的视频帧,可以将 I d I_d Id 的运动传递到 I s I_s Is 上,得到 I ^ s , z p o s e d , z d y n d = D ( V a p p s , z i d s , z p o s e d , z d y n d ) \hat{I}_{s,z_{pose}^d,z_{dyn}^d} = D(V_{app}^s, z_{id}^s, z_{pose}^d, z_{dyn}^d) I^s,zposed,zdynd=D(Vapps,zids,zposed,zdynd)。然后对从 I s I_s Is I ^ s , z p o s e d , z d y n d \hat{I}_{s,z_{pose}^d,z_{dyn}^d} I^s,zposed,zdynd 提取的深度面部身份特征 (arcface) 应用余弦相似性损失。正如我们在实验中展示的那样,我们的新损失函数设计对于实现有效的因素解耦以及促进高质量、逼真的说话人脸生成至关重要。

3.2 整体面部动态生成与扩散变换器

  • 在构建了人脸潜在空间并训练了编码器后,我们可以从真实的说话人脸视频中提取面部动态和头部动作,并训练生成模型。关键在于我们考虑的是与身份无关的整体面部动态生成(HFDG),其中学习到的潜在代码表示所有面部运动,例如唇部动作、(非唇部的)表情、眼睛的注视和眨眼。这不同于现有方法,它们通常为不同因素应用独立模型,使用交错的回归和生成形式 (比如 Audio2head、Sadtalker 等)。此外,以往方法往往在有限的身份数据上进行训练 (比如 Sadtalker、Codetalker 等),无法涵盖不同人类的广泛运动模式,特别是在存在丰富运动潜在空间的情况下。

  • 在本研究中,我们利用扩散模型进行音频条件的 HFDG,并在大量多身份的说话人脸视频上进行训练。我们采用变换器架构 (参考 DiT、Diffposetalk) 来完成序列生成任务。图 2 展示了我们的HFDG框架概览。
    在这里插入图片描述

  • 形式上,从视频片段中提取的运动序列定义为 X = { [ z p o s e i , z d y n i ] } , i = 1 , . . . , W X = \{[z_{pose}^i , z_{dyn}^i ]\}, i = 1, . . . , W X={[zposei,zdyni]},i=1,...,W。给定其对应的音频片段 a a a,我们使用预训练的特征提取器 Wav2Vec2 提取同步的音频特征 A = { f a u d i o i } A = \{f_{audio}^i\} A={faudioi}

扩散模型公式

扩散模型定义了两个马尔科夫链,正向链逐渐向目标数据添加高斯噪声,反向链则逐步从噪声中恢复原始信号。基于去噪得分匹配目标,我们定义简化的损失函数为:

E t ∼ U [ 1 , T ] , X 0 , C ∼ q ( X 0 , C ) ( ∥ X 0 − H ( X t , t , C ) ∥ 2 ) , \mathbb{E}_{t \sim U[1, T], X_0, C \sim q(X_0, C)}(\|X_0 - H(X_t, t, C)\|^2), EtU[1,T],X0,Cq(X0,C)(X0H(Xt,t,C)2),

其中 t t t 表示时间步, X 0 = X X_0 = X X0=X 为原始运动潜在序列, X t X_t Xt 是扩散前向过程 q ( X t ∣ X t − 1 ) = N ( X t ; 1 − β t X t − 1 , β t I ) q(X_t | X_{t-1}) = N(X_t; \sqrt{1 - \beta_t} X_{t-1}, \beta_t I) q(XtXt1)=N(Xt;1βt Xt1,βtI) 生成的噪声输入。 H H H 是我们的 transformer 网络,它直接预测原始信号而非噪声。 C C C 是条件信号,接下来将进行描述。

条件信号
  • 在我们的音频驱动的运动生成任务中,主要的条件信号是音频特征序列 A A A。我们还加入了若干额外的信号,不仅让生成建模更加易处理,还增强了生成的可控性。具体来说,我们考虑了主要的注视方向 g g g、头部与摄像机的距离 d d d 以及情感偏移 e e e

    • 主要注视方向 g = ( θ , φ ) g = (θ, φ) g=(θ,φ) 由球坐标中的一个向量定义,用来指定生成的说话人脸的注视方向。我们通过在每帧中使用文献 L2cs-net 的方法,并辅以简单的基于直方图的聚类算法,提取训练视频片段中的 g g g
    • 头部距离 d d d 是一个归一化的标量,控制人脸与虚拟摄像机之间的距离,从而影响生成视频中人脸的大小。我们通过 3D 人脸重建的方法为训练视频获取这一尺度标签。
    • 情感偏移 e e e 用于调节说话人脸上显示的情绪。注意,情绪通常内在地与音频相关,且能从音频中大致推断出来;因此, e e e 仅作为一个全局偏移,用于在需要时增强或适度地调整情绪,而非在推理过程中完全改变情绪或产生与输入音频不一致的情绪。在实际操作中,我们使用文献 Hsemotion 提取的平均情绪系数作为情绪信号。
  • 为了实现相邻窗口之间的无缝过渡,我们将前一个窗口中音频特征和生成的运动的最后 K K K 帧作为当前窗口的条件。总结而言,我们的输入条件可以表示为 C = [ X pre , A pre ; A , g , d , e ] C = [X_{\text{pre}}, A_{\text{pre}}; A, g, d, e] C=[Xpre,Apre;A,g,d,e]。所有条件在时间维度上与噪声连接后作为 transformer 的输入。

无分类器引导 (CFG)

在训练阶段,我们随机去除每个输入条件。在推理阶段,我们应用:

X ^ 0 = ( 1 + ∑ c ∈ C λ c ) ⋅ H ( X t , t , C ) − ∑ c ∈ C λ c ⋅ H ( X t , t , C ∣ c = ∅ ) \hat{X}_0 = \left(1 + \sum_{c \in C} \lambda_c\right) \cdot H(X_t, t, C) - \sum_{c \in C} \lambda_c \cdot H(X_t, t, C |_{c = ∅}) X^0=(1+cCλc)H(Xt,t,C)cCλcH(Xt,t,Cc=)

其中, λ c \lambda_c λc 是条件 c c c 的CFG比例。 C ∣ c = ∅ C | _{c = ∅} Cc= 表示将条件 c c c 替换为空集。在训练中,除了 X pre X_{\text{pre}} Xpre A pre A_{\text{pre}} Apre 使用 0.5 的丢弃概率外,其他每个条件的丢弃概率为 0.1。这样可以确保模型能很好地处理没有前置音频和运动的第一个窗口(即设置为空)。我们还随机去除 A A A 的最后几帧,以确保在音频序列短于窗口长度时也能生成稳健的运动。

3.3 说话人脸视频生成

在推理时,给定任意人脸图像和音频片段,我们首先使用训练好的面部编码器提取 3D 外观体积 V a p p V_{app} Vapp 和身份代码 z i d z_{id} zid。接着,提取音频特征,将其分割成长度为 W W W 的片段,并使用训练好的扩散变换器 H H H 以滑动窗口的方式逐段生成头部和面部运动序列 { X = { [ z p o s e i , z d y n i ] } } \{X = \{[z_{pose}^i , z_{dyn}^i ]\}\} {X={[zposei,zdyni]}}。最终的视频可以使用我们训练好的解码器生成。

Experiments

实验配置

  • 模型
    • 对于运动潜在生成,我们使用一个 8 层的 transformer 编码器,嵌入维度为512,头数为 8,作为我们的扩散网络。
  • 数据
    • 对于人脸潜在空间的学习:我们使用公开数据集VoxCeleb2,该数据集包含大约 6000 名主体的说话人脸视频。我们重新处理该数据集,并通过 Blind image quality assessment (BIQA) 的方法丢弃包含多个人物的片段以及质量较低的片段
    • 对于运动潜在生成:该模型在 VoxCeleb2 和我们收集的另一个高分辨率对话视频数据集上进行训练,后者包含约 3500 名主体。
  • 推理配置:
    • 在我们的默认设置中,模型使用面向前方的主要注视条件,所有训练视频的平均头部距离,以及空的情感偏移条件。
    • CFG 参数设置为 λ A = 0.5 \lambda_A = 0.5 λA=0.5 λ g = 1.0 \lambda_g = 1.0 λg=1.0,采样步数为50。
  • 训练
    • 我们的人脸潜在模型在 4 个 NVIDIA RTX A6000 GPU 工作站上大约需要 7 天的训练时间,而扩散变换器大约需要 3 天。用于训练的总数据量约为 50 万段,每段持续 2 到 10 秒。我们的 3D 辅助人脸潜在模型和扩散变换器模型的参数量分别约为 200M 和 29M。

评估基准

  • 我们使用两个数据集来评估我们的方法。
    • 第一个是 VoxCeleb2 的一个子集。我们从 VoxCeleb2 的测试集随机选择了46个主体,并为每个主体随机抽取 10 个视频片段,总计 460 个片段。这些视频片段时长约为 5 到 15 秒(80% 小于 10 秒),大部分内容为访谈和新闻报道。
    • 为了进一步评估我们的方法在长时语音生成和更广泛声音变化下的表现,我们另外收集了 17 个人的 32 个一分钟视频片段。这些视频主要来自在线辅导课程和教育讲座,其讲话风格比 VoxCeleb2 更为多样化。我们将此数据集称为 OneMin-32。

推理速度

在离线批处理模式下,我们的方法可生成 512×512 大小的视频帧,速度为45fps;在在线流媒体模式下,支持速度最高可达 40fps,前置延迟仅为 170ms,评估是在配备单个 NVIDIA RTX 4090 GPU 的桌面 PC 上进行的。

定量评估

评测指标

我们使用以下指标对生成的唇部运动头部姿态整体视频质量进行定量评估,包括一种类似于 CLIP 训练的新数据驱动的音频-姿态同步指标:

  • 音频-唇部同步。我们使用一个预训练的音频-唇部同步网络,即 SyncNet,来评估输入音频与生成唇部运动在视频中的对齐情况。具体来说,我们分别计算置信度分数和特征距离,分别表示为 SC 和 SD。通常来说,较高的 SC 和较低的 SD 表明更好的音频-唇部同步质量。
  • 音频-姿态对齐。衡量生成的头部姿态与输入音频的对齐并不容易,目前没有成熟的指标。一些最近的研究使用了 Beat Align Score 来评估音频-姿态对齐。然而,由于“节拍”在自然语音和人类头部运动中的概念并不清晰,这一指标并不理想。在本研究中,我们引入了一种新的数据驱动指标,称为对比音频和姿态预训练 (CAPP) 分数。受到 CLIP 的启发,我们联合训练了一个姿态序列编码器和一个音频序列编码器,并预测输入的姿态序列和音频是否配对。音频编码器从预训练的 Wav2Vec2 网络初始化,而姿态编码器是一个随机初始化的 6 层 Transformer 网络。输入窗口大小为 3 秒。我们的 CAPP 模型在 2K 小时的真实音频和姿态序列上训练,表现出评估音频输入与生成姿态同步程度的强大能力。
  • 姿态变化强度。我们进一步定义了一个姿态变化强度分数 ∆P,它是相邻帧之间的姿态角度差异的平均值。∆P 在所有生成的帧上进行平均,提供了该方法生成的总体头部运动强度的指示。
  • 视频质量。根据以前的视频生成工作,我们使用弗雷谢视频距离 (FVD) 来评估生成的视频质量。我们使用 25 帧的连续序列,分辨率为 224×224 来计算 FVD 指标。
对比结果
  • 我们将我们的方法与现有的三个基于音频的说话人脸生成方法进行比较:MakeItTalk,Audio2Head 和 SadTalker。
    • 没有在 VoxCeleb2 上评估 FVD,因为其视频质量参差不齐且往往较低。
    • 在两个基准上,我们的方法在所有评估指标上均表现最佳。就音频-唇部同步分数(SC 和 SD)而言,我们的方法远超其他方法。需要注意的是,我们的方法比真实视频得分更高,这归因于音频 CFG 的效果。
    • 我们生成的姿态与音频的对齐效果更好,尤其是在 OneMin-32 基准上,这在 CAPP 分数上得到了反映。
    • 根据 ∆P,头部运动也显示出最高的强度,尽管与真实视频的强度仍有差距。
    • 我们的 FVD 分数显著低于其他方法,表明我们生成结果的视频质量和真实性更高。
      在这里插入图片描述

定性评估

视觉结果。图 1 展示了我们方法的一些具有代表性的基于音频驱动的说话人脸生成结果。通过视觉检查,我们的方法能够生成高质量的视频帧,并展现出生动的面部情感。此外,还能生成类似人类的对话行为,包括在讲话和思考过程中偶尔的眼神转移,以及自然和多变的眨眼节奏等细微之处。

生成的可控性。图 3 显示了我们在不同控制信号下的生成结果,包括主要眼神方向、头部距离和情绪偏移。我们的模型能够很好地解读这些信号,并生成紧密符合这些指定参数的说话人脸结果。

在这里插入图片描述

面部潜在因素的解耦。图 A.1 显示了在不同主体上应用相同的运动潜在序列时,我们的方法有效地保持了独特的面部运动和独特的面部身份。这表明了我们方法在身份和运动解耦方面的有效性。图 A.2 进一步展示了头部姿态和面部的有效解耦。
在这里插入图片描述
在这里插入图片描述

Thoughts

  • 训练和推理资源消耗都不大,几十 M 的 diffusion 模型支持实时生成,官网上的效果也不错,有比较大的应用前景,可惜没有开源。
  • 比较好奇其中解耦设计带来的具体好处,消融实验暂时没有提到

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

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

相关文章

【Ubuntu24.04】服务部署(基础)

目录 0 背景1 设置静态IP2 连接服务器3 部署服务3.1 安装JDK3.2 下载并安装MySQL8.43.2.1 从官网下载 APT Repository 配置文件3.2.2 安装 MySQL8.43.2.3 配置远程连接 3.3 下载并配置Redis3.4 上传jar包并部署应用3.5 开放端口 4 总结 0 背景 在成功安装了Ubuntu24.04操作系统…

[Java]Properties类加载配置文件

在我JDBC的文章末尾展示了完整的JDBC使用流程。但那种方式有一个问题,如果项目需要更换数据库,或者这个项目本来就是要使用多种数据库,那么像这种把信息写死在代码里边的编写模式,是肯定不行的。实际开发中肯定不会使用这种把信息…

STM32CUBEIDE的使用【五】TFT_LCD

硬件平台: 正点原子潘多拉开发板 STM32L475 软件平台: STM3232CubeMX 、STM32CUBEIDE 屏幕尺寸为1.3寸 分辨率240*240 16位真彩色 使用SPI接口驱动TFT_LCD 用来显示ASCII 字符图像和彩色功能 CubeMX配置 Source Code 创建app_lcd.c文件 #include &q…

Python数据分析NumPy和pandas(三十二、数据拆分-应用-合并)

最常用的 GroupBy 方法是 apply,apply 将正在操作的对象拆分为多个片段,在每个片段上调用传递给它函数,然后尝试连接这些片段。 还是用前面的小费数据集tips.csv,它的内容如下图: 假设我们想按smoker进行分组并选择前…

【毫米波雷达(九)】前雷达软件开发遇到的问题汇总及解决方法

前雷达软件开发遇到的问题汇总及解决方法 一、CAN/CANFD通信1、雷达CAN未能正常发出数据2、雷达在车上接收不到车身信息3、程序下载失败4、DV试验发送数据偶发断连5、发送感知信息丢帧或者丢报文6、上电发出第一帧的报文时间长7、ZCANPRO有错误帧二、协议转换(以太网…

linux 下调试 bmp280 气压传感器

供自己备忘; linux 下有自带的 bmp280 驱动,实际测试数据抖动不理想; 于是自己重写一个 bmp280 驱动,实际测试数据依旧抖动,不理想; 考虑使用 SPL06 来测试看看效果; 1. 参考资料&#xff1…

『VUE』26. props实现子组件传递数据给父组件(详细图文注释)

目录 本节内容示例代码总结 欢迎关注 『VUE』 专栏,持续更新中 欢迎关注 『VUE』 专栏,持续更新中 本节内容 父组件传子组件–props 子组件传父组件–自定义事件 本节讲子组件传父组件–通过props里的方法传递,就是父亲写了一个函数,给子组件调用,然后…

Linux编辑/etc/fstab文件不当,不使用快照;进入救援模式

目录 红帽镜像9救援模式 现象 解决 第一步:修改启动参数以进入救援模式 第二步:进入救援模式、获取root权限、编辑/etc/fstab文件 第三步:编辑好后在重启 下面是ai给的模板 红帽镜像9救援模式 编辑/etc/fstab不当时 17 /dev/nvme0n3p1…

异地情侣远程玩游戏?GameViewer远程串流轻松实现!

情侣之间偶尔想远程玩游戏增进感情却苦于找不到合适的软件?想要寻找一款低门槛好上手操作便捷的串流软件 ? 在这里向你推荐 网易GameViewer远程 ! GameViewer是专为游戏玩家的设计远程控制软件,可以帮助异地情侣实现这一需求。它让…

1990-2020年中国人工林和天然林空间分布数据集

数据介绍 植树已被认为是减缓气候变化的潜在有效解决方案。自上世纪70年代以来,中国实施了世界上最大的造林和再造林工程,但中国人工林的高分辨率地图仍然无法获得。在这项研究中,我们探索了使用多源遥感图像和众包样本来制作第一张高分辨率…

[Docker#10] network | 架构 | CRUD | 5种常见网络类型 (实验)

目录 1. Docker 为什么需要网络管理 2. Docker 网络架构简介 CNM(Container Network Model) Libnetwork 驱动 3. ⭕常见网络类型(5 种) 4. Docker 网络管理命令 一. bridge 网络 1. 操作案例:容器间网络通信 …

Spring Cloud Gateway快速入门Demo

1.什么是Spring Cloud Gateway? Spring Cloud Gateway 是一个基于 Spring Framework 和 Spring Boot 构建的 API 网关服务。它提供了一种简单而有效的方式来路由请求、提供跨领域的关注点(如安全、监控/指标和弹性)以及其他功能。Spring Clo…

【AI换脸整合包及教程】Rope:AI 换脸工具的功能、原理、应用

在人工智能技术迅猛发展的当下,AI 换脸技术无疑是近年来备受瞩目的焦点之一。其中,Rope 作为一款开源的 AI 换脸工具,因其出色的易用性和强大的功能而广受青睐。本文将对 Rope 的功能、技术原理、应用场景以及所面临的法律和伦理问题进行详细…

Yocto项目 - VIRTUAL-RUNTIME,它有什么用?

Yocto 项目是一个完整的 Linux 分布构建工具集,提供了构建完全自定义小型核心或完整应用的能力。在这样一个构建系统中,VIRTUAL-RUNTIME这个概念是应用构建和选择处理中的重要部分。这篇文章将从概念、优势、应用场景和实战案例几个方面,全面…

BB1-NHS ester被用于将各种生物活性分子与蛋白质或其他生物大分子进行共轭连接,2082771-52-4

CAS号:2082771-52-4 中文名:BB1-琥珀酰亚胺酯,BB1-活性酯 英文名:BB1-NHS ester,或BB1-Succinimidyl Ester 分子式:C32H32N6O4 分子量:564.63 纯度:≥95% 供应商:陕…

初级数据结构——栈

目录 前言一、栈的基本概念二、栈的实现方式三、栈的性能分析四、栈的应用场景五、栈的变体六、出栈入栈的动态图解七、代码模版八、总结结语 前言 数据结构栈(Stack)是一种线性的数据结构,它只允许在序列的一端(称为栈顶&#x…

Jdbc学习笔记(四)--PreparedStatement对象、sql攻击(安全问题)

目录 (一)使用PreparedStatement对象的原因: 使用Statement对象编写sql语句会遇到的问题 ​编辑 (二)sql攻击 1.什么是sql攻击 2.演示sql攻击 (三)防止SQL攻击 1.PreparedStatement是什么 …

前端开发必备!2024年最全工具和框架资源大汇总

在前端开发的过程中,我们会使用各种工具、框架和库来提升开发效率和用户体验。随着技术的不断发展,前端生态系统逐渐丰富,开发者面临着越来越多的选择。本文将分享一些常见的前端资源,帮助开发者根据项目需求选择合适的工具。 1.…

备份可以起到什么作用?

在数字化时代,数据已经成为企业最宝贵的资产。然而,数据丢失和系统故障可能给企业带来巨大的损失。华为云备份服务作为一款全面的数据保护解决方案,致力于帮助企业保障数据安全,确保业务的连续性。九河云来给大家说一下华为云备份…

labview实现导出excel表格

有些项目数据读写在数据库里,有时客户会要求读写出来,这样就用到了labview把数据导出来,一般在测试程序界面,我们会把测试数据放在多列列表框里,这里我们需要对多列列表框进行操作。把多列列表框中的项名拆分出来。 接…