阿里数字人工作 Emote Portrait Alive (EMO):基于 Diffusion 直接生成视频的数字人方案
TL;DR
- 2024 年 ECCV 阿里智能计算研究所的数字人工作,基于 diffusion 方法来直接的从音频到视频合成数字人,避免了中间的三维模型或面部 landmark 的需求,效果很好。
Paper name
EMO: Emote Portrait Alive - Generating Expressive Portrait Videos with Audio2Video Diffusion Model under Weak Conditions
Paper Reading Note
Paper URL: https://arxiv.org/abs/2402.17485
Project URL: https://humanaigc.github.io/emote-portrait-alive/
Code URL: https://github.com/HumanAIGC/EMO (暂未开源,空代码库)
Introduction
背景
- 将音频转换为头部动画(如面部表情或头部运动)具有挑战性,因为存在模糊且一对多的映射关系
- 大多数关于说话人脸的研究将过程分为头部运动和面部表情两个组成部分,比如 VividTalk。
- 对于头部运动,一些说话人脸技术在这一方面表现不佳,通常会借助现有视频中的预定义姿势序列(比如 Diff2Lip 等)或使用独立的网络分别处理头部姿势和面部表情(比如 VividTalk)。
- 在面部表情方面,一些方法选择使用显式的中间信号,如三维人脸模型或二维面部标记来引导生成 (比如 SadTalker、VividTalk 等)。虽然这些方法增强了特定方面(如唇部同步)的保真度,但往往限制了生成内容的整体表现力和自然度。例如,言语情感语气所关联的微妙手势或细微表情通常难以准确转换,导致生成结果缺乏生动性。
- 因此,为了创建高度表现力的说话人脸视频,至关重要的是摆脱强先验信息的约束,充分利用模型的生成潜力。
- 大多数关于说话人脸的研究将过程分为头部运动和面部表情两个组成部分,比如 VividTalk。
- 本文通过关注音频线索与面部运动之间动态且细微的关系,解决了提升人脸视频生成的真实感和表现力的挑战。
本文方案
- 提出了一种新颖的框架 EMO (Emote Portrait Alive),通过直接的音频到视频合成方法,避免了中间的三维模型或面部 landmark 的需求
- EMO 利用扩散模型的生成能力直接捕捉复杂的音视频关联,通过整合时间模块和三维卷积来扩展 SD 用于视频
- 为了学习音频和视频之间的关联,我们引入了一个音频特征提取器,并采用注意力模块将音频特征调制到主干网络中
- 为了在不损失表现力的情况下确保稳定性,我们引入了如人脸定位器和速度层等新机制,用于作为弱条件指导目标人脸的大致区域和运动的大致速度水平
- 引入了 Reference Net 确保整个视频中面部身份一致性
- 实现了运动帧模块以保持相邻视频片段之间的连续性,从而实现无缝的无限视频生成
- 构建了一个庞大且多样化的音视频数据集,收集了超过 250 小时的素材。该丰富的数据集涵盖了演讲、影视片段和歌唱表演等多种内容,并包括中文和英语等多种语言
- 引入的一个新指标 E-FID(Expression-FID),该指标旨在评估生成视频的表现力
Methods
- 给定一个角色肖像的单一参考图像,我们的方法可以生成与输入语音音频剪辑同步的视频,同时保留自然的头部动作和生动的表情,配合提供的语音音调变化。
3.1 预备知识
本文方法采用 Stable Diffusion (SD) 作为基础框架。SD 是一种广泛应用的文本到图像(T2I)模型,由 Latent Diffusion Model (LDM) 演化而来。它使用一种 变分自编码器(VAE),将原始图像特征分布 x 0 x_0 x0 映射到潜在空间 z 0 z_0 z0,通过公式 z 0 = E ( x 0 ) z_0 = E(x_0) z0=E(x0) 进行编码,并将潜在特征还原为 x 0 = D ( z 0 ) x_0 = D(z_0) x0=D(z0)。这种架构具有降低计算成本同时保持高视觉保真的优势。
基于 去噪扩散概率模型(DDPM) 或 去噪扩散隐式模型(DDIM),SD 向潜在变量 z 0 z_0 z0 添加高斯噪声 ϵ \epsilon ϵ,以生成某时间步 t t t 的噪声潜在变量 z t z_t zt。在推理过程中,SD 旨在从 z t z_t zt 中移除噪声 ϵ \epsilon ϵ,并通过结合文本特征实现期望的输出。其去噪过程的训练目标公式为:
L = E t , c , z t , ϵ [ ∣ ∣ ϵ − ϵ θ ( z t , t , c ) ∣ ∣ 2 ] L = \mathbb{E}_{t,c,z_t,\epsilon}[||\epsilon − \epsilon_\theta (z_t, t, c)||^2] L=Et,c,zt,ϵ[∣∣ϵ−ϵθ(zt,t,c)∣∣2]
其中 c c c 代表从 CLIP ViT-L/14 文本编码器中获取的文本特征。SD 中的 ϵ θ \epsilon_\theta ϵθ 是通过改进的 UNet 模型实现的,该模型利用交叉注意力机制将 c c c 融合到潜在特征中。
3.2 网络架构
本文方法概览如图 2 所示。骨干网络(Backbone Network) 输入多帧噪声潜在变量,并尝试在每个时间步将它们去噪为连续视频帧。骨干网络的 UNet 结构与 SD 1.5 类似,具有以下特点:
- 嵌入时序模块:确保生成帧之间的连续性。
- ID一致性维护:部署与骨干网络并行的 UNet 结构 ReferenceNet,通过输入参考图像提取特征。
- 语音驱动动作:利用音频层对语音特征进行编码。
- 可控和稳定的动作生成:通过脸部定位器和速度层提供弱控制条件。
骨干网络
在本文工作中,不使用提示嵌入 (prompt embedding);因此,我们将 SD 1.5 UNet 结构中的交叉注意力层改为参考注意力层 (reference-attention)。这些修改的层现在以 ReferenceNet 提供的参考特征作为输入,而不是文本嵌入。
音频层
语音的发音和语调是驱动角色生成的主要信号。通过预训练的 wav2vec 从输入音频序列提取的特征 concat 起来,行程第 f f f 帧的音频表示嵌入 A ( f ) A(f) A(f)。考虑到嘴巴的动作可能受到前后语音片段的影响(例如说话前张嘴和吸气),我们通过连接相邻帧的特征来定义每个生成帧的语言特征:
A ( f ) = ⨁ { A ( f − m ) , . . . , A ( f ) , . . . , A ( f + m ) } A(f) = \bigoplus \{A(f − m), ..., A(f), ..., A(f + m)\} A(f)=⨁{A(f−m),...,A(f),...,A(f+m)}
其中 m m m 是每侧额外特征帧的数量。在骨干网络中,每个参考注意力层后添加音频注意力层,通过跨注意力机制将语音特征 A A A 注入潜在变量中。
ReferenceNet
ReferenceNet 的结构与骨干网络相同,用于从输入图像中提取特征。参考研究 Animate Anyone、TryOnDiffusion 强调了采用类似结构在保持目标对象身份一致性方面的重要作用。ReferenceNet 和骨干网络继承了原始 SD UNet 的权重。参考图像被输入 ReferenceNet 提取参考特征图,这些特征在骨干网络的去噪过程中与对应层的输入通过参考注意力层进行融合。
时序模块
基于 AnimateDiff 的架构概念,将自注意力时间层应用于帧内特征中。具体而言,输入特征图 x ∈ R b × c × f × h × w x \in \mathbb{R}^{b \times c \times f \times h \times w} x∈Rb×c×f×h×w 被重新配置为形状 ( b × h × w ) × f × c (b \times h \times w) \times f \times c (b×h×w)×f×c,其中 b b b 表示批量大小, h h h 和 w w w 表示特征图的空间维度, f f f 表示生成帧的数量, c c c 是特征维度。自注意力操作针对时间维度 f f f,以有效捕捉视频的动态内容。时间层被插入到骨干网络的每个分辨率层级中。
多片段连续性:引入了前一段生成视频中的最后 n n n 帧,称为“运动帧”,以增强跨片段的一致性。这些“运动帧”被输入ReferenceNet以预提取多分辨率运动特征图。在骨干网络的降噪过程中,时间层的输入与匹配分辨率的预提取运动特征沿时间帧维度进行融合。此简单方法有效地确保了不同片段之间的连贯性。对于第一个视频片段的生成,运动帧初始化为零图。需要注意的是,尽管骨干网络可能会多次迭代降噪处理,但目标图像和运动帧仅被一次性输入到 ReferenceNet 中,因此提取的特征在整个过程中重复使用,确保推理时不会显著增加计算时间。
面部定位器与速度层
时间模块能够保证生成帧的连续性以及视频片段之间的无缝过渡,但由于独立生成的特性,它无法确保生成角色在不同片段中的运动一致性与稳定性。先前的研究通过某些信号来控制角色运动,例如 skeleton、blendshape 或 3DMM,然而,使用这些控制信号可能无法很好地生成生动的面部表情和动作,原因在于其自由度有限且训练阶段的标签不足以捕捉完整的面部动态。此外,相同的控制信号可能在不同角色之间产生差异,无法体现个体的细微差别。生成控制信号可能是一个可行的途径,但生成逼真的运动仍然是一大挑战。因此,本文选择了一种“弱”控制信号的方法。
具体而言,如图 2 所示,本文使用一个掩码 M = ⋃ i = 1 f M i M = \bigcup_{i=1}^f M_i M=⋃i=1fMi 表示面部区域,该区域包括视频片段中的面部边界框 (bbox) 区域。本文引入了面部定位器,其由轻量级卷积层组成,用于编码边界框掩码。编码后的掩码被添加到噪声潜表示中,然后输入到骨干网络中。掩码可用于控制角色面部的位置生成。然而,由于不同片段的头部运动频率变化,在片段间生成一致且平滑的运动仍具有挑战性。
为了解决此问题,本文在生成中加入目标头部运动速度。更具体地,考虑帧 f f f 中的头部旋转速度 w f w_f wf,将速度范围划分为 d d d 个离散速度桶,每个桶代表一个不同的速度级别。每个桶有一个中心值 c i ∈ { c 1 , . . . , c d } c_i \in \{c_1, ..., c_d\} ci∈{c1,...,cd} 和一个半径 r i ∈ { r 1 , . . . , r d } r_i \in \{r_1, ..., r_d\} ri∈{r1,...,rd}。将 w f w_f wf 重新定向为向量 s ∈ R d s \in \mathbb{R}^d s∈Rd,其中第 i i i 个值记为 s i = tanh ( ( w f − c i ) / r i ⋅ 3 ) s_i = \tanh((w_f - c_i)/r_i \cdot 3) si=tanh((wf−ci)/ri⋅3)。类似于音频层中使用的方法,每帧的头部旋转速度嵌入表示为 S f = ⨁ { s ( f − m ) , . . . , s ( f ) , . . . , s ( f + m ) } S_f = \bigoplus \{s(f - m), ..., s(f), ..., s(f + m)\} Sf=⨁{s(f−m),...,s(f),...,s(f+m)}。每个片段的速度嵌入表示为 S ∈ R b × f × ( 2 m + 1 ) d S \in \mathbb{R}^{b \times f \times (2m+1)d} S∈Rb×f×(2m+1)d,然后通过一个多层感知器 (MLP) 处理为速度特征图 F ∈ R b × f × l F \in \mathbb{R}^{b \times f \times l} F∈Rb×f×l。在时间层中,将 F F F 重复至形状 ( b × h × w ) × f × l (b \times h \times w) \times f \times l (b×h×w)×f×l,并实现一种跨注意力机制,该机制在速度特征和重塑后的特征图之间的时间维度 f f f 上运行。通过这种方式并指定目标速度,可以在不同片段中同步生成角色头部的旋转速度和频率。结合面部定位器提供的面部位置控制,生成的结果既稳定又可控。
需要注意的是,指定的面部区域和分配的速度并不构成强控制条件。在面部定位器的上下文中,由于 M M M 是整个视频片段的联合区域,表示角色面部运动可以在较大的范围内进行,从而确保头部不会被限制为静态姿态。对于速度层,由于数据集标注阶段难以准确估计人类头部旋转速度,预测的速度序列本质上是有噪声的。因此,生成的头部运动只能近似指定的速度级别。这一限制推动了本文速度桶框架的设计。
训练策略
训练过程分为三个阶段:
-
图像预训练阶段:
在此阶段,骨干网络(Backbone Network)、参考网络(ReferenceNet)和脸部定位器(Face Locator)参与训练。骨干网络以单帧图像作为输入,而 ReferenceNet 处理来自同一视频片段的另一随机帧。骨干网络和 ReferenceNet 的权重初始化来源于原始 SD。 -
视频训练阶段:
在此阶段,加入了时序模块和音频层。视频片段中采样出 n + f n + f n+f 个连续帧,其中起始的 n n n 帧为运动帧(motion frames)。时序模块的权重初始化自 AnimateDiff。 -
速度层训练阶段:
在这一阶段,仅训练时序模块和速度层,有意跳过音频层的训练。这是因为角色的表情、嘴部动作以及头部动作的频率主要受音频影响。这些元素之间存在一定的相关性,模型可能会倾向于根据速度信号而非音频来驱动角色动作。实验结果表明,同时训练速度和音频层会削弱音频对角色动作的驱动能力。
Experiments
实现细节
我们从互联网收集了约 250 小时的说话人头像视频,结合 HDTF 和 VFHQ 数据集进行模型训练。由于 VFHQ 数据集中缺乏音频,仅在第一阶段使用。我们使用 MediaPipe 获取脸部边界框(bbox)。通过 face landmark 提取每帧的 6 自由度头部姿态并计算帧间的旋转角度,标记头部旋转速度。
视频剪辑被调整为 512×512 的分辨率并裁剪。在第一阶段,分别从视频片段中采样参考图像和目标帧,训练骨干网络和 ReferenceNet,批量大小为 48。在第二和第三阶段,生成视频的长度 f f f 设为 12 帧,运动帧数量 n n n 设为 4,批量大小为 4。额外特征数量 m m m 设为 2。所有阶段的学习率均为 1e-5。
在推理过程中,我们使用 DDIM 的采样算法,生成视频片段需要 40 步,并为每帧分配一个恒定的速度值。方法的计算时间约为 15 秒 处理一批( f = 12 f = 12 f=12 帧)。
数据预处理流程
- 标注包括以下步骤:
- 基于扩展的脸部边界框对视频进行裁剪,并将每个视频片段转换为 30 FPS。
- 使用 MediaPipe 确定所有帧中的脸部边界框,从而划定面部区域。
- 使用预训练的 Wav2Vec 模型提取音频嵌入。
- 确定角色的 6 自由度(6-DoF)头部姿态,以计算逐帧的旋转速度。
实验设置
为进行方法比较,我们将 HDTF 数据集划分为 90% 的训练集和 10% 的测试集,确保两者之间没有角色 ID 的重叠。此外,为了在更多变的场景中评估方法,我们从收集的互联网视频数据集中提取了 1000 个视频片段,每段约 4 秒长。这些片段主要展示了丰富的表情视频,其中包括大量唱歌场景。与 HDTF 数据集相比,这些视频在面部表情和头部动作范围上具有更广泛的多样性。
我们将方法与以下一些工作进行了比较:Wav2Lip、SadTalker、DreamTalk 和 MakeItTalk。此外,使用 Diffused Heads 的公开代码生成了结果,但由于其模型在仅包含绿色背景的 CREMA 数据集上训练,生成结果表现不佳,并且生成帧中存在累积误差。因此,我们仅与 Diffused Heads 方法进行定性比较。对于 DreamTalk,我们使用原作者规定的说话风格参数。
为了证明我们方法的优越性,我们使用以下评估指标:
- Fréchet Inception Distance (FID):用于评估生成帧的质量。
- 面部相似度 (F-SIM):通过提取和比较生成帧与参考图像的面部特征,评估结果的身份保留情况。注意,单一参考图像可能导致 F-SIM 得分过高(例如某些方法仅生成嘴部区域,其他部分与参考图像相同)。因此,我们将 F-SIM 视为基于总体的参考指标,更接近相应的真实值(GT)表示性能更好。
- Fréchet Video Distance (FVD):用于视频级别的评估。
- SyncNet 得分:评估唇部同步质量,这是说话人头像应用中的关键方面。
- Expression-FID (E-FID):用于评估生成视频中面部表情的表现力。具体而言,使用面部重建技术提取表情参数,计算这些表情参数的 FID,量化生成视频与真实数据集之间的表情差异。
定性评估
- 与早期方法对比
- Wav2Lip 在仅使用单一参考图像作为输入时,通常会生成模糊的嘴部区域,并且视频表现为静态头部姿态和极少的眼睛运动。
- DreamTalk 使用的样式剪辑可能会扭曲原始面孔,同时限制面部表情和头部动作的动态性
- 与 SadTalker 和 DreamTalk 相比,本文方法能够生成更大范围的头部运动和更动态的面部表情
- 跨风格头像生成
- 参考图像来自 Civitai,由不同的文本到图像(T2I)模型生成,包括真实风格、动漫风格和 3D 风格。相同的语音音频输入被用于为这些角色生成动画,在不同风格中达到了大致一致的唇部同步效果。
- 参考图像来自 Civitai,由不同的文本到图像(T2I)模型生成,包括真实风格、动漫风格和 3D 风格。相同的语音音频输入被用于为这些角色生成动画,在不同风格中达到了大致一致的唇部同步效果。
- 丰富的面部表情与动作
- 具有显著音调特征的音频时能够生成更丰富的面部表情和动作。例如,第三行的例子表明,高音调的语音会引发角色更为强烈和生动的表情。此外,利用运动帧可以扩展生成视频的时长,我们能够根据输入音频的长度生成更长的视频。如图 5 和图 6 所示,我们的方法在大幅运动的情况下仍能保持角色身份的一致性。
- 具有显著音调特征的音频时能够生成更丰富的面部表情和动作。例如,第三行的例子表明,高音调的语音会引发角色更为强烈和生动的表情。此外,利用运动帧可以扩展生成视频的时长,我们能够根据输入音频的长度生成更长的视频。如图 5 和图 6 所示,我们的方法在大幅运动的情况下仍能保持角色身份的一致性。
定量评估
- 图 3 展示了互联网数据集中包含更广泛的面部表情和更大的头部运动范围,同时伴随参考角色的多样姿态。这种多样性可能对性能指标产生负面影响,如表 1 所示。但本文结果在视频质量评估中具有显著优势,表现为较低的 FVD 得分。此外,本文方法在单帧质量上也优于其他方法,表现在改进的 FID 得分上。尽管 Wav2Lip 由于使用 SyncNet 作为判别器在 SyncNet 信心分数上表现最佳,但本文方法在生成生动面部表情方面表现卓越,体现于 E-FID 分数上。进一步分析显示,即使在不使用 250 小时数据集的情况下,本文的模型在 FVD 和 E-FID 等指标上仍表现出色。额外数据有助于增强视频内容的动态性和生成更丰富的表情。
消融实验
速度层的影响
速度层旨在确保连续生成的视频片段之间头部运动频率的一致性。在推理过程中,为每帧分配一个恒定的速度值。实验表明,速度层显著提高了头部运动的稳定性,与未使用速度层的基线相比,“速度方差”和“平均速度方差”均显著降低。语音驱动的场景速度分配为 0.1-1.0,而唱歌场景速度更高(1.0-1.3),以适应更快的头部动作。超过 1.5 的速度可能导致动作过快和抖动。
- “无速度”(No Speed)表示未使用速度层的模型结果。
- “速度方差”(Velocity Variance)反映了单个视频序列内旋转速度的一致性。
- “平均速度方差”(VMV)测量不同片段之间头部旋转速度均值的变化。
面部定位器的控制效果
面部定位器将脸部区域作为输入,并定义面部动作的许可范围,从而影响头部运动的范围。图 7 显示(白色是指定的人脸框,紫色是生成视频中检测的人脸框),当输入适当大小的脸部区域时,角色仅表现出最小的头部运动;而输入更广的区域时,允许角色在说话过程中有更大范围的头部摆动,输入增加高度的区域则促进点头动作。
此外,输入均匀的白色掩膜未提供具体指导,允许在任意位置生成面部。紫色边框可能超出预定的白色面部区域,表明面部定位器仅对头部动作施加弱约束,允许超越其边界的运动。
Conclusion
- EMO 摒弃了传统的中间信号依赖,基于 diffusion 方案实现音频到视频的驱动。官网展示的实验效果很惊艳。
- 代码未开源,空 repo 也能获得 7k+ star,很强
- 补充材料中说不使用 Voxceleb 数据集是因为该数据集以面部中心为焦点,导致摄像机运动不稳定。另外 250h 的自建数据集主要增强了面部表情的丰富性和视频内容的动态性。所以数据集的选择和构建还是有讲究的。
- 目前模型的局限性
- 暂时不支持文本、情感设定来做一些显示的控制,音频音调控制可能不一定符合用户期望
- 手部和身体动作很少,因为数据集以头部区域为主,包含手部的帧仅占 3%
- 实时性能暂时无法保证,而实时性是数字人大规模应用很重要的依赖。EMO 在 A100 GPU 上运行 40 次去噪步骤时,每 12 帧(一个片段)耗时约 18 秒。
相关文章:
阿里数字人工作 Emote Portrait Alive (EMO):基于 Diffusion 直接生成视频的数字人方案
TL;DR 2024 年 ECCV 阿里智能计算研究所的数字人工作,基于 diffusion 方法来直接的从音频到视频合成数字人,避免了中间的三维模型或面部 landmark 的需求,效果很好。 Paper name EMO: Emote Portrait Alive - Generating Expressive Portra…...
Java将PDF保存为图片
将 PDF 文件转换为图片是常见的需求之一,特别是在需要将 PDF 内容以图像形式展示或处理时。其中最常用的是 Apache PDFBox。 使用 Apache PDFBox Apache PDFBox 是一个开源的 Java 库,可以用来处理 PDF 文档。它提供了将 PDF 页面转换为图像的功能。 …...
医药企业的终端市场营销策略
近年来,随着医药行业的快速发展,终端市场逐渐成为企业竞争的关键领域。在政策趋严、市场环境变化以及数字化转型的大背景下,医药企业如何在终端市场中立于不败之地?本文结合我们在医药数字化领域的经验,为大家剖析终端…...
使用EFK收集k8s日志
首先我们使用EFK收集Kubernetes集群中的日志,本次实验讲解的是在Kubernetes集群中启动一个Elasticsearch集群,如果企业内已经有了Elasticsearch集群,可以直接将日志输出至已有的Elasticsearch集群。 文章目录 部署elasticsearch创建Kibana创建…...
Vue3 + TypeScript 项目搭建
Vue3 TypeScript 项目搭建 环境准备 首先确保你的开发环境满足以下要求: # 检查 Node.js 版本 (需要 14.0 或更高版本) node -v# 检查 npm 版本 npm -v# 安装或更新 Vue CLI npm install -g vue/cli创建项目 使用 Vue CLI 创建项目: # 创建项目 np…...
Python操作neo4j库py2neo使用(一)
Python操作neo4j库py2neo使用(一) 安装(只用于测试) docker-compose .yml 文件 version: 3.8 services:neo4j:image: neo4j:5.6.0-enterprise #商业版镜像hostname: neo4jcontainer_name: neo4jports:- "7474:7474"-…...
(原创)Android Studio新老界面UI切换及老版本下载地址
前言 这两天下载了一个新版的Android Studio,发现整个界面都发生了很大改动: 新的界面的一些设置可参考一些博客: Android Studio新版UI常用设置 但是对于一些急着开发的小伙伴来说,没有时间去适应,那么怎么办呢&am…...
Linux——用户级缓存区及模拟实现fopen、fweite、fclose
linux基础io重定向-CSDN博客 文章目录 目录 文章目录 什么是缓冲区 为什么要有缓冲区 二、编写自己的fopen、fwrite、fclose 1.引入函数 2、引入FILE 3.模拟封装 1、fopen 2、fwrite 3、fclose 4、fflush 总结 前言 用快递站讲述缓冲区 收件区(类比输…...
CKA认证 | Day2 K8s内部监控与日志
第三章 Kubernetes监控与日志 1、查看集群资源状态 在 Kubernetes 集群中,查看集群资源状态和组件状态是非常重要的操作。以下是一些常用的命令和解释,帮助你更好地管理和监控 Kubernetes 集群。 1.1 查看master组件状态 Kubernetes 的 Master 组件包…...
大模型部署,运维,测试所需掌握的知识点
python环境部署: python3 -m site --user-base 返回用户级别的Python安装基础目录 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1 将python3的默认路径/usr/bin/python3替…...
JDBC编程---Java
目录 一、数据库编程的前置 二、Java的数据库编程----JDBC 1.概念 2.JDBC编程的优点 三.导入MySQL驱动包 四、JDBC编程的实战 1.创造数据源,并设置数据库所在的位置,三条固定写法 2.建立和数据库服务器之间的连接,连接好了后ÿ…...
什么是沙箱(Sandbox)技术
沙箱技术是一种重要的计算机安全机制,主要用于隔离程序运行环境,以防止恶意代码或应用程序对系统和数据造成破坏。通过限制代码的访问权限和行为,沙箱为程序提供了一个受控且隔离的执行环境。 核心特点 隔离性沙箱运行的程序被限制在一个受控…...
TCP socket api详解
文章目录 netstat -nltpaccept简单客户端工具 telnet 指定服务连接connect异常处理version 1 单进程版version 2 多进程版version 3 -- 多线程版本version 4 ---- 线程池版本 创建套接字socket sockaddr_in结构体 bind 之后就和UDP不一样了。 因为TCP是一个面向连接的服务器&…...
Linux——环境变量
环境变量一般指的是在操作系统重用来指定操作系统运行环境的一些参数,这些参数会被bash使用,而bash是被我们用户使用的,也就是说,这些环境变量间接的也是被我们用户使用的。环境变量通常都有某些特殊的用途,它在系统重…...
Windows Pycharm 远程 Spark 开发 PySpark
一、环境版本 环境版本PyCharm2024.1.2 (Professional Edition)Ubuntu Kylin16.04Hadoop3.3.5Hive3.1.3Spark2.4.0 二、Pycharm远程开发 文件-远程-开发 选择 SSH连接,连接虚拟机,选择项目目录即可远程开发...
【es6进阶】vue3中的数据劫持的最新实现方案的proxy的详解
vuejs中实现数据的劫持,v2中使用的是Object.defineProperty()来实现的,在大版本v3中彻底重写了这部分,使用了proxy这个数据代理的方式,来修复了v2中对数组和对象的劫持的遗留问题。 proxy是什么 Proxy 用于修改某些操作的默认行为࿰…...
【Isaac Sim】加载自带模型或示例时报 Isaac Sim is not responding
Isaac Sim对电脑配置要求很高,开机第一次打开 Isaac Sim 时,直接就报 Isaac Sim is not responding 卡死了,这是由于第一次需要加载一些资源,耗时会导致 Isaac Sim 无响应,这里等一会会自动给回复。 加载自带模型或示…...
React (三)
文章目录 项目地址十二、性能优化12.1 使用useMemo避免不必要的计算12.2 使用memo缓存组件,防止过度渲染12.3 useCallBack缓存函数12.4 useCallBack里访问之前的状态(没懂)十三、Styled-Components13.1 安装13.2给普通html元素添加样式13.3 继承和覆盖样式13.4 给react组件添…...
C0031.在Clion中使用mingw编译器来编译opencv的配置方法
mingw编译器编译opencv库的配置方法...
多目标跟踪算法
文章目录 一、传统方法1. 基于卡尔曼滤波器的方法1.1 Kalman Filter(卡尔曼滤波器) 2. 基于数据关联的方法2.1 匈牙利算法 二、深度学习方法1. 基于检测的多目标跟踪1.1 SORT算法1.2 DeepSort1.3 BoT-SORT 2. 基于特征关联和增强的方法2.1 ByteTrack 3. 基于Transformer的方法3…...
【CSS in Depth 2 精译_059】9.2 把 CSS 模块组合成更大的结构
当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第九章 CSS 的模块化与作用域】 ✔️ 9.1 模块的定义 9.1.1 模块和全局样式9.1.2 一个简单的 CSS 模块9.1.3 模块的变体9.1.4 多元素模块 9.2 将模块组合为更大的结构 ✔️ 9.2.1 模块中多个职责的…...
uniapp+vue3+ts H5端使用Quill富文本插件以及解决上传图片反显的问题
uniappvue3ts H5端使用Quill富文本插件以及解决上传图片反显的问题 1.在项目中安装Quill npm i quill1.3.72.需要显示富文本的页面完整代码 <template><view><div ref"quillEditor" style"height: 65vh"></div></view> &…...
shell(二)
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
在使用PCA算法进行数据压缩降维时,如何确定最佳维度是一个关键问题?
一、PCA算法的基本原理 PCA算法的核心思想是通过正交变换,将一组可能相关的变量转换成一组线性不相关的变量,称为主成分。这组主成分能够以最小的信息损失来尽可能多地保留原始数据集的变异性。具体来说,PCA算法包括以下几个步骤:…...
学习嵩山版《Java 开发手册》:编程规约 - 命名风格(P1 ~ P2)
概述 《Java 开发手册》是阿里巴巴集团技术团队的集体智慧结晶和经验总结,他旨在提升开发效率和代码质量 《Java 开发手册》是一本极具价值的 Java 开发规范指南,对于提升开发者的综合素质和代码质量具有重要意义 学习《Java 开发手册》是一个提升 Jav…...
#渗透测试#红蓝攻防#HW#SRC漏洞挖掘01之静态页面渗透
免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停…...
开源POC库推荐
声明 学习视频来自 B 站UP主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致…...
深度学习每周学习总结J6(ResNeXt-50 算法实战与解析 - 猴痘识别)
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 | 接辅导、项目定制 目录 0. 总结ResNeXt基本介绍 1. 设置GPU2. 导入数据及处理部分3. 划分数据集4. 模型构建部分5. 设置超参数:定义损失函数&…...
用vite下载的react + TS的项目,组件会调用两次
解决方案: 去掉main.tsx文件中的StrictMode...
STM32F4----DCA数字量转换成模拟量
STM32F4----DCA数字量转换成模拟量 基本原理 上一节讲诉了ADC的具体原理与程序搭建https://blog.csdn.net/qq_35970934/article/details/143999874?spm1001.2014.3001.5501。这节讲DAC的原理和程序,在实际应用中,我们经常需要调节电压的输出大小&…...
springboot3如何集成knife4j 4.x版本及如何进行API注解
1. 什么是Knife4j knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案, 取名knife4j是希望她能像一把匕首一样小巧,轻量,并且功能强悍!knife4j的前身是swagger-bootstrap-ui,swagger-bootstrap-ui自1.9.6版本后,正式更名为knife4j为了契合微服务的架构发展,由于原来…...
【Linux网络 (二)】套接字编程
Linux: 网络 一、前言二、端口号 (port)1)port、套接字概念2)端口号 vs 进程id3)端口号和进程关系 三、认识TCP/Udp协议1)连接性解释2)可靠性解释3)面向数据报/字节流解释 四、网络字节序五、struct sockad…...
SQL 语句执行计划中的连接方式
SQL 语句执行计划中的连接方式 join操作 join操作基本分为3大类:外连接(细分为:左连接(Left outer join/ left join)、右连接(right outer join/ right join)、全连接(full outer …...
3、集线器、交换机、路由器、ip的关系。
集线器、交换机、路由器三者的关系 1、集线器2、交换机(每个交换机是不同的广播域,ip地址起到划分广播域的作用)3、 路由器4、ip地址 1、集线器 一开始两台电脑通信就需要网线就可以,但是三台或者更多主机通信时,就需…...
OpenCV相机标定与3D重建(3)校正鱼眼镜头畸变的函数calibrate()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::fisheye::calibrate 函数是 OpenCV 中用于校正鱼眼镜头畸变的一个重要函数。该函数通过一系列棋盘格标定板的图像来计算相机的内参矩阵和畸变…...
【论文笔记】LLaVA-KD: A Framework of Distilling Multimodal Large Language Models
Abstract 大语言模型(Large Language Models, LLM)的成功,使得研究者为了统一视觉和语言的理解去探索多模态大预言模型(Multimodal Large Language Models, MLLM)。 但是MLLM庞大的模型和复杂的计算使其很难应用在资源受限的环境,小型MLLM(s-MLLM)的表现…...
C++内存管理和模板
文章目录 1. C内存管理1.1 new1.1.1 内置类型1.1.2 自定义类型1.1.3 定位new表达式1.1.4 new的优势与不足1.1.5 new的原理 1.2 delete1.2.1 内置类型1.2.2 自定义类1.2.3 delete和free1.2.4 delete原理 1.3 new和delete的对应1.3.1 内置类型1.3.2 自定义类型 2. 模板2.1 函数模…...
Docker 容器化开发 应用
Docker 常用命令 存储 - 目录挂载 存储 卷映射 自定义网络 Docker Compose语法 Dockerfile - 制作镜像 镜像分层机制 完结...
element-plus教程:Input Number 数字输入框
一、基础用法 要使用Input Number数字输入框,只需要在<el-input-number>元素中使用v-model绑定变量即可。例如: <template><el-input-number v-model"value" /> </template><script lang"ts" setup>…...
【Go语言成长之路】编写web应用
文章目录 编写Web应用一、介绍二、创建项目2.1 创建wiki数据结构2.2 介绍net/http包(小插曲)2.3 使用 net/http 提供 wiki 页面2.4 编辑Pages2.5 html/template包2.6 处理不存在的页面2.7 保存页面2.8 错误处理2.9 模板缓存2.10 验证2.11 函数文字和闭包…...
Java 对象头、Mark Word、monitor与synchronized关联关系以及synchronized锁优化
1. 对象在内存中的布局分为三块区域: (1)对象头(Mark Word、元数据指针和数组长度) 对象头:在32位虚拟机中,1个机器码等于4字节,也就是32bit,在64位虚拟机中࿰…...
安宝特分享 | 如何利用AR技术革新医疗实践:从远程急救到多学科协作
AR技术在国内外医院的应用 在现代医疗环境中,患者面临的挑战依然严峻:看病难、看病远、看病急。这些问题不仅影响了患者的治疗效果,也让医务工作者倍感压力。幸运的是,随着增强现实(AR)技术的发展…...
小米note pro一代(leo)线刷、twrp、magisk、TODO: android源码编译
本文主要说android5 整体思路 android 5.1 twrp magisk Zygisk(Riru) Dreamland(xposed) Riru不支持android5.1, 因此只能选择Zygisk : 如果你正在使用 Android 5,你必须使用 Zygisk 因为 Riru 并不支持 Android 5. 基于magisk之上的xposed 其中提到的 作者…...
vue2-基础核心
vue简介 动态构建用户界面的渐进式 JavaScript 框架 vue的特点: 遵循MVVM模式 采用组件化模式,提高代码复用率,让代码更好维护 声明式编码,无需直接操作DOM,提高开发效率,编码简洁、体积小,运行效率高 本…...
使用 前端技术 创建 QR 码生成器 API1
前言 QR码(Quick Response Code)是一种二维码,于1994年开发。它能快速存储和识别数据,包含黑白方块图案,常用于扫描获取信息。QR码具有高容错性和快速读取的优点,广泛应用于广告、支付、物流等领域。通过扫…...
天云数据参编行业标准|《Maas模型服务协议要求》标准正式发布
随着各行业对大模型的应用需求日益增多,模型即服务(MaaS)发展迅速,MaaS将AI模型以服务的方式提供给用户,降低模型使用门槛。当前产业界已推出诸多MaaS产品,并集成和提供了大量模型服务,然而对于…...
观察者模式和订阅模式
观察者模式和订阅模式在概念上是相似的,它们都涉及到一个对象(通常称为“主题”或“发布者”)和多个依赖对象(称为“观察者”或“订阅者”)之间的关系。然而,尽管它们有相似之处,但在某些方面也…...
Mac设置java环境变量
Mac电脑中存在多个jdk版本,如何配置java环境变量为指定版本jdk? 一、查看所有已安装的 JDK 版本 /usr/libexec/java_home -V二、临时设置 export JAVA_HOME=$(/usr/libexec/java_home -v 1.8)三、永久设置 如果需要永久使用指定版...
Sentinel服务保护
Sentinel是阿里巴巴开源的一款服务保护框架,目前已经加入SpringCloudAlibaba中。官方网站: home | Sentinel Sentinel 的使用可以分为两个部分: 核心库(Jar包):不依赖任何框架/库,能够运行于 Java 8 及以…...
Linux内核USB2.0驱动框架分析--USB包
一, 包的组成 每个包都由SOP(包起始域)、SYNC(同步域)、Packet Content(包内容)、EOP(包结束域)四部分组成,其中SOP、SYNC、EOP为所有包共有的域,…...