当前位置: 首页 > news >正文

【论文笔记】Contrastive Learning for Sign Language Recognition and Translation

🍎个人主页:小嗷犬的个人主页
🍊个人网站:小嗷犬的技术小站
🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。


基本信息

标题: Contrastive Learning for Sign Language Recognition and Translation
作者: Shiwei Gan, Yafeng Yin, Zhiwei Jiang, K. Xia, Linfu Xie, Sanglu Lu
发表: IJCAI 2023

基本信息

摘要

当前端到端手语处理架构中广泛存在两个问题。一个是 CTC 尖峰 现象,这削弱了连续手语识别(CSLR)中的视觉表征能力。另一个是 暴露偏差 问题,这导致在手语翻译(SLT)推理过程中翻译错误的累积。

在这篇论文中,我们通过引入对比学习来解决这些问题,旨在增强视觉级特征表示和语义级错误容忍度。

具体来说,为了缓解 CTC 尖峰现象并增强视觉级表示,我们设计了一种视觉对比损失,通过最小化同一手语视频中不同增强样本帧之间的视觉特征距离,从而使模型能够进一步探索特征,利用大量未标记的帧以无监督的方式。

为了缓解暴露偏差问题并提高语义级错误容忍度,我们设计了一种语义对比损失,通过将预测的句子重新输入到语义模块,并比较真实序列和预测序列的特征,使模型暴露于自身的错误中。

此外,我们提出了两种新的指标,即空白率和连续错误词率,直接反映我们在两个问题上的改进。在当前手语数据集上的广泛实验结果证明了我们方法的有效性,该方法达到了最先进的性能。

主要贡献

  • 为了缓解 CSLR 中的 CTC 尖峰现象并增强视觉级特征表示,我们提出了一种视觉对比损失,通过利用大量未标记的帧来探索特征。
  • 为了缓解 SLT 中的暴露偏差问题并提高语义级错误容忍度,我们提出了一种语义对比损失,通过将预测序列重新输入到语义模块中,使模型暴露于自身的翻译错误。
  • 提出了两种新的指标,即空白率和连续错误词率,以反映我们在两个问题上的改进。
  • 广泛的实验表明,所提出的损失函数和框架在 CSLR 和 SLT 上达到了最先进的性能。

方法

在这一节中,我们首先概述了我们的框架。然后,我们简单地描述了 CSLR 中的 CTC 尖峰现象,并提出了一种增强视觉表示的可视对比损失。

接着,我们描述了 SLT 中的暴露偏差问题,并提出了一种增强语义层错误容忍度的语义对比损失。最后,我们设计了联合损失,以训练我们的模型同时适用于 CSLR 和 SLT。

总体框架

对于一个包含 n n n 帧的手语视频 f = { f i } i = 1 n f=\{f_i\}_{i=1}^n f={fi}i=1n,CSLR 的目标是学习从 f f f g = { g i } i = 1 ϑ g=\{g_i\}_{i=1}^\vartheta g={gi}i=1ϑ 的映射,其中 g g g 包含 ϑ \vartheta ϑ 个手语符号,而 SLT 的目标是将 f f f 翻译成包含 t t t 个单词的口语句子 w = { w i } i = 1 t w=\{w_i\}_{i=1}^t w={wi}i=1t

Framework of common end-to-end CSLR and SLT model

如图 1 所示,CSLR 和 SLT 的过程可以简化如下。

视觉特征提取

视觉模块 V E \mathcal{VE} VE 处理帧以获得视觉特征 v = V E ( f ) v=\mathcal{VE}(f) v=VE(f),其中 v v v 包含 m m m 个向量, v = { v i ∈ R d v } i = 1 m v=\{v_i \in \mathbb{R}^{d_v}\}_{i=1}^m v={viRdv}i=1m m ≤ n m \leq n mn), d v d_v dv v i v_i vi 的维度。

时间特征提取

时间模块 T E \mathcal{TE} TE v v v 中提取全局上下文信息以获得 u = T E ( v ) u=\mathcal{TE}(v) u=TE(v),其中 u = { u i ∈ R d t } i = 1 m u=\{u_i \in \mathbb{R}^{d_t}\}_{i=1}^m u={uiRdt}i=1m d t d_t dt u i u_i ui 的维度。

识别和翻译

对于 CSLR,添加了一个全连接层,权重为 W r W_r Wr 和偏差 b r b_r br,以及一个 softmax 层 S M SM SM,以获得识别的手语序列的最终概率矩阵: R = S M ( W r ∗ u + b r ) R = SM(W_r *u + b_r) R=SM(Wru+br)

对于SLT,需要一个 RNN-like 或 transformer 解码器 S E SE SE,以获得第 i i i 步的翻译概率矩阵: Y i = S M ( W y ∗ S E ( u , { y j } j = 0 i − 1 ) + b y ) Y_i = SM(W_y*\mathcal{SE}(u, \{y_j\}_{j=0}^{i-1}) + b_y) Yi=SM(WySE(u,{yj}j=0i1)+by) 中, W y W_y Wy b y b_y by 是语义模块中全连接层的权重和偏差。

视觉级对比学习用于 CTC 尖峰现象

CTC 尖峰现象

在 CSLR 中,CTC 损失通过最大化所有可能路径的概率来解决未分段手语视频的时间分类问题,这些路径将帧与标记的 gloss 序列 g g g 在概率矩阵 R \mathbf{R} R 中对齐。

理想情况下,有必要为每一帧标注一个特定的类别。然而,考虑到无意义的帧和连续出现的相同 gloss,CTC 引入了 blank token,并进一步定义了一个多对一映射 B \mathcal{B} B,该映射简单地从路径中删除所有重复的 token 和 blank(例如,在图 2 中, B ( P a t h B ) = B ( a − a a − ) = a a \mathcal{B}(PathB) = \mathcal{B}(a-aa-) = aa B(PathB)=B(aaa)=aa)。因此,CTC损失可以形式化如下:

L C T C ( R , g ) = − ∑ π ∈ B − 1 ( g ) log ⁡ ( p ( π ) ) \mathcal{L}_{CTC}(\mathbf{R}, g) = -\sum_{\pi \in \mathcal{B}^{-1}(g)} \log(p(\pi)) LCTC(R,g)=πB1(g)log(p(π))

其中 p ( π ) = ∏ i = 1 m R i π i p(\pi) = \prod_{i=1}^{m} \mathbf{R}_i^{\pi_i} p(π)=i=1mRiπi π \pi π 表示一个对齐路径(即, B ( π ) = g \mathcal{B}(\pi) = g B(π)=g),而 R i π i \mathbf{R}_i^{\pi_i} Riπi 是第 i i i 个 token π i \pi_i πi 的概率。

Illustration of CTC loss. ‘-’ denotes blank token

然而,CTC 损失会导致尖峰现象。如图 2 所示,当模型无法自信地区分手势边界时,它倾向于将帧分类为 blank token,因为预测 blank token 是减少损失 L C T C \mathcal{L}_{CTC} LCTC 的更安全选择。例如, B ( P a t h A ) = B ( a a a b b ) = a b \mathcal{B}(PathA) = \mathcal{B}(aaabb) = ab B(PathA)=B(aaabb)=ab B ( P a t h C ) = B ( − a − − b ) = a b \mathcal{B}(PathC) = \mathcal{B}(-a--b) = ab B(PathC)=B(ab)=ab 都是标签序列 ‘ab’ 的正确路径,而 CTC 偏好 PathC 而不是 PathA ,这导致只有少数帧对最终结果有贡献。由于在训练过程中大多数帧被分类为 blank token,视觉模块没有得到充分训练,无法在测试集上提供有效的手语特征。

视觉级的对比学习

为了应对尖峰现象,我们的直观想法是通过使用更多数据训练视觉模块来增强视觉表示能力。

然而,与图像分类任务(ResNet 使用的 128 万张标记图像)或 NLP 任务(Transformer 使用的 450 万句对)不同,当前手语任务中的数据对(视频-手势对或视频-句子对)相当有限,通过手动标记每一帧来增加样本以单独训练视觉模块是不现实的。

但是,手语视频提供的未标记帧是丰富的,例如,Phoenix14 训练集中的 5672 个样本提供了 963,664 帧,Phoenix14T 训练集中的 7096 个样本提供了 827,354 帧。

因此,我们引入了视觉级的对比学习,通过比较同一手势视频的不同增强视图的视觉特征,使得视觉模块能够以无监督的方式进一步探索大量未标记帧中的特征。

为了构建视觉对比损失,我们首先需要从包含 n n n 个未标记帧的手势视频 f = { f i } i = 1 n f=\{f_i\}^n_{i=1} f={fi}i=1n 生成两个增强视频。

Visual-level contrastive learning (‘Aug’: augmentation)

如图 3 所示,我们引入两种不同的增强:软增强 S A \mathcal{SA} SA 和硬增强 H A \mathcal{HA} HA,以获得增强视频 f s f^s fs f h f^h fh

f s = S A ( f ) , f h = H A ( f ) f^s = \mathcal{SA}(f), \quad f^h = \mathcal{HA}(f) fs=SA(f),fh=HA(f)

然后,视觉模块 V E \mathcal{VE} VE 将两个增强视频映射到帧级别的视觉特征向量 v s = { v i s } i = 1 m v^s=\{v_i^s\}^m_{i=1} vs={vis}i=1m v h = { v i h } i m = 1 v^h=\{v_i^h\}^m_i=1 vh={vih}im=1,如下所示。

v s = V E ( f s ) , v h = V E ( f h ) v^s = \mathcal{VE}(f^s), \quad v^h = \mathcal{VE}(f^h) vs=VE(fs),vh=VE(fh)

接下来,如图 3 所示,一个投影 MLP 头 P R O v i \mathcal{PRO}_{vi} PROvi 和一个预测 MLP 头 P R E v i \mathcal{PRE}_{vi} PREvi 被附加到将视觉特征映射到应用对比损失的空间。

z s = P R O v i ( v s ) , z h = P R O v i ( v h ) z^s = \mathcal{PRO}_{vi}(v^s), \quad z^h = \mathcal{PRO}_{vi}(v^h) zs=PROvi(vs),zh=PROvi(vh)

p s = P R E v i ( z s ) p^s = \mathcal{PRE}_{vi}(z^s) ps=PREvi(zs)

在得到 p s p^s ps z h z^h zh 后,我们的相似性函数 S \mathcal{S} S 计算每个 p s p^s ps z h z^h zh 在帧级别的负余弦相似性,如下所示。这里, ∣ ∣ ⋅ ∣ ∣ 2 ||\cdot||_2 ∣∣2 ℓ 2 ℓ_2 2 范数。

S ( p i s , z i h ) = − p i s ∣ ∣ p i s ∣ ∣ 2 ⋅ z i h ∣ ∣ z i h ∣ ∣ 2 \mathcal{S}(p_i^s, z_i^h) = -\frac{p_i^s}{||p_i^s||_2} \cdot \frac{z_i^h}{||z_i^h||_2} S(pis,zih)=∣∣pis2pis∣∣zih2zih

当使用 S \mathcal{S} S 计算 p s p^s ps z h z^h zh 的相似性时,我们可以得到所有帧的平均损失,如下所示。

S ( p s , z h ) = 1 m ∑ i = 1 m S ( p i s , z i h ) \mathcal{S}(p^s, z^h) = \frac{1}{m} \sum_{i=1}^{m} \mathcal{S}(p_i^s, z_i^h) S(ps,zh)=m1i=1mS(pis,zih)

最后,遵循 SimSiam,我们进一步以对称方式获得 p h = P R E v i ( z h ) p^h=\mathcal{PRE}_{vi}(z^h) ph=PREvi(zh),并定义对称化的视觉对比损失 L V i C o \mathcal{L}_{ViCo} LViCo 如下,

L V i C o = S ( p s , d e t a c h ( z h ) ) + S ( p h , d e t a c h ( z s ) ) 2 \mathcal{L}_{ViCo} = \frac{\mathcal{S}(p^s, detach(z^h)) + \mathcal{S}(p^h, detach(z^s))}{2} LViCo=2S(ps,detach(zh))+S(ph,detach(zs))

其中 d e t a c h ( ⋅ ) detach(\cdot) detach() 函数表示停止梯度操作,这意味着 z h z^h zh z s z^s zs 被视为常量而不是具有梯度的变量。

语义级对比学习以解决暴露偏差

暴露偏差

在 SLT 中,seq2seq 架构(更精确地说是自回归架构)通常通过最大似然估计(MLE)进行训练。

The difference between MLE-based training and inference

如图 4 所示,以 RNN 类解码器为例,基于 MLE 的训练通过最大化下一个词 y i y_i yi 基于其前一个真实词 w i − 1 w_{i-1} wi1(称为 teacher forcing)的概率来进行优化,如下所示。

这里, θ \theta θ 表示模型参数, θ ∗ \theta^* θ 表示更新后的参数, h i − 1 h_{i-1} hi1 是语义模块的第 ( i − 1 ) (i-1) (i1) 个隐藏状态, u u u 表示时间特征。

θ ∗ = arg max ⁡ θ ∏ i = 1 t P θ ( y i ∣ w i − 1 , h i − 1 , u ) \theta^* = \argmax_\theta \prod_{i=1}^{t} P_\theta(y_i | w_{i-1}, h_{i-1}, u) θ=θargmaxi=1tPθ(yiwi1,hi1,u)

而在推理阶段,模型需要根据自身生成的前缀词 y i − 1 y_{i-1} yi1 来预测 Y i y i Y_i^{y_i} Yiyi(即词 y i y_i yi 的概率)。

Y i y i = P θ ∗ ( y i ∣ y i − 1 , h i − 1 , u ) Y_i^{y_i} = P_{\theta^*}(y_i | y_{i-1}, h_{i-1}, u) Yiyi=Pθ(yiyi1,hi1,u)

由于在训练过程中接触到了真实数据,模型可能会过度依赖正确的前缀词。而在推理过程中,错误预测的词 y i − 1 y_{i-1} yi1 可能会加剧沿生成序列的误差传播,模型生成的目标概率分布将逐渐扭曲(称为暴露偏差)。暴露偏差会导致性能显著下降,尤其是在训练样本的序列分布不足以覆盖测试样本的序列分布时。

语义级对比学习

为了解决暴露偏差问题,最直接的解决方案是计划采样。计划采样在训练过程中决定是否以概率 α α α 使用真实词 w i − 1 w_{i-1} wi1 或预测词 y i − 1 y_{i-1} yi1。通过这种方式,模型可以通过暴露其自身的错误来削弱对真实词的依赖。

然而,直接将计划采样应用于 Transformer 模型并不简单,因为与 RNN 类解码器不同,Transformer 基于整个前缀序列 { y j } j = 0 i − 1 \{y_j\}_{j=0}^{i-1} {yj}j=0i1 而不是最后一个词 y i − 1 y_{i-1} yi1 生成第 i i i 个词。

此外,计划采样训练是一个随时间进行的顺序过程,因此阻碍了并行训练。

在这篇论文中,遵循让模型暴露自身错误的相同理念,我们通过比较语义模块(即解码器模块)中不同输入(真实序列输入和预测序列输入)的语义特征来引入语义级对比学习,以减轻暴露偏差。

与计划采样相比,我们的方法可以用于 RNN 类解码器和 Transformer 解码器,并且可以轻松并行训练。

为了构建语义对比损失,我们首先需要基于真实句子 w w w 获得翻译句子 y y y。具体来说,对于时间特征 u = { u i } i = 1 m u=\{u_i\}_{i=1}^m u={ui}i=1m,语义模块 S E \mathcal{SE} SE u u u w w w 作为输入以获得语义特征(即隐藏状态) h w h^w hw

h w = S E ( u , w ) h^w = \mathcal{SE}(u, w) hw=SE(u,w)

然后,采用全连接层和 softmax 函数 S M \mathcal{SM} SM 来获得翻译句子的可能性矩阵 Y \mathbf{Y} Y,并通过 argmax 操作进一步获得翻译句子 y y y

Y = S M ( W y ∗ h w + b y ) \mathbf{Y} = \mathcal{SM}(W_y * h^w + b_y) Y=SM(Wyhw+by)

y = argmax ( Y ) y = \text{argmax}(\mathbf{Y}) y=argmax(Y)

Semantic-level Contrastive (SeCo) learning for tackling exposure bias by re-inputting predicted sequence

之后,如图 5 所示,我们将预测的句子 y y y 重新输入到语义模块中以获得另一个语义特征 h y h^y hy,如下所示。这里,重新输入预测序列 y y y 可以被视为重新输入增强的真实词 w w w,也可以被视为一种计划采样的形式。

h y = S E ( u , y ) h^y = \mathcal{SE}(u, y) hy=SE(u,y)

接下来,类似于图 3 中的视觉模块,添加了一个投影 MLP 头 P R O s e \mathcal{PRO}_{se} PROse 和一个预测 MLP 头 P R E s e \mathcal{PRE}_{se} PREse 以获得 ρ w \rho^w ρw ξ w \xi^w ξw。此外,采用了相似性函数 S \mathcal{S} S 来计算 ρ w \rho^w ρw ξ g \xi^g ξg 之间的距离,

ρ w = P R O s e ( h w ) , ρ y = P R O s e ( h y ) \rho^w = \mathcal{PRO}_{se}(h^w), \quad \rho^y = \mathcal{PRO}_{se}(h^y) ρw=PROse(hw),ρy=PROse(hy)

ξ w = P R E s e ( ρ w ) \xi^w = \mathcal{PRE}_{se}(\rho^w) ξw=PREse(ρw)

最后,我们也得到 ξ y = P R E s e ( ρ y ) \xi^y = \mathcal{PRE}_{se}(\rho^y) ξy=PREse(ρy),并定义对称化的语义对比损失 L S e C o \mathcal{L}_{SeCo} LSeCo 如下,

L S e C o = S ( ξ w , detach ( ρ y ) ) + S ( ξ y , detach ( ρ w ) ) 2 \mathcal{L}_{SeCo} = \frac{\mathcal{S}(\xi^w, \text{detach}(\rho^y)) + \mathcal{S}(\xi^y, \text{detach}(\rho^w))}{2} LSeCo=2S(ξw,detach(ρy))+S(ξy,detach(ρw))

CSLR 和 SLT 的联合损失

为了使用提议的对比损失优化我们的模型,我们需要基于不同的输入两次推断我们的模型 M O \mathcal{MO} MO。一种包含软增强视频 f s f_s fs 和标记的词序列 w w w。另一种包含硬增强视频 f h f^h fh 和预测的词序列 y y y,其中 y = arg ⁡ max ⁡ ( Y ) y = \arg\max(\mathbf{Y}) y=argmax(Y)

R , Y , ( p s , z s ) , ( ρ w , ξ w ) = M O ( f s , w ) \mathbf{R}, \mathbf{Y}, (p^s, z^s), (\rho^w, \xi^w) = \mathcal{MO}(f^s, w) R,Y,(ps,zs),(ρw,ξw)=MO(fs,w)

R ′ , Y ′ , ( p h , z h ) , ( ρ y , ξ y ) = M O ( f h , y ) \mathbf{R}', \mathbf{Y}', (p^h, z^h), (\rho^y, \xi^y) = \mathcal{MO}(f^h, y) R,Y,(ph,zh),(ρy,ξy)=MO(fh,y)

在获得 ( p s , z s , p h , z h ) , ( ξ w , ρ w , ρ y , ξ y ) (p^s, z^s, p^h, z^h), (\xi^w, \rho^w, \rho^y, \xi^y) (ps,zs,ph,zh),(ξw,ρw,ρy,ξy) 后,我们可以分别计算对比损失 L V i C o , L S e C o \mathcal{L}_{ViCo}, \mathcal{L}_{SeCo} LViCo,LSeCo。同时,我们得到两个识别概率矩阵 R , R ′ \mathbf{R}, \mathbf{R}' R,R 和两个翻译概率矩阵 Y , Y ′ \mathbf{Y}, \mathbf{Y}' Y,Y。为了实现 CSLR 和 SLT 的联合目标,我们采用 CTC 损失 L C T C \mathcal{L}_{CTC} LCTC 和交叉熵损失 L C E \mathcal{L}_{CE} LCE 来训练我们的模型,如下所示,

L s o f t = L C T C ( R , g ) + L C E ( Y , w ) \mathcal{L}_{soft} = \mathcal{L}_{CTC}(\mathbf{R}, g) + \mathcal{L}_{CE}(\mathbf{Y}, w) Lsoft=LCTC(R,g)+LCE(Y,w)

L h a r d = L C T C ( R ′ , g ) + L C E ( Y ′ , w ) \mathcal{L}_{hard} = \mathcal{L}_{CTC}(\mathbf{R}', g) + \mathcal{L}_{CE}(\mathbf{Y}', w) Lhard=LCTC(R,g)+LCE(Y,w)

最后,我们得到带有平衡权重 α \alpha α 的联合损失 L \mathcal{L} L,其中 α \alpha α 是一个超参数,如下所示,

L = L s o f t + L h a r d + α ( L V i C o + L S e C o ) \mathcal{L} = \mathcal{L}_{soft} + \mathcal{L}_{hard} + \alpha (\mathcal{L}_{ViCo} + \mathcal{L}_{SeCo}) L=Lsoft+Lhard+α(LViCo+LSeCo)

实验

空白率和连续错误词率

为了验证我们的方法是否能够有效处理 CTC 尖峰现象和暴露偏差问题,我们提出了两个新的指标:空白率( B R BR BR)和连续错误词率( C W W R CWWR CWWR)。

B R BR BR 是一个直接反映尖峰现象严重程度的指标,可以表示为以下形式:

B R = # B l a n k # T o t a l R BR = \frac{\#Blank}{\#TotalR} BR=#TotalR#Blank

其中 # B l a n k \#Blank #Blank 表示识别序列中 blank token 的数量,而 # T o t a l R \#TotalR #TotalR 表示识别序列中所有 token 的总数。

C W W R CWWR CWWR 是一个直接反映模型在翻译中依赖先前预测词汇程度的指标,可以表示为以下公式:

C W W R = ∑ # C W # T o t a l T CWWR = \frac{\sum \#CW}{\#TotalT} CWWR=#TotalT#CW

其中 # C W \#CW #CW 表示连续错误单词的数量,而 # T o t a l T \#TotalT #TotalT 表示翻译序列中单词的总数。

An example of BR, CWWR calculation.“***” denotes wrong predicted token and “-” denotes blank token

主实验

Comparison with of SLT performance on Phoenix14T (F: face, M: mouth, H: hands, S: skeleton, P: pretraining on other datasets)

Comparison of SLT performance on CSL-daily dataset

Comparison of CSLR performance on Phoenix14T dataset

Comparison of CSLR performance on CSL-daily dataset

Comparison of CSLR performance on Phoenix14 dataset

消融实验

Effects of beam width about recognition and translation performance on Phoenix14T dev set

Effects of different weights α on Phoenix14T dev set

Comparison of different training strategies

Ablation study on Phoenix14T dev set

Effects of different masking rates

Effects of different padding rates

Qualitative analysis on Phoenix14T test set

总结

在这篇论文中,我们引入对比学习来解决手语任务中广泛存在的两个问题:连续手语识别(CSLR)任务中的 CTC 尖峰现象和手语翻译(SLT)任务中的暴露偏差。

具体来说,为了解决 CTC 尖峰现象,我们设计了一种视觉对比损失,通过从大量未标记的帧中学习特征来增强视觉模块。

为了解决暴露偏差问题,我们设计了一种语义对比损失,通过让模型暴露在自己的错误中来增强语义模块。

此外,我们提出了两种新的指标,即空白率(Blank Rate)和连续错误词率(Consecutive Wrong Word Rate),以直接反映我们在两个问题上的改进。

在公共手语数据集上的实验结果证明了我们方法的有效性。

相关文章:

【论文笔记】Contrastive Learning for Sign Language Recognition and Translation

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: Contrastive Learning for…...

Gitlab17.7+Jenkins2.4.91实现Fastapi/Django项目持续发布版本详细操作(亲测可用)

一、gitlab设置: 1、进入gitlab选择主页在左侧菜单的下面点击管理员按钮。 2、选择左侧菜单的设置,选择网络,在右侧选择出站请求后选择允许来自webhooks和集成对本地网络的请求 3、webhook设置 进入你自己的项目选择左侧菜单的设置&#xff…...

一起来看--红黑树

【欢迎关注编码小哥,学习更多实用的编程方法和技巧】 红黑树是一种自平衡的二叉搜索树,广泛应用于计算机科学中,尤其是在实现关联数组和集合时。它的设计旨在确保在最坏情况下,基本动态集合操作(如插入、删除和查找&am…...

SpringBoot整合篇 05、Springboot整合Redission

文章目录 前言Redission详细配置步骤pom依赖application.yaml配置类CacheConfigEnvironmentContext RedissionController单测 前言 本篇博客是SpringBoot整合Redission,若文章中出现相关问题,请指出! 所有博客文件目录索引:博客…...

供应链系统设计-供应链中台系统设计(六)- 商品中心概念篇

概述 我们在供应链系统设计-中台系统设计系列(五)- 供应链中台实践概述 中描述了什么是供应链中台,供应链中台主要包含了那些组成部门。包括业务中台、通用中台等概念。为了后续方便大家对于中台有更深入的理解,我会逐一针对中台…...

胡闹厨房练习(三)

ScriptableObject 一、初步了解 1、实质:是一种特殊类型的Unity对象, 2、作用:用于存储大量数据,而不必依附于游戏场景中的某个GameObject。 3、特点: 可以在不增加场景中对象数量的情况下,管理和存储复杂的数据结构、配置信息、游戏状态等。 4、适用:非常适合用来…...

关于ESD(静电放电)等级的划分

关于ESD(静电放电)等级的划分,主要依据不同的测试模型和测试标准。以下是对HBM(人体模型)和CDM(充电器件模型)两种测试模型下ESD等级划分的详细解释: HBM ESD等级划分 HBM ESD等级…...

探究步进电机与输入脉冲的关系

深入了解步进电机 前言一、 步进电机原理二、 细分三、脉冲数总结 前言 主要是探究以下内容: 1、步进电机的步进角。 2、什么是细分。 3、脉冲的计算。 最后再扩展以下STM32定时器的计算方法。 一、 步进电机原理 其实语言描述怎么样都不直观,我更建议…...

基于YOLOV5+Flask安全帽RTSP视频流实时目标检测

1、背景 在现代工业和建筑行业中,安全始终是首要考虑的因素之一。特别是在施工现场,工人佩戴安全帽是确保人身安全的基本要求。然而,人工监督难免会有疏漏,尤其是在大型工地或复杂环境中,确保每个人都佩戴安全帽变得非…...

Windows内置的服务器IIS(Internet Information Services)托管网站

一. 安装IIS 打开控制面板:在开始菜单搜索“控制面板”并打开它。程序和功能:点击“程序”然后选择“程序和功能”。启用或关闭Windows功能:在左侧菜单中选择“启用或关闭Windows功能”。查找并勾选IIS:在弹出的窗口中&#xff0c…...

虚幻引擎结构之UObject

一. UObject 的介绍 UObject 是虚幻引擎中的核心基础类,所有其他游戏对象和资源类都直接或间接地继承自它。作为虚幻引擎的基石,UObject 提供了多项关键功能,包括内存管理、序列化、反射(introspection)、垃圾回收以及元数据支持。在虚幻引擎中,UObject 类的实例通常被称…...

js的Reflect对象

Reflect 对象是 JavaScript ES6 中引入的一个内建对象,它提供了一系列与对象操作相关的方法。这些方法与 Object 对象上的方法类似,但在行为上有一些差异,并且更加规范和统一。Reflect 对象并不是一个构造函数,不能被 new 操作符调…...

this指向了谁?

看函数在执行的时候是如何调用的, 1 如果这个函数是用普通函数调用模式来进行调用,它内部的this指向了window; 2 如果一个函数在调用的时候是通过对象方法模式来进行调用,则它内部的this就是我们的对象; 3 如果一个函数在调用的时候通过构…...

基于Resnet、LSTM、Shufflenet及CNN网络的Daily_and_Sports_Activities数据集仿真

在深度学习领域,不同的网络结构设计用于解决特定的问题。本文将详细分析四种主流网络结构:卷积神经网络(CNN)、残差网络(ResNet)、长短期记忆网络(LSTM)和洗牌网络(Shuff…...

mac系统vsCode中使用Better Comments在.vue文件里失效

问题:关于Better Comments默认在html、TS、JS中有效,在vue中无效,需要单独进行配置 windows系统可以参考友链Better Comments(注释高亮)在vue文件里失效的问题 关于Better Comments电脑的配置路径: Windows系统&…...

UE5.3 C++ Ceiusm中的POI 制作3DUI 结合坐标转化

一.核心思路WidgetComponent CesiumGloberAnchor 二.先制作POI 创建C Actor来制作,APOI。直接上代码 #pragma once#include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "CesiumGlobeAnchorComponent.h" #includ…...

一起学Git【第六节:查看版本差异】

git diff是 Git 版本控制系统中用于展示差异的强大工具。他可以用于查看文件在工作区、暂存区和版本库之间的差异、任意两个指定版本之间的差异和两个分支之间的差异等,接下来进行详细的介绍。 1.显示工作区与暂存区之间的差异 # 显示工作区和暂存区之间的差异,后面不加参数…...

numpy np.newaxis介绍

np.newaxis 是 NumPy 中用于增加数组维度的关键字。它的作用是为数组插入一个新的维度,从而改变数组的形状(shape)。 基本用法 np.newaxis 等价于 None,可以作为索引使用,用于在指定位置增加一个维度。增加的维度的大…...

小程序配置文件 —— 16 项目配置文件和配置 sass

目录 项目配置文件配置 sass 项目配置文件 在创建项目的时候,每个项目的根目录生成两个 config.json 文件(project.config.json 和 project.private.config.json ),用于保存开发者在工具上做的个性化配置,例如和编译有…...

【yolov5】实现FPS游戏人物检测,并定位到矩形框上中部分,实现自瞄

介绍 本人机器学习小白,通过语言大模型百度进行搜索,磕磕绊绊的实现了初步效果,能有一些锁头效果,但识别速度不是非常快,且没有做敌友区分,效果不是非常的理想,但在4399小游戏中爽一下还是可以…...

react-color-palette源码解析

项目中用到了react-color-palette组件,以前对第三方组件都是不求甚解,这次想了解一下其实现细节。 简介 react-color-palette 是一个用于创建颜色调色板的 React 组件。它提供了一个简单易用的接口,让开发者可以轻松地创建和管理颜色调色板。…...

在 Ubuntu 上安装 NVM (Node Version Manager) 的步骤

NVM (Node Version Manager) 是一个用于管理多个 Node.js 版本的工具,它允许您在同一台设备上安装、切换和管理不同版本的 Node.js。以下是在 Ubuntu 上安装 NVM 的详细步骤: 安装前准备 可先在windows上安装ubuntu 参考链接:https://blog.…...

重温经典算法——插入排序

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl 基本原理 插入排序是一种基于元素逐步插入的简单排序算法,其核心思想是将待排序序列分为已排序和未排序两部分,每次从未排序部分取出第一个元素&…...

在VirtualBox中打造高效开发环境:CentOS虚拟机安装与优化指南

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、为何选择VirtualBox CentOS组合? 对于程序员而言,构建隔离的开发测试环境是刚需。VirtualBox凭借其跨平台支持(W…...

塔能科技:为多行业工厂量身定制精准节能方案

在当今追求可持续发展的时代,工厂能耗精准节能成为众多企业关注的焦点。塔能科技凭借先进的技术和丰富的经验,服务于广泛的行业客户,其中55.5%来自世界500强和上市公司。针对不同行业工厂的特点和需求,塔能提供了一系列行之有效的…...

【实证分析】上市公司全要素生产率+5种测算方式(1999-2024年)

上市公司的全要素生产率(TFP)衡量企业在资本、劳动及中间投入之外,通过技术进步、管理效率和规模效应等因素提升产出的能力。与单纯的劳动生产率或资本生产率不同,TFP综合反映了企业创新能力、资源配置效率和组织优化水平&#xf…...

弥散制氧机工作机制:高原低氧环境的氧浓度重构技术

弥散制氧机通过空气分离与智能扩散技术,将氧气均匀分布于封闭或半封闭空间,实现环境氧浓度的主动调控。其核心在于 “分子筛吸附动态均布智能反馈” 的协同作用机制,为高原、矿井、医疗等场景提供系统性氧环境解决方案。 一、空气分离&#x…...

[Python] 避免 PyPDF2 写入 PDF 出现黑框问题:基于语言自动匹配系统字体的解决方案

在使用 Python 操作 PDF 文件时,尤其是在处理中文、日语等非拉丁字符语言时,常常会遇到一个令人头疼的问题——文字变成“黑框”或“方块”,这通常是由于缺少合适的字体支持所致。本文将介绍一种自动选择系统字体的方式,结合 PyPDF2 模块解决此类问题。 一、问题背景:黑框…...

《基于Keepalived+LVS+Web+NFS的高可用集群搭建》

目 录 1 项目概述 1.1 项目背景 1.2 项目功能 2 项目的部署 2.1 部署环境介绍 2.2 项目的拓扑结构 2.3 项目环境调试 2.4 项目的部署 2.5 项目功能的验证 2.6 项目对应服务使用的日志 3 项目的注意事项 3.1 常见问题与解决方案 3.2 项目适用背…...

RabbitMQ搭建集群

要在 Windows 或 Linux(CentOS 7.9) 上搭建 RabbitMQ 集群,基本思路是: 🗂️ 架构说明 主机角色IP节点名称A主节点10.152.132.1rabbitnode1B备节点10.152.132.2rabbitnode2 集群目标:两台 RabbitMQ 节点加…...