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

news2024/11/19 2:24:18

本次分享上海交通大学发表在 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.coloradmin.cn/o/1066195.html

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

相关文章

ACM模板修改

修改为匿名版本 将 \documentclass[sigconf,authordraft]{acmart} 改为 \documentclass[sigconf,review,anonymous]{acmart} 去掉模板中的无用段落 添加如下语句删除上述段落 \renewcommand\footnotetextcopyrightpermission[1]{} 添加如下语句删除上述段落 \settopmatter…

2019款保时捷卡宴车发动机故障灯异常点亮

故障现象 一辆2019款保时捷卡宴车,搭载DCB发动机,累计行驶里程约为9万km。车主反映,该车行驶中发动机故障灯偶尔异常点亮(图1),其他无异常,为此在其他维修厂更换过燃油箱通风电磁阀、活性炭罐及…

品牌举办活动如何提高知名度?媒介盒子告诉你

2023年,线下消费端口迎来了迅猛爆发,多数行业进入“复苏反攻”状态之中,但在生活节奏加快,信息碎片化趋势之下,大众的注意力成为稀缺资源,逐渐趋同的套路式营销很难打动人心,对于品牌来说&#…

python3多线程处理文件

问题 现在需要对某个文本中的每一条进行处理,例如:对每一行进行同样的操作,现在采用多线程进行,而不是一条一条读取、执行 解决 #! /usr/bin/env python # encoding:utf-8 # Software:PyCharm # Time:2023/10/07 14:30 # Auth…

k8s 集群安装(vagrant + virtualbox + CentOS8)

主机环境:windows 11 k8s版本:v1.25 dashboard版本:v2.7.0 calico版本: v3.26.1 CentOS8版本:4.18.0-348.7.1.el8_5.x86_64 用到的脚本: https://gitcode.net/sundongsdu/k8s_cluster 1. Vagrant创建…

乌班图22.04 kubeadm简单搭建k8s集群

1. 我遇到的问题 任何部署类问题实际上对于萌新来说都不算简单,因为没有经验,这里我简单将部署的步骤和想法给大家讲述一下 2. 简单安装步骤 准备 3台标准安装的乌班图server22.04(采用vm虚拟机安装,ip为192.168.50.3&#xff0…

DP1363F与CLRC663的兼容性对比区别

DP1363F收发器DP1363F支持下列操作模式 • 替代兼容CLRC663/RC663 • 读写模式支持 ISO/IEC 14443A/MIFARE • 读写模式支持 SO/IEC 14443IB • JIS X 6319-4 读写模式支持(等效于FeliCa1方案) • 相应于 ISO/IEC 18092 的被动发起方模式 • 读写模式支持…

告别繁琐,轻松管理SQLite数据库!极简SQLite数据库管理器上线了

如果你是一名Mac用户,并且经常处理SQLite数据库,那么你一定会遇到繁琐的数据库操作,比如安装各种复杂的软件、编写复杂的SQL语句等等。这些操作不仅费时费力,而且还容易出错。那么是否有一种轻松快捷的方法可以管理SQLite数据库呢…

Springboot 音乐网站管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 音乐网站管理系统是一套完善的信息系统,结合springboot框架和bootstrap完成本系统,对理解JSP java编程开发语言有帮助系统采用springboot框架(MVC模式开发),系统 具有完整的源代码和数据库&…

口袋参谋:如何提升宝贝流量?这三种方法超实用!

​你的店铺能不能出爆款?提升单品流量是关键。 对于新手卖家来说,是缺乏运营技巧和运营经验的,运营技巧主要体现在标题写作、各种图片和视频制作等。 由于新手买家没有经验,习惯于直接使用数据包上传,导致宝贝没有展…

使用scipy库将离散点连续化

离散点连续化用于求满足所有离散点的对应法则F(x)且非离散集合中的值。 如有x[0,1,2,3], y[1,3,2,1],求当x1.5时对应的y是多少? 拟合 可以直接求出对应的函数式,但要求知晓经验函数 from numpy import * from scipy.signal import *# 如线性拟合经验函…

【Linux】 rm命令使用

作为一个程序员 我们经常用到rm -rf * 或者rm -rf XXX 。但是rm -rf 是什么意思不是很清楚,咱们一起来学习一下吧。 rm(英文全拼:remove)命令用于删除一个文件或者目录。 rm 命令 -Linux手册页 著者 由保罗鲁宾、大卫麦肯齐、理…

jira+confluence安装

准备如下所有包: atlassian-agent.jar jdk-8u241-linux-x64.tar.gz atlassian-confluence-8.0.0-x64.bin atlassian-jira-software-9.4.0-x64.bin mysql-8.0.31-1.el8.x86_64.rpm-bundle.tar mysql-connector-java-8.0.28.jar confluence-8.2.1破解 1.安装j…

对于java线程池ThreadPoolExecutor监控以及参数动态调整的思考

https://mp.weixin.qq.com/s/baYuX8aCwQ9PP6k7TDl2Ww Java线程池实现原理及其在美团业务中的实践 - 美团技术团队 上面两个链接都是一篇文章发布在不同地方,看其中一篇即可。 看到了美团技术团队的这篇文章以及加上自己对线程池的了解和看过的源码,有如…

app对接广告变现平台:影响app广告单价的4大因素

在移动应用开发者和媒体公司竞相寻求提高广告变现效率的今天,理解影响APP广告单价的关键因素至关重要。广告单价是广告收入的核心组成部分,它受多种因素的影响,直接关系到媒体的盈利能力。主要因素大概有以下几点:#APP广告变现# …

vue3+vite+uniapp 封装一个省市区组件

一、预览图 二、使用前的一些注意事项 只支持在 uniapp vue3 项目中使用支持微信小程序和h5 (app端没有测试过)ui库用的 uview-plus省市区数据用的是 vant-ui 提供的一个赖库 vant/area-data 三、组件代码 <template><u-popup :show"show" type"botto…

深圳市重点实验室如何办理-华夏泰科

深圳市重点实验室是为了提升科技创新的能力和水平&#xff0c;推动科技成果的转化和应用而设立的一项重要机构。同时深圳市重点实验室是开展高水平基础研究和应用基础研究、聚焦和培养优秀科技人才、开展学术交流的重要基地。认定该资质对于提升品牌影响力和科技创新能力有着重…

Elasticsearch实战(十八)--ES搜索Doc Values/Fielddata 正排索引 深入解析

1.正排索引与倒排索引 先说结论&#xff0c;再讲原理 !!!尽量不要再生产环境使用fielddatatrue&#xff0c;即使要用也要控制好占用内存比例的大小&#xff0c;否则容易出现OOM !!!尽量不要再生产环境使用fielddatatrue&#xff0c;即使要用也要控制好占用内存比例的大小&#…

剑指offer——JZ32 从上往下打印二叉树 解题思路与具体代码【C++】

一、题目描述与要求 从上往下打印二叉树_牛客题霸_牛客网 (nowcoder.com) 题目描述 不分行从上往下打印出二叉树的每个节点&#xff0c;同层节点从左至右打印。例如输入{8,6,10,#,#,2,1}&#xff0c;如以下图中的示例二叉树&#xff0c;则依次打印8,6,10,2,1(空节点不打印&a…

docker运维之自定义网络配置

自定义网络配置讲解与实操 docker中的容器有独立的隔离空间&#xff0c;那么&#xff0c;它们能不能通过网络相互访问呢&#xff1f; 答案是可以的&#xff01;作者在之前Redis篇中使用docker配置了主从、cluster集群&#xff0c;当时的做法是利用每个容器的ip地址和端口创建相…