【论文笔记】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),以直接反映我们在两个问题上的改进。

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

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

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

相关文章

docker redis安装

一.镜像拉取 docker pull redis:5.0新建文件 touch /home/redis/redis.conf touch /home/redis/redis_6379.pid # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 #bind 127.0.0.1protected-mode noport 6379tcp-backlog 511requirepass roottimeout 0tcp-keepali…

【CSS in Depth 2 精译_096】16.4:CSS 中的三维变换 + 16.5:本章小结

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…

小程序租赁系统开发的优势与实践探索

内容概要 小程序租赁系统开发正在引起广泛关注,特别是在数字化快速发展的今天。很多企业开始意识到,小程序不仅能为他们带来更多的客户,还能极大地提高管理效率。借助小程序,用户在租赁时可以更加方便地浏览和选择产品&#xff0…

机器人C++开源库The Robotics Library (RL)使用手册(二)

由于RL库采用跨平台CMake源码,可以轻松在win、ubantu等平台部署、编译,win通常用VS编译器,为了便于使用、阅读,需要将CMake编译成VS工程。 1、准备三个工具:CMake、VS、QT 为了在Windows上编译RL和依赖项,您需要安装一个编译器(例如。,Visual Studio 2017)和跨平台构…

如何在LabVIEW中更好地使用ActiveX控件?

在LabVIEW中,ActiveX控件可以帮助实现与其他应用程序或第三方组件的集成(例如Microsoft Excel、Word、Internet Explorer等)。以下是一些建议,帮助您更好地在LabVIEW中使用ActiveX控件: ​ 1. 理解ActiveX控件的基本原…

如何使用Python从SACS结构数据文件中提取节点数据信息并导出到EXCEL

在现代工程设计中,结构分析和数据处理是不可或缺的一部分。特别是在海洋工程、桥梁建设等领域,SACS文件被广泛应用。这种文件格式包含了结构模型的各种重要信息,包括节点(JOINT)、构件(ELEMENT)…

如何判断一个学术论文是否具有真正的科研价值?ChatGPT如何提供帮助?

目录 1.创新性与学术贡献的超级加分✔ 2.科研过程中的各个环节—从0到1✔ 3.创新性与理论深度的完美结合✔ 4.论证与写作的清晰性✔ 5.数据整理和文献回顾——效率与精准并存✔ 6.创新性要求辅助✔ 总结 宝子们,学术论文写作的旅程是不是感觉像是走进了迷雾森…

学习threejs,THREE.CircleGeometry 二维平面圆形几何体

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.CircleGeometry 圆形…

【微服务】SpringBoot 自定义消息转换器使用详解

目录 一、前言 二、SpringBoot 内容协商介绍 2.1 什么是内容协商 2.2 内容协商机制深入理解 2.2.1 内容协商产生的场景 2.3 内容协商实现的常用方式 2.3.1 前置准备 2.3.2 通过HTTP请求头 2.3.2.1 操作示例 2.3.3 通过请求参数 三、SpringBoot 消息转换器介绍 3.1 H…

深入理解Composer自动加载机制

Composer是PHP生态系统中最常用的依赖管理工具之一,它不仅能够帮助开发者管理项目的依赖关系,还能够自动加载这些依赖项。自动加载机制是Composer的核心功能之一,通过自动加载,开发者可以在运行时按需加载所需的类和文件&#xff…

【游戏设计原理】35 - 委员会设计

一、 分析并总结 核心内容 定义:委员会设计(Design by Committee)是指游戏开发团队通过集体协作完成设计,这种模式结合了多样化的创意和个体专长,但也可能因缺乏一致性而导致设计的混乱。优势:多样性带来…

【Java】IO流练习

IO流练习 题干: 根据指定要求,完成电话记录、 注册、登录 注册 题干: 完成【注册】功能: 要求: 用户输入用户名、密码存入users.txt文件中 若users.txt文件不存在,创建该文件若users.txt文件存在 输入…

内网学习:工作组用户与权限

目录 一、本地用户组介绍本地工作组介绍用户与组的关系 二、四种用户类型及权限比较本地系统最高权限(System账户)特性Administrator与System账户的区别 本地最高管理员(Administrator用户)特性 本地普通管理员特性 本地普通用户特…

SpringMVC核心、两种视图解析方法、过滤器拦截器 “ / “ 的意义

SpringMVC的执行流程 1. Spring MVC 的视图解析机制 Spring MVC 的核心职责之一是将数据绑定到视图并呈现给用户。它通过 视图解析器(View Resolver) 来将逻辑视图名称解析为具体的视图文件(如 HTML、JSP)。 核心流程 Controlle…

抽象类和接口的区别是什么?

抽象类和接口在编程中都是用来定义对象的公共行为的重要概念,但两者之间存在显著的区别。以下是对抽象类和接口的详细比较: 一、定义与关键字 抽象类:使用abstract关键字定义,表示该类是抽象的,不能被实例化。抽象类…

html+css+js网页设计 美食 美拾9个页面

htmlcssjs网页设计 美食 美拾9个页面 网页作品代码简单,可使用任意HTML辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作)。 获取源码 1&#xff0…

Linux下PostgreSQL-12.0安装部署详细步骤

一、安装环境 postgresql-12.0 CentOS-7.6 注意:确认linux系统可以正常连接网络,因为在后面需要添加依赖包。 二、pg数据库安装包下载 下载地址:PostgreSQL: File Browser 选择要安装的版本进行下载: 三、安装依赖包 在要安…

『VUE』vue-quill-editor设置内容不可编辑(详细图文注释)

目录 预览思路调用代码借助Props添加isDisable属性控制 是否内容可编辑总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 预览 思路 禁用焦点事件和内容改变事件 调用代码 <quillEditorclass"editor":class"…

python 和go 语法对比

Python 和 Go 是两种设计哲学和应用场景有所不同的编程语言&#xff0c;它们在语法、类型系统、并发模型等方面存在显著差异。以下是 Python 和 Go 语法特点的详细对比&#xff1a; 语法简洁性与结构 Python 的语法以其简洁易读而著称。它使用缩进来表示代码块的层次结构&…

我们来学activiti -- bpmn

bpmn 题记bpmn结余 题记 在《Activiti很难学》提到学习知识点需要面对的思想钢印问题 按常见步骤&#xff0c;先展示下官方的客套话 BPMN&#xff08;Business Process Model and Notation&#xff09;是一种业务流程建模符号&#xff0c; 它是一种图形化的语言&#xff0c;用…