效果炸裂、刷爆各大视频网站的EMO到底是怎么做到的?

文章链接:https://arxiv.org/abs/2402.17485

今天分享的工作是刷爆各大视频平台的EMO的背后的工作原理。提出的初衷是着手解决增强发言者的头部特写视频生成中的现实感和表现力的挑战,重点关注音频提示与面部动作之间的动态和微妙关系。传统技术具有局限性,这些技术通常无法捕捉到人类表情的全部范围以及个体面部风格的独特性。

EMO是一个新颖的框架,利用直接的音频到视频合成方法,绕过了中间的3D模型或面部关键点的需要。方法确保了无缝的帧转换和一致的身份保留,从而产生高度表现力和逼真的动画。实验结果表明,EMO不仅能够生成令人信服的说话视频,还能以各种风格生成歌唱视频,从表现力和逼真度方面显著优于现有的最先进方法。

项目地址(截止3月4日还没有放出代码):

https://humanaigc.github.io/emote-portrait-alive/

介绍

近年来,图像生成领域取得了显著进展,这在很大程度上归功于扩散模型的出现和成功。这些模型以它们生成高质量图像的能力而受到赞誉,这要归功于对大规模图像数据集的广泛训练和渐进式生成方法。

这种创新方法使得创造具有无与伦比的细节和逼真度的图像成为可能,为生成模型领域设立了新的标杆。扩散模型的应用不仅仅局限于静态图像。对视频生成的兴趣日益增长,导致了探索这些模型在塑造动态和引人入胜的视觉叙事方面的潜力。这些开创性的努力强调了扩散模型在视频生成领域的巨大潜力。

除了一般的视频合成之外,生成以人为中心的视频一直是研究的焦点,比如发言者的头部特写。发言者的头部特写的目标是从用户提供的音频剪辑中生成面部表情。塑造这些表情涉及捕捉人的面部运动的微妙性和多样性,在视频合成中提出了重大挑战。

传统方法通常会对最终视频输出施加约束,以简化这项任务。例如,一些方法使用3D模型来限制面部关键点,而其他方法从基础视频中提取头部运动序列来引导整体运动。尽管这些约束减少了视频生成的复杂性,但它们也往往限制了生成面部表情的丰富性和自然性。

本文的目标是建立一个创新的发言者的头部特写框架,旨在捕捉广泛的逼真面部表情,包括微妙的微表情,并促进自然的头部运动,从而赋予生成的头像视频无与伦比的表现力水平。

为了实现这一目标,本文提出了一种利用扩散模型的生成能力的方法,能够直接从给定的图像和音频剪辑合成角色头像视频。这种方法消除了中间表示或复杂预处理的需要,简化了生成具有高度视觉和情感保真度的发言者的头部特写视频的过程,这些视频与音频输入中存在的微妙差异密切相关。

音频信号富含与面部表情相关的信息,理论上使得模型能够生成多样化的富有表现力的面部运动。然而,将音频与扩散模型集成在一起并不是一项简单的任务,因为音频和面部表情之间的映射具有固有的模糊性。这个问题可能导致模型生成的视频不稳定,表现为面部失真或视频帧之间的抖动,严重的情况下,甚至可能导致视频完全崩溃。

为了解决这一挑战,这里在模型中引入了稳定的控制机制,即速度控制器和面部区域控制器,以增强在生成过程中的稳定性。这两个控制器作为超参数发挥作用,充当微妙的控制信号,不会影响最终生成的视频的多样性和表现力。此外,为了确保生成视频中的角色与输入的参考图像保持一致,采用并增强了ReferenceNet的方法,设计了一个类似的模块,FrameEncoding,旨在跨视频保留角色的身份。

最后,为了训练模型,构建了一个庞大且多样化的音频视频数据集,收集了超过250小时的录影和超过1.5亿张图像。这个庞大的数据集涵盖了广泛的内容,包括演讲、电影和电视片段以及歌唱表演,并涵盖了多种语言,如中文和英文。丰富多样的说话和歌唱视频确保我们的训练材料捕捉到了广泛的人类表达和声音风格,为EMO的发展提供了坚实的基础。

在HDTF数据集上进行了大量的实验和比较,其中我们的方法在多个指标(如FID、SyncNet、F-SIM和FVD)上超越了当前的最先进方法,包括DreamTalk、Wav2Lip和SadTalker。除了定量评估外,还进行了全面的用户研究和定性评估,结果显示我们的方法能够生成高度自然和富有表现力的说话甚至歌唱视频,达到了迄今为止最佳的结果。

相关工作

扩散模型

扩散模型在各个领域展示了显著的能力,包括图像合成、图像编辑、视频生成,甚至3D内容生成。其中,Stable Diffusion (SD)是一个代表性例子,采用UNet架构迭代生成具有显著文本到图像能力的图像,经过对大型文本图像数据集的广泛训练。这些预训练模型在各种图像和视频生成任务中得到了广泛应用。

一些最近的工作采用了DiT(Diffusion-in-Transformer),它改变了UNet架构,将Transformer与具有时间模块和3D卷积的模块相结合,使其支持更大规模的数据和模型参数。通过从头开始训练整个文本到视频模型,它实现了卓越的视频生成结果。此外,一些工作已经开始将扩散模型应用于发言者的头部特写生成,产生了令人期待的结果,突显了这些模型在制作逼真的发言者的头部特写视频方面的能力。

声音驱动的发言者的头部特写生成

声音驱动的发言者的头部特写生成可大致分为两种方法:基于视频的方法单图像方法。基于视频的发言者的头部特写生成允许直接在输入视频片段上进行编辑。

例如,Wav2Lip根据音频重新生成视频中的唇部动作,使用鉴别器进行音频唇部同步。它的局限性在于依赖基础视频,导致固定的头部运动和仅生成嘴部动作,这可能限制了真实感。对于单图像发言者的头部特写生成,使用参考照片生成与照片外观相匹配的视频。提出通过学习混合形状和头部姿势来独立生成头部运动和面部表情。然后,使用这些信息创建3D面部网格,作为指导最终视频帧生成的中间表示。

类似地,[33]使用3D可变模型(3DMM)作为生成发言者的头部特写视频的中间表示。这些方法的一个常见问题是3D网格的表示能力有限,这限制了生成视频的整体表现力和逼真度。此外,这两种方法都基于非扩散模型,进一步限制了生成结果的性能。

[15]尝试使用扩散模型进行发言者的头部特写生成,但不是直接应用于图像帧,而是将它们用于生成3DMM的系数。与前两种方法相比,Dreamtalk 在结果上有所改进,但仍然未能实现高度自然的面部视频生成。

方法

给定一个角色肖像的单个参考图像,EMO可以生成与输入的语音音频剪辑同步的视频,保留与提供的声音音频的音调变化和谐的自然头部运动和生动表情。通过创建一系列连续的级联视频,EMO促进了生成具有一致身份和连贯运动的长时持续说话肖像视频,这对于现实应用至关重要。

准备

EMO采用 Stable Diffusion(SD)作为基础框架。SD 是一种广泛使用的文本到图像(T2I)模型,起源于潜在扩散模型(LDM)。它利用变分自编码器(VAE)将原始图像特征分布 映射到潜在空间 ,将图像编码为 = 并将潜在特征重建为 。这种架构具有降低计算成本并保持高视觉保真度的优势。基于去噪扩散概率模型(DDPM)或去噪扩散隐式模型(DDIM)方法,SD 引入高斯噪声 ε 到潜在 中,产生特定时间步 t 的噪声潜在 。在推理过程中,SD 旨在从潜在 中移除噪声 ε,并通过整合文本特征来实现所需的结果。这个去噪过程的训练目标表达为:

其中 c 代表文本特征,这些特征是通过 CLIPViT-L/14 文本编码器从tokens 提示中获取的。在 SD 中, 通过修改的 UNet模型实现,该模型采用交叉注意力机制将 c 与潜在特征融合。

网络流程

我们方法的概述如下图2所示。

骨干网络接收多帧噪声潜在输入,并在每个时间步尝试将其去噪为连续的视频帧,骨干网络具有与原始 SD 1.5 类似的 UNet 结构配置。

  • 与以前的工作类似,为了确保生成的帧之间的连续性,骨干网络嵌入了时间模块

  • 为了保持生成帧中人像的 ID 一致性,在骨干网络旁部署了一个称为 ReferenceNet 的 UNet 结构,它输入参考图像以获取参考特征。

  • 为了驱动角色的说话动作,使用音频层来编码语音特征。

  • 为了使说话角色的运动可控且稳定,使用面部定位器速度层提供弱约束条件。

骨干网络

在本工作中,未使用提示embedding;因此,已经将 SD 1.5 UNet 结构中的交叉注意力层改为参考注意力层。这些修改后的层现在将 ReferenceNet 中的参考特征作为输入,而不是文本embeddings。

音频层

声音中的发音和语调是生成角色运动的主要驱动信号。通过预训练的 wav2vec的各个块从输入音频序列中提取的特征被连接以产生音频表示嵌入 ,对于第 f 帧。然而,运动可能受到未来/过去音频段的影响,例如,在说话之前张嘴和吸气。为了解决这个问题,我们通过将相邻帧的特征连接起来定义了每个生成帧的语音特征:,其中 m 是每边的附加特征数量。为了将语音特征注入到生成过程中,在骨干网络中的每个参考注意力层后添加了音频注意力层,执行潜在代码与 Agen 之间的交叉注意力机制。

ReferenceNet

ReferenceNet 的结构与骨干网络相同,并用于从输入图像中提取详细特征。由于 ReferenceNet 和骨干网络都源自相同的原始 SD 1.5 UNet 架构,因此这两个结构在某些层次生成的特征图很可能会表现出相似性。

因此,这有助于骨干网络整合 ReferenceNet 提取的特征。先前的研究已经强调了利用类似结构在维持目标对象身份一致性方面的深远影响。在本研究中,ReferenceNet 和骨干网络都继承了原始 SD UNet 的权重。将目标角色的图像输入到 ReferenceNet 中,以从自注意力层中提取参考特征图输出。在骨干网络去噪过程中,相应层的特征经过与提取的特征图的参考注意力层。由于 ReferenceNet 主要设计用于处理单个图像,它缺乏在骨干网络中发现的时间层。

时间模块

大多数工作尝试将时间混合层插入预训练的文本到图像架构中,以促进对连续视频帧之间时间关系的理解和编码。通过这样做,增强的模型能够在帧之间保持连续性和一致性,从而生成平滑一致的视频流。

AnimateDiff的架构概念启发,将自注意力时间层应用于帧内的特征。具体而言,将输入特征图 x ∈ 重新配置为形状 (b×h×w)×f×c。这里,b代表batch大小,h和w表示特征图的空间维度,f是生成帧的数量,c是特征维度。

值得注意的是,将自注意力定向到时间维度 f,以有效捕捉视频的动态内容。时间层被插入到骨干网络的每个分辨率层中。大多数基于扩散的视频生成模型在设计上受到限制,只能生成预先确定数量的帧,从而限制了生成扩展视频序列的能力。

这种限制在发言者的头部特写视频的应用中尤为显著,因为足够的持续时间对于表达有意义的讲话至关重要。一些方法学采用前一剪辑末尾的帧作为后续生成的初始帧,旨在保持连接片段之间的无缝过渡。受此启发,我们的方法将先前生成的剪辑中的最后n帧,称为“运动帧”,并入以增强片段间的一致性。

具体而言,这些n个运动帧被输入到ReferenceNet中以预提取多分辨率动作特征图。在骨干网络内的去噪过程中,将时间层输入与匹配分辨率的预提取动作特征沿帧维度进行合并。这种简单的方法有效地确保了各种片段之间的一致性。对于生成的第一个视频剪辑,将运动帧初始化为零特征图。

值得注意的是,虽然骨干网络可能会多次迭代以去噪嘈杂的帧,但目标图像和运动帧仅被串联并输入到ReferenceNet一次。因此,在整个过程中重复使用提取的特征,确保在推理过程中没有计算时间的实质性增加。

面部定位器和速度层。时间模块可以保证生成的帧之间的连续性和视频片段之间的无缝过渡,然而,由于独立生成过程,它们无法确保生成的角色动作在片段之间的一致性和稳定性。先前的工作使用某些信号来控制角色的动作,例如骨架、混合形状或3DMM,然而,使用这些控制信号可能不利于创建生动的面部表情和动作,因为它们的自由度有限,而在训练阶段的不充分标注无法捕捉到完整的面部动态范围。

此外,相同的控制信号可能导致不同角色之间的差异,无法考虑到个体细微差异。使生成控制信号可能是一个可行的方法,然而,产生逼真的运动仍然是一个挑战。因此,我们选择了一种“弱”控制信号方法。

具体地,在前面图2中所示,使用一个mask M = 作为面部区域,该mask包含视频剪辑的面部边界框区域。我们使用面部定位器,它由轻量级卷积层组成,设计用于对边界框mask进行编码。然后,在将结果编码的mask添加到嘈杂的潜在表示之前,将其馈送到骨干网络。通过这种方式,可以使用mask来控制角色面部应该生成的位置。

然而,由于在不同的生成过程中头部运动频率的变化,使得在片段之间创建一致和平滑的运动是具有挑战性的。

为了解决这个问题,将目标头部运动速度纳入到生成过程中。更具体地说,考虑帧f中的头部旋转速度,并将速度范围划分为d个离散速度桶,每个桶代表不同的速度水平。每个桶都有一个中心值和一个半径。我们将重新定向到一个向量S = {}∈,其中。与音频层中使用的方法类似,每个帧的头部旋转速度embedding由 = ⊕给出,并且 随后由MLP处理以提取速度特征。

在时间层内,将重复到形状 (b × h × w) × f × ,并实现一个跨速度特征和沿时间维度f重塑的特征图之间进行操作的交叉注意力机制。通过这样做,并指定目标速度,可以同步生成的角色头部旋转速度和频率,跨不同的片段。结合面部定位器提供的面部位置控制,生成的输出可以既稳定又可控。

还应该注意到,指定的面部区域和分配的速度并不构成强控制条件。在面部定位器的上下文中,由于M是整个视频剪辑的联合区域,表明了一个可允许面部运动的大区域,从而确保头部不受限制于静态姿势。关于速度层,准确估计数据集标签中的人类头部旋转速度的困难意味着预测的速度序列本质上是嘈杂的。因此,生成的头部运动只能近似于指定的速度水平。这种限制促使我们设计了速度桶框架。

训练策略

训练过程分为三个阶段。第一阶段是图像预训练阶段,在此阶段中,骨干网络、参考网络和面部定位器都被纳入训练,骨干网络以单帧作为输入,而参考网络处理同一视频剪辑中不同的、随机选择的帧。骨干网络和参考网络都从原始的SD初始化权重。第二阶段是引入视频训练,在此阶段中加入了时间模块和音频层,从视频剪辑中采样n+f连续帧,其中开始的n帧是运动帧。

时间模块的权重初始化来自于 AnimateDiff。在最后阶段,速度层被整合进来,只在这个阶段训练时间模块和速度层。这种策略性的决定有意地将音频层从训练过程中省略掉。因为说话角色的表情、嘴部动作和头部运动的频率,主要受到音频的影响。因此,这些元素之间存在相关性,模型可能会根据速度信号而不是音频来驱动角色的运动。实验结果表明,同时训练速度和音频层会削弱音频对角色动作的驱动能力。

实验

实现

从互联网上收集了约250小时的发言者特写头像视频,并补充了HDTF和VFHQ数据集,用于训练我们的模型。由于VFHQ数据集缺乏音频,因此它仅用于第一个训练阶段。应用MediaPipe人脸检测框架来获取面部边界框区域。头部旋转速度是通过提取每一帧的6自由度头部姿态使用面部特征点进行标注,然后计算相邻帧之间的旋转角度来标注的。

从数据集中采样的视频剪辑被调整大小并裁剪为512 × 512。在第一个训练阶段,参考图像和目标帧分别从视频剪辑中采样,以批大小48训练骨干网络和参考网络。在第二和第三阶段,将生成的视频长度设置为f = 12,运动帧数设置为n = 4,采用批大小4进行训练。额外特征数m设置为2,遵循Diffused Heads。所有阶段的学习率均设置为1e-5。在推理过程中,使用DDIM的采样算法为视频剪辑生成40步,为每个帧生成分配一个恒定的速度值。我们的方法的时间消耗约为15秒一个批次(f = 12帧)。

实验设置

为了进行方法比较,将HDTF数据集划分,将10%分配为测试集,保留剩余90%用于训练。采取了预防措施,确保这两个子集之间没有角色ID的重叠。将我们的方法与一些先前的工作进行比较,包括:Wav2Lip,SadTalker,DreamTalk。

另外,使用了来自Diffused Heads的发布代码生成结果,然而,该模型是在仅包含绿色背景的CREMA数据集上训练的,生成的结果不够理想。此外,结果受到了在生成的帧之间的误差累积的影响。因此只对Diffused Heads方法进行了定性比较。对于DreamTalk,使用了原始作者规定的说话风格参数。

为了证明所提出方法的优越性,使用了几个定量指标对模型进行评估。利用Fréchet Inception Distance(FID)来评估生成帧的质量。另外,为了衡量结果中的身份保持情况,通过提取和比较生成帧和参考图像之间的面部特征来计算面部相似性(F-SIM)。值得注意的是,使用单一的、不变的参考图像可能会导致欺骗性的完美F-SIM分数。某些方法[18]可能只会生成口部区域,而将其余帧保持与参考图像相同,这可能会使结果产生偏差。

因此,将F-SIM视为opulation-reference indices,较接近相应的真值(GT)表示性能更好。进一步采用Fréchet Video Distance(FVD)进行视频级评估。SyncNet分数用于评估唇部同步质量,这是说话头应用的关键方面。

为了评估生成视频中面部表情的表现力,引入了Expression-FID(E-FID)度量。这涉及通过面部重建技术提取表情参数,如[3]中所述。随后,我们计算这些表情参数的FID,以定量衡量合成视频中的表情与真值数据集中的表情之间的差异。

定性比较

下图3展示了我们方法与之前方法的视觉结果。

可以观察到,当提供单一参考图像作为输入时,Wav2Lip通常会合成模糊的嘴部区域,并生成头部姿势静态、眼睛运动最小的视频。对于DreamTalk,提供的样式片段可能会扭曲原始面部,也会限制面部表情和头部运动的动态性。与SadTalker和DreamTalk相比,我们提出的方法能够生成更广泛的头部运动和更动态的面部表情。由于我们不使用直接信号,如混合形状或3DMM,来控制角色的运动,这些运动是由音频直接驱动的,这将在下面的示范中详细讨论。

进一步探索了在各种人像风格下生成发言者头部特写视频的可能性。如下图4所示,从Civitai获取的参考图像是由不同的文本到图像(T2I)模型合成的,涵盖了各种风格的人物,包括逼真的、动漫的和3D的。这些角色使用相同的语音音频输入进行动画化,从而在不同风格之间实现了近乎统一的唇部同步。虽然我们的模型只是在逼真的视频上进行了训练,但它显示出在为各种人像类型生成说话头视频方面的能力。

下图5展示了当处理具有明显音调特征的音频时,我们的方法能够生成更丰富的面部表情和动作。例如,第三行的示例显示,高音调的语音音调能够引发角色更强烈和更生动的表情。此外,利用动作帧能够延长生成的视频,可以根据输入音频的长度生成持续时间较长的视频。正如下图5和下图6所示,我们的方法在长序列中保持了角色的身份,即使在存在大幅运动的情况下也是如此。

定量比较

如下表1所示,我们的结果表明在视频质量评估方面具有明显的优势,这体现在较低的FVD得分上。此外,我们的方法在单帧质量方面表现出色,这表现在改善的FID得分上。尽管在SyncNet指标上未达到最高分,但我们的方法在生成生动的面部表情方面表现出色,正如E-FID所示。

局限性

EMO方法存在一些局限性。首先,与不依赖于扩散模型的方法相比,它更耗时。其次,由于不使用任何明确的控制信号来控制角色的动作,可能会导致意外生成其他身体部位,如手部,从而在视频中产生瑕疵。解决这个问题的一个潜在方法是专门为身体部位使用控制信号。

参考文献

[1]EMO: Emote Portrait Alive - Generating Expressive Portrait Videos with Audio2Video Diffusion Model under Weak Conditions

 更多精彩内容,请关注公众号:AI生成未来

欢迎加群交流AIGC技术

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

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

相关文章

【HarmonyOS】鸿蒙开发之Stage模型-UIAbility的启动模式——第4.4章

UIAbi lity的启动模式简介 一共有四种:singleton,standard,specified,multion。在项目目录的:src/main/module.json5。默认开启模式为singleton(单例模式)。如下图 singleton(单实例模式)启动模式 每个UIAbility只存在唯一实例。任务列表中只会存在一…

测试管理进阶 | 量力而行:避免成为替罪羊

职场中,我们常常面临是否帮助他人的抉择。尽管善良是美德,但过度的好人卡可能会给自己带来麻烦。本文将探讨如何在职场中量力而行,避免成为替罪羊,以及如何保持高效和合理的职责划分。 我们在工作中常常会遇到一些需要帮助他人的情况,作为团队的一员,我们希望能够积极地协…

六、继承(一)

1 继承的引入 以往我们想分别实现描述学生、老师的类,可能会这样子做: class Student {string _name;string _number;int _tel;int id;string _address;int _age; }; class Teacher {string _name;int _level;int _tel;int id;string _address;int _ag…

【归并排序】 详细解析 动图演示 逐图解析 洛谷P1177【模板】排序 sort【快速排序】

文章目录 归并排序1.归并排序的复杂度分析2.细节解释3.归并排序动图演示3(1) 我们的拆分过程如下↓ 4.code↓ 洛谷P1177【模板】排序数据规模与约定code(归并排序)↓code(sort排序【快速排序】) 完结撒花( ̄▽&#xff…

数据中台:数字中国战略关键技术实施

这里写目录标题 前言为何要建设数据中台数据中台建设痛点数据中台学习资料聚焦前沿,方法论体系更新与时俱进,紧跟时代热点深入6大行业,提炼实践精华大咖推荐,数字化转型必备案头书 前言 在数字中国这一国家战略的牵引下&#xff0…

基于springboot+vue的响应式企业员工绩效考评系统(源码+论文)

文章目录 前言 一、功能设计 1 普通员工功能 2 主管功能 3 系统管理员功能 4 评分标准功能 5 PC端与手机端 6 制图 二、功能实现 普通员工 1普通员工登录 2公告板块 3日志板块 主管 1主管登录 2公告板块 3日志板块 4绩效评分板块 5个人信息板块 系统管理员…

在 Linux 环境下安装 Kibana

目录 一、Kibana 是什么 二、在 Linux 环境下安装 Kibana 1、下载安装包 2、解压 3、修改 Kibana的配置文件 config/kibana.yml 4、启动 5、浏览器登录 Kibana 6、测试查询 一、Kibana 是什么 Kibana 是通向 Elastic 产品集的窗口。 它可以在 Elasticsearch 中对数据进…

品牌推广的两种飞轮:非酋飞轮与欧皇飞轮

在品牌推广的世界里,存在着两种截然不同的飞轮效应,我们称之为“非酋飞轮”与“欧皇飞轮”。这两种飞轮象征着品牌发展的两种不同路径和策略,而迅腾文化则以其独特的“繁”的原则,巧妙地将这两种飞轮结合,助力品牌形成…

Linux安装JumpServer并结合内网穿透实现公网访问本地服务

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Kubernetes 学习总结(46)—— Pod 不停重启问题分析与解决

我们在做性能测试的时候,往往会发现我们的pod服务,频繁重启,通过kubectl get pods 命令,我们来逐步定位问题。 现象:running的pod,短时间内重启次数太多。 定位问题方法:查看pod日志 kubectl get event …

1、EmlogCms代码审计

一、SQL注入 1、后台标签删除处存在1处sql注入 漏洞条件 ● 漏洞url: http://emlog6.0.com/admin/tag.php?actiondell_all_tag ● 漏洞参数:tag[xx] ● 是否存在限制:无 ● 是否还有其他条件:actiondell_all_tag,token复现 POST /admin…

撸chatgpt3.5 api backend-api 对接wxbot

功能是实现 web 转api 对接wxbot用, 直接上代码, 1.获取wss url def get_register_websocket():# 请求头url "https://chat.openai.com/backend-api/register-websocket"payload {}headers {Authorization: Bearer eyJhbGxxxxxxxxxxxxx…

docker的网络配置

文章目录 1、网络模式1.1、bridge模式(默认模式)1.2、host模式 2、bridge模式3、自定义网络 1、网络模式 Docker在创建容器时有四种网络模式:bridge/host/container/none,bridge为默认不需要用–net去指定,其他三种模式需要在创建容器时使用…

案例介绍:汽车维修系统的信息抽取技术与数据治理应用(开源)

一、引言 在当今汽车产业的快速发展中,软件已经成为提升车辆性能、安全性和用户体验的关键因素。从车载操作系统到智能驾驶辅助系统,软件技术的进步正在重塑我们对汽车的传统认知。我有幸参与了一个创新项目,该项目专注于开发和集成先进的汽…

关于 svg path 路径坐标 精度误差问题

<svg width"2838.739990" height"2482.179932" viewBox"0 0 2838.74 2482.18" fill"none" xmlns"http://www.w3.org/2000/svg" xmlns:xlink"http://www.w3.org/1999/xlink"><path id"矢量 12"…

原理篇-- 定时任务xxl-job-服务端(admin)项目启动过程--JobRegistryHelper 初始化 (4)

文章目录 前言一、JobRegistryHelper 作用&#xff1a;二、JobRegistryHelper 源码介绍&#xff1a;2.1 初始化start() 方法&#xff1a;2.1.1 registryOrRemoveThreadPool 执行器注册和移除&#xff1a;2.1.2 registryMonitorThread 执行器注册监控线程&#xff1a; 2.2 toSto…

折线图实现柱状阴影背景的demo

这个是一个由官网的基础折线图实现的流程&#xff0c;将涉及到的知识点附上个人浅薄的见解&#xff0c;源码在最后&#xff0c;需要的可自取。 折线图 成果展示代码注解参数backgroundColordataZoomlegendtitlexAxisyAxisgridseries 源码 成果展示 官网的基础折线图&#xff…

猫耳语音下载(mediadown)

猫耳语音下载(mediadown) 一、介绍 猫耳语音下载,能够帮助你下载猫耳音频节目。如果你是会员,它还能帮你下载会员节目。 二、下载地址 下载:猫耳语音下载(mediadown) 百度网盘下载:猫耳语音下载(mediadown) 三、安装教程 将下载的文件解压到D:\xibinhui,D:\Pr…

Unity RectTransform·屏幕坐标转换

RectTransform转屏幕坐标 分两种情况 Canvas渲染模式为Overlay时&#xff0c;使用此方式 public Rect GetScreenCoordinatesOfCorners(RectTransform rt) {var worldCorners new Vector3[4];rt.GetWorldCorners(worldCorners);var result new Rect(worldCorners[0].x,world…

Manomotion 实现AR手势互动-解决手势无效的问题

之前就玩过 Manomotion &#xff0c;现在有新需求&#xff0c;重新接入发现不能用了&#xff0c;不管什么办法&#xff0c;都识别不了手势&#xff0c;我记得当初是直接调用就可以的。 经过研究发现&#xff0c;新版本SDK改了写法。下边就写一下新版本的调用&#xff0c;并且实…