Stitch it in Time: GAN-Based Facial Editing of Real Videos翻译

news2024/11/16 21:39:40

代码地址

论文下载

摘要

      生成对抗网络在其潜空间内编码丰富语义的能力已被广泛用于面部图像编辑。然而,事实证明,在视频上复制他们的成功具有挑战性。高质量的面部视频集是缺乏的,在视频上存在一个需要克服的基本障碍——时间一致性。我们认为这种障碍很大程度上是人为的。源视频在时间上已经是连贯的,偏离这种状态的部分原因是在编辑思路中对各个组件的粗心处理。我们利用StyleGAN的自然对齐和神经网络学习低频函数的趋势,并证明它们提供了强一致的先验。我们利用这些见解,提出了一个视频中人脸语义编辑的框架,并证明了与目前最先进技术相比我们的框架具有显著改进。我们的方法产生了有意义的面部操作,保持了更高程度的时间一致性,并且可以应用于具有挑战性的、高质量的、会说话的头部视频(语音驱动头部动作的视频),目前的方法难以做到。

引言

      生成对抗网络(GANs)的出现带来了内容创作和操作领域的复兴,允许用户以直观的方式修改照片。特别是StyleGAN[21,22]的高度解纠缠潜空间已被广泛应用于面部图像的逼真编辑。然而,这些语义编辑工具大多局限于图像,因为视频的编辑强加了一个额外的挑战——保持时间一致性。对视频的任何操作都必须在所有视频帧中传播一致性。先前的工作建议通过训练GAN进行视频合成来解决这一挑战[36,47,51]。然而,由于缺乏高质量的视频数据集,以及额外的数据维度所产生的复杂性,视频GANs到目前为止还无法与单幅图像的质量相匹配。
      相反,我们建议通过在现成的、非时间的StyleGAN模型中使用通常的潜编辑技术来应对这一挑战。我们强调了一个关于视频编辑过程的基本假设:初始视频已经是一致的。与合成工作相反,我们不需要创造时间一致性,而只需要维持它。基于这种直觉,我们回顾了最近基于StyleGAN编辑思想的构建块,确定了可能出现时间不一致的点,并提出在许多情况下,这些不一致可以通过仔细选择工具来减轻。
      我们通过确定两种类型的时间不一致性开始我们的研究:局部-相邻帧之间的过渡不流畅,显示相当大的抖动,全局- GAN编辑过程中的不准确性,如身份的变化,随着时间的推移而增加。我们考虑最近提出的PTI [33];一种两步反演方法,首先找到一个“枢轴”——一个初始的潜码,可以通过生成器产生输入图像的近似值。然后,生成器的权重被微调,以便特定的“枢轴”代码可以更好地再现目标。PTI提供了强大的全局一致性,使身份与目标视频保持一致。然而,我们的调查显示,它在本地基准上表现不佳,并在编辑操作下产生不一致的反转。
      在这一点上,我们做了两个关键的观察:生成器是一个高度参数化的神经函数,已知它倾向于学习低频函数。因此,其输入潜码的微小变化可能只会导致生成图像的微小变化。此外,已有研究表明,基于风格的模型在微调下保持了令人难以置信的对齐,特别是在过渡到相邻域时[13,30,43]。因此,如果生成器对一组平滑变化的潜码进行一致的编辑,我们期望任何经过微调的生成器都类似地倾向于时间一致性。
      直觉考虑,我们认为PTI的局部不一致性出现在找到“枢轴”这个过程的第一步。更具体地说,采用的基于优化的反演是不一致的。高度相似的帧可以编码到潜空间的不同区域,即使是使用相同的初始化和随机噪声种子。另一方面,基于编码器的反演方法利用高度参数化的网络,因此也偏向于低频表征。因此,当编码器的输入只经历一个微小的变化时,例如在观察两个相邻的视频帧时,编码器可能会提供缓慢变化的潜特征。
      我们合并了两种方法:用于发现局部一致枢轴的编码器和用于促进全局一致性的生成器微调,并证明它们已经提供了强一致的先验。然而,对于编辑真实的视频来说,它们是不够的。由于StyleGAN 不能在整个帧上操作,我们需要将编辑过的裁切图像放回原始视频中。然而,反演和编辑方法通常会大量地破坏背景,使其结果难以融入原始帧。为此,我们设计了一种新颖的“还原-调优”操作,进一步调优生成器以提供空间一致的迁移。通过这样做,我们在保留编辑效果的同时实现了真正的混合。
在这里插入图片描述
图1   使用我们提出的思路的视频编辑。我们的框架可以成功地将一致的语义操作应用于具有挑战性的讲话头部视频,而不需要任何时间组件或损失。
      我们证明了我们提出的编辑思路可以无缝地将基于潜在语义的修改应用于真实视频中的人脸。虽然我们只使用非时间模型,但我们可以成功地编辑具有相当大的动作、复杂的背景、具有挑战性的讲话头部视频,这是目前的方法无法解决的问题。在图1中,我们展示了从使用我们的方法编辑的视频中提取的几帧。这些证明了我们改变野外场景并保持时间连贯性的能力。通过详细的消融研究,我们验证了每个建议的组件,并证明了其对真实性和一致性的贡献。所有的视频都可以作为我们的补充材料。

2、背景和相关工作

基于StyleGAN的编辑

      StyleGAN[21,22]采用基于风格的架构从语义丰富且高度结构化的潜空间生成高保真图像。值得注意的是,StyleGAN可以通过简单的潜码修改实现逼真的图像编辑。在此激励下,许多方法利用不同层面的监督方法,发现了有意义的潜方向。这些范围从全监督[3,10,14,34,37,38],如属性标签或面部3D先验,到全无监督和无样本方法[13,17,28,35,41,42,44]。

GAN反演方法

      然而,将这些编辑方法应用于真实图像需要首先找到给定图像对应的潜在表征,这一过程称为GAN反演[8,25,45,49,54]。有许多工作已经在以StyleGAN为背景下调研了反演方法。他们要么直接优化潜在向量以重现特定图像[1,2,6,15,33,46,56],要么在大量图像集合上训练有效的编码器[4,5,16,19,23,29,32,40,53]。通常,直接优化更准确,但编码器在推理方面更快。此外,由于编码器作为高参数神经函数估计器的性质,编码器显示出更平滑的行为,倾向于在相似的输入中产生更一致的结果。我们在工作中利用了这些好处。
      早期的反演方法在两个空间之一中生成编码:要么在StyleGAN的原生潜空间中,表示为W,要么在更有表现力的W+中,其中一个不同的潜码被分配给生成器的每个层。[40,56]已经证明W显示出更高程度的可编辑性-在这个空间中的潜码可以更容易地操纵,同时保持更高程度的真实性。另一方面,W提供了较差的表达能力,导致了与目标标识不一致的反演。Tov et al.[40]将此定义为扭曲-可编辑性权衡。他们认为,这两个方面可以通过设计一个编码器来平衡,该编码器预测W+中的编码,这些编码位于W附近。最近,Roich等人[33]证明了可以避开这种权衡。通过围绕初始反转编码(称为“pivot”)对生成器进行微调,他们实现了具有高可编辑性的最先进的重建。然而,单纯地将PTI应用于视频可能会导致时间不一致,因为不同的枢轴不一定是一致的。Xu等人提出了一种提高反演质量的不同方法,利用帧序列而不是单个图像。

使用StyleGAN的视频生成器

      虽然大多数工作都探索了StyleGAN在图像领域的使用,但最近的一些工作试图将其许多好处带入视频生成和操作领域。在生成方面,Skorokhodov等人[36]提出了一种基于样式的模型,该模型可以生成短的(例如3)连贯的帧序列。然而,他们的方法需要时间数据集,目前表现出较低的质量和不充分的数据。其他工作[12,39]训练第二个生成器为预训练的固定StyleGAN产生时间一致的潜码。他们的目标是解纠缠空间和时间信息。Tian等人[39]训练了一个基于时序LSTM的生成器。采用不同的方法,Fox等人[12]只使用一个视频。产生的潜在序列后来被投影到任意潜码上,从而产生随机主题的动画。然而,尽管提供了可靠的初始结果,这些方法并不能成功地可信地反演真实的视频或编辑它。

视频语义编辑

      许多方法建议对图像中的面部属性进行编辑[7,18,24,26,27]。然而,在帧级别应用这些通常会导致时间不一致,导致不真实的视频操作。为了克服这一挑战,人们提出了针对视频的方法。Duong等人[11]使用深度强化学习在视频序列中进行面部老化编辑。与我们的工作最接近的是,Yao等人[48]提出使用StyleGAN编辑真实视频,通过训练专用的潜码转换器来实现更多的解纠缠编辑。这些编辑应用了他们提出的思路的一部分,首先包括一个基于裁剪和对齐步骤的平滑光流,以减少抖动。然后,他们使用W+编码器[32]反转帧,使用专用转换器进行编辑,并使用泊松混合的分割掩码将它们缝合回原始视频。在我们的工作中,我们证明了通过构建高度一致的工具,我们可以在更具挑战性的设置中实现改进的编辑,并且使用更少的视觉材料——不需要任何流或基于时间的模块。

在这里插入图片描述
图2   我们完整的视频编辑思想包含6个步骤。(1)将视频分割成单独的帧。每一帧中的脸都是裁剪和对齐的。(2)使用预训练的e4e编码器,将每个裁剪的脸倒转嵌入预训练StyleGAN2模型的潜空间中。(3)使用PTI对所有视频帧并行进行微调,纠正初始反演中的不准确性并恢复全局一致性。(4)通过使用固定的方向和步长线性操作其枢轴潜码来编辑所有帧。(5)我们第二次微调生成器,以空间平滑的方式将背景和编辑过的人脸拼接在一起。(6)我们反转对齐步骤,将修改后的人脸粘贴到视频中。
在这里插入图片描述
图3   我们完整的编辑思路的可视化过程。左列显示了从源视频中提取的三帧。在接下来的列中,我们展示我们的思路在相同的三帧上的中间结果。从左到右:编码器反转步骤,PTI微调步骤,枢轴编辑步骤,最后是我们的拼接过程。当不应用我们的拼接过程时,我们使用基于分割掩码的混合过程[48]。特别注意颈部区域,在编辑步骤之后,它显示了大量的伪影,然后通过我们的缝合-微调方法消除了这些伪影。

3、方法

      给定一个真实的视频和一个语义潜在的编辑方向,我们的目标是生成一个编辑的视频。结果应保留原始帧的保真度,同时以时间一致的方式修改它们,实现有意义和现实的编辑。为此,我们提出了一个由六个部分组成思路:时间一致对齐、基于编码器的反转、生成器调优、编辑调优、拼接调优,以及最终将结果合并回原始帧。在下一节中,我们将详细描述每个核心步骤、用于实现它的工具以及每个选择背后的动机。我们整个思路的概述如图2所示。此外,图3提供了在编辑思路在不同阶段视频状态的可视化。

3.1、对齐

      我们使用预训练的StyleGAN2模型进行人脸编辑。然而,该模型是在FFHQ数据集上训练的,其中每张图像都经过预处理。特别是,每张图像都被裁剪并围绕面部对齐。因此,将图像成功地反转到GAN的潜空间需要类似的裁剪和对齐阶段。而这种预处理过程由离散步骤(例如裁剪)组成,这些步骤对提取的面部标志的确切位置非常敏感。这种敏感性会导致时间不一致的出现,因此我们的目标是降低它。受Fox等人[12]工作的启发,我们在标志上使用高斯低通滤波器。我们发现这种平滑足以克服由对齐步骤引起的任何不一致。

3.2、反演

      要编辑一个对齐的面,我们必须将它反转到GAN的潜空间中。我们使用PTI[33]来实现这一点,该方法首先发现一个“枢轴”潜码,该潜码可以在GAN更可编辑的区域大致重建输入图像,然后微调生成器,以便相同的枢轴编码将产生更准确的目标图像版本。PTI的目标是克服反演模型的扭曲性、可编辑性权衡,从而实现更准确但高度可编辑重建。我们认为,除了它最初的用途之外,PTI还可以帮助维持时间一致性。直观上,我们希望反转的原始视频本身在时间上是一致的。因此,如果我们能精确地再现每一帧,我们就保证有一个一致的反演。
      然而,在实践中,我们观察到PTI的编辑性能容易受到枢轴本身不一致的影响。这些表现为两种方式:首先,如果枢轴在潜空间中彼此相距很远,那么编辑就不那么一致了。例如,在潜空间的两个不同区域中编码的同一张脸,当潜码朝同一方向调整时,可能会长出不同的胡须。其次,如果PTI必须在反转中“修复”属性(例如缺少胡子),那么对属性的进一步编辑通常不会考虑这个修复。因此,如果属性在枢轴之间不一致(只在一些倒置的帧中出现胡子),那么PTI将只需要在一些帧中“修复”它,结果编辑将在这些帧中有所不同。
      我们提出,这两个缺陷都可以简单地通过用基于编码器的版本替换基于优化器的初始反转(即找到枢轴)的PTI来纠正,特别是e4e[40]。由于e4e是一个具有数百万个参数的深度神经网络,它天生倾向于学习低频表示[31]。我们期望这个属性将提供一个强大的平滑偏置,鼓励连续帧图像之间的任何相一致变化映射到一致变化的潜码中。在第4.2节中,我们分析了这个属性,并证明编码器的使用确实优于基于优化的反转。注意,此属性依赖于输入帧之间转换的平滑性,因此可以被不一致的对齐所破坏,从而引发第3.1节的变化。为了减少内存和时间需求,我们同时在所有枢轴潜码周围使用PTI(而不是为每一帧使用一个模型)。
      形式上,给定N帧源视频 { x i } i = 1 N \{x_i\}^N_{i=1} {xi}i=1N,我们将裁剪对齐的帧表示为 { c i } i = 1 N \{c_i\}^N_{i=1} {ci}i=1N。我们首先使用e4e编码器E来获得它们的潜反转 { w i } i = 1 N = { E ( c i ) } i = 1 N \{w_i\}^N_{i=1} = \{E(c_i)\}^N_{i=1} {wi}i=1N={E(ci)}i=1N。然后将这些潜向量用作PTI的“枢轴”。令 r i = G ( w i ; θ ) r_i = G(w_i;θ) ri=G(wi;θ)为隐码 w i w_i wi带有权重θ参数化的生成器G生成的图像, PTI目标定义为: m i n θ 1 N ∑ i = 1 N ( L L P I P S ( c i , r i ) + λ L 2 P L L 2 ( c i , r i ) ) + λ R P L R . (1) \underset{θ}{min}\frac{1}{N}\sum^{N}_{i=1}(\mathcal L_{LPIPS}(c_i, r_i) + λ^P_{L2}\mathcal L_{L2}(c_i, r_i)) + λ^P_R\mathcal L_R. \tag{1} θminN1i=1N(LLPIPS(ci,ri)+λL2PLL2(ci,ri))+λRPLR.(1)其中 L L P I P S \mathcal L_{LPIPS} LLPIPS是Zhang et al. [52]所提出的LPIPS感知损失。 L L 2 \mathcal L_{L2} LL2是像素级 MSE距离。 L R \mathcal L_R LR是 Roich et al. [33]所说的局部正则化。 λ L 2 P 、 λ R P λ^P_{L2}、λ^P_R λL2PλRP是整个实验中的常量

3.3、编辑

      获得了一组时间一致的反演之后,我们现在开始编辑它们。我们证明了我们的方法可以很好地使用现成的线性编辑技术[28,34]。我们期望,由于StyleGAN本身倾向于低频表示(并进一步受到路径长度正则化的激励),它将对附近的潜码应用足够一致的编辑。换句话说,如果我们使用StyleGAN编辑时序平滑的枢轴,我们期望生成一个时序平滑的序列。正如我们稍后所论证的,这种期望与我们的实验结果一致。形式上,给定语义潜在编辑方向 δ w δw δw,我们利用PTI-weights θ p θ_p θp来获得我们编辑的帧 e i = G ( w i + δ w ; θ p ) e_i = G(w_i + δw;θ_p) ei=G(wi+δw;θp)

3.4、拼接微调

在这里插入图片描述
图4  我们的拼接-调整方法的概述。我们首先使用修改过的枢轴编码生成编辑过的图像,然后使用现成的分割网络[50]对图像进行分割。分割掩码被扩张,创建一个边界区域。然后,我们对生成器进行微调,以便修改后的枢轴将提供一个图像(a)与人脸掩模(蓝色)内的原始编辑一致的图像,以及(b)与边界掩模(红色)内的原始背景一致的图像。我们使用微调生成器合成最终图像,并将其粘贴在扩张的掩模区域内(蓝色+红色)。
在这里插入图片描述
图7  与可选编辑思想的可视化比较。我们的方法保持了更高程度的时间一致性,产生了真实的编辑,并成功地减轻了混合诱导的伪影。
在这里插入图片描述
图9  定性地展示了我们组件的重要性。用优化步骤替换编码器会导致编辑一致性较差。没有PTI,身份随时间漂移,拼接性能下降。用基于掩模的混合方案替换拼接会产生视觉伪影,例如头发区域的尖锐过渡。我们的完整思路成功地避免了这些陷阱,并生成了一致的视频。
      作为最后一步,我们必须将编辑过的人脸 e i e_i ei注入到原始视频中。仅仅覆盖裁剪脸部的原始位置是不够的,因为编辑过程通常会导致在裁剪边界周围发生明显的背景变化。例如,图3和图9演示了在简单的缝合裁切块时出现伪影。先前的工作[48]通过使用从对齐步骤中检测到的标志提取的分割掩模并执行泊松混合来限制对面部区域的修改。然而,这样的拼接仍然容易在边界周围出现不一致,导致诸如轮廓出现伪迹等伪影(见图7)。我们建议通过一种受PTI启发的新型调谐技术来解决这一限制,称为拼接调谐。这种技术的概述如图4所示。对于每个编辑过的帧,我们在分割掩码的边缘指定一个边界。然后,我们围绕编辑过的主轴,以双重目标简单地微调生成器。首先,我们的目标是将边界恢复到反转前的值,即将边界完美地融合在原始框架中。其次,我们希望保留我们的编辑结果,通过要求在分割掩码覆盖的区域内与编辑帧相似。这个短暂的调整会话可以成功地恢复边界,并诱导平滑过渡到图像的中心,而不影响编辑的人脸。
      在形式上,我们首先使用现成的预训练的分割网络50]为所有帧生成分割掩码 { m i } i = 1 N \{m_i\}^N_{i=1} {mi}i=1N。然后,我们对每一个进行扩散,以获得一组扩展掩码 { m i d } i = 1 N \{m^d_i\}^N_{i=1} {mid}i=1N。边界定义为它们的元素异或运算符 b i i = 1 N = { m i ⊕ m i d } i = 1 N {b_i}^N_{i=1} = \{m_i⊕m^d_i\}^N_{i=1} bii=1N={mimid}i=1N。设 s i = G ( w i + δ w ; θ s t ) s_i = G(w_i + δw;θ_{st}) si=G(wi+δw;θst)表示拼接调整过程的结果,我们的第一个目标是将边界与原始图像混合: L b , i = L L 1 ( s i ⊙ b i , x i ⊙ b i ) , (2) \mathcal L_{b,i} = \mathcal L_{L1}(s_i \odot b_i ,xi \odot b_i), \tag{2} Lb,i=LL1(sibi,xibi),(2)其中 ⊙ \odot 表示对应元素相乘。第二个目标是保存编辑结果: L m , i = L L 1 ( s i ⊙ m i , e i ⊙ m i ) . (3) \mathcal L_{m,i} = \mathcal L_{L1}(s_i\odot m_i, e_i\odot m_i). \tag{3} Lm,i=LL1(simi,eimi).(3)这些损失项用于进一步优化每一帧的生成器权重 θ s t θ_{st} θst: m i n θ s t L b , i + λ m L m , i , (4) \underset{θ_{st}}{min} \mathcal L_{b,i} + λ_m\mathcal L_{m,i},\tag{4} θstminLb,i+λmLm,i,(4)其中权重用PTI的权重 θ p θ_p θp初始化, λ m λ_m λm在所有实验中均为常数。最后,我们执行反向对齐,并使用扩展掩模 m i d i = 1 N {m^d_i}^N_{i=1} midi=1N将每个帧 s i s_i si镶嵌到原始帧 x i x_i xi。高斯模糊可以进一步平滑掩模的边缘。

3.5、实验细节

      所有实验均设置 λ L 2 P = 10 , λ R P = 0.1 , λ m = 0.01 λ^P_{L2} = 10, λ^P_R = 0.1, λ_m = 0.01 λL2P=10λRP=0.1λm=0.01。当使用PTI调优模型时,我们使用3e−5的学习率并训练每个帧80次。当调整模型用于拼接时,我们将学习率提高到3e−4,并将训练迭代次数提高到每帧100次。对于所有其他实现细节,我们遵循PTI。

4、实验(略)

5、讨论

      提出了一种新的人脸视频语义编辑方法。通过使用光滑和一致的工具,我们证明了标准StyleGAN编辑技术可以很容易地应用于野外视频,而不影响时间一致性。
      虽然我们的方法在许多实际场景中工作得很好,但它仍然面临一些局限性。特别是,Style GAN对齐过程容易将部分头发(例如,辫子)留在裁剪区域之外。这些“外部”区域不进行任何语义操作,当试图修改头发长度或颜色等属性时,可能会导致不协调的过渡。在StyleGAN3[20]中研究的“纹理粘合”效果的形式出现了进一步的限制。使用每帧优化而不是潜空间插值可以显著降低这种影响。然而,在某些情况下,它仍然是可见的。我们希望随着StyleGAN3的反转和编辑工具的出现,它们可以与我们的方法结合起来,以获得无粘连的结果。
      也许令人惊讶的是,我们的框架可以生成连贯的视频,而不需要复杂的机制来直接执行时间一致性。这些结果表明,光谱和归纳偏差可以在保持一致性方面发挥关键作用,比试图通过损失项强制一致性产生显著优势。此外,我们强调了将编辑过的裁切块缝合到视频的挑战,并提出了一个指定的微调方案,可以避免与当前泊松混合方法相关的陷阱。展望未来,我们希望我们的方法可以通过具有时间意识的目标来改进,这些目标旨在补充它,而不是替代。例如,可以对输入视频上的反转编码器进行微调,以激发生成代码的更大一致性。

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

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

相关文章

【Leetcode面试常见题目题解】6. 电话号码的字母组合

题目描述 本文是LC第17题,电话号码的字母组合,题目描述如下: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意…

智能遍历测试在回归测试与健壮性测试的应用

首先来看业界用的较早也是经常听过的一款工具—— Monkey。这是 Android 官方提供的一个工具。谷歌原本设计这款工具是为了对 App 进行压力测试的。谷歌早期在设计 Android 的时候,Android 需要响应滑动、输入、音量、电话等事件,早期 activity 设计不完…

常见的 5 种 消息队列 使用场景

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题。 实现高性能,高可用,可伸缩和最终一致性架构。 使用较多的消息队列有 RocketMQ,RabbitMQ,Kafka&#xf…

Android实战场景 - 输入手机号、银行卡号、身份证号时动态格式化

在日常项目开发中,如果稍微严谨点的话,其中关于手机号、银行卡号、身份证号的输入格式有做了限制格式化操作,主要是为了给用户带来更好的体验感; 最近同事正好问到了我这个问题,虽然以前做过这类型功能,但是…

你了解RTK技术吗?—— 揭秘GNSS中的定位技术

上期文章中我们一起探讨了GNSS仿真及其对测试验证的重要意义,今天我们将一起走进GNSS中的定位技术—RTK技术。什么是RTK技术?传统RTK技术与网络RTK技术又有什么区别呢?随着GNSS系统的迅速发展,RTK技术由于可以在作业区域内提供实时…

OpenMLDB v0.7.0 发布

2023 新年伊始,OpenMLDB v0.7.0 正式发布。本次版本更新重点增强了易用性和稳定性,下文将详细介绍主要改进和更新内容。更多 0.7.0 版本内容详见链接:Release v0.7.0 4paradigm/OpenMLDB 系统性改进消息和错误码,提升易用性 在…

【数据库概论】第二章 关系数据库

第二章 关系数据库 目录第二章 关系数据库2.1 关系数据结构2.1.1关系2.1.2关系模式2.1.3关系数据库2.2 关系操作2.2.1 基本的关系操作2.2.2关系数据语言的分类2.3 关系的完整性2.3.1 实体完整性2.3.2 参照完整性2.3.3 用户定义的完整性2.4 关系代数2.4.1 传统集合运算2.4.2 专门…

multimodal remote sensing survey 遥感多模态综述阅读

遥感多模态 参考:From Single- to Multi-modal Remote Sensing Imagery Interpretation: A Survey and Taxonomy Keywords:multimodal remote sensing 文章目录遥感多模态AbstractIntroductionTaxonomy1. Multi-source Alignment1.1 Spatial Alignment1…

《MySQL系列-InnoDB引擎15》慢查询日志拓展-如何开启MySQL慢查询日志?

慢查询日志拓展-如何开启MySQL慢查询日志? 1.查看MySQL慢查询日志是否开启? show variables like %query%; 查询出的结果中,主要观察如下三条: long_query_time 通过long_query_time设置阈值,设置阈值后&#xff0c…

Linux学习笔记 超详细 0基础(中)

Vi/Vim编辑器在Linux下一切皆文件,Vi编辑器和Vim编辑器是可以直接对文本文件进行编辑和操作,没什么大区别,vim有颜色区分更美观,vim 文件路径文件名即可进入一般模式,一般模式就是只读文件,不可进行操作。V…

K8s: Windows 下安装 K8s 开源桌面面板工具 OpenLens 查看集群信息

写在前面 分享一个桌面端的 k8s 面板工具 OpenLens博文内容为 OpenLens 简单介绍和 下载安装教程。安装非常简单,感兴趣的小伙伴快去尝试吧理解不足小伙伴帮忙指正 我所渴求的,無非是將心中脫穎語出的本性付諸生活,為何竟如此艱難呢 ------赫尔曼黑塞《德…

《c++ primer》第三章 字符串、vector、数组

前言 本章内容相比第二章要简单不少,里面比较重要的内容主要是vector和迭代器,这里只是很简单的介绍了一下,在后续的章节会有更详细、复杂的说明。以下记录的都是比较重要或者易混淆的知识点,对于像string、vector只列举了部分方法…

Sentienl一:下载,启动

Hystrix :1需要自己搭建监控平台 2 没有一套web界面可以给我们进行更加细粒度化的配置流控,速率控制 服务熔断,服务降级 Sentinel: 1 单独一个组件,可以独立出来 2 直接界面化的细粒度统一配置 一:丰富的应用场景&…

【Linux】分布式版本控制工具Git的学习 | 在Linux上使用git

👑作者主页:安 度 因 🏠学习社区:安度因的学习社区 📖专栏链接:Linux 文章目录一、前言二、历史背景三、版本控制1、何为版本控制2、版本控制工具① 集中式版本控制工具② 分布式版本控制工具四、代码托管平…

React 学习笔记总结(八)

react-router6版本的学习笔记。 文章目录一、React Router 6二、router6版本的 安装 和 一级路由1. 安装router6版本2. Routes组件 和 Route的 element属性三、router6 之 重定向四、router6的 NavLink高亮五、router6 的 useRoutes路由表(重要)六、router6 的 嵌套路由七、rou…

编写自己的OPTEE CA/TA demo

前言 (默认你对optee有一点点点点了解) 一、hello_world分析 在\optee_examples\hello_world目录下,optee给出了一个简单的CA/TA示例。 hello_world的结构如下: 1、CA端 A.main.c main.c文件有效代码如下: #incl…

vue2组件之间的数据传递(组件之间使用mitt第三方模块创建事件中心进行订阅与发布)

目录 一、组件之间的通信 1、组件之间的关系:父子关系、兄弟关系、跨级关系 2、父子组件之间的通信(数据传递): 3、兄弟组件之间的通信(数据传输): 4、跨级组件之间的通信:provide / inject 类似于消息…

正则表达式 - 匹配开头、结尾、中间 - 某天气网站网页源代码分析

背景 爬取某天气网站数据,使用 Selenium 能够得到渲染数据后的页面源代码。特定日期的真实数据肯定只有1份,展示在页面表格中,但是源代码中提供了3个都有数据的 Table,而其中2个Table 的数据是通过 math.random 生成后填充&#…

ASP.NET Core 3.1系列(25)——Autofac中的泛型注册和程序集注册

1、前言 在实际开发业务中,泛型的应用非常广泛,而这也就产生了一个问题:泛型类和泛型接口该怎么注册?难道要开发者一行一行去写泛型构造参数吗?同时,实际业务中往往也会对项目进行分层设计,例如…

【十】Netty WebSocket协议栈开发

Netty WebSocket协议栈开发背景介绍HTTP 协议的弊端WebSocket 介绍WebSocket 特点WebSocket 连接建立Socket生命周期WebSocket关闭开发WebSocket 服务端功能介绍流程图代码实现jar 依赖WebSocket 服务端启动类 WebSocketServer服务端业务处理类 WebSocketServerHandlerWebSocke…