Self-supervised learning of a facial attribute embedding from video

news/2024/9/12 14:32:00/

Self-supervised learning of a facial attribute embedding from video

译题:视频中人脸属性嵌入的自监督学习

论文题目Self-supervised learning of a facial attribute embedding from video
译题视频中人脸属性嵌入的自监督学习
时间2018年
开源代码地址https://github.com/oawiles/FAb-Net

摘要:我们提出了一个自我监督的框架,通过简单地观看人脸随着时间的推移说话、大笑和移动的视频来学习面部属性。为了执行这项任务,我们引入了一个网络,面部属性网( FAb-Net ),它训练将来自同一视频面部轨迹的多个帧嵌入到一个公共的低维空间中。通过这种方法,我们做出了三个贡献:首先,我们表明网络可以通过预测每个帧的置信度/注意力掩码来利用来自多个源帧(source frame)的信息;其次,我们证明了使用课程学习制度(curriculum learning regime)可以提高学习嵌入;最后,我们证明了该网络学习了一种有意义的人脸嵌入,该嵌入对头部姿势、面部特征和面部表情(即面部属性)的信息进行编码,而无需使用任何标记数据进行监督。在这些任务上,我们与最先进的自我监督方法相当或优于最先进的自监督方法,并接近监督方法的性能。

1 引言

婴儿和儿童对与他们互动的人的面部表情有高度的感知能力[14,18]。在与人类用户交互时,理解和响应人们情绪状态变化的能力对于计算机视觉系统和情感系统同样重要。因此,能够预测头部姿势和表情是至关重要的。
最近,利用深度学习在情感识别和面部特征检测等各种任务上取得了最先进的成果。尽管取得了这些进步,但监督方法需要大量的标记数据,这些数据可能很昂贵,或者在现实的、不受约束的环境中很难获得,或者需要将数据分配给定义不明确的类别。例如,用三个人类注释器对情绪进行分类只能得到46%的一致性[2],而给野外姿势贴标签是出了名的困难。此外,独立执行每项任务并不能利用这样一个事实,即检测特征需要了解姿势和面部特征,而这些特征又与表情相对应。

因此,我们考虑以下问题:是否可以在没有任何手动标签的情况下,以自监督的方式学习对特征、姿势、情绪等进行编码的面部属性的嵌入?然后,可以使用线性层将学习到的嵌入用于另一个任务(例如,特征、姿势和表情预测)。为此,我们贡献了 FAb-Net,这是一个用于学习面部属性的低维人脸嵌入的自监督框架(第3节)。我们利用视频数据,其中包含来自不同视角和不同表情的同一个人的大量图像。仅给定与源帧和目标帧相对应的嵌入,网络的任务是通过预测它们之间的流场来将源帧映射到目标帧。该代理任务迫使网络将计算流场所需的信息(例如,头部姿势和表情)提取到源和目标嵌入中。在第3.1节中解释了单个源帧的设置后,我们介绍了我们的额外贡献:在第3.2节中,一种利用多个帧来改进学习嵌入的方法;以及如何使用第4节中训练 FAb-Net 的课程策略(curriculum strategy)来提高绩效。
图1
图1 FAb-Net 概述。在单源情况下(顶部),编码器-解码器架构将一个源帧和一个目标帧作为输入,并学习生成目标帧。编码器输出的 256维——源和目标属性嵌入——被连接并输入到解码器。解码器预测从源帧到目标帧的点对点对应关系,然后使用双线性采样器从源帧获得生成帧的 RGB 值。在生成的帧和目标帧之间的 L1 损耗的情况下训练网络。在多源情况下(底部),解码器还预测置信图,并且置信图用于加权不同源帧的贡献。

在第5节中,通过简单地学习线性层,提取学习的嵌入并将其用于各种任务,如特征检测、姿态回归和表情分类。我们在这些任务上的结果与其他自监督方法相当或优越,接近监督方法的性能。这些实验验证了我们的自监督框架学习对面部属性进行编码的假设,这对各种任务都很有用。最后,通过使用学习的嵌入来检索不同身份下具有相似面部属性的图像,对该方法进行了定性测试。

2 相关工作

自监督学习。自我监督的方法,如[12,38,43,62],不需要手动标记图像;相反,他们直接使用图像数据来为学习良好的特征表示提供代理监督。这些方法的好处是,使用大量可用数据学习的特征可以转移到具有较少甚至没有注释数据的其他任务/领域。为了从图像数据中提供进一步的监督,可以通过合成扭曲或旋转来变换图像本身,并训练网络来识别旋转[19]或学习等变像素嵌入[40,51,52]。

与我们的训练框架更直接相关的是使用视频数据的自我监督框架([1,8,11,16,17,21,22,30,34,44,55,56,58,61])。我们的方法特别建立在使用帧合成的方法[8,11,22,44,56,58]的基础上,尽管对我们来说,合成是一项代理任务,而不是最终目标。注意,与[16,30,34,55]不同,我们不使用视频中固有的时间排序信息;我们也不预测以过去帧的数量为条件的未来帧[44],也不明确地预测帧之间的运动作为卷积核[22,58],或者以另一种模态(例如,语音[8])。相反,我们将帧视为一个无序集,并提出了一个简单的公式:通过将源帧和目标帧嵌入到一个公共空间中,并在这些嵌入上调节从源帧到目标帧的转换,学习到的嵌入必须学会对转换所需的相关变化模式进行编码。

在我们工作的同时,Zhang等人[64]和Jakab等人[21]在[51]的基础上,使用发现的特征重建原始图像。然而,与这些工作不同的是,我们没有对学习的表示施加任何限制——例如将特征编码为热图的显式表示。

面部嵌入的监督学习。给定已知(标记的)属性信息,例如姿势或表情,可以通过以有监督的方式进行训练来学习嵌入,以直接预测属性[28,32,46],或以新的、已知的姿势、表情等生成(人脸、汽车或其他类别的)图像[13,25,53,59,68]。监督人脸嵌入的另一种方法是显式学习 3D 可变形(morphable)模型(3DMM)的参数[7]。由于装配 3DMM 相对昂贵,[3,50]使用特征或光度误差作为监督来学习端到端。然而,与我们的方法不同,这些方法要么需要基本事实标签,要么需要固定变化模式和嵌入的可变形模型(morphable model )。

一个有趣的中途点是弱监督,其中学习的对象或人脸嵌入分别以对象标签[39]或天气/地理位置信息[31]为条件。这需要额外的元数据,但会产生可以表示人脸的年龄和表情或对象的关键点等属性的嵌入。

3 方法

其目的是 训练网络学习以自监督的方式编码面部属性的嵌入,而不需要任何标签 。为此,通过学习如何将源转换为目标帧,训练网络从一个或多个源帧生成目标帧。源帧和目标帧取自说话的人的相同面部轨迹,即帧具有相同的身份,但具有不同的表情/姿势。该架构的概述如图1 所示,并在第 3.1节 中对单个源帧和第 3.2 节中对多个源帧进行了进一步描述(补充材料中提供了更多细节)。

3.1 单源帧架构

网络的输入是来自同一面部轨迹(face-track)的源帧 s s s 和目标帧 t t t 。这些通过具有共享权重的编码器,该编码器学习从输入帧到 256 维向量嵌入的映射 f f f(如 图1 所示)。与目标帧和源帧相对应的嵌入分别是 v t = f ( t ) v_t=f(t) vtf(t) v s = f ( s ) v_s=f(s) vsf(s) 。源嵌入和目标嵌入被级联以给出 512 维向量,该 512 维向量经由解码器被上采样。解码器学习从级联嵌入到双线性网格采样器的映射 g g g ,双线性网格采样器从源帧采样以创建新的生成帧 s ′ = g ( v t , v s ) ( s ) s' = g(v_t, v_s)(s) s=g(vt,vs)(s) 。精确地说, g g g 预测目标帧中每个像素位置 ( x , y ) (x, y) (x,y) 的偏移量 ( d x , d y ) (dx, dy) (dx,dy) ;生成的帧 s ′ s' s 在位置 ( x , y ) (x, y) (x,y) 处,通过根据以下偏移从源帧 s s s 采样来获得: s ′ ( x , y ) = s ( x + d x , y + d y ) s'(x, y) = s( x+dx, y+dy ) s(x,y)=s(x+dx,y+dy) 。对网络进行训练,以最大限度地减少生成帧和目标帧之间的 L 1 L1 L1 损失: L ( s ′ , t ) = ∣ ∣ t − s ′ ∣ ∣ 1 L(s', t) = || t-s'||_1 L(s,t)=∣∣ts1

这种设置强制嵌入 v s v_s vs v t v_t vt 分别表示源帧和目标帧的面部属性,因为解码器从源帧 s s s 映射以生成帧 s ′ s' s (即,它使用源帧 s s s 的像素 RGB 值来创建生成的 s ′ s' s —— [54]在这项工作的同时提出了类似的公式)。由于解码器是目标和源属性嵌入的函数,并且解码器是网络中唯一共享信息的地方,因此目标属性嵌入必须对关于表情和姿势的信息进行编码,以便解码器知道在源帧中从哪里采样,以及在生成的帧中将该信息放置在哪里。

3.2 多源帧架构

虽然使用两个帧进行训练强制网络学习高质量的嵌入,但可以利用额外的源帧来改进学习的嵌入。这是通过额外的解码器预测每个源帧的置信热图(1 通道图像)来实现的。热图表示网络对每个像素位置的流量的置信度——例如,如果源帧的姿态与目标帧的姿态非常不同,则置信热图的置信度很低。此外,它可以针对图像的子部分来表达这一点;如果嘴在源中是闭合的,但在目标帧中是打开的,则置信热图可以表达该区域的不确定性。置信热图 C i C_i Ci是使用软最大操作针对每个源帧 s i s_i si 按像素组合的。对于 n n n 个源帧,要最小化的损失函数如下所示 L = ∣ ∣ t − ∑ i = 1 n e C i ∗ ( g ( v t , v s i ) ( s i ) ) ∑ i = 1 n e C i ∣ ∣ 1 L = || t-\dfrac{\textstyle\sum_{i=1}^n e^{C_i}*(g(v_t, v_{s_i})(s_i))} {\textstyle\sum_{i=1}^n e^{C_i}} ||_1 L=∣∣ti=1neCii=1neCi(g(vt,vsi)(si))1

4 课程策略

网络的训练被分为几个阶段,因此,正如[5,27]所启发的那样,随着所给出的例子变得越来越困难,知识可以随着时间的推移而积累。前向通过计算的损失用于以类似于[33,37,48,49]的方式根据样本的难度对批次中的样本(即源帧对和目标帧对)进行排序。然而,这些方法只使用最困难的样本,这被发现会阻止我们的网络学习。与[37]类似,使用难度越来越大的样本对策略的成功至关重要。

给定 N 个随机选择的样本的批量大小,即源帧和目标帧对,执行前向传递并计算每个样本的损失。根据这种损失对样本进行排序。最初,损失仅在批次中第 50 百分位的样本上反向传播(即,通过正向传递计算出的损失最低的 0.5N 个样本)。这些被认为是更容易的样本。当验证集上的损失趋于平稳时,要反向传播的子集偏移 10(例如,第 10 至第 60 百分位范围内的样本)。重复4次,直到被反向传播的样本落入第 40~90 百分位范围。在这一点上,课程策略被终止,因为假设 90-100 范围内的样本太具挑战性或可能有问题(例如:背景发生了很大的变化,这太难学习)。

5 实验

在这部分,我评估网络和学习到的嵌入。在 5.1 节,将使用 FAb-Net 的学习表示的性能与最先进的自监督和监督方法在各种任务上的性能进行了比较:面部特征预测、头部姿势回归和表情分类。第 5.2 节讨论了使用额外源帧的好处,第5.3节展示了如何使用学习的表示来检索具有相似面部属性的图像。
训练 该模型在 VoxCeleb1VoxCeleb2 视频数据集上进行训练[9,36];我们将组合的数据集称为 VoxCeleb+。VoxCeleb+ 数据集由采访视频组成,其中包含约 7000 名演讲者的 100 多万次发言。帧以每秒1帧的速度提取。帧被裁剪,大小调整为 256 * 256 ,并且身份被随机地划分为 train/val/test(具有75/15/10的划分)。

模型在 PyTorch [42]中使用 SGD 进行训练,初始学习率为 0.001 ,动量为 0.9 。当使用第4节中描述的课程策略时,批量大小为 N=32,否则为 N=8。当验证集上的损失趋于平稳时,学习率除以因子 10。(如果使用课程策略,则只有在考虑 40-90 百分位时才会更新学习率。)重复此操作,直到损失收敛。有关训练的更多详细信息,请参阅支持材料。

5.1 使用嵌入进行回归和分类

首先,我们研究了在嵌入中学习到的表示,并通过挑战它来预测三种不同的属性:特征、姿势和表情,来评估它是否真的编码了面部属性。

设置。给定在 VoxCeleb+ 上训练的网络,从学习的嵌入到输出任务来训练线性回归器或分类器。线性回归器/分类器由两层组成:批处理范数[20],然后是无偏差的线性全连接层。使用 MSE 损失来训练回归任务。分类任务是用交叉熵损失进行训练的。编码器的参数是固定的,同时使用 Adam [23]在目标数据集的训练集上训练两个附加层,学习率为 0.001,b1=0.9 和 b2=0.999。

5.1.1 基线

**自监督。**先前有关于在我们评估的数据集上使用自我监督进行里程碑预测的出版物,但没有关于在标准数据集上预测情绪的出版物。因此,我们实现了一个自动编码器和一组最先进的自监督方法[19,63],用于对象检测和分割。基线使用与 FAb-Net 相同的体系结构进行训练,但具有相关的损失函数和训练目标。

对于[63],使用了 L L L a b ab ab 通道的回归损失。这些模型在 VoxCeleb+ 上进行训练,直到收敛,具有与 FAb-Net 相同的训练参数和数据扩充。支持材料中提供了更多详细信息。

VGG面部描述符。此外,我们还将其与 VGG Face 描述符进行了比较,该描述符是从在 VGG-Face 数据集[41]上训练的 VGG-16 网络的 4096 维 FC7 特征中获得的。与流行的观点相反,最近有研究表明,经过身份训练的网络确实保留了有关其他面部属性的信息[10,15]。我们使用 VGG Face 描述符来学习所需属性任务的线性回归/分类层。这提供了一个强有力的基线,所获得的结果证实了这一发现,即经过身份训练的网络确实编码了表达,在某种程度上也编码了姿势信息。然而,请注意,与我们的方法不同,这种人脸描述符需要大量的标记人脸图像数据集进行训练。

5.1.2 结果

面部特征。面部特征位置从学习的嵌入中回归,并与 MAFL [66]和更具挑战性的 300-W [47]数据集上的最先进方法进行比较。按照[51,66]中的概述进行评估,并给出眼间距离的误差。对于 MAFL ,对 19k/1k 训练/测试图像的5个面部特征进行回归。对于 300-W,对 3148/689 个 训练/测试 图像的 68 个特征进行回归,这些图像是从组合多个数据集[4,67,70]中获得的(如[51]中所述)。

结果如 表1 所示,一些定性结果如 图2 和 图3 所示。这些结果首先表明,通过额外的观点和我们的课程策略进行微调可以提高 FAb-Net 所学习的嵌入。其次,这些结果表明,我们的方法比最先进的无监督特征检测方法有竞争力或更好,比 VGG 人脸描述符基线更好,并且与最先进的监督方法有竞争力。即使其他自监督方法[21,51,52,64]被明确设计为检测特征,而我们的方法却没有。除此之外,我们的方法能够弥合 VoxCeleb+ 和 CelebA [32]之间的域差距(我们比较的其他自监督方法是在 CelebA 上预训练的)。
表1
表1 300-W 和 MAFL 数据集上的特征预测错误。越低越好
表2
表2 来自 [26] 中 AFLW 测试集的头部预测错误,越低越好。
图2
图2 FAb-Net 在 MAFL数据集上的特征预测可视化。一个点表示真实情况和交叉 FAb-Net 的预测。右侧显示了一个失败案例。
图3
图3 FAb-Net 在 300W 数据集上的特征预测可视化

姿势。学习的嵌入用于姿态预测,并与监督方法[26]和使用 VGG 人脸描述符进行比较。为了进行评估,使用AFLW 数据集[24]从给定的嵌入到头部姿势标签来训练线性回归,但在从[26]中省略了 AFLW 测试集的 1000 个图像之后。从 表2 中可以看出,FAb-Net 在预测滚转角方面表现更好, MAE 与[26]相当,后者由头部姿态标签监督。此外,我们的嵌入优于基于身份训练的 VGG 人脸描述符;即,我们学习的嵌入编码了更多关于头部姿势的信息。

表情。我们在两个数据集上评估了我们学习的嵌入用于表达估计的性能:AffectNet [35]和 EmotioNet [6],这两个数据集中都包含超过 900000 个图像。这些数据集是在“野外”获取的,而不是在受约束的环境中获取的 AffectNet包含 8 种面部表情(中性、快乐、悲伤、惊讶、恐惧、厌恶、愤怒、蔑视),EmotioNet 包含 11 个动作单元(AU)(AU的组合对应于面部表情)。
表3
表3 在 EmotioNet[6] 上最新的自监督和监督方法对多个面部动作单元 (AU) 的表情分类结果。AUC 越高越好
表4
表4 AffectNet [35]上最先进的自监督和监督方法的表达式分类结果。AUC 越高越好。

这两个数据集都是用一个未发布的测试集组织起来应对挑战的。因此,训练集被细分为两个子集;一个用于训练,另一个用于验证。原始数据集的验证集用于测试不同的模型。EmotioNet 的线性分类器使用每个 AU 的二进制交叉熵损失进行训练,而对于 AffectNet ,使用交叉熵损失。两个训练数据集都是高度不平衡的。结果,来自未被表示的类的示例被与类频率成反比地重新加权,以更严重地惩罚对未被表示类的图像进行错误分类的损失。

通过测量 ROC 曲线下面积(AUC),将 FAb-Net 学习的嵌入与许多自监督和监督方法进行比较。对于每个类别(例如情感或 AU ),AUC 是独立计算的,并且结果是所有类别的平均值。EmotioNet 和 AffectNet 的结果分别报告在 表3 和 表4 中,表明当给定相同的训练数据时,我们的网络在这两个指标上都比其他自监督方法表现更好。据推测,这是由于网络必须学习变换源帧才能生成目标帧。当面部的各个部分一起移动时(例如,当嘴巴张开时,眉毛抬起或嘴唇张开),嵌入必须学会对有关面部特征的信息进行编码,从而对表情进行编码。有趣的是,自动编码器的性能很好,可能是由于该域的限制性质。
图4
图4 通过 FAb-Net 学习的置信热图。强度越高,置信度越高。网络会选择姿势最相似的帧进行绘制,并忽略姿势不太相似的帧(请参见示例(a))。在示例(b)中,口腔在第三源帧中具有更高的置信度,从而允许网络重新构建存在于目标帧中的牙齿。在支持材料中可以找到更多示例。

尽管领域发生了变化,但 FAb-Net 也离监督方法不远;VoxCeleb+ 只包括被采访的人(因此大多数是中性/微笑的脸),因此它不包括 AffectNet 或 EmotioNet 中的表情范围/极端。最后,可以观察到,被训练来预测身份的 VGG 人脸描述符在预测情感方面表现得出奇地好。

讨论 FAb-Net 已经取得了令人印象深刻的性能,因为大多数自监督方法在转移到另一个任务时,与监督方法相比有很大的差距。对于较小的数据集(特征/姿势)没有差距或差距很小,并且模型接近于较大数据集(表达式)的监督性能。

5.2 外源帧有什么好处?

前面的部分已经表明,使用外源帧可以提高性能。这是以通过编码器执行额外的正向通过为代价的(在这种情况下是两次)。如果有足够的GPU 内存,这些前向传递可以并行进行,只影响内存需求,而不影响计算速度。

通过可视化图4中给定一组源帧的置信热图,进一步研究了使用多个源帧。置信热图允许具有更相似姿势的图像用于创建生成的帧。此外,网络可以集中在一个帧上用于生成面部的一部分(例如,嘴),而集中在另一个帧中用于不同的部分。

5.3 图片检索

本节考虑了学习嵌入的应用:检索具有相似面部属性(如姿势)但具有不同身份的图像。为了执行此任务,从 VoxCeleb+ 中获得 10000 个随机采样的测试图像的子集。对于给定的查询图像,使用相应嵌入之间的余弦相似性度量(cosine similarity metric),基于它们与查询图像的相似性来对所有其他图像(库)进行排序。对于给定的查询图像 Q Q Q,通过执行通过网络的前向传递来提取嵌入 x q x_q xq。类似地,为库中的每个图像 I i I_i Ii 提取嵌入 x i x_i xi。然后根据 x q x_q xq x i x_i xi 之间的余弦相似性对每个图像 I i I_i Ii 进行排序。如果网络确实对关于面部属性的显著信息进行了编码,则余弦相似度可以用于识别具有相似姿势和面部属性的图像。对于一组查询图像,结果如图5所示。从这些结果中可以再次确认,我们的嵌入对关于面部属性的信息进行了编码,因为检索到的图像具有与查询图像相似的姿势和表情。注意,嵌入在很大程度上不受面部装饰(例如眼镜)和身份的影响,因为这些在面部轨迹中不会改变,因此不需要学习来预测变换。
图5
图5 使用 FAb_Net 嵌入学习的检索结果。嵌入捕获相似的视觉属性,因为对于给定的查询图像检索具有相似面部属性的图库图像。检索到的图像在所有情况下都具有与查询相似的姿势,并且例如在(b)闭上眼睛和(a)稍微张开嘴的情况下可以看到表情相似性。有关其他示例,请参阅支持材料。

6 总结

我们引入了 FAb-Net :一个用于从视频中学习面部属性的自监督框架。我们的方法通过在没有任何手动标签的情况下观看大量视频中的人脸移动和变化来学习姿势和表情。然后,我们训练的网络的特征可以用于预测其他数据集上的姿势、特征和表情(尽管域发生了变化),只需在学习的嵌入之上训练一个线性层。这些特征已被证明在各种任务上与自监督和监督方法具有可比性或优越的性能。这令人印象深刻,因为通常情况下,自监督方法的性能比监督方法差,但在姿势回归和面部特征检测方面,我们的方法确实具有竞争力/优于监督方法,并且在表情分类方面接近监督性能。


http://www.ppmy.cn/news/48048.html

相关文章

VLAN与access接口、hybrid接口实验

[r1]dhcp enable //开启DHC0功能P [r1-GigabitEthernet0/0/0]int g 0/0/0.1 [r1-GigabitEthernet0/0/0.1]ip add 192.168.1.1 24 [r1-GigabitEthernet0/0/0.1]dhcp select interface //接口地址池 [r1-GigabitEthernet0/0/0.1]dhcp server dns-list 8.8.8.8 [r1-GigabitEthern…

网络安全-网站后台的寻找+网页JS文件信息收集

网络安全-网站后台的寻找网页JS文件信息收集 前言 一,我也是初学者记录的笔记 二,可能有错误的地方,请谨慎 三,欢迎各路大神指教 四,任何文章仅作为学习使用 五,学习网络安全知识请勿适用于违法行为 学习网…

【Unity】基于AVFoundation开发MacOS摄像头(一)

起因:unity的自带WebCamTexture在mac上使用导致崩溃或花屏 复现步骤: mac里要有多个摄像头实例(包括自带摄像头、虚拟摄像头、外接usb摄像头);启动自己的app;启动会议软件或其他任何一个可以切换摄像头的…

Window下编译PJSIP,不编译Media模块

Windows系统下使用VS2017进行编译PJSIP。 下载地址 PJSIP的地址:https://github.com/pjsip/pjproject 在线clone太慢的话,可以直接在这里下载比clone会快很多: https://github.com/pjsip/pjproject/releases 安装OpenSSL 直接安装已经编译…

Blender3.5 视图切换

目录 1. 数字小键盘切换视图1.1 正交顶视图1.2 正交前视图1.3 正交右视图1.4 透视图1.5 四格视图 2. 鼠标点击切换视图2.1 点击视图,根据需求选择对应视图2.2 点导航栏的坐标轴切换 3. 启用字母区数字键3.1 编辑——偏好设置——输入——勾选“模拟数字键” 1. 数字…

Downie 4 4.6.14 MAC上最新最好用的一款视频下载工具

Downie for Mac 简介 Downie是Mac下一个简单的下载管理器,可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 下载 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的…

使用计算机视觉实战项目精通 OpenCV:1~5

原文:Mastering OpenCV with Practical Computer Vision Projects 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线…

拿下模板进阶

模板进阶 1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将…

Java并发工具合集JUC大爆发

1. CountDownLatch CountDownLatch是一个同步计数器,初始化的时候 传入需要计数的线程等待数,可以是需要等待执行完成的线程数,或者大于 ,一般称为发令枪。\ ​ countdownlatch 是一个同步类工具,不涉及锁定&#xff0…

TitanIDE 新版本来袭,全新“效能看板”上线

TitanIDE产品团队于4月17日晚发布了TitanV2.6.3版本,作为一次重要的版本迭代,新版本主要增加/优化了以下重大功能: 全新效能看板上线,研发进度一目了然;新增代码拷贝、下载权限管理功能;项目启动提速&…

ObjectMapper 对象的基本使用(三)

一.简介 Jackson ObjectMapper可以从字符串、流或文件解析JSON,并创建Java对象或对象图来表示已解析的JSON。将JSON解析为Java对象也称为从JSON反序列化Java对象 Jackson ObjectMapper也可以从Java对象创建JSON. 从Java对象生成JSON的过程也被称为序列化Java对象到…

Leetcode912.排序数组(三路划分)

文章目录 一、三路划分二、Leetcode912.排序数组 一、三路划分 为何还会有三路划分? 快速排序算法在某个数据大量重复时效率极低,在运行程序时会超出时间限制,为了解决数据大量重复的情况下,三路划分诞生了。三路划分是基于快速排…

如何进行帕累托分析

【面试题】有一张“学生成绩表”,包含3个字段:学号、课程、成绩。 问题:找出每门课程A类和B类的学生,判断标准是累计占比,0~60%的记为A类,60%~85%记为B类 【解题思路】 什么是二八定律? 二八定律…

Java接口自动化测试框架系列:提升测试效率的自动化测试框架

目录:导读 一、什么是自动化测试 二、自动化测试的缺点 三、自动化测试框架选型 原则 对比 四、框架构建 【自动化测试工程师学习路线】 一、什么是自动化测试 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。 通常,在设计了测试…

5.java程序员必知必会类库之excel读写库

前言 Excel在数据处理中的重要性自不必说,我们经常会有需求,将数据库中的数据,做过一些处理后,导出一个Excel给运营人员分析。也有需求是将批量的商品数据等,批量录入到我们系统中。直观上可以理解为Excel是客户和系统…

前端学习:HTML JavaScript

目录 一、JavaScript 使HTML页面更具有动态性和交互性 浏览器中的 JavaScript 能做什么? 二、 HTML 三、HTML标签 ​编辑 四、JavaScript 的功能示例 1. JavaScript 能够更改内容: 2. JavaScript能够更改样式: 3.JavaScript能够更改属性…

【Ruby 2D】【unity learn】抬头显示血条

说起游戏开发,大家一般会觉得控制角色移动和制作血条哪个难呢? 或许都会觉得血条比较难吧。 是的,正是如此。 那么我们让我们来看看血条该怎么做吧 这是效果图 受伤后是这样的 首先是创建一张Canvas画布 这个画布会很大 相比之下我们的小…

Spring AOP: 多切面的顺序,性能及异常监控

目录标题 一、Sprig的AOP操作JDK动态代理CGLib动态代理基于xml开发Spring AOP基于注解开发Spring AOP 二、多切面的顺序基于注解的配置基于Ordered接口配置基于XML配置 三、性能及异常监控性能监控异常监控 四、工程目录及运行结果图 一、Sprig的AOP操作 JDK动态代理 //接口 …

【STL】map容器

1、map容 map中所有元素都是pair组成pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)所有元素都会根据元素的键值自动 排序 map/multimap属于关联式容器,底层结构由二叉树…

8万字智慧旅游景区信息化建设方案word

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 1.1. 整体建设框架 XXXXXX智慧景区旅游建设对于全面整合景区旅游资源,提升景区旅游产业发展能级,进一步增强景区旅游业的核心竞争力具有十分重要的支…