当前位置: 首页 > 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小游戏中爽一下还是可以…...

Spring Boot 实现流式响应(兼容 2.7.x)

在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

USB Over IP专用硬件的5个特点

USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

Java求职者面试指南:计算机基础与源码原理深度解析

Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...

C++ 设计模式 《小明的奶茶加料风波》

👨‍🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

第八部分:阶段项目 6:构建 React 前端应用

现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...