Modality-Aware Contrastive Instance Learning with Self-Distillation ... 论文阅读

Modality-Aware Contrastive Instance Learning with Self-Distillation for Weakly-Supervised Audio-Visual Violence Detection 论文阅读

  • ABSTRACT
  • 1 INTRODUCTION
  • 2 RELATEDWORKS
    • 2.1 Weakly-Supervised Violence Detection
    • 2.2 Contrastive Learning
    • 2.3 Cross-Modality Knowledge Distillation
  • 3 PRELIMINARIES
  • 4 METHODOLOGY
    • 4.1 Two-Stream Network
    • 4.2 MA-CIL
    • 4.3 Self-Distillation
    • 4.4 Learning Objective
  • 5 EXPERIMENT
  • 6 CONCLUSION

文章信息:
在这里插入图片描述

原文链接:https://arxiv.org/abs/2207.05500#:~:text=Weakly-supervised%20audio-visual%20violence%20detection%20aims%20to%20distinguish%20snippets,overlooking%20the%20modality%20heterogeneousness%20over%20the%20weakly-supervised%20setting.
源码:https://github.com/JustinYuu/MACIL_SD
发表于:MM 2022

ABSTRACT

弱监督的音频-视觉暴力检测旨在利用视频级别标签区分包含多模态暴力事件的片段。许多先前的工作在早期或中间阶段执行音频-视觉整合和交互,但忽略了在弱监督设置下的模态异质性。在本文中,我们分析了多实例学习(MIL)过程中的模态异步性和未区分实例现象,并进一步研究了它对弱监督音频-视觉学习的负面影响。为了解决这些问题,我们提出了一种模态感知对比实例学习与自我蒸馏(MACIL-SD)策略。具体来说,我们利用轻量级的双流网络生成音频和视觉袋,其中单模态背景、暴力和正常实例以无监督方式聚类为半袋。然后,音频和视觉暴力半袋表示被组装为正对,暴力半袋与相反模态中的背景和正常实例结合为对比负对。此外,应用自我蒸馏模块将单模态视觉知识转移到音频-视觉模型中,从而减轻噪声并缩小单模态和多模态特征之间的语义差距。实验表明,我们的框架在大规模XD-Violence数据集上比先前的方法表现更好,并且结果还表明我们提出的方法可以用作增强其他网络的插件模块。

1 INTRODUCTION

近年来,暴力检测的范围已经从纯视觉任务 [4, 18, 20, 30, 33, 45, 47, 54, 61, 67, 68] 扩展到了一个音频-视觉多模态问题 [43, 44, 62],其中相应的听觉内容补充了细粒度的暴力线索。尽管许多模态融合和交互方法已经显示出了良好的结果,但在弱监督设置下,多实例学习(MIL)[38] 框架的模态差异仍有待探索。

为了减轻对精细标记数据的需求,多实例学习被广泛应用于弱监督的暴力检测中,其中每个视频序列的输出被形成为一个包含多个片段级实例的袋子。在音频-视觉场景中,所有先前的工作都采用了一个通用方案,将每个音频-视觉片段视为一个完整实例,并将前K个音频-视觉logit的平均值作为最终的视频级别分数。然而,我们分析发现这个公式存在两个缺陷:模态异步性未区分实例。模态异步性表示听觉和视觉暴力线索之间的时间不一致性。以图1(a)中典型的暴力事件滥用为例,当施暴者击打受害者时,尖叫声随后发生,整个过程被视为暴力事件。在这种情况下,视觉模态(第2-3个片段)和音频模态(第4-5个片段)中的部分场景包含暴力线索。我们认为,直接利用音频-视觉对作为一个实例可能会引入数据噪声到视频级别的优化中。我们发现的另一个缺陷是未区分实例,即为了优化选择前K个实例导致大量不相关的实例。如图1(b)所示,在一系列暴力视频中,一些音频/视觉实例反映了暴力事件。相反,其他实例包含了背景噪音等无关元素。与此相对应,在正常事件的视频中,少数片段包含正常事件的元素,而其他片段包含背景信息。在这种情况下,K-max激活放弃了包含背景元素的实例,并且暴力和正常实例之间的差异没有得到明确的展现。因此,我们认为在暴力、正常和背景实例之间添加对比约束可以有助于对暴力内容进行区分

在初步分析的驱动下,我们提出了一个简单但有效的框架,由模态感知对比实例学习(MA-CIL)和自我蒸馏(SD)模块构成。为了解决模态异步性,我们除了原始的音频-视觉袋之外,还形成了单模态袋,计算单模态logits,并将前K个和后K个单模态实例的嵌入聚类为半袋。为了区分实例,我们提出了一种基于模态感知对比的方法。具体而言,音频和视觉暴力半袋被构造为正对,而暴力半袋与背景和正常半袋中的实例嵌入组装为负对。此外,我们还应用了一个自我蒸馏模块,将单模态知识提炼到音频-视觉模型中,从而缩小模态之间的语义差距,并减轻丰富的跨模态交互引入的数据噪声。总而言之,我们的贡献如下:

  • 我们分析了在音频-视觉场景中广泛使用的多实例学习(MIL)框架中的模态异步性和未区分实例现象,并进一步阐述了它们对弱监督音频-视觉暴力检测的不利影响。
  • 我们提出了一个模态感知的对比实例学习与自我蒸馏框架,以引入特征区分性并减轻模态噪声。
  • 搭载了轻量级网络的我们的框架在XD-Violence数据集上表现优于最先进的方法,而且我们的模型还展现出了作为插件模块的通用性。

2 RELATEDWORKS

2.1 Weakly-Supervised Violence Detection

弱监督的暴力检测需要在视频级别标签下识别具有暴力特征的片段,其中多实例学习(MIL)[38] 框架被广泛用于去除不相关信息的噪声。一些先前的工作 [4, 18, 20, 30, 45, 47, 61, 67, 68] 将暴力检测视为纯粹的视觉任务,并利用基于CNN的网络来编码视觉特征。在这些方法中,提出了各种特征融合和改进方法以增强MIL的鲁棒性。Tian等人 [54] 提出了RTFM,一种强大的时间特征幅度学习方法,以改进对正例的识别能力。Li等人 [33] 设计了基于Transformer [57] 的多序列学习网络,以降低实例选择错误的概率。然而,这些模型忽略了相应的听觉信息以及跨模态交互,从而限制了暴力预测的性能。

最近,吴等人[62]策划了一个大规模的音频-视觉数据集XD-Violence并建立了一个音频-视觉基准。然而,他们以早期融合的方式整合音频和视觉特征,从而限制了进一步的跨模态交互。为了促进多模态融合,庞等人[43]提出了一种基于注意力的网络,以中间方式自适应地整合音频和视觉特征,并带有互学习模块。与先前的方法不同,我们通过一个轻量级的双流网络执行跨模态交互,并通过模态感知的对比和自我蒸馏进行具有辨别力的多模态学习。

2.2 Contrastive Learning

对比学习是通过对比正对和负对来制定的,无需数据监督。在单模态领域,一些视觉方法 [10, 23, 25, 35] 利用对视觉数据的增强作为对比来增加模型的区分性。此外,一些自然语言处理方法利用标记和句子级别的对比来增强预训练模型 [15, 50] 和监督任务 [17, 46] 的性能。对于多模态领域,一些工作引入了模态感知的对比来处理视觉-语言任务,如图像描述 [16, 58]、视觉问答 [9, 60] 和表示学习 [34, 49, 59, 66]。此外,最近的文献 [1, 2, 14, 32, 37, 39, 40, 42] 利用音频-视觉流的时间一致性作为对比的前提任务,以学习稳健的音频-视觉表示。基于现有的实例级对比框架 [12, 63],我们提出了半袋的概念,并利用跨模态对比来获得模型的区分性。

2.3 Cross-Modality Knowledge Distillation

知识蒸馏最初是为了将大规模架构的知识转移到轻量级模型中 [5, 28]。然而,跨模态蒸馏旨在将单模态知识转移到多模态模型中,以减轻模态之间的语义差距。一些方法 [21, 29] 通过幻觉网络将深度特征蒸馏到RGB表示中,以解决模态缺失和噪声现象。陈等人 [13] 提出了一种音频-视觉蒸馏策略,该策略学习组合嵌入,并在语义不相关的模态之间转移知识。最近,多模态知识扩展 [65] 被提出作为一种两阶段蒸馏策略,通过生成伪标签将知识从单模态教师网络转移到多模态学生网络。受到自我蒸馏方法 [6, 8, 11, 19, 52, 64] 的启发,我们提出了参数整合范式,通过两个相似的轻量级网络将视觉知识转移到我们的音频-视觉模型中,从而减少模态噪声,获得稳健的音频-视觉表示。

3 PRELIMINARIES

给定一个音频-视觉视频序列 S = ( S A , S V ) , S= ( S^A, S^V) , S=(SA,SV), 其中 S A S^A SA 是音频通道, S V S^V SV 表示视觉通道,整个序列被划分为 T T T 个不重叠的片段 { s t A , s t V } t = 1 N \{s_t^A,s_t^V\}_{t=1}^N {stA,stV}t=1N。对于一个音频-视觉对 ( s t A , s t V ) (s_t^A,s_t^V) (stA,stV),弱监督暴力检测任务要求通过一个事件相关性标签 y t ∈ { 0 , 1 } y_t\in \{ 0, 1\} yt{0,1} 区分该对是否包含暴力事件,其中 y t = 1 y_t= 1 yt=1 表示当前片段中至少一个模态包含暴力线索。在训练阶段,只有视频级别的标签 y y y 可用于优化。因此,一个常规的方案是利用多实例学习(MIL)过程来满足弱监督。

在MIL框架中,每个视频序列S被视为一个袋子,视频片段 { s t A , s t V } t = 1 N \{s_t^A,s_t^V\}_{t=1}^N {stA,stV}t=1N 被视为实例。然后,通过特定的特征级别/得分级别汇聚方法将实例聚合起来生成视频级别的预测 p p p。在本文中,我们利用 K K K-max激活与平均池化,而不是基于注意力的方法 [41, 53] 和全局池化 [51, 67] 作为聚合函数。具体来说,给定由CNN网络提取的音频和视觉特征 f a , f v f_a, f_v fa,fv,我们使用一个多模态网络生成单模态logits l a , l v l_a, l_v la,lv 和音频-视觉logits l a v l_{av} lav。音频和视觉实例的嵌入被表示为 h a h_a ha h v h_v hv。然后,我们平均 K K K 个最大的logits,并使用sigmoid激活生成视频级别的预测 p p p。由于我们提出的对比学习方法的额外约束,我们定义了单模态袋 B a , B v \mathcal{B}_a, \mathcal{B}_v Ba,Bv。在每个单模态袋中,实例根据其固有特性被聚类到几个半袋 B m , m ∈ { a , v } B_m, m\in\{a,v\} Bm,m{a,v} 中,相应的半袋表示记为 B m , m ∈ { a , v } \mathcal{B}_m, m\in\{a,v\} Bm,m{a,v}

4 METHODOLOGY

我们提出的框架由三个部分组成:一个轻量级的双流网络,模态感知的对比实例学习(MA-CIL)和自我蒸馏(SD)模块。我们框架的示意图如图2所示,具体如下所述。

在这里插入图片描述

图2:我们提出的模态感知对比实例学习与自我蒸馏框架的示意图。我们的方法包括三个部分:轻量级的双流网络、模态感知的对比学习(MA-CIL)和自我蒸馏(SD)模块。将预训练网络提取的音频和视觉特征作为输入,我们设计了一个简单而有效的基于注意力的网络来执行音频-视觉交互。然后,我们使用基于模态感知对比的方法将不同类型的实例聚类到几个半袋中,并进一步获得模型的区分性。最后,我们部署了一个自我蒸馏模块,将视觉知识转移到我们的音频-视觉网络中,旨在减轻模态噪声并缩小单模态和多模态特征之间的语义差距。整个框架以弱监督的方式联合训练,并采用多实例学习(MIL)策略进行优化。

4.1 Two-Stream Network

考虑到先前的方法受到大规模网络参数冗余的影响,我们设计了一个编码器不可知的轻量级架构来实现特征聚合和模态交互。以预训练网络提取的视觉和听觉特征 f v , f a f_v,f_a fv,fa 为输入,我们提出的网络包括三个部分:线性层以保持输入特征的维度相同,跨模态注意力层以执行模态间的交互,以及多实例学习(MIL)模块用于弱监督训练。在这些模块中,跨模态注意力层是从Transformer [57] 的编码器部分改进而来,包括多头自注意力、前馈层、残差连接 [26] 和层归一化 [3]。在原始的自注意力块中,特征分别由三个不同的参数矩阵投影为查询、键和值向量。然后,通过 a t t ( q , k , v ) = s o f t m a x ( q k T d m ) v att(q,k,v)=softmax(\frac{qk^T}{\sqrt{d_m}})v att(q,k,v)=softmax(dm qkT)v 计算缩放点积注意力得分,其中 q , k , v q,k,v q,k,v 表示查询、键和值向量, d m d_m dm 是查询向量的维度, T T T 表示矩阵转置操作。为了加强跨模态交互,我们将自注意力块的键和值向量改为其他模态的特征:
在这里插入图片描述
其中, h a , h v h_a,h_v ha,hv 是更新的音频和视觉特征, W Q , W K , W_Q, W_K, WQ,WK, W V W_V WV 是可学习的参数。我们采用共享参数策略进行特征投影,以减少计算量。

我们在弱监督设置下采用多实例学习(MIL)过程来获得视频级别的分数。与先前的工作不同,我们单独处理单模态特征以减轻模态异步性。具体而言,我们在每个模态中使用全连接层来生成单模态logits。然后,我们将单模态logits的总和作为融合的音频-视觉logits,同时保留单模态logits以用于后续的对比学习。最后,我们对前K个音频-视觉logits进行平均池化,并经过sigmoid激活生成用于优化的视频级别分数。整个过程可以表示为:
在这里插入图片描述

其中, W a , W v , b a , b v W_a,W_v,b_a,b_v Wa,Wv,ba,bv 是可学习的参数, Ω \Omega Ω 表示 K K K-max 激活, σ \sigma σ 表示sigmoid函数, ⊕ \oplus 表示求和操作, Θ \Theta Θ 表示平均池化, p p p 是视频级别的预测。

4.2 MA-CIL

为了利用更多的非相关实例,我们提出了MA-CIL模块,如图2右侧所示。给定嵌入 h a , h v h_a,h_v ha,hv,我们执行无监督聚类将它们分为暴力、正常和背景半袋表示,基于视觉和音频logits。我们认为,语义无关实例之间的差异可以被利用来丰富模型的区分能力。

具体而言,我们首先利用视频级别的概率 p p p 来区分给定视频是否包含暴力事件。在每个小批量中,对于满足 p i > 0.5 p_i>0.5 pi>0.5 的视频序列 S i S_{i} Si,将具有最高logits的前 K K K 个实例聚类为暴力半袋 B m υ i o ( i ) = { h m ( n ) } n = 1 K υ i o , m ∈ { a , v } B_m^{\upsilon io}(i)=\{h_m(n)\}_{n=1}^{K_{\upsilon io}}, m\in\{a,v\} Bmυio(i)={hm(n)}n=1Kυio,m{a,v}。对于满足 p j ≤ 0.5 p_j\leq0.5 pj0.5 的序列 S j S_j Sj,选择前 K K K 个实例作为正常半袋 B m n o r ( j ) = { h m ( n ) } n = 1 K n o r , m ∈ { a , v } B_m^{nor}(j)=\{h_m(n)\}_{n=1}^{K_{nor}}, m\in\{a,v\} Bmnor(j)={hm(n)}n=1Knor,m{a,v}。我们希望对正常事件和暴力事件添加对比,以帮助模型区分所感知信号的暴力程度。

此外,我们认为正常和暴力视频都包含背景片段,学习事件相关片段与背景噪声之间的差异可以有助于定位。因此,我们选择整个小批量中的最低的 K K K 个实例作为背景半袋 B m b g d = { h m ( n ) } n = 1 K b g d , m ∈ { a , v } B_m^{bgd}=\{h_m(n)\}_{n=1}^{K_{bgd}}, m\in\{a,v\} Bmbgd={hm(n)}n=1Kbgd,m{a,v}。在每个小批量中,模型应该将暴力音频-视觉实例与由暴力实例和其他实例(背景和正常实例)构建的负对进行对比。

一种直观的方法是在相反的模态中随机选择半袋内和半袋间的实例作为正对和负对。

然而,我们认为具有不同位置的音频和视觉暴力实例可能在语义上不匹配,例如分别表示暴力事件的开始和结束。因此,假设它们具有相同的含义是不自然的。相反,我们对每个半袋中所有暴力实例的嵌入进行平均池化,并形成一个半袋级别的表示 B m v i o , m ∈ { a , v } B_m^{vio},m\in\{a,v\} Bmvio,m{a,v}。通过这样做,音频和视觉表示都表达了事件级别的语义,从而减轻了噪音问题。为此,我们构建了半袋级别的正对,由音频和视觉暴力半袋表示 B a v i o , B v v i o \mathcal{B}_a^{vio},\mathcal{B}_v^{vio} Bavio,Bvvio 组成。我们还构建了半袋到实例的负对,以保持大量的对比样本,其中暴力半袋表示与相反模态中的背景和正常实例嵌入 h m n o r , h m b g d , m ∈ { a , v } h_m^{nor},h_m^{bgd},m\in\{a,v\} hmnor,hmbgd,m{a,v} 组合成负对。

我们将InfoNCE [55]作为此部分的训练目标,该目标缩小了正对之间的距离,并增大了负对之间的距离。对于音频暴力半袋表示 B a v i o ( i ) B_{a}^{vio}(i) Bavio(i) 与视觉正常实例嵌入 { h U n o r ( n ) } n = 1 K n o r \{ h_{\mathcal{U} }^{nor}( n) \} _{n= 1}^{K_{nor}} {hUnor(n)}n=1Knor 之间的目标可以表示为:
在这里插入图片描述
其中, ϕ \phi ϕ 表示余弦相似度函数, τ \tau τ 是温度超参数, K n o r K_{nor} Knor 表示整个小批量中正常实例的数量。类似地,音频暴力半袋表示 B a v i o ( i ) B_a^{vio}(i) Bavio(i) 与视觉背景实例嵌入 { h v b g d ( n ) } n = 1 K b g d \{h_v^{bgd}(n)\}_{n=1}^{K_{bgd}} {hvbgd(n)}n=1Kbgd 之间的目标可以表示为:
在这里插入图片描述

其中, K b g d K_{bgd} Kbgd 表示整个小批量中背景实例的数量。视觉对音频的对应部分非常相似,因此我们在简洁的写作中省略了这些内容。

4.3 Self-Distillation

前面部分提供的音频-视觉交互可能会引入大量的模态噪声,而模态异步性也会导致在相同时间位置的多模态和单模态特征之间的语义不匹配。为了解决这些问题,我们认为同时训练一个类似的视觉网络可以使模型集成单模态和多模态知识。通过可控的共同蒸馏策略,我们提出的模块确保模态噪声的减少和稳健的模态无关知识。

具体而言,我们提出了一个类似的单模态网络,其架构与我们的双流网络相当。跨模态注意力块被标准的Transformer编码器块替换,包括自注意力机制。在训练过程中,单模态网络以相对较小的学习率进行训练,并且相同层的参数通过指数移动平均策略被注入到音频-视觉网络中:
在这里插入图片描述
其中, θ a v \theta_{av} θav θ v \theta_v θv 分别表示音频-视觉模型和视觉模型的参数, m m m 是控制超参数,遵循余弦调度器,在训练过程中从初始值 m ^ \hat{m} m^ 增加到 1。

4.4 Learning Objective

整个框架采用联合训练的方式进行优化。对于视频级别的预测 p p p,我们利用二元交叉熵 L B \mathcal{L}_{\mathcal{B}} LB 作为训练目标,并使用线性增长策略来控制对比损失的权重。总的目标函数为:
在这里插入图片描述
其中, K v i o K_{vio} Kvio 表示整个小批量中暴力半袋的数量, λ ( t ) \lambda(t) λ(t) 是一个控制器,用于在几个时期内线性增加权重, r r r 表示增长比率, t t t 是当前时期, Λ \Lambda Λ 表示最大权重。

视觉网络通过二元交叉熵损失与视频级别标签进行优化,以提取单模态知识。这两个目标在训练期间同时进行优化,而在推断阶段,仅使用音频-视觉网络进行预测。

5 EXPERIMENT

在这里插入图片描述

消融实验(对每个模块):
在这里插入图片描述

6 CONCLUSION

在这篇论文中,我们调查了在音频-视觉场景下多示例学习(MIL)中的模型不同步和未区分实例现象,并进一步展示了对弱监督音频-视觉学习的影响。然后,我们提出了一种模态感知对比实例学习和自我蒸馏框架来解决这些问题。具体而言,我们设计了一个轻量级的双流网络来生成音频和视觉嵌入和logits。此外,我们对具有不同语义的音频和视觉实例应用了跨模态对比,这涉及更多未使用的实例,以实现更好的区分并减轻模态不一致性。为了减少训练噪声,我们利用自我蒸馏模块将视觉知识转移给音频-视觉网络,从而缩小了单模态和多模态特征之间的语义差距。我们的框架在XD-Violence数据集上的表现优于先前的方法,成本较低。此外,结合我们的对比学习和自我蒸馏模块,几种先前的方法实现了更高的检测精度,表明了作为插件模块改善其他网络的能力。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

盲人安全导航技巧:科技赋能让出行更自如

作为一名资深记者,长期关注并报道无障碍领域的发展动态。今日,我将聚焦盲人安全导航技巧,探讨这一主题下科技如何赋能视障人士实现更为安全、独立的出行。一款融合了实时避障、拍照识别物体及场景功能的盲人出行辅助应用叫做蝙蝠避障&#xf…

软考 - 系统架构设计师 - Web 应用真题(2)

问题 1: 淘汰策略:遗留系统技术含量低,业务价值也低,所以需要全面重新开发一个系统来替代遗留系;(一般是企业的业务发生了根本变化,遗留系统已经基本不再适应企业运作的需要;或者是遗…

C语言进阶课程学习记录-数组指针和指针数组分析

C语言进阶课程学习记录-数组指针和指针数组分析 实验-数组指针的大小实验-指针数组小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 实验-数组指针的大小 #include <stdio.h>typedef int(AINT…

【微信小程序之分包】

微信小程序之分包 什么是分包分包的好处分包前的结构图分包后的结构图分包的加载规则分包的体积限制使用分包打包原则引用原则独立分包独立分包的配置方法独立分包的引用原则分包预下载配置分包的预下载分包预下载限制 什么是分包 分包指的是把一个完整小程序项目&#xff0c;…

理想低通滤波器

理想低通滤波器&#xff0c;振铃现象是因为sinc函数&#xff0c;而sinc函数是因为例4.1的简单函数的傅里叶变换得到的。经过我的计算&#xff0c;简单函数的傅里叶反变换也得到sinc函数。这里的频率域滤波器因为是二个值的&#xff0c;所以类似简单函数&#xff0c;反变换之后得…

DRV8711驱动器的各寄存器的介绍

一、CTRL Register (Address = 0x00) ISENSE放大器增益设置:设定值越大时,表示在任何频率的指令脉冲下,位置滞后量越小;位置环的前馈增益大,控制系统的高速响应特性提高,但会使系统的位置不稳定,容易产生振荡; 死亡时间设置:电机驱动死区时间指的是在电机的控制信号由…

AI智能体技术突破:引领科技新浪潮

AI智能体技术突破&#xff1a;引领科技新浪潮 基于大模型的 AI Agent 工作流基于大模型的 AI Agent 工作流效果AI Agent 的四种设计模式Reflection 反思设计模式Tool use 工具使用设计模式Planning 规划设计模式Multiagent collaboration 多智能体协作设计模式 吴恩达在红杉美国…

Python可视化-matplotlib用法详解(一)

一、折线图绘制 import pandas as pds./../../data//unrate.csv unrate pd.read_csv(s) # 时间格式转换&#xff0c; unrate[DATE] pd.to_datetime(unrate[DATE]) print(unrate.head(12))DATE VALUE 0 1948-01-01 3.4 1 1948-02-01 3.8 2 1948-03-01 4.0 3 19…

C++ | Leetcode C++题解之第31题下一个排列

题目&#xff1a; 题解&#xff1a; class Solution { public:void nextPermutation(vector<int>& nums) {int i nums.size() - 2;while (i > 0 && nums[i] > nums[i 1]) {i--;}if (i > 0) {int j nums.size() - 1;while (j > 0 && …

pip如何查看Python某个包已发行所有版本号?

以matplotlib包为例子&#xff0c; pip install matplotlib6666 6666只是胡乱输入的一个数&#xff0c;反正输入任意一个不像版本号的数字都可以&#xff5e; matplotlib所有版本号如下&#xff0c; 0.86, 0.86.1, 0.86.2, 0.91.0, 0.91.1, 1.0.1, 1.1.0, 1.1.1, 1.2.0, 1.2.1…

从永远到永远-ThinkBook笔记本避坑

ThinkBook黑点吐槽 0.写在前边的话1.配置2.槽点1.蓝屏2.键盘失灵3.触摸板失灵4.游戏1.黑屏2.切出游戏 5.资源管理器搜索栏消失6.鼠标右键桌面失灵7.输入法8.声音 3.总结 0.写在前边的话 在购买本机之前&#xff0c;我一直使用的小米&#xff08;型号待补&#xff09;笔记本。也…

lua基本语法

Lua语法入门 初识lua vi hello.lua print("hello,lua") lua hello.lua 变量和循环 变量 循环 条件控制、函数 条件控制

计算机网络——实现smtp和pop3邮件客户端

实验目的 运用各种编程语言实现基于 smtp 协议的 Email 客户端软件。 实验内容 1. 选择合适的编程语言编程实现基于 smtp 协议的 Email 客户端软件。 2. 安装 Email 服务器或选择已有的 Email 服务器&#xff0c;验证自己的 Email 客户端软件是否能进行正常的 Email 收发功…

OWASP发布10大开源软件风险清单

3月20日&#xff0c;xz-utils 项目被爆植入后门震惊了整个开源社区&#xff0c;2021 年 Apache Log4j 漏洞事件依旧历历在目。倘若该后门未被及时发现&#xff0c;那么将很有可能成为影响最大的软件供应链漏洞之一。近几年爆发的一系列供应链漏洞和风险&#xff0c;使得“加强开…

材料物理 笔记-6

原内容请参考哈尔滨工业大学何飞教授&#xff1a;https://www.bilibili.com/video/BV18b4y1Y7wd/?p12&spm_id_frompageDriver&vd_source61654d4a6e8d7941436149dd99026962 或《材料物理性能及其在材料研究中的应用》&#xff08;哈尔滨工业大学出版社&#xff09; 文…

维护表和索引分区

1. ALTER FRAGMENT 语句 如果想更改分片策略&#xff0c;可以使用ALTER FRAGMENT语句。 初始化新的片段模式 ALTER FRAGMENT …INIT 增加额外片段 ALTER FRAGMENT …ADD 删除一个片段 ALTER FRAGMENT …DROP 修改片段表达式或 dbspace ALTER FRAGMENT …MODIFY 将表合并至一张…

音频---数字mic

一、常见的数字mic pdm麦通过codec芯片将数字麦转换为i2s信号输入到SOC 纯pdm麦就是直接进入SOC的pdm接口&#xff0c;走的是PDM信号&#xff0c;PDM信号就是两个线&#xff0c;一根数据线一根时钟线&#xff08;如顺芯ES7201/7202把MIC信号转换成PDM&#xff09;。 二、DMIC…

Chrome将网页保存为PDF的实战教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

半导体行业芯片加工机台数据采集,如何同时保证效率和准确性?

半导体行业的重要性不言而喻&#xff0c;随着互联网时代技术的不断更新和演进&#xff0c;芯片的应用更加广泛&#xff0c;新能源、信息通讯设备、4C产业、智能电网等领域均需要芯片的支撑。而芯片的制造涉及多个关键步骤&#xff0c;包括晶圆制备、氧化、光刻、刻蚀、薄膜沉积…

Vue3(四):组件通信详解(九种方法)

主要有九种方法&#xff0c;以下是详细解释及使用方法&#xff1a; 1.props props实现父子间的通信&#xff0c;是使用频率最高的。 &#xff08;1&#xff09;父传子&#xff1a;属性值是非函数。 以Father.vue和Child.vue 为例。 父组件中&#xff0c;引入子组件并给子组…