增强现实系列—GaussianAvatars: Photorealistic Head Avatar

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。

🚀 探索专栏:学步_技术的首页 —— 持续学习,不断进步,让学习成为我们共同的习惯,让总结成为我们前进的动力。

🔍 技术导航:

  • 人工智能:深入探讨人工智能领域核心技术。
  • 自动驾驶:分享自动驾驶领域核心技术和实战经验。
  • 环境配置:分享Linux环境下相关技术领域环境配置所遇到的问题解决经验。
  • 图像生成:分享图像生成领域核心技术和实战经验。
  • 虚拟现实技术:分享虚拟现实技术领域核心技术和实战经验。

🌈 非常期待在这个数字世界里与您相遇,一起学习、探讨、成长。不要忘了订阅本专栏,让我们的技术之旅不再孤单!

💖💖💖 ✨✨ 欢迎关注和订阅,一起开启技术探索之旅! ✨✨

文章目录

  • 1. 背景介绍
  • 2. 方法
    • 2.1 预备知识
    • 2.2 3D 高斯绑定
    • 2.3 绑定继承
    • 2.4 优化与正则化
    • 2.5 位置损失与阈值
    • 2.6 缩放损失与阈值
    • 2.7 实现细节
  • 3. 实验
    • 3.1 设置
    • 3.2 头像重建与动画
    • 3.3 消融实验
  • 4. 限制与潜在的负面影响
  • 5. 结论

1. 背景介绍

我们介绍了 GaussianAvatars,一种用于创建逼真头像的新方法,头像在表情、姿态和视角方面完全可控。核心思想是基于3D高斯点的动态3D表示,这些点与参数化可变脸模型相绑定。该组合既能实现逼真的渲染,同时允许通过底层的参数化模型进行精确的动画控制,例如,通过从驱动序列中转移表情或手动更改可变模型参数。我们通过三角形的局部坐标系对每个高斯点进行参数化,并优化显式的位移偏移,以获得更准确的几何表示。在头像重建过程中,我们对可变模型参数和高斯点参数进行端到端的联合优化。我们在多个具有挑战性的场景中展示了我们逼真头像的动画能力。例如,我们展示了从驱动视频中的再现行为,我们的方法在这一过程中显著优于现有的工作。
在这里插入图片描述

创建可动画的人类头像一直是计算机视觉和图形学中的一个长期问题。特别是,从任意视角渲染逼真的动态头像的能力使得游戏、电影制作、沉浸式远程呈现以及增强或虚拟现实等众多应用成为可能。对于这些应用,能够控制头像并且使其在新的姿势和表情下具有良好的泛化能力也是至关重要的。重建能够同时捕捉人类头像的外观、几何形状和动态特性的3D表示,是生成高保真头像的主要挑战。这个重建问题的欠约束性质大大增加了实现一种能够结合新视角渲染逼真度和表情可控性的表示的难度。此外,极端表情和面部细节,如皱纹、嘴巴内部以及头发,往往难以捕捉,容易产生人类容易察觉的视觉伪影。

神经辐射场(Neural Radiance Fields,简称NeRF)及其变体[2, 6, 28, 29]已经在通过多视角观察重建静态场景中展示了令人印象深刻的成果。后续工作扩展了NeRF,以建模动态场景,既有适用于任意场景[22, 30, 31]的,也有专门针对人类场景的[13, 18]。这些工作在新视角渲染方面取得了显著成果,但它们缺乏可控性,因此在新的姿势和表情下泛化能力较差。最近的3D高斯点(3D Gaussian Splatting)方法[15]在新视角合成中取得了比NeRF更高的渲染质量,并且实现了实时性能,其优化是在整个3D空间中的离散几何基元(3D高斯点)。该方法已被扩展用于通过建立时间步的显式对应关系来捕捉动态场景[27],但它们不允许对重建输出进行动画处理。

为此,我们提出了 GaussianAvatars,一种基于绑定到参数化可变脸模型的3D高斯点的动态3D表示方法。给定一个 FLAME [21] 网格,我们在每个三角形的中心初始化一个3D高斯点。当 FLAME 网格进行动画处理时,每个高斯点根据其父三角形进行平移、旋转和缩放。然后,3D高斯点在网格顶部形成一个辐射场,用于补偿网格对齐不准确或无法重现某些视觉元素的区域。为了实现高保真的重建头像,我们引入了绑定继承策略来支持高斯点的添加和删除,同时保持可控性。我们还探索了在头像动画过程中平衡保真度和鲁棒性,使其能够呈现新的表情和姿势。我们的方法在新视角渲染和从驱动视频中的再现上显著优于现有的工作。

我们的贡献如下:

  • 我们提出了 GaussianAvatars,一种通过将3D高斯点绑定到参数化网格模型上来创建可动画头像的方法。
  • 我们设计了一种绑定继承策略,支持在不失去可控性的情况下添加和删除3D高斯点。

2. 方法

如图2所示,我们的方法的输入是一个人头的多视角视频录制。对于每个时间步,我们使用基于[39]的光度头部跟踪器,结合多视角观察和已知的相机参数来拟合 FLAME [21] 参数。FLAME 网格的顶点处于不同位置,但具有相同的拓扑结构。因此,我们可以在网格的三角形和3D高斯点之间建立一致的连接(见3.2节)。这些高斯点通过可微分的瓦片光栅化器渲染成图像[15]。然后,这些图像通过监督学习与真实图像进行对比,以学习逼真的人头头像。与静态场景类似,仍然需要通过一组自适应密度控制操作[15]来增密和修剪高斯点,以达到最佳质量。为了在不破坏三角形和高斯点连接的情况下实现这一点,我们设计了绑定继承策略(见3.3节),以便新的高斯点仍然绑定到 FLAME 网格上。除了颜色损失外,我们还发现,正则化高斯点的局部位置和缩放对于在新表情和姿势下避免质量下降至关重要(见3.4节)。
在这里插入图片描述

2.1 预备知识

3D高斯点(3D Gaussian Splatting)[15] 提供了一种基于给定的图像和相机参数,通过各向异性3D高斯重建静态场景的解决方案。场景由一组高斯点表示,每个高斯点通过协方差矩阵 Σ \Sigma Σ 定义,中心为点(均值) μ \mu μ

G ( x ) = e − 1 2 ( x − μ ) T Σ − 1 ( x − μ ) G(x) = e^{-\frac {1}{2}(x - \mu)^T \Sigma ^{-1}(x - \mu)} G(x)=e21(xμ)TΣ1(xμ)

需要注意的是,协方差矩阵只有在半正定的情况下才具有物理意义,而这在使用梯度下降的优化过程中无法保证。因此,Kerbl等人[15]首先定义了一个带有缩放矩阵 S S S 和旋转矩阵 R R R 的参数化椭圆,然后通过以下方式构建协方差矩阵:

Σ = R S S T R T . \Sigma = R S S^T R^T. Σ=RSSTRT.

在实际操作中,椭圆以位置向量 μ ∈ R 3 \mu \in \mathbb{R}^3 μR3、缩放向量 s ∈ R 3 s \in \mathbb{R}^3 sR3 和四元数 q ∈ R 4 q \in \mathbb{R}^4 qR4 存储。在我们的论文中,我们用 r ∈ R 3 × 3 r \in \mathbb{R}^{3 \times 3} rR3×3 来表示与 q q q 对应的旋转矩阵。

在渲染过程中,像素的颜色 C C C 是通过混合所有与该像素重叠的3D高斯点来计算的:

C = ∑ i = 1 N c i α i ′ ∏ j = 1 i − 1 ( 1 − α j ′ ) , C = \sum_{i=1}^{N} c_i \alpha_i' \prod_{j=1}^{i-1}(1-\alpha_j'), C=i=1Nciαij=1i1(1αj),

其中 c i c_i ci 是每个点由三阶球谐函数建模的颜色。混合权重 α ′ \alpha' α 是通过评估3D高斯点的2D投影乘以每个点的不透明度 α \alpha α 来给出的。在混合之前,高斯点根据深度排序,以确保可见性顺序。

2.2 3D 高斯绑定

我们方法的关键组件是如何在 FLAME [21] 网格和 3D 高斯点之间建立连接。起初,我们将网格的每个三角形与一个 3D 高斯点配对,并让 3D 高斯点随着时间步的变化与三角形一起移动。换句话说,3D 高斯点在其父三角形的局部空间中是静止的,但在全局(度量)空间中随着三角形的移动而动态变化。给定一个三角形的顶点和边,我们取顶点的平均位置 T T T 作为局部空间的原点。然后,我们将一个边的方向向量、三角形的法向量以及它们的叉积作为列向量串联起来,形成一个旋转矩阵 R R R,该矩阵描述了三角形在全局空间中的方向。我们还通过其中一条边的平均长度及其垂线来计算一个标量 k k k,以描述三角形的缩放。

对于与三角形配对的 3D 高斯点,我们定义其位置 μ \mu μ、旋转 r r r 和各向异性缩放 s s s 都在局部空间中。我们将位置 μ \mu μ 初始化在局部原点,旋转 r r r 初始化为单位旋转矩阵,缩放 s s s 初始化为单位向量。在渲染时,我们通过以下公式将这些属性转换到全局空间中:

r ′ = R r , μ ′ = k R μ + T , s ′ = k s . r' = R r, \\ \mu' = k R \mu + T, \\ s' = k s. r=Rr,μ=kRμ+T,s=ks.

我们在公式 (5) 和 (6) 中结合了三角形缩放,使得 3D 高斯点的局部位置和缩放是相对于三角形的绝对尺度定义的。这使得在度量空间中可以使用自适应步长,并且参数在局部空间中使用恒定的学习率。例如,与较大的三角形配对的 3D 高斯点将在一个迭代步骤中移动得比与较小三角形配对的高斯点更快。这也使得解释与三角形中心的距离有关的参数更加容易。

2.3 绑定继承

仅使用与三角形数量相同的高斯点不足以捕捉细节。例如,表示一根弯曲的发束需要多个高斯点,而头皮上的三角形可能会与多根发束相交。因此,我们还需要自适应密度控制策略[15],它基于视空间位置梯度和每个高斯点的不透明度来添加和删除高斯点。

对于具有较大视空间位置梯度的每个 3D 高斯点,如果它较大,我们将其分割为两个较小的高斯点;如果它较小,我们将其克隆。我们在局部空间中进行这项操作,并确保新创建的高斯点与触发此密集化操作的原始高斯点相邻。因此,将新创建的 3D 高斯点绑定到与原始高斯点相同的三角形是合理的,因为它是为了增强局部区域的保真度而创建的。因此,每个 3D 高斯点必须携带一个额外的参数,即其父三角形的索引,以在密集化过程中启用绑定继承。

除了密集化,我们还使用修剪操作作为自适应密度控制策略[15]的一部分。它会定期将所有高斯点的不透明度重置为接近零,并删除不透明度低于阈值的点。此技术在抑制漂浮伪影方面非常有效,然而在动态场景中,修剪也可能引发问题。例如,面部经常被遮挡的区域(如眼球三角形)对这种修剪策略可能过于敏感,最终可能只有很少甚至没有高斯点附着。为了防止这种情况发生,我们会跟踪每个三角形上附着的高斯点数量,并确保每个三角形始终至少附着一个高斯点。

2.4 优化与正则化

我们通过结合L1损失项和D-SSIM损失项[15]来监督渲染的图像:

L rgb = ( 1 − λ ) L 1 + λ L D-SSIM , \mathcal{L}_{\text{rgb}} = (1-\lambda) \mathcal{L}_1 + \lambda \mathcal{L}_{\text{D-SSIM}}, Lrgb=(1λ)L1+λLD-SSIM,

其中 λ = 0.2 \lambda = 0.2 λ=0.2。在没有其他监督(如深度或轮廓监督)的情况下,这已经能够通过强大的瓦片光栅化器[15]带来良好的重新渲染质量。然而,当我们尝试通过 FLAME [21] 使这些高斯点在新的表情和姿势下进行动画处理时,会在场景中出现大量的尖刺和块状伪影。这是由于高斯点与三角形之间的对齐不佳造成的。

2.5 位置损失与阈值

3D 高斯绑定的一个基本假设是高斯点应大致匹配其底层网格,同时应与其位置匹配。例如,表示鼻子上的一个点的高斯点不应绑定到脸颊上的三角形。虽然我们的高斯点在初始化时位于三角形的中心,且新的高斯点是在现有点附近添加的,但无法保证这些基元在优化后仍与其父三角形保持接近。为了解决这个问题,我们通过以下方式正则化每个高斯点的局部位置:

L position = ∥ max ⁡ ( μ , ϵ position ) ∥ 2 , \mathcal{L}_{\text{position}} = \| \max \left( \mu, \epsilon_{\text{position}} \right) \|_2, Lposition=max(μ,ϵposition)2,

其中 ϵ position = 1 \epsilon_{\text{position}} = 1 ϵposition=1 是一个容忍小误差的阈值,该误差与其父三角形的缩放相关。

2.6 缩放损失与阈值

除了位置外,3D 高斯点的缩放对于动画处理时的视觉质量更为重要。具体来说,如果3D高斯点相对于其父三角形较大,那么三角形的小旋转(在三角形尺度上几乎不可察觉)会因3D高斯点的放大而产生令人不悦的抖动伪影。为了解决这个问题,我们还通过以下方式正则化每个3D高斯点的局部缩放:

L scaling = ∥ max ⁡ ( s , ϵ scaling ) ∥ 2 , \mathcal{L}_{\text{scaling}} = \| \max \left( s, \epsilon_{\text{scaling}} \right) \|_2, Lscaling=max(s,ϵscaling)2,

其中 ϵ scaling = 0.6 \epsilon_{\text{scaling}} = 0.6 ϵscaling=0.6 是一个阈值,当高斯点的缩放小于其父三角形的0.6倍时,这一损失项被禁用。这个 ϵ scaling \epsilon_{\text{scaling}} ϵscaling 容忍度至关重要;没有它,高斯点会缩得过小,导致渲染速度下降,因为相机射线需要击中更多的高斯点才能达到零透光率。

我们的最终损失函数为:

L = L rgb + λ position L position + λ scaling L scaling , \mathcal{L} = \mathcal{L}_{\text{rgb}} + \lambda_{\text{position}} \mathcal{L}_{\text{position}} + \lambda_{\text{scaling}} \mathcal{L}_{\text{scaling}}, L=Lrgb+λpositionLposition+λscalingLscaling,

其中 λ position = 0.01 \lambda_{\text{position}} = 0.01 λposition=0.01 λ scaling = 1 \lambda_{\text{scaling}} = 1 λscaling=1。需要注意的是,我们只对可见的高斯点应用 L position \mathcal{L}_{\text{position}} Lposition L scaling \mathcal{L}_{\text{scaling}} Lscaling。因此,只有当存在颜色损失 L rgb \mathcal{L}_{\text{rgb}} Lrgb 时,我们才会对这些点进行正则化。这有助于保持经常被遮挡区域(如牙齿和眼球)的学习结构。

2.7 实现细节

我们使用 Adam 优化器[17]进行参数优化(所有对象均使用相同的超参数值)。我们将3D高斯点的位置学习率设置为 5 × 1 0 − 3 5 \times 10^{-3} 5×103,缩放学习率设置为 1.7 × 1 0 − 2 1.7 \times 10^{-2} 1.7×102,其余参数的学习率与 3D 高斯点方法[15]保持一致。除了高斯点参数外,我们还微调了 FLAME [21] 在每个时间步的平移、关节旋转和表情参数,学习率分别为 1 × 1 0 − 6 1 \times 10^{-6} 1×106 1 × 1 0 − 5 1 \times 10^{-5} 1×105 1 × 1 0 − 3 1 \times 10^{-3} 1×103。我们训练了 600,000 次迭代,并在高斯点位置的学习率上进行指数衰减,直到最后一次迭代时,学习率达到初始值的 0.01 倍。我们在每隔 2,000 次迭代后,从第 10,000 次迭代开始启用绑定继承的自适应密度控制。每 60,000 次迭代,我们会重置高斯点的不透明度。我们使用光度头部跟踪器获取 FLAME 参数,包括形状 β \beta β、平移 t t t、姿态 θ \theta θ、表情 ψ \psi ψ 和规范空间中的顶点偏移 Δ v \Delta v Δv

3. 实验

3.1 设置

实验设置:我们通过三个设置来评估头像的质量:1) 新视角合成:使用来自训练序列的头部姿势和表情驱动头像,并从一个未使用的视角渲染。2) 自我再现:使用来自相同主体的未见过的姿势和表情驱动头像,并渲染所有16个摄像机视角。3) 跨身份再现:使用来自另一个主体的姿势和表情动画化头像。

数据集:我们在 NeRSemble [18] 数据集的9个主体的视频录制上进行了实验。所有录制都包含16个视角,覆盖了主体的前方和侧面。对于每个主体,我们使用11个视频序列,并将图像下采样至802×550分辨率。参与者在10个序列中被指示执行特定的表情或情感,而在最后一个序列中自由表演。为了对每个主体进行定量评估,我们使用10个指定序列中的9个以及16个摄像机中的15个训练我们的方法和三个基线方法(INSTA [52]、PointAvatar [50] 和 AvatarMAV [44])。我们使用第11个(自由表演)序列来视觉评估跨身份再现能力。有关数据集和基线的详细信息,请参阅补充材料。

3.2 头像重建与动画

我们通过新视角合成评估头像的重建质量,并通过自我再现评估动画保真度。图3展示了定性比较。对于新视角合成,所有方法都生成了合理的渲染结果。仔细检查 PointAvatar [50] 的结果时,发现了由于其固定点大小导致的点状伪影。在我们的案例中,3D高斯点的各向异性缩放缓解了这一问题。
在这里插入图片描述
INSTA [52] 在面部区域表现出干净的结果,但颈部和肩膀周围的区域可能会有噪声,因为跟踪的 FLAME 网格在这些区域往往不对齐。这导致了 INSTA 的问题,因为它的扭曲过程基于最近的三角形。而我们的方法中,每个高斯点都绑定到一个一致的三角形,无论姿势或表情如何。当跟踪的网格不准确时,指向高斯点的位置梯度可以始终回传到同一个三角形。这使得在优化3D高斯点的过程中,能够纠正由于错误的 FLAME 跟踪导致的错位。

AvatarMAV [44] 在新视角合成中显示了与其他方法相当的质量,但在新表情合成方面表现较差。这是因为它仅使用了3DMM的表情向量作为条件控制。由于必须学习从表情向量到形变基的控制,它在再现训练分布之外的表情时显得乏力。类似的结论也可以从表1中的定量比较中得出。我们的方法在新视角合成指标上大幅领先其他方法。我们的方法在自我再现方面也表现突出,LPIPS [48] 感知差异显著更低。请注意,自我再现基于跟踪的 FLAME 网格,可能无法与目标图像完全对齐,因此在像素级度量(如 PSNR)方面对我们的结果带来了不利影响。

为了进行头像动画的真实场景测试,我们在图4中进行了跨身份再现实验。我们的头像能够准确再现来源演员的眨眼和嘴部运动,展示了丰富的动态细节,如皱纹。INSTA [52] 在头像超出为训练序列优化的 I-NGP [29] 占用网格时表现出锯齿伪影。PointAvatar [50] 的结果因其形变空间与 FLAME 不一致,导致动作不准确。AvatarMAV [44] 由于缺乏形变先验,在再现过程中出现了大幅劣化。
在这里插入图片描述

3.3 消融实验

为了验证我们方法组件的有效性,我们依次禁用它们并在表2中报告结果。
在这里插入图片描述

带绑定继承的自适应密度控制:没有绑定继承,我们就无法在初始高斯点之外添加或删除新的高斯点。随着高斯点数量的限制,每个高斯点的缩放会增加以占据相同的空间,导致渲染模糊,显著降低保真度,如表2第二行所示。

高斯点缩放的正则化:没有缩放损失时,伪影会以尖刺形式出现(图6中间列),并略微降低图像质量(表2第三行)。但当我们使用没有容错的缩放损失时,所有指标都会急剧恶化(表2第四行),因为所有高斯点被正则化到无限小,使得难以构建不透明的表面。
在这里插入图片描述
在这里插入图片描述

高斯点位置的正则化:当禁用位置损失的阈值时,指标略微变差(表2第六行)。但当关闭位置损失时,新视角合成的指标变为表中最佳(表2第五行)。这是合理的,因为没有约束的情况下,高斯点可以自由移动以实现最小的重新渲染误差。然而,由于高斯点的分布过度拟合了训练帧,头像在新的表情和姿势下表现出裂缝和漂浮块状伪影(图6左列)。因此,位置损失对于限制高斯点从网格表面的偏离是必要的,以便我们能够在未见过的面部动作下对重建的头像进行动画处理。

FLAME 微调:由于高斯点与三角形之间的绑定一致性,我们可以在优化高斯点的同时有效地微调 FLAME 参数(图5)。如表2最后一行所示,关闭微调会对新视角合成的图像质量产生负面影响。对于自我再现,微调 FLAME 参数也会降低感知误差。
在这里插入图片描述

4. 限制与潜在的负面影响

我们的方法基于3D高斯点,直接捕捉辐射场,而没有对材质和光照进行解耦。因此,在我们当前的方法中,无法实现对头像的重新光照。此外,我们缺乏对 FLAME 模型未覆盖区域(如头发和其他配件)的控制。我们认为,直接建模这些部分是一个有趣的未来研究方向。例如,最近的一些方法在头发重建方面取得了令人鼓舞的成果[35, 41]。

创建逼真的头像可能引发广泛的恶意用途。隐私侵犯是一个重要的担忧,尤其是在未经授权操作他人肖像的情况下。此外,欺骗性内容的创建,例如深度伪造视频,可能导致虚假信息传播、诽谤以及声誉损害。身份盗窃也是一个潜在风险,因为头像可能被用于冒充和欺诈活动。我们强烈谴责未经授权和恶意使用此技术的行为,并强调在所有使用我们方法的应用中应考虑伦理问题。

5. 结论

GaussianAvatars 是一种从视频序列创建逼真头像的新方法。它通过基于3D高斯点的动态3D表示,绑定到参数化的可变脸模型上。这使得动态的、逼真的头像能够实现灵活的控制和精确的属性传递。高斯点集能够偏离网格表面,以补偿可变模型的缺失或不准确部分,展示出对人类头部细节建模的惊人能力。我们的方法在图像质量和表情准确性上大幅超越了当前最先进的方法,表明该方法在相关领域中具有广泛的应用潜力。

🌟 在这篇博文的旅程中,感谢您的陪伴与阅读。如果内容对您有所启发或帮助,请不要吝啬您的点赞 👍🏻,这是对我最大的鼓励和支持。

📚 本人虽致力于提供准确且深入的技术分享,但学识有限,难免会有疏漏之处。如有不足或错误,恳请各位业界同仁在评论区留下宝贵意见,您的批评指正是我不断进步的动力!😄😄😄

💖💖💖 如果您发现这篇博文对您的研究或工作有所裨益,请不吝点赞、收藏,或分享给更多需要的朋友,让知识的力量传播得更远。

🔥🔥🔥 “Stay Hungry, Stay Foolish” —— 求知的道路永无止境,让我们保持渴望与初心,面对挑战,勇往直前。无论前路多么漫长,只要我们坚持不懈,终将抵达目的地。🌙🌙🌙

👋🏻 在此,我也邀请您加入我的技术交流社区,共同探讨、学习和成长。让我们携手并进,共创辉煌!
在这里插入图片描述

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

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

相关文章

【ollama】ollama配置本地大模型并运行

ollama的Github链接 https://github.com/ollama/ollamaollama官网链接 https://ollama.com/打开后点击下载 下载完成后进行安装,安装完毕后在终端输入以下,代表安装成功 ollama在ollama官网的模型库中找到需要的模型,这里使用阿里最新开源…

ZYNQ FPGA自学笔记~操作PLL

一 时钟缓冲器、管理和路由 垂直时钟中心(clock backbone)将设备分为相邻的左侧和右侧区域,水平中心线将设备分为顶部和底部两侧。clock backbone中的资源镜像到水平相邻区域的两侧,从而将某些时钟资源扩展到水平相邻区域。BUFG不…

JavaWeb---三层架构

文章目录 1. 为什么需要分层?2.软件设计中的分层模式3.分层4.三层架构:显示层、业务逻辑层、数据访问层3. 案例:利用三层架构原理实现编写web程序的流程 摘自:https://blog.csdn.net/qq_64001795/article/details/124112824 1. 为…

死锁(详解版)

一、什么是死锁 死锁就是多个线程在运行过程中,都需要获取对方线程所持有的锁(资源),导致处于长期无限等待的状态。 二、死锁产生原因 两个线程各自持有不同的锁,然后试图获取对方线程的锁,造成双方无限等待…

聊城网站建设:企业如何打造高效官网

聊城网站建设:企业如何打造高效官网 在互联网飞速发展的今天,官方网站已成为企业展示形象、推广产品、与客户沟通的重要平台。尤其对于聊城地区的企业来说,建立一个高效的官网显得尤为重要。本文将分享一些关键步骤,帮助企业打造一…

如何在Mac上查看剪贴板历史记录

重点摘要 macOS 内建的剪贴簿查看器可以透过 Finder 存取,但只能显示最近一次复制的内容,而且重新开机后就会清除。若要更进阶的剪贴簿管理,第三方 app 像是 CleanClip 提供了强大的功能和更好的组织方式。CleanClip 提供了全方位的剪贴簿历史管理解决方案,支援各种内容类型和…

书客、柏曼、明基护眼台灯怎么样?实测三款热门护眼台灯推荐

随着市场上照明产品种类的日益丰富,从护眼台灯到护眼落地灯等各种选择足以让初次接触的宝妈们感到困惑,仿佛置身于一个复杂的选择迷宫。为了帮助大家筛选出真正优质的护眼灯,作为一位长期关注护眼照明领域的评测博主,我综合考虑了…

Swift里的数值变量的最大值和最小值

Swift里有很多种数值变量,如Int,Int8,Float,Double等。和绝大多数编程语言一样,由于是在计算机上运行,内存有限,所以必有最大值和最小值,而计算机无法处理超过该值的数。 在Swift中…

Unity 3D 概览一口气讲完!\(@^0^@)/

PS:好久没做Unity内容了,先做个合集凑合看着吧。。谢啦!!☆⌒(*^-゜)v Unity 3D 简介 Unity 3D 也称 Unity,是由 Unity Technologies 公司开发的一个让玩家轻松创建诸如三维视频游戏、建筑可视化、实时三维动画等类型互动内容的多平台的综…

AI大模型站在十字路口,持续突破or陷入低谷?

文|白 鸽 编|王一粟 当普通人被AI轰炸的已经疲劳,应用落地也没有惊人地突破,AI大模型的发展似乎已经进入瓶颈期。 在云栖大会之前,业界弥漫着对AI的唱衰,似乎又到了一个历史的转折点。如2017年上一代深度…

MySQL的索引——提高查找算法的数据结构 B+树

我们MYSQL服务器是在内存中的,所以所有的操作也是内存级的,索引也是如此 我们要提高算法的效率:首先要用一个好的数据存储结构储存数据,然后结构决定算法 所以——索引的本质就是一种提高算法效率组织的数据结构 缩印的主要价值体…

如何使用 React、TypeScript、TailwindCSS 和 Vite 创建 Chrome 插件

创建一个 Chrome 插件是一个有趣的项目,特别是当结合使用强大的工具如 React、TypeScript、TailwindCSS 和 Vite 时 在这篇文章中,我们将逐步引导完成整个过程,了解如何在 2024 年构建自己的 Chrome 插件。无论是经验丰富的开发者还是刚刚起…

Kafka 为什么这么快?

Kafka 是一款性能非常优秀的消息队列&#xff0c;每秒处理的消息体量可以达到千万级别。今天来聊一聊 Kafka 高性能背后的技术原理。 1 批量发送 Kafka 收发消息都是批量进行处理的。我们看一下 Kafka 生产者发送消息的代码&#xff1a; private Future<RecordMetadata>…

Mysql进阶——1

一.MySQL程序简介 本章介绍 MySQL 命令⾏程序以及在运⾏这些程序时指定选项的⼀般语法。 对常⽤程序进⾏详细的讲解&#xff0c;包括它们的选项。 MySQL安装完成通常会包含如下程序&#xff1a; • Linux系统程序⼀般在 /usr/bin⽬录下&#xff0c;可以通过命令查看&#x…

MySQL篇(索引)(持续更新迭代)

目录 一、简介 二、有无索引情况 1. 无索引情况 2. 有索引情况 3. 优劣势 三、索引结构 1. 简介 2. 存储引擎对于索引结构的支持情况 3. 为什么InnoDB默认的索引结构是Btree而不是其它树 3.1. 二叉树&#xff08;BinaryTree&#xff09; 3.2. 红黑树&#xff08;RB&a…

让模型评估模型:构建双代理RAG评估系统的步骤解析

在当前大语言模型(LLM)应用开发的背景下,一个关键问题是如何评估模型输出的准确性。我们需要确定哪些评估指标能够有效衡量提示(prompt)的效果,以及在多大程度上需要对提示进行优化。 为解决这一问题,我们将介绍一个基于双代理的RAG(检索增强生成)评估系统。该系统使用生成代理…

MySQL练手题--日期连续类型(困难)

一、准备工作 Create table If Not Exists Failed (fail_date date); Create table If Not Exists Succeeded (success_date date); Truncate table Failed; insert into Failed (fail_date) values (2018-12-28); insert into Failed (fail_date) values (2018-12-29); inser…

攻防世界-1-misc

下载附件&#xff0c;提示需要密码 提示密码是出题人的生日&#xff0c;这里可以自己定义一个关于生日的字典&#xff0c;使用字典生成工具&#xff0c;直接生成字典。&#xff08;我用的是19000101至20231231字典进行的爆破测试&#xff09; 使用archpr软件&#xff0c;和刚刚…

k8s下的网络通信与调度

目录 一、k8s网络通信 1、k8s通信整体架构 2、flannel网络插件 &#xff08;1&#xff09;flannel跨主机通信原理 &#xff08;2&#xff09;flannel支持的后端模式 3、calico网络插件 &#xff08;1&#xff09;简介 &#xff08;2&#xff09;网络架构 &#xff08;…

Css_动态渐变圆圈旋转效果

1、效果图 2、实现代码 <template><div class"box"><div class"line"></div><div class"lineNew"></div></div> </template><script lang"ts" setup></script><styl…