论文阅读---《Unsupervised Transformer-Based Anomaly Detection in ECG Signals》

news/2024/12/5 4:41:05/

题目:基于Transformer的无监督心电图(ECG)信号异常检测

摘要

        异常检测是数据处理中的一个基本问题,它涉及到医疗感知数据中的不同问题。技术的进步使得收集大规模和高度变异的时间序列数据变得更加容易,然而,为了确保一致性和可靠性,需要复杂的预测分析模型。随着收集数据的规模和维度的增加,深度学习技术,例如自编码器(AE)、循环神经网络(RNN)和长短期记忆(LSTM),受到越来越多的关注,并被认为是最先进的异常检测技术。最近,基于Transformer架构的发展被提出作为改进的注意力机制的知识表示方案。我们提出了一种无监督的基于Transformer的方法来评估和检测心电图(ECG)信号中的异常。模型架构包括两部分:嵌入层和标准的Transformer编码器。我们在两个著名的数据集ECG5000和MIT-BIH Arrhythmia中引入、实现、测试和验证了我们的模型。根据实际和预测的ECG时间序列序列之间的损失函数结果来检测异常。我们发现,使用Transformer编码器作为异常检测的替代模型能够在ECG时间序列数据中实现更好的性能。建议的模型在检测ECG信号中的异常方面具有显著的能力,并在两个数据集上优于文献中的深度学习方法。在ECG5000数据集上,该模型可以以99%的准确率、99%的F1分数、99%的AUC分数、98.1%的召回率和100%的精确度检测异常。在MIT-BIH Arrhythmia数据集上,该模型的准确率为89.5%,F1分数为92.3%,AUC分数为93%,召回率为98.2%,精确度为87.1%。

引言

        异常检测对许多当代应用来说至关重要,并随着传感器使用的爆炸式增长而变得尤为重要。心电图(ECG)时间序列数据的异常检测近年来引起了相当大的关注,因为它对控制ECG时间序列过程的质量和识别异常数据源行为有着重要的影响。在时间序列数据的异常检测过程中,涉及使用复杂的算法和模型来检测在选定时间段内的异常数据。有效的异常检测器能够识别正常和异常时间序列数据之间的差异。 

        随着对实时异常检测的需求日益增长,人们已经意识到需要智能、稳健和计算效率高的模型,并且这种需求正在在大多数实时应用中受到更多关注。由于错误事件的不可避免性,这些模型在大多数时间序列应用中发挥着关键作用。时间序列数据的特性对于选择合适的异常检测方法至关重要。成功的异常检测器通过测量时间序列数据的统计偏差来识别异常,例如自回归移动平均(ARIMA)、累积和统计(CUSUM)和指数加权移动平均(EWMA)。然而,另一方面,传统的时间序列异常检测方法在模型的期望效率和准确性方面存在缺陷。

        最近,已经开发了几种用于异常检测的智能计算方法。其中,深度学习和神经网络是准确高效的热门算法。然而,从2000年代末开始,人们对于在大量和高度变异的在线时间序列数据中识别异常的兴趣逐渐增长。除了常用的技术,如自编码器(AEs)、循环神经网络(RNNs)、卷积神经网络(CNN)和长短期记忆(LSTM),当代深度神经架构通常用于异常检测和医疗预测。尽管这些方法已经发展以克服之前提出的技术,但它们大多数在处理时间序列数据时具有固有的特性限制其使用。例如,LSTM神经网络通过使用乘性门在特殊单元(记忆单元)的内部状态中施加常量误差流,克服了RNN面临的梯度消失问题。此外,LSTM网络不需要预先指定的时间窗口,并且可以准确地建模复杂的多变量序列,因为它们具有学习系列中长期相关性的能力。然而,这些方法的主要目标是生成更真实的序列,而不是提取有助于后续任务的有意义的特征。

        目前,在自然语言处理(NLP)中,首次引入了遵循预测过程的Transformer架构作为对循环神经网络RNNs的高效替代方案。因此,在这项工作中,我们介绍了一种基于Transformer架构的异常检测模型,用于检测人类心跳时间序列信号中的异常,例如室性早搏(PVC)、室上性早搏(SP)或异位心搏(EB),以及其他心电图(ECG)异常。在这里,我们使用中引入的Transformer编码器来开发新颖的无监督Transformer异常检测。该模型通过比较预测数据和原始数据之间的损失函数,学习正常数据的分布模式并检测异常。提出的模型在检测ECG时间序列数据方面优于当前最先进的深度学习建模方法。

        在接下来的文章中,我们将在相关工作部分对心电图时间序列中的深度学习异常检测的现有文献进行调查。在材料和方法部分,我们将介绍所提出的模型和使用的数据集。实验设置和结果分析将在结果和讨论部分展示。最后,本文以结论结束。

相关工作

       我们介绍一些用于心电图时间序列异常检测的现有深度学习模型。在[21]中,作者使用LSTM单元神经网络架构构建了一个用于健康心电图信号的预测模型。使用LSTM网络的一个额外优势是,ECG信号可以直接输入网络,无需复杂的预处理。研究结果乐观,并显示LSTM模型可能适用于检测心电图信号中的异常。此外,在[18]中,作者提出了基于LSTM网络的编码器-解码器框架,用于学习重构正常时间序列行为,并通过重构误差检测三个可预测时间序列数据集:电力需求、航天飞机和心电图。结果显示,该模型具有鲁棒性,可以检测可预测、不可预测、周期性、非周期性和准周期性的时间序列。值得注意的是,在[22]中,作者将AE与LSTM相结合,使用来自心肌梗死患者的心电图数据,展示了该系统可以准确分类不规则波间隔。在[23]中,堆叠LSTM网络用于时间序列的异常检测。该方法的有效性在四个数据集上得到了证明:心电图、航天飞机、电力需求和多传感器发动机数据集。在[24]中,作者专注于使用LSTM和GAN融合模型(LSTM-GAN)来识别时间序列数据中的异常。作者通过两组时间序列数据验证了算法的输出。实验结果表明,与传统算法相比,LSTM-GAN在处理时间序列数据方面表现出更优异的性能。Schlegl等人[25]开发了基于Anomaly Detection Generative Adversarial Nets(AnoGAN)模型的深度卷积生成对抗网络(DC-GAN)用于异常检测。作为无监督学习模型,AnoGAN使用正常数据进行学习。通过将其与查询数据进行比较,可以检测异常。在该方法中,决策边界是主观的。因此,需要根据条件进行多次实验,以应用决策边界。LSTM还可用于无监督学习,例如在[26]中,作者使用MIT-BIH心律失常数据集以无监督学习方式检测心电图信号中的异常。

        然而,只有少数模型在时间序列异常检测中使用了基于Transformer的架构。在[27]中,作者提出了一种基于Transformer和生成对抗网络(GAN)的时间序列数据异常检测方法。基于Transformer的生成器可以提取时间序列数据的上下文特征以提高性能。在训练和异常检测阶段,作者使用了两个编码器和两个解码器的Transformer块。他们展示了该模型在异常检测方面比使用三个数据集(Secure Water Treatment(SWaT)、Water Distribution(WADI)和KDD Cup 1999)的最先进的异常检测技术具有更好的性能。在[28]中,作者在时间序列数据中使用了Transformer架构;该模型包含三个编码器块和一个解码器块。输入的时间序列数据被分成训练序列和标签序列,其中训练序列被输入到编码器,而标签序列被输入到解码器。他们还用多分支注意力机制替换了原始的多头自注意力方法。对于WADI和SWaT数据集,F1分数分别为0.84和0.91。

        从以上讨论中,我们意识到基于Transformer的异常检测方法在检测心电图异常方面具有巨大的潜力,这是由于Transformer的高效性和同时获取长距离上下文数据的能力。我们将采用Transformer方法作为一种未经监督学习的模型来检测心电图时间序列数据中的异常,这在此领域之前尚未被使用过。然而,[29]等文献以及一些最近发表的论文考虑了需要大量标记的端到端学习方法,这是监督学习的特点。对于时间序列数据,标记数据可能并不总是可用的。我们的工作仅考虑了无监督学习,以更好地适应输入信号。此外,我们的模型与现有模型不同,因为它由两个标准的编码器Transformer层组成,没有解码器。因此,在这项工作中,我们将调查Transformer编码器在心电图时间序列异常检测方面的能力,并将我们的发现与最先进的深度学习模型在准确性和F1分数上进行比较,详细内容稍后说明。

 数据与方法

ECG

        时间序列是按照时间顺序组织的数据点的集合。通常,时间序列是在连续的相似间隔时间点上采集的序列。在这项工作中,我们使用了ECG5000数据集和MIT-BIH Arrhythmia数据集来验证所提出的模型。这两个数据集都属于心电图领域。

 ECG500

        在我们的实验中,我们使用了一个包含5000个心电图(ECG5000)时间序列的数据集[30]。原始数据来自PhysioNet的BIDMC Congestive Heart Failure Database (CHFDB)。在两个处理过程中,数据首先被预处理:首先提取每个心跳,并将每个心跳插值为相同的长度,等于140个时间步长。根据图1,有五种不同的心跳类型:正常(N)、R-on-T VPC(R-on-T)、室性早搏(PVC)、室上性早搏(SP)或异位心搏(EB),以及未分类的心跳(UB)。

        ECG5000数据集是通过从外推的心电图中选择5000个序列创建的,其中2989个序列是正常心跳,剩下的2011个序列是异常心跳。对于我们提出的模型,数据被按照80:10:10的比例划分为三个集合——训练集、验证集和测试集。由于我们采用了无监督学习,我们从训练集和验证集中排除了异常数据。在训练阶段,模型学习了正常心跳的潜在空间。表1列出了每个数据集中序列的数量。

MIT-BIH Arrhythmia

         MIT-BIH Arrhythmia数据库是一种临床数据库,其中包含了在贝斯以色列医院(BIH)心律失常实验室对48名患者进行的两通道心电图(ECG)记录。每个记录持续半小时。在本研究中,选择了修改后的肢体导联Ⅱ信号。根据美国医学仪器协会(AAMI)[33]的建议,将选择的心跳分为以下五类:正常心跳(N)、室上性异位心跳(S)、室性异位心跳(V)、融合心跳(F)和未知心跳(Q)。根据AAMI的建议,我们选择了48个记录中的44个用于我们的实验,并移除了四个记录(102、104、107和217),因为它们质量较差。

        信号预处理是一个重要的步骤,特别是在处理生理数据,如心电图(ECG)时,需要考虑所有潜在的噪声来源,比如运动伪影和电源干扰,这些噪声可能会影响后续模型的性能。我们的预处理阶段包含两个步骤。首先,我们应用滤波器来消除噪声,然后提取心跳信号。我们尝试了不同的滤波器,如巴特沃斯带通滤波器、带通滤波器和中值滤波器,我们发现两个中值滤波器的效果更好。本研究中采用了以下预处理步骤:

        中值滤波器:我们使用了一个滑动窗口为200毫秒的中值滤波器。然后,我们使用一个600毫秒的窗口,再次应用了第二个中值滤波器。原始信号的基线包含在第二个滤波器的输出中。将第二个滤波器的输出从未经处理的ECG数据中减去,以消除基线漂移(见图2)。这一步增强了基线校正,并消除了一些伪影。

        心跳提取:这涉及在每个心跳周围选择一个邻域。该间隔是通过在心跳前后±50毫秒处进行R峰标注来估计的。

        在心跳提取之后,正常序列的总数为72,722个,而异常序列的总数为10,579个。由于正常序列的数量比异常序列大很多,我们从中随机采样了18,824个序列。数据被划分为80%的训练数据和20%的测试数据。将训练数据再分为训练数据和验证数据,其中只包含N心跳。表2总结了每个数据集中序列的数量。

 提议的无监督Transformer架构

        在本论文中,我们介绍了一种基于Transformer的网络,用于心电图信号的异常检测。整体模型架构由两个部分组成:嵌入层和标准Transformer编码器(见图3)。所有正常的心电图信号时间序列数据,形式为一个2D张量,包含序列长度 × 特征数量,首先被编码成嵌入序列,然后输入到一个多层双向Transformer网络中,生成对应的表示。最后的线性稠密层预测输入的心电图信号,具有相同的输入序列长度。

         引入了嵌入层用于将输入张量映射到更高维度的特征空间。由于输入维度与Transformer隐藏层的大小相关,我们将该层分为两部分:一个线性稠密层,用于将输入投影到更高维度的向量,以及一个Dropout层,以避免过拟合。我们使用了正弦位置编码来对输入序列的顺序进行编码:

        其中,pos表示位置,i表示维度,dmodel表示模型的嵌入大小(即特征向量的维度)。         

        在寻找最佳模型配置的过程中,我们测试了使用一个和两个Transformer编码器块的情况。第一个Transformer编码器块创建了嵌入序列输入的等效隐藏表示。然后,为了逐步生成更高层次的表示,这些表示被作为输入传递给第二个Transformer编码器块。单个Transformer块(如图3所示)包括两个主要子层:一个位置感知的全连接前馈网络和一个多头自注意层(FFN)。两个子层都采用残差连接和层标准化。如图4所示,组成多头注意力层的h个并行缩放点积注意力层中的每一个被称为一个头。通过缩放点积注意力,将查询向量和一组键值对转换成输出向量。

         其中,Q、K和V分别表示由多个查询、键和值向量组成的矩阵,每个向量作为一行堆叠,查询/键向量的维度为dk。在计算注意力之前,多头注意力通过使用不同的线性稠密层将Q、K和V映射到各种较低维度的特征子空间。然后,使用一个额外的稠密层将h个头的输出连接在一起,并投影到最终的隐藏表示中,如下所示:

        Transformer的自注意机制通过学习输入序列的内在关系。自注意机制中的查询、键和值向量都是相似的。换句话说,在序列中的每个位置,都会计算该位置与其他位置之间的注意力。因此,每个观察值的隐藏表示捕捉了全局序列信息,并通过对序列中所有位置的加权求和来强调第i个观察值周围的区域。

         接着,对每个位置的隐藏状态进行了位置感知的前馈网络(FFN)处理,处理是独立且相同的。该前馈网络由两个线性变换组成,它们之间有一个ReLU激活函数:

        其中,xi是由多头注意力层产生的第i个隐藏状态,W1和W2是权重矩阵,b1和b2分别是内部和输出稠密层的偏差项。

异常分数和阈值

        因为我们实现了一种无监督的模式,模型仅在一个 N 心跳序列上进行训练。该模型预测输入序列的原始值。我们的模型的损失函数是平均绝对误差(MAE),其计算方式如下所示,即方程(7)。在类似于的情况下,通常使用均方根误差(RMSE)作为损失函数。然而,我们发现MAE是最佳选择,因为它表现更好。

        MAE是每个信号实际值yi和模型预测值xi之间的总绝对差异。通过训练,模型学习了正常信号的显著性和激活特征,从而导致更低的损失预测误差。该模型通过计算预测的损失误差是否大于一个固定的阈值来检测测试数据中的异常。在本文中,阈值等于训练正常数据的平均损失值加上两个标准偏差,如下所示的方程式: 

        在使用训练数据计算了阈值后,该过程被转化为一个二元分类问题。在异常检测阶段,通过比较预测误差来判断数据序列是正常还是异常,而这个计算出的阈值起到了决定作用。使用测试数据时,将一个特定的输入序列提供给模型,然后将预测误差与计算得到的阈值进行比较。如果预测误差超过阈值,那么该输入序列被归类为异常;否则,被归类为正常。 图5展示了我们的异常检测模型的图形化架构过程,以便更清楚地理解。

结果与结论

 实验配置

        为了对我们的模型进行微调,我们进行了许多实验,尝试了不同数量的Transformer编码器块(包含多头注意力层和接着的前馈层),不同的隐藏状态大小和不同数量的注意力头。仅在第一个密集层上实施了0.2的丢弃率的Dropout。我们使用Adam优化器,学习率为1e-4,并使用了早停技术。模型最多训练70个epochs,但在此之前所有实验都已经收敛。我们在批次大小为16个序列的情况下,仅使用正常数据对模型进行了训练。所有实验均使用Python(v3.7.6)、Tensorflow(v1.14.0)和Keras(v2.3.1)机器学习库进行实现。我们在Windows 10 Pro 64位操作系统上运行所有实验,使用了AMD Ryzen 5 3600 6核处理器(主频3.59 GHz)、NVIDIA 185 GEFORCE RTX 2080 SUPER(GPU)以及32GB的内存。

性能指标

        真正例(True Positive,TP)表示在二元分类器中被准确地预测为正例的值,真负例(True Negative,TN)表示被正确地预测为负例的值。假正例(False Positive,FP)是负例的预期值,但被错误地预测为正例,而假负例(False Negative,FN)是正例的预期值,但被错误地预测为负例。我们的模型的异常检测结果通过以下指标进行评估:ROC曲线下面积(AUC)、准确度(accuracy)、精确率(precision)、召回率(recall)和F1得分(F1-scores)。 

        AUC(曲线下面积):AUC是通过构建基于假正例(FP)和真正例(TP)的接收者操作特征曲线(ROC曲线)来计算的。

ECG500 数据库实验结果

        该提议的模型是在正常心跳上进行训练的,因此学习了正常信号的分布。异常心跳不遵循这个分布,因此当将它们输入模型时,模型无法准确预测。为了直观地观察这一点,我们使用测试数据集在图6中展示了输入时间序列和预测时间序列。该图显示实际和预测的正常心跳信号大致相同(图6b)。然而,当输入是一个异常心跳信号时,模型将其映射到连续的正常心跳的潜在空间,如图6a所示,这为异常检测提供了机会。尽管某些异常样本通常与它们的正常预测相似,但局部差异可以帮助区分它们。

        如表3所示,我们训练了一系列无监督的Transformer网络来确定最佳的编码器块数量(1或2)、嵌入大小(32、64、128或256)和注意力头数量(16或32)。表现最佳的模型包含两个编码器块、128的嵌入大小和32的注意力头,取得了令人印象深刻的结果,F1分数为99%,准确度为99%,召回率为98.1%,精确率为100%。计算得到的阈值为0.29。然而,从表3中我们可以观察到,较大的嵌入大小获得了更好的模型性能。由于我们的模型处理不同时间步的心跳信号,因此更适用于顺序时间序列数据。图7展示了ROC曲线,该曲线绘制了真正例率(True Positive Rate,TPR)与假正例率(False Positive Rate,FPR)在不同分类阈值下的变化,以表示模型在区分正类和负类方面的能力。我们的模型实现了99%的AUC分数,表明该模型是一个完美的分类器模型,因为较高的AUC分数意味着更好的预测能力。

        由于ECG5000数据集已经在之前的研究中被使用过,将我们的模型与其他有监督和无监督方法进行比较对于了解其优劣势以及在异常检测领域的地位非常关键。在表4中展示了一些有监督和无监督算法在相同数据集上的结果。在[41]和[42]中,数据集的划分为4500个心跳(80%)用于测试,500个心跳(20%)用于训练和验证任务(20%)。在[41]中,作者使用变分递归自编码器(VRAE)来表示数据,然后应用聚类和Wasserstein距离来检测异常,成功地在ECG5000数据集上实现了超越现有有监督和无监督方法的异常检测性能。同样地,在[42]中,作者使用相同的变分自编码器(VAE)方法结合局部相似度评分在我们的两个数据集上,即ECG5000和MIT-BIH Arrhythmia,在AUC方面取得了与文献中类似的结果。然而,我们的模型在所有评估指标上都超过了这些深度学习模型,具有99%的F1分数,99%的准确率,98.1%的召回率和100%的精确率。然而,由于我们使用了不同的数据划分方法,这种比较被认为是不公平的。因此,我们将我们的结果与[43]和[44]最近获得的结果进行了比较,因为数据的划分为80%的训练集、10%的验证集和10%的测试集,与我们在这里所做的完全相同。[43]中的作者使用了Concat Attention Autoencoder(CAT-AE)、AE-without-Attention和VAE,声称在异常检测中达到了最先进的准确率和精确率。另一方面,[44]中的作者使用了无监督的LSTM自编码器。如表4所示,我们的模型在使用相同数据划分方法的情况下,超越了这些深度学习模型。

 MIT-BIH Arrhythmia数据库实验结果

        图8展示了异常和正常心跳的示例,以及它们对应的预测结果。正常心跳在模型的预测下表现得相当准确,如图8b所示。毫无疑问,模型已经捕捉到了正常心脏周期模式的基本形态行为。模型可以尽量调整输出来适应正常的潜在空间,同时不断努力最小化预测误差。模型试图仅使用心脏周期的正常属性来预测输入,因此异常心跳被映射到一个正常心跳的潜在空间。正如预期的,这导致了异常心跳的较低预测质量和较高的预测误差,如图8a所示。 

        如表5所示,我们训练了多个Transformer编码器网络来确定最佳的注意力-前馈块数量(1或2)、嵌入大小(512或1024个神经元)和注意力头数量(16或32)。从表5可以看出,不同模型的Transformer编码器异常检测结果在MIT-BIH测试数据集上表现相近。然而,表现最佳的模型配置包含两个块,64的嵌入大小和32个注意力头。我们表现最好的Transformer编码器模型实现了89.5%的准确率,92.3%的F1分数,98.2%的召回率和87.1%的精确率。图9展示了最佳模型在测试集上的ROC曲线,AUC得分为93%,这意味着该模型在区分异常和正常信号方面表现相对良好。计算得到的阈值为0.12。

        表6显示了我们的结果与其他使用MIT-BIH数据集的深度学习异常检测模型的比较。在[26]中,作者使用堆叠LSTM并应用无监督训练,因为在训练模型时不需要异常类别。数据集的划分为80%训练和20%测试。因此,我们还将我们的模型与他们的模型进行了比较,因为他们遵循了相同的训练过程和数据划分。我们的模型实现了92.3%的F1分数,98.2%的召回率和87.1%的精确率,而他们的模型报告了81%的F1分数,87%的召回率和82%的精确率,这表明我们的模型优于无监督的LSTM尝试。此外,在[45]中,作者使用了一种新颖的混合架构,由LSTM单元和多层感知器(MLP)组成,数据集的划分为70%训练和30%测试。他们在监督学习方式下实现了87%的F1分数和75%的灵敏度,这也低于我们的结果,然而更高的准确率可能归因于他们使用了监督学习。最后,在[42]中,作者使用了无监督的变分自编码器,并采用AAMI数据集划分,但其F1分数和准确率分别为76.55%和87.77%,分别是最低的。与使用有监督或无监督深度学习模型的最新应用异常检测方法相比,我们的模型表现更好。然而,该模型在异常检测方面的性能仍然缺乏令人满意的F分数。

 总结

        我们提出了一种稳健有效的无监督Transformer异常检测模型,用于处理时间序列数据。该模型被用于检测人类心跳时间序列信号中的异常,例如早搏(premature ventricular contraction,PVC)、室上性早搏(supraventricular premature,SP)和其他心电图异常。该模型的架构由Transformer编码器网络和线性密集解码器网络组成。心电图时间序列异常检测方法基于序列预测方法,包含两个阶段:模型训练,在此阶段模型学习正常数据的分布;异常检测,在此阶段计算心电图时间序列的异常得分以识别异常情况。我们通过使用预先设定的阈值(训练损失的均值加上两倍的标准差)将异常检测方法调整为无监督框架。

        我们已经展示了如何利用Transformer编码器进行心电图时间序列的异常检测。我们在ECG5000和MIT-BIH Arrhythmia数据集上的结果表明,Transformer编码器在这个任务中是一个可行的替代方案。我们将Transformer编码器与几种最先进的深度学习模型进行了对比测试,结果表明我们的模型在准确率、F1分数、召回率和精确率等方面表现优于其他模型。对于ECG5000心跳数据集,我们实现了99%的准确率、99%的F1分数、100%的精确率、98.1%的召回率和99%的AUC得分,展现了在确定ECG心跳信号异常方面的出色能力。此外,我们的模型在MIT-BIH Arrhythmia数据集上表现良好,具有92.3%的加权F1分数、89.5%的准确率、93%的AUC得分、98.2%的召回率和87.1%的精确率。此外,我们提出的模型在使用MIT-BIH Arrhythmia数据集进行最近的ECG分析中表现出比其他深度学习模型更加稳健的性能。尽管本研究主要集中在将模型与深度学习异常检测方法进行比较,但我们未来的工作目标是扩展对其他时间序列数据异常检测技术的研究。


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

相关文章

每日一学:什么是 Harbor ?

目录 什么是 Harbor ? 一、Harbor 的优势 二、Harbor 架构构成 三、Core services 这是 Harbor 的核心功能 什么是 Harbor ? Harbor 是 VMware 公司开源的企业级 Docker Registry 项目,其目标是帮助用户迅速搭建一个企业级的 Docker Reg…

前端根据url在线预览功能

文章目录 加载脚本WORDexcelpdfimgvideo 加载脚本 // wordawait this.utils.loadScript(https://unpkg.com/promise-polyfill/dist/polyfill.min.js)await this.utils.loadScript(https://unpkg.com/jszip/dist/jszip.min.js)await this.utils.loadScript(https://unpkg.com/do…

C++初阶——函数重载

前言:C中除了可以在不同的命名空间中使用同名函数,还有一种支持在同一个作用域中同名函数的方式——函数重载。 函数重载 一.什么是函数重载?二.函数重载的3种规则三.特殊情况 一.什么是函数重载? C允许同样同一作用域中声明几个功…

维深(Wellsenn):2023中国消费端VR内容开发商调研报告(附下载

关于报告的所有内容,公众【营销人星球】获取下载查看 核心观点 国内互联网大厂商入局VR,字节跳动、网易表态明确。字节跳动2021年收购国内头部VR硬件厂商PICO后,加速构建VR内容生态,2021年 成立海南创见未来当前已推出VR视频应用…

DP与EDP接口协议学习

文章目录 一、概念介绍DP----DisplayPort,一种标准化数字式视频接口&协议EDP---Embedded DisplayPort,DP协议在嵌入式领域拓展DP和HDMI对比----HDMI当前应用更广,DP是PC领域推出协议 二、DP&EDP相关协议分析三条数据通路Manlink 、Au…

海思uvc_app源码学习笔记

文章目录 前言流程hicamerahistreamhiuvc 模块分析总结 前言 海思mpp例子里面的uvc_app源码学习笔记。 看了半天,以为是3516读取usb摄像头数据的,结果是实现一个usb摄像头的。可以搞个公对公的usb线测试下。 大概流程是从摄像头获取图像,进行…

ChatGPT发展到了什么程度?代码生成,程序员将被取代?

前言 ChatGPT 是一个基于人工智能的聊天机器人,由 OpenAI 开发。ChatGPT 的历史可以追溯到早期的语言模型,例如循环神经网络 (RNN) 和长短时记忆网络 (LSTM)。如今的 ChatGPT-3 则是最新的版本。 ChatGPT发展到了什么程度?代码生成&#xff0…

vs code remote ssh: Resolver error: Error: Got bad result from install script

今天像往常一样,打开 windows 11,使用 vs code 远程连接服务器 ubuntu 20,但是遇到了一个错误:Resolver error: Error: Got bad result from install script。 ok!!!开始 Bing !&…