论文分享 | 利用单模态自监督学习实现多模态AVSR

本次分享上海交通大学发表在 ACL 2022 会议 的论文《Leveraging Unimodal Self-Supervised Learning for Multimodal AVSR》。该论文利用大规模单模态自监督学习构建多模态语音识别模型。

论文地址:

https://aclanthology.org/2022.acl-long.308.pdf

代码仓库:

https://github.com/LUMIA-Group/Leveraging-Self-Supervised-Learning-for-AVSR

Abstract

训练一个基于Transformer的模型需要大量的数据,然而获取对齐且有标注的多模态数据的成本很高,特别是用于音视频语音识别的数据(AVSR)。因此使用未标注的单模态数据非常有意义。另一方面,尽管大规模自监督学习的有效性在音频和视觉方面都得到了很好的证实,但是如何将这些预训练模型融合到多模态场景中仍尚未得到充分探索。在本工作中,我们成功利用单模态自监督学习来优化多模态的AVSR。特别的是,音频和视觉前端是在大规模单模态数据上进行训练,然后我们将两个前端组件融合进一个大的多模态框架中,该框架通过CTC和seq2seq组合解码,将并行的音频-视觉数据识别为字符。我们表明,两个通过单模态自监督学习的组件很好的进行了合作,使得该多模态框架通过微调产生了有竞争力的结果。我们的模型在单词级和句子级的任务上都经过了实验验证。值得注意的是,尽管没有额外使用语言模型,我们的模型也大幅提高了在被广泛接受的LRS2数据集上的SOTA的性能,相对提高了30%。

Introduction

视听语音识别(ASVR)是一个利用人类语音和对齐的嘴唇移动视频作为输入的语音识别任务。近些年,它已经成为多模态成功应用的领域之一。由于已标注的多模态对齐数据的数量有限,并且视觉输入(唇语)难以识别,因此这是一件很有挑战性的任务。

现有的ASVR模型倾向于使用额外的数据来提高系统性能,其形式为在训练过程中插入额外的监督学习阶段。例如,很多现有的方法依赖一个外部的句子级分类器来引导其对视觉特征的学习。Petridis et al.(2018),Zhang et al.(2019)在学习AVSR任务前,用LRW(Chung and Zisserman, 2016)训练他们的视觉前端。Afouras(2018a,b)将MV-LRS数据(Chung and Zisserman, 2017)分成单词片段,并通过分类来预训练模型。VoxCeleb(Chung et al., 2018)也因同样的原因被用于Afouras(2020)。学习一个有效的视觉前端依旧是出了名的难,即使引入这些外部的监督学习阶段。有时需要课程学习来将已训练的视觉前端改编进ASVR任务(Afouras et al.,2018a)。大规模AVSR数据的端到端学习直到最近才取得成功(Ma et al., 2021)。

尽管自监督学习能够利用未标注的甚至是未对齐的数据,但他在ASVR任务上还未被充分探索。Shukla et al.(2020)是在这方面为数不多的尝试之一,他根据音频输入预测嘴唇移动。他们提出的学习方案在情感识别展现了强大的效果,但是在语音识别方面相对较弱。此外,由于在ASVR中,帧间的嘴唇形状和运动相对于单个图像中的信息对语音识别更重要,针对单帧图像的预训练视觉模型能否适用在ASVR上仍未可知。在另一方面,单模态的自监督学习作为一种从未标注示例中学习一般表示的范式已经被广泛认可,例如在自然语言处理(Brown et al., 2020; Devlin et al., 2019),语音识别(Baevski et al., 2020),和计算机视觉中(He et al., 2019; Chen et al., 2020a; Grill et al., 2020)。

在本工作中,我们依赖一种简单但有效的方法,该方法是通过自监督学习的单模态预训练模型来利用未标注的单模态数据。具体来说,我们在大的LibriLight(Kahn et al., 2020)数据集上利用Baevski et al.(2020)来预训练我们的音频前端。对于视觉前端,我们发现利用预训练模型并不那么简单吗,因此我们不得不使用一个3D卷积层来替换MoCo v2(Chen et al., 2020b)的第一个卷积层,并使用LRW来微调他。总的来说,我们的方法不需要一个课程学习阶段,总体训练时长也减少了。

实验结果表明,我们新的前端无论在视觉还是听觉都显著优于之前的前端,最终在ASVR上达到了SOTA的效果。据我们所知,这是第一个在ASVR的多模态配置中成功利用单模态预训练模型的工作。

Related works

2.1  Audio-Visual Speech Recognition

最早的AVSR工作能追溯到大约20年之前,当Dupont and Luet-tin(2000)展示了手工制作的视觉特征改进了给予HMM的ASR系统。第一个现代的AVSR系统在Afouras et al.(2018a)提出,其使用了深度神经网络。此后该领域得到了迅速地发展。大多数工作致力于架构的改进,例如Zhang et al.(2019)提出了临时焦点块(temporal focal block)和临时空间(spatio-temporal)的融合,Lee et al.(2020)使用Transformer和跨模态注意力。

另一条研究路线是关注更多样的学习方案来提高ASVR性能。Li et al.(2019)使用一种模型间学生、教师的训练方案。Paraskevopoulos et al.(2020)提出一种多任务学习方案使得模型既能进行字符级预测,也能进行分词级预测。自监督学习也被Shukla et al.(2020)所探索,其中通过从音频输入预测视频帧来利用跨模态配置。

端到端学习的ASVR系统首次出现在Tao and Busso(2020),尽管数据集必LRS2简单的多。最近的工作(Ma et al., 2021)已经成功使用Conformer声学模型和混合CTC/attention解码器在LRS2上实现端到端学习。

2.2 Self-Supervised Learning

自监督学习在近些年热度很高,因为其能够通过简单任务学习到数据的一般表示,且不依赖已标注的数据。在该领域中对比学习(Hadsell et al., 2006)是最有效的学习方案。在自然语言处理领域,单、双向语言建模(Brown et al., 2020; Devlin et al., 2019)已被用于多种任务来显著提高性能。在音频语音识别领域,对比预测编码(Baevski et al., 2020)已被证明在语音识别方面非常强大。在视觉领域,早期工作通过基于图像处理的方法创建自监督任务,例如失真(Gidaris et al., 2018),着色 (Zhang et al., 2016),上下文预测(Doersch et al., 2015)。最近,对比学习作为自监督学习的范式出现,从而产生了一组更富有表现力的一般视觉表示,例如MoCo(He et al., 2019; Chen et al., 2020b),SimCLR(Chen et al., 2020a),BYOL (Grill et al., 2020)等。

Architecture

我们模型的整体架构如图1所示。视听模型由四个组件组成:两种模态的前后端、融合模块、解码器。

3.1 Front-ends

视觉前端:视觉前端是一个捕获嘴唇运动以及反映嘴唇位置变化并输出其表示的组件。一个将预训练模型作为视觉前端的简单方式是直接将每帧的RGB通道作为输入。然而,由于在ASVR的同一段视频的帧中内容十分相似,而大多数预训练模型的视觉目标是反映整张图像内容的一般表示,这会导致所有帧会得到相似的结果,丢失帧间的嘴唇位置差异的信息。

为了解决上述问题来继续利用预训练模型,我们截掉了在ImageNet(Deng et al., 2009)上预训练的MoCo v2(Chen et al., 2020b)模型的第一个卷积层,并用一个3D卷积层替换他。3D卷积层的输出与MoCo v2(见表1)的第一个ResBlock的输入相同,因此提供了一个兼容的接口来将MoCo v2的上层迁移到此任务中。另一方面,我们采用一种常见的方法:在输入模型前将RGB图像转为灰度图像,以此来防止模型学习到色差信息。

音频前端:音频前端相对简单。我们使用在Libri-Light数据集(Kahn et al., 2020)上预训练的wav2vec 2.0模型(Schnei-der et al., 2019),就像其通常被用在ASR任务上一样,一维卷积层和堆叠起来的Transformer编码器都迁移到我们的音频前端上。音频前端以16kHz的原始音频作为输入,并每20ms生成一个向量表示。音频特征维度如表2所示。

图片

3.2 Back-ends

由于视频帧为25FPS,而wav2vec 2.0输出约为49Hz,需要注意到视觉前端输出的逐帧信息频率和音频前端输出的表示存在两倍的差异。在后端,我们利用一维卷积层在时间维度上结合Transformer编码器来提供单模态的时间建模,同时调整特征至具备相同的频率。

视觉后端:由MoCo v2输出到视觉后端的输入为每秒25个,特征维度为2048的向量。在视觉后端中,我们保持了这一频率,将特征维度减小到512。见表1。对与Transformer的位置编码,我们使用正弦函数形式的固定位置编码。

音频后端:由wav2vec 2.0输出到音频后端的输入为每秒50个,特征维度为1024的向量。我们通过设置一维卷积层的步长为2来降低频率。Transformer编码器和视觉后端的具有相同的大小,但使用一组单独的参数。表2更清晰的显示了音频前后端的维度。

图片

3.3 Fusion Module

在这一节中,会对音频和视频模块输出的特征进行融合,形成25Hz,1024维的相对较低速率向量表示。特别的,我们对每种模态在特征维度上分别使用LayerNorm (Ba et al., 2016)在将他们连在一起之前。LayerNorm是必要的,他能避免一种模态以较大的方差在整体表示中占据压倒性的地位。类似的,一维卷积层和后续的6层Transformer编码器将融合表示作为输入,并将其编码后供解码器使用。

3.4 Decoders

按照Petridis et al. (2018)的设置,同时训练两个基于相同的融合模块输出的解码器。

第一个是一个Transformer seq2seq解码器,使用6层的Transformer解码器,我们在训练期间使用真实字符作为输入,在字符级执行强制教学。

第二个可论证为一个解码器,因为他生成每个时间步的字符概率,并在训练阶段依赖CTC损失。在Transformer编码器的顶层输出之上使用4个额外的带有ReLU激活的一维卷积层。我们还在层之间添加了LayerNorm。

3.5 Loss Functions

在本工作中,我们训练过程中使用称为混合CTC/attention损失(Watanabe et al., 2017)的方法。令X=[x1, ..., xT]作为融合模块中Transformer编码器输入的帧序列,Y=[y1, ...., yL]作为目标,其中T和L为输入和目标的长度。

CTC损失检测假设在每个输出预测之间具有条件独立性,并具有以下形式:

图片

另一方面,自回归编码器根据链式法则,直接估计后续,摆脱了这一假设,其形式为:

图片

总体的目标函数计算如下:

图片

其中,λ控制混合CTC/attention损失机制中的CTC损失和seq2seq损失之间的相对权重。不仅在整合两个损失至训练损失中需要权重,并且在解码过程中融合两个预测结果时也需要权重,我们会在下一小节中进行讨论.

3.6 Training Pipeline

最终的AVSR模型是通过一系列训练阶段实现的。

对于音频模态,音频前端首先通过自监督学习来预训练,这是由wav2vec 2.0完成的。然后,通过纯音频(AO)设置以及专用解码器来训练音频的前端和后端。

对于视觉模态,视觉前端首先通过自监督学习进行预训练,然后通过对LRW数据中单词级视频片段进行序列分类来修改和训练。之后,视觉前端继承于纯视觉(VO)模型,其使用视觉后端和专用解码器。

在纯音频模型和纯视觉模型收敛后,就可以训练最终的AVSR模型。由于算力限制,我们预先计算音频和视觉的后端输出,并在最终阶段只学习融合模型和解码器部分的参数。我们训练流程的详细可视化见图2。

3.7 Decoding

联合使用CTC/attention一次性解码(Watanabe et al., 2017)和束搜索来执行解码。我们使用浅层融合来合并CTC以及seq2seq预测结果:

图片

其中ˆY表示目标符号的预测集,而α是在验证集上调整的相对权重。

Experiments

在本节中,我们首先介绍模型中各个组件使用的数据集和何种配置。之后,我们将展示纯音频、纯视觉和视听配置的结果。我们还通过消融实验来对每个组件的贡献进行了细分。

4.1 Dataset

我们使用大规模公开ASVR数据集,Lip Reading Sentences 2 (LRS2)(Chung et al., 2017)作为我们主要的测试平台。在训练过程中,我们使用Lip Reading in the Wild (LRW) (Chung and Zisserman, 2016)单词级的视频分类任务来预训练我们的视觉前端。

LRS2包含224小时的对齐音视频数据,总共144K个BBC视频片段,每个视频片段为句子级别。训练数据包含超过2M的单词实例和超过40K的词汇表。该数据集十分具有挑战性,因为头部姿态、照明条件、种类和说话人数量各不相同。

LRW是单词级别数据集,包含157小时对齐的音视频数据,总计489K个BBC视频片段,每个包含超过500个词汇中的单个词的发音。视频的固定长度为29帧,目标词出现在视频片段的中间,并被协同发音包围。所有视频都是正面或者近正面的。在我们的实验中,仅将视觉模态用于我们的视觉前端的训练。

4.2 Experimental Settings

我们使用输出大小为40的字符级预测,包含26个英文字母,10个数字,省略号,[space]、[blank]和[EOS/SOS]的特殊token。由于数据集的转录不包含其他标点符号,所以我们不在词汇表中包含他们。

我们的实验基于Pytorch(Paszke et al., 2019),使用四个NVIDIA A100 GPUs,共计160G显存,训练时长一星期。忘了使用Adam优化器(Kingma and Ba, 2015),β1 = 0.9,β2 = 0.999,Epsilon = 10e−8,初始学习率为10e-4。我们使用权重为0.01的标签平滑,并对学习率进行预热以及采用ReduceLROnPlateau的学习率降低策略。CTC损失和seq2seq损失的相对权重λ设置为0.2。在解码阶段,我们设置α为0.1。为了匹配训练集的视频片段长度,通过随机采样整个语句的1/3的单词的连续范围来裁剪预训练集中的样本。超过160帧的样本将被截断以减少内存占用。

预处理:我们使用dlib(King, 2009)对每个视频检测并提取68面部特征点。为了消除面部旋转缩放的差异,使用相似变换将面部与神经参照系对齐(Martínez et al. 2020)。使用插值法和窗宽为12的帧平滑来处理dlib检测失败的帧。然后使用120*120的外接框来裁剪嘴部ROI。裁剪后的帧进一步转换为灰度图,并根据训练集整体的均值和方差来进行归一化。每个原始音频波形归一化为零均值和单位方差(Baevski et al. 2020)。

数据增强:按照Ma et al. (2021)的方法,在训练纯视觉模型和视听模型时,对给定的图片序列的所有帧进行随机裁剪一个尺寸为112*112,以0.5的概率水平翻转。在纯音频模型和音视频模型训练中,对于每个音频波形,按照Afouras et al. (2018a)的方法,在时域中添加噪声。Babble噪声以5dB的SNR和Pn=0.25的概率添加到音频流中。其由LRS2的20个不同音频样本混合合成而来。

评估:对于所有实验,都会报告单词错误率(WER),其定义为WER = (S + D + I)/N,其中S、D、I分别表示替换、删除和插入次数,N为单词数。在评估阶段的音频波形加入与训练阶段相同设置的噪声,同时我们设置不同的种子来避免模型拟合特定的噪声。解码联合使用CTC/attention一次性解码和束宽为5的束搜索(该值由在LRS2保留的验证集上确定)。在实验中我们没有使用额外的语言模型。

4.3 Results

我们在表3中列出了所有实验的结果,报告了纯视觉、纯音频和视听模型的WER。请注意,此处列出的许多模型也在训练过程的不同阶段使用额外的训练数据,例如MVLRS (Chung and Zisserman, 2017), LRS3 (Afouras et al., 2018b), LibriSpeech (Panayotov et al., 2015)以及LRW。

图片

我们在表4中列出了我们的模型、TM-CTC 模型(Afouras et al.,2018a)和当前SOTA模型(Ma et al.,2021)的参数。我们的模型后端和融合模块配置遵循TM-CTC模型,seq2seq解码器中的超参数设置与后端相同。最显着的区别是我们利用预先训练的前端,从而产生更大的模型尺寸。

图片

视听配置:在视听配置中,LRS2中的预训练集和训练集被用作最终训练阶段的训练集。我们提出的视听模型在没有外部语言模型帮助的情况下实现了2.6%的WER,比当前SOTA的技术提高了1.1%(Ma et al, 2021)。这是一个比较大的进步,相对提升了30%左右。

纯音频配置:用于训练纯音频模型的训练数据包括来自LRS2的224小时标记数据,以及通过继承wav2vec 2.0参数间接使用的LibriLight(Kahn  et al,2020)的60K小时未标记数据。我们的模型还实现了2.7%的WER,这将当前SOTA的模型(Ma et al, 2021)的WER降低了1.2%,相对提高了31%。

纯视觉配置:纯视觉模型在其预训练和训练集中使用带标签的LRS2数据,LRW用于监督预训练,并通过MoCo v2间接使用来自ImageNet的1.28M张未标注的图像。纯视觉模型的WER为43.2%,落后于当前SOTA的E2E Conformer模型(Ma et al,2021)5.3%。与E2E Conformer相比,主要区别在于解码时使用了大型Transformer语言模型,这本身在消融研究中与普通RNN语言模型相比带来了4.5%的差异(Ma et al, 2021)。我们的纯视觉模型与带有RNN语言模型的E2E Conformer模型之间的差距为0.8%,处于相当合理的范围内。此外,我们使用6层Transformer编码器进行时间建模,而不是 12 层 Conformer 编码器,这使得后端尺寸更小。

如果我们考虑通过仅考察基准而不使用外部语言模型来进行更公平的比较,报告最好的基准是 Ren et al.(2021),其WER为49.2%,落后我们的模型6.0%。

4.4 Ablation Studies

在本节中,我们通过在LRW、纯音频和纯视觉设置中测试每个单独的模块来研究它们的影响。

MoCo v2在视觉词分类方面的贡献:LRW上的视觉词分类结果如表5所示。我们首先通过将Stafylakis和Tzimiropoulos(2017)中的ResNet-18前端替换为ResNet-50前端来训练模型,该前端与MoCo v2的大小相匹配,但具有新的权重。结果是存在2.1%的改进。然后,我们使用MoCo v2权重初始化ResNet-50前端,观察到2.3%的进一步改进,这意味着自监督学习实际上可以更好地表示嘴唇运动。此外,当使用6层Transformer编码器代替TCN作为后端时,我们可以观察到另一个6.0%的改进。我们还注意到,使用MoCo v2前端可以显著减少训练时间。

图片

纯音频配置中的性能:LRS2上的纯音频模型结果如表6所示。从Afouras et al. (2018a)开始,我们首先通过在LibriSpeech上预训练的wav2vec 2.0前端替换STFT音频模块来训练模型,结果提高了11.1%。然后,我们使用在更大的未标注单模态数据集Libri-Light上学习的另一个预训练模型,观察到进一步的提升为0.6%。我们在训练阶段使用混合CTC/attention解码器进一步训练模型,这又带来了0.9%的改进。

图片

纯视觉配置中的性能:LRS2上的纯视觉模型的结果如表7所示。从Afouras et al.

(2018a)开始,我们首先使用混合CTC/attention解码器引入端到端训练(前端仍然通过LRW进行预训练),提升了16.0%。然后我们用预训练的MoCo v2权重初始化前端,相同的端到端训练方式导致进一步提升5.8%。

图片

噪声输入下的鲁棒性:为了评估模型对音频噪声的容忍度,我们测试了模型在不同SNR水平的杂音噪声下的性能。当SNR水平为0dB时,我们的纯音频和视听模型的WER分别达到32.5%和24.5%,将Afouras et al. (2018a)报告的结果减少25.5%和9%。当SNR水平升至5dB时,我们的纯音频和视听模型获得的WER分别为6.8%和6.3%。

除了在嘈杂噪声环境下比基线模型取得显著改进之外,我们还进一步研究了人类噪声环境下的模型性能。人类噪声极具挑战性,因为噪声本身包含一些单词,而模型无法轻松区分哪个音频信号是要识别的。我们通过从LRS2数据集中的不同音频样本中随机裁剪许多1秒的信号来合成人类噪声。如图3所示,我们进行了不同级别的人类噪声的实验,模型使用Babble噪声增强音频进行训练。当SNR水平下降到0db以下时,WER会大幅增加。这是因为模型可能无法在低信噪比水平下区分两个重叠的口语单词。并且每个SNR水平下的整体性能都比Babble噪声差,这表明具有特定信息的噪声比杂乱的Babble噪声更难。

图片

图片

资源匮乏下的识别:使用自监督预训练模型的一个显着好处是训练模型只需要少量标注的数据。为了进一步研究模型在低资源环境下的性能,我们使用LRS2的28小时训练集来训练纯音频和纯视觉模型。结果如表9所示。使用28小时数据训练的纯音频模型的WER为3.4%,比使用224小时数据训练的模型稍差一些。结果表明,对于纯音频模型,在大规模单模态数据集上预训练的自监督模型可以显著减少数据需求。然而用28小时数据训练的纯视觉模型与用224小时数据训练的模型有很大差距,原因可能是纯视觉模型训练难度更大,需要的数据量更大。

图片

4.5 Discussion and Conclusion

在这项工作中,我们提出通过简单地合并在大量未标注的单模态数据上训练的预训练模型来用于AVSR的自监督学习。尽管视觉预训练模型不能直接移植到视觉前端,但我们仍然设法将预训练模型集成到AVSR任务的两种模式中。实验结果令人印象深刻,相对提高了30%。

有趣的是,音频模态中的自监督模型比视觉模型有更大的改进。我们认为原因可归纳如下:

·音频模态的训练数据规模明显大于视觉模态,用于预训练wav2vec 2.0的Libri-Light数据集包含60K小时的音频信号,而ImageNet数据集只有1.28M图像,大致相当25FPS下,14小时的无声视频。

·MoCo v2模型在图像上进行了预训练,以更好地表示帧级内容,但没有预训练步骤来对帧间的相关性进行建模。相比之下,wav2vec 2.0模型是在一致的音频上进行预训练的,因此具有更好的建模能力。

由于AVSR领域还没有出现一种占主导地位的跨模态自监督学习方法,因此在未来的工作中,我们将在这项工作的基础上探索自监督学习场景的另外两个方向。第一个是利用视觉域内的时间相关性,而另一个是音频和视觉模态之间的跨模态相关性。我们希望这项工作能够为多模态自监督学习铺平道路,特别是对于AVSR的各个方面。

论文翻译:内蒙古大学计算机学院2023级硕士研究生 袁宏宇 (导师:刘瑞研究员)

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

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

相关文章

css 写带三角形的对话框,空心的三角形边框

首先,我们要会先实现一个小三角形; 思路:利用元素的 border 属性,将其三个方向的 border-color 值设为透明色(或者和其父元素的背景色一致,形成视觉差,俗称障眼法),剩下…

操作系统学习笔记--进程与线程

进程 概念 不同的角度有不同的定义 进程是程序的一次执行过程进程是一个程序及其数据在处理机上顺序执行时所发生的活动进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位 进程:是动态的,是…

ESP-07S进行TCP 通信测试

一,TCP Server 为 AP 模式,TCP Client 为 Station 模式。 这里电脑pc作为TCP Server,ESP-07S作为TCP Client 。 二,电脑端配置。 1,开启热点。 2,转到“设置”,编辑热点信息。 3,关闭…

nio 文件传输

transferto方法一次只能传输2个g的数据 文件大于2个g时

动态壁纸软件iWall mac中文特色

iWall for mac是一款动态壁纸软件,它可以使用任何格式的漂亮视频(无须转换),音频(可视化功能),图片,动画,Flash,gif,swf,程序,网页,网站做为您的动态壁纸&…

90后整顿秦始皇老板

我的日常就像跑步机上急速前行的仓鼠,使劲往前冲,心有余力力有限。 我在一个电商运营公司做策划和写文案,每天总是加不完的班,从来没见过下午六点钟的太阳。 我做文案吗?唉,说实话,我倒觉得大…

HP打印机一点击打印就出现Windows资源管理器已停止工作问题解决

本次处理的打印机型号是HP Officejet 200 移动便携式打印机,不过其他型号如果出现类似现象,解决方法应该是一致的。 在弹出Windows资源管理器已停止工作的报错提示框后,点击左下角的详细信息,看到的内容显示是KernelBase.dll崩溃…

第二证券:汽车产业链股活跃,恒勃股份、博俊科技“20cm”涨停

轿车产业链股9日盘中走势活跃,截至发稿,恒勃股份、博俊科技“20cm”涨停,德迈仕涨超17%,上声电子涨超14%,川环科技涨超10%,圣龙股份、科华控股、沪光股份、上海沿浦、日盈电子、赛力斯等均涨停。 工作方面…

Feign(替代RestTemplate)远程调用

Feign初步学习 定义 Feign 是一个基于 Java 的 HTTP 客户端库,它是 Spring Cloud 中的一部分,用于简化微服务之间的 HTTP 通信。与传统的使用 RestTemplate 来调用 RESTful 服务不同,Feign 提供了一种声明式、基于接口的方式来定义和调用 H…

XLSX.utils.sheet_to_json()解析excel,给空的单元格赋值为空字符串

前言 今天用到XLSX来解析excel文件,调用XLSX.utils.sheet_to_json(worksheet),发现如果单元格为空的话,解析出来的结果,就会缺少相应的key(如图所示)。但是我想要单元格为空的话,值就默认给空字…

HarmonyOS/OpenHarmony原生应用开发-华为Serverless认证服务说明(二)

一、支持HarmonyOS(Stage模型-API9)应用的账户注册登录方式 文档中的TS作者认为就是ArkTS之意。暂时支持四种模式,手机、邮箱、匿名、自有账户。 二、暂时不支持HarmonyOS(Stage模型-API9)应用的账户注册登录方式 包括华为账户注册登录,HarmonyOS…

计算机竞赛 题目:基于深度学习的手势识别实现

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于深度学习的手势识别实现 该项目较为新颖,适合作为竞赛课题…

汽车烟雾测漏仪(EP120)

【汽车烟雾测漏仪(EP120)】 此烟雾测漏仪专为车辆管道(油道、气道、冷却管道) 的泄露检测而设计。适用于所有轻型 汽车、摩托车、轻卡、游艇等。 【特点】 具有空气模式和烟雾模式。空气模式,无需烟雾,检测…

接口自动化测试yaml+requests+allure技术,你学会了吗?

前言 接口自动化测试是在软件开发过程中常用的一种测试方式,通过对接口进行自动化测试,可以提高测试效率、降低测试成本。在接口自动化测试中,yaml、requests和allure三种技术经常被使用。 一、什么是接口自动化测试 接口自动化测试是指通…

vue实现自定义滚动条

vue实现自定义滚动条 具体效果如下,这边我用的rem单位,比例是1:40, 先写下页面布局,把原生的滚动条给隐藏掉,给自定义的滑块增加transition: marginLeft 1s linear;可以使左边距过度的更顺滑 .top-box-2::-webkit-scr…

【DRAM存储器十三】DDR介绍

👉个人主页:highman110 👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容 参考资料:《镁光DDR数据手册》 目录 DDR SDRAM芯片引脚 DDR SDRAM芯片框…

销售小白如何写客户拜访记录?

销售小白如何写客户拜访记录?10年客户管理经验,接下来我说的,都是实实在在的经验,小白能用到其中的40%,你的客户成单率会大大提升! 首先,客户拜访记录的哪些信息是重要的? 答案是&…

ueditor

下载文件 文档 UEditor入门部署 入门部署和体验 1.1 下载编辑器 到官网下载 UEditor 最新版:http://ueditor.baidu.com/website/download.html#ueditor 1.2 创建demo文件 解压下载的包,在解压后的目录创建 demo.html 文件,填入下面的…

【轻松玩转MacOS】网络连接篇

引言 本篇让我们来聊聊网络连接。不论你是在家、在办公室,还是咖啡厅、机场,几乎所有的MacOS用户都需要连接到互联网。在这个部分,我们将向你展示如何连接到互联网和局域网。让我们开始吧! 一、连接到互联网 首先,我…

CSS 中::after的妙用(实现在margin中显示内容)

效果图如下: 背景: 如上图,之前只是当纯的写一个参考货架平面图,用作物料系统的在库状态可视化,当完成页面body分成10等份时,货架之间需要有通道,为了实现实际的样式,我给每个等份都…