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

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...