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数据集上的表现优于先前的方法,成本较低。此外,结合我们的对比学习和自我蒸馏模块,几种先前的方法实现了更高的检测精度,表明了作为插件模块改善其他网络的能力。

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

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

相关文章

读天才与算法:人脑与AI的数学思维笔记02_激发创造力

1. 心理创造力 1.1. 自我创造力的实现结果对个体来说可能是全新的,但纵观历史其实已算是“明日黄花”,这就是心理创造力的概念 2. 激发创造力 2.1. 理智是创造力最大的敌人 2.1.1. 巴勃罗毕加索(P…

Jmeter 场景测试:登录--上传--下载--登出

为了练习Jmeter的使用,今天我要测试的场景是“登录--上传--下载--登出”这样一个过程. 测试的目标是我曾经练手写的一个文件分享系统,它要求用户只有登录后才可以下载想要的文件。 Jmeter总体结构: 第一步:添加HTTP Cookie管理器…

47.HarmonyOS鸿蒙系统 App(ArkUI)创建轮播效果

创建轮播效果,共3页切换 Entry Component struct Index {State message: string Hello Worldprivate swiperController: SwiperController new SwiperController()build() {Swiper(this.swiperController) {Text("第一页").width(90%).height(100%).bac…

电动汽车退役锂电池SOC主动均衡控制MATLAB仿真

微❤关注“电气仔推送”获得资料(专享优惠) 仿真简介 模型选用双向反激变换器作为主动均衡拓扑电路,均衡策略采用基于SOC的主动均衡策略,旨在解决电动汽车退役锂电池的不一致性问题。模型选用双向反激变换器作为主动均衡拓扑电路…

pytorch Neural Networks学习笔记

(1)输入图像,13232,通道数1,高32,宽32 (2)卷积层1,滤波器的shape为6155,滤波器个数6,通道数1,高5,宽5。卷积层1的输出为62…

【介绍下负载均衡原理及算法】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

使用docker配置DSP-SLAM

一.Docker环境配置 1.简单介绍 –docker容器技术–。 简单理解:Anaconda用于隔离不同的python环境;docker可以理解成在你的机器里面安装了一个独立的系统,因此它可以隔离不同的CUDA环境,还有着独立的文件系统,防止别…

高级IO和5种IO模型

目录 1. 高级IO1.1 IO的基本概念1.2 OS如何得知外设当中有数据可读取1.3 OS如何处理从网卡中读取到的数据包1.4 IO的步骤 2. 五种IO模型2.1 利用钓鱼来理解2.2 阻塞IO2.3 非阻塞IO2.4 信号驱动IO2.5 IO多路转接2.6 异步IO 3. 高级IO的概念3.1 同步通信 VS 异步通信3.2 阻塞 VS …

k-means聚类算法的MATLAB实现及可视化

K-means算法是一种无监督学习算法,主要用于数据聚类。其工作原理基于迭代优化,将数据点划分为K个集群,使得每个数据点都属于最近的集群,并且每个集群的中心(质心)是所有属于该集群的数据点的平均值。以下是…

STM32有什么高速接口吗?

STM32系列微控制器在高速接口方面也提供了一些强大的功能,虽然没有像Zynq那样的可编程逻辑部分,但有一些特性值得注意。我这里有一套嵌入式入门教程,不仅包含了详细的视频 讲解,项目实战。如果你渴望学习嵌入式,不妨点…

【数据结构与算法】用两个栈实现一个队列

题目 用两个栈,实现一个队列功能 add delete length 队列 用数组可以实现队列,数组和队列的区别是:队列是逻辑结构是一个抽象模型,简单地可以用数组、链表实现,所以数组和链表是一个物理结构,队列是一个逻…

Go 单元测试基本介绍

文章目录 引入一、单元测试基本介绍1.1 什么是单元测试?1.2 如何写好单元测试1.3 单元测试的优点1.4 单元测试的设计原则 二、Go语言测试2.1 Go单元测试概要2.2 Go单元测试基本规范2.3 一个简单例子2.3.1 使用Goland 生成测试文件2.3.2 运行单元测试2.3.3 完善测试用…

easyexcel升级3.3.4失败的经历

原本想通过easyexcel从2.2.6升级到3.3.3解决一部分问题,结果之前的可以用的代码,却无端的出现bug 1 Sheet index (1) is out of range (0…0) 什么都没有改,就出了问题,那么问题肯定出现在easyexcel版本自身.使用模板填充的方式进…

conda新建环境报错An HTTP error occurred when trying to retrieve this URL.

conda新建环境报错如下 cat .condarc #将 .condarc文件中的内容删除,改成下面的内容 vi .condarc channels:- defaults show_channel_urls: true default_channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main- https://mirrors.tuna.tsinghua.…

权限管理Ranger详解

文章目录 一、Ranger概述与安装1、Ranger概述1.1 Ranger介绍1.2 Ranger的目标1.3 Ranger支持的框架1.4 Ranger的架构1.5 Ranger的工作原理 2、Ranger安装2.1 创建系统用户和Kerberos主体2.2 数据库环境准备2.3 安装RangerAdmin2.4 启动RangerAdmin 二、Ranger简单使用1、安装 R…

【Java NIO】那NIO为什么速度快?

Java IO在工作中其实不常用到,更别提NIO了。但NIO却是高效操作I/O流的必备技能,如顶级开源项目Kafka、Netty、RocketMQ等都采用了NIO技术,NIO也是大多数面试官必考的体系知识。虽然骨头有点难啃,但还是要慢慢消耗知识、学以致用哈…

# RAG | Langchain # Langchain RAG:打造Markdown文件的结构化分割解决方案

【文章简介】 在信息技术的现代背景下,高效地处理和分析文本数据对于知识获取和决策支持至关重要。Markdown文件因其易读性和高效性,在文档编写和知识共享中占据了重要地位。然而,传统的文本处理方法往往忽视了Markdown的结构化特性&#xff…

KNIME 国际化支持投票

你的投票也许能让 KNIME 中文化快一点点。 i18n 是个很搞笑的单词,它是英文 internationalization 国际化的缩写。18 指的是首字母i和末字母n中间有18个字母。另外还有什么 K8s 也是一样,中间省去了8个字母 ... 真是懒的可以。指北君还想起一个类似的笑话…

数字革命的先锋:Web3对社会的影响

引言 在信息技术飞速发展的当下,Web3作为一个新兴的互联网模式,正在逐渐改变我们的生活方式、商业模式和社会结构。本文将深入探讨Web3的核心特点、它在各个领域中的应用以及对社会产生的深远影响。 1. Web3的核心特点 1.1 去中心化 Web3强调去中心化…

记【k8s】:访问 Prometheus UI界面:kubernetes-etcd (0/1 up) Error : out of bounds

记【k8s】:访问 Prometheus UI界面:kubernetes-etcd (0/1 up) Error : out of bounds 1、报错详情2、解决方法 💖The Begin💖点点关注,收藏不迷路💖 出现 “out of bound…