【弱监督时间动作定位】CoLA: Weakly-Supervised Temporal Action Localization with Snippet Contrastive ... 论文阅读

文章信息:

在这里插入图片描述

发表于:CVPR 2021
原文链接:https://arxiv.org/abs/2103.16392
源码:https://github.com/zhang-can/CoLA

Abstract

弱监督的时间动作定位 (WSTAL) 旨在仅使用视频级标签,在未裁剪的视频中定位动作。大多数现有模型遵循“通过分类进行定位”的过程:定位对视频级分类贡献最大的时间区域。通常,它们单独处理每个片段(或帧),从而忽略了丰富的时间上下文关系。这就产生了单片段欺骗问题:“困难”片段过于模糊,无法分类。在本文中,我们认为通过比较学习有助于识别这些困难片段,并提出利用片段对比学习来定位动作,简称为 CoLA。具体来说,我们提出了一种片段对比 (SniCo) 损失来在特征空间中优化困难片段的表示,这引导网络感知准确的时间边界,避免时间间隔中断。此外,由于无法获取帧级注释,我们引入了一种困难片段挖掘算法来定位潜在的困难片段。大量分析验证了这种挖掘策略有效地捕捉了困难片段,而 SniCo 损失导致了更具信息量的特征表示。大量实验表明,CoLA 在 THUMOS’14 和 ActivityNet v1.2 数据集上取得了最新的成果。

1. Introduction

在这里插入图片描述

图1。两个选定的片段(#2、#3)属于哪个类别?当独立评估时,很难判断,并且它们在基线中实际上被错误分类(我们绘制了CliffDiving的一维T-CAS及其阈值结果)。相比之下,通过比较学习可以帮助识别它们:#2片段(人向下跌落)通过与#1“简单动作”(CliffDiving动作的不同摄像机视角)进行比较被推断为动作片段;#3片段的推断也在与#4“简单背景”片段比较后得到修正。

时间动作定位(TAL)旨在在未裁剪的视频中找到并分类动作间隔。由于其在监控分析、视频摘要和检索等领域的广泛应用,它在工业和学术界得到了广泛研究【38, 15, 23】。传统上,全监督的TAL在手动标注过程中非常费力,因此只需要视频级标签的弱监督TAL(WS-TAL)越来越受欢迎。

大多数现有的弱监督时间动作定位(WS-TAL)方法【39, 27, 30, 26, 14】采用了通用的注意力机制或多实例学习公式。具体来说,每个输入视频被划分为多个固定大小的不重叠片段,并对片段进行分类以生成时间类激活图/序列(TCAM/T-CAS)【27, 34】。最终的定位结果通过对类激活进行阈值化和合并生成。为了说明,我们考虑一个简单的情况,即整个过程通过单个视频级分类损失进行优化,并在本文中将此流程视为基线。

在缺乏逐帧标签的情况下,弱监督时间动作定位(WS-TAL)面临单个片段欺骗问题:难以区分的片段容易被误分类,从而影响定位性能。为了说明这一点,我们以图1中的CliffDiving为例。单独评估时,两个选定的片段(#2和#3)似乎很模糊并且被误分类:1)#2片段被错误分类,从而打破了时间间隔;2)#3片段在基线中被误认为是动作,导致动作间隔边界被不准确地延长。如何解决单个片段欺骗问题?让我们重新审视图1中的案例。通过将感兴趣的片段与那些可以轻松分类的“简单片段”进行比较,可以更容易地区分动作和背景。例如,#2片段和#1简单动作片段是“CliffDiving”中一个人摔倒过程的两个不同视角。#3片段类似于#4简单背景片段,可以轻松分类为背景类。鉴于此,我们认为通过情境比较来定位动作提供了一种强有力的归纳偏差,有助于区分困难片段。基于上述分析,我们提出了一种替代且直观的方法来解决单个片段欺骗问题——通过对困难片段进行对比学习来定位动作,简称为CoLA。为此,我们引入了一种新的片段对比(SniCo)损失,在那些更具辨别力的简单片段的指导下,优化困难片段的特征表示。由于这些片段的模糊性,这些“欺骗”片段被称为困难片段。

然而,该解决方案面临着在弱监督环境下如何识别合理片段的一个关键挑战。由于没有特定的注意力分布模式,困难片段的选择并非易事。例如,在图1的基线中,#3困难片段具有高响应值,而#2则保持较低值。注意到模糊的困难片段通常出现在动作实例的边界区域附近,我们提出了一种边界感知的困难片段挖掘算法——一种简单但有效的重要性采样技术。具体来说,我们首先对T-CAS进行阈值处理,然后在时间上采用膨胀和侵蚀操作来挖掘潜在的困难片段。由于困难片段可能是动作片段或背景片段,我们选择通过它们的相对位置来区分它们。对于简单片段,它们位于最具辨别力的部分,因此选择T-CAS得分前-k/后-k的片段分别作为简单动作/背景。此外,我们形成两个困难-简单对比对,并通过所提出的SniCo损失进行特征优化。

简而言之,本工作的主要贡献如下:
(1) 首次将对比表示学习范式引入到弱监督时序动作定位(WS-TAL)中,并提出了SniCo损失函数,有效优化了困难片段的特征表示。
(2) 提出了困难片段挖掘算法,用于定位边界附近的潜在困难片段,这在我们的弱监督环境下作为一种有效的采样策略。
(3) 在THUMOS’14和ActivityNet v1.2数据集上进行的大量实验验证了我们提出的CoLA方法的有效性。

2. Related Work

完全监督的动作定位利用帧级别的注释来定位和分类长时间未修剪视频中动作实例的时间间隔。大多数现有工作可分为两类:基于提议的方法(自顶向下)和基于帧的方法(自底向上)。基于提议的方法 [35, 47, 40, 7, 5, 33, 19, 17, 44, 16] 首先生成动作提议,然后对其进行分类以及进行时间边界回归。相反,基于帧的方法 [18, 2, 22, 46] 直接预测帧级别的动作类别和位置,然后采用一些后处理技术。

弱监督动作定位只需要视频级别的注释,受到了广泛关注。UntrimmedNets [39] 首先进行片段提议分类,然后以软或硬方式选择相关的片段。STPN [27] 引入稀疏性约束以强制选择片段的稀疏性。Hide-and-seek [36] 和 MAAN [43] 分别通过随机隐藏补丁或抑制主导响应来扩展判别区域。Zhong 等人 [48] 引入渐进生成过程以达到类似的目的。W-TALC [30] 应用深度度量学习来补充多实例学习的表述。

Discussion.尽管单个片段作弊问题在弱监督动作定位中很常见,但尚未得到充分研究。刘等人 [20] 着重于动作完整性建模问题和动作-背景分离问题。他们利用生成的硬负例数据开发了并行多分支分类架构。相比之下,我们的CoLA统一了这两个问题,并通过提出的SniCo Loss以更轻量的方式解决了它们。DGAM [32] 提到了动作-背景混淆问题,即靠近动作片段的背景片段往往被错误分类,这可以视为我们单个片段作弊问题的一个子问题。此外,几项背景建模工作 [28, 14, 32] 也可以看作是解决这一问题的一种方法。Nguyen等人 [28] 利用注意力机制来建模前景和背景帧的外观,并指导类激活图的生成。BaS-Net [14] 引入了背景的辅助类,并应用不对称训练策略来抑制背景片段的激活。然而,这些方法存在固有的缺点,因为背景片段并不一定静止,并且很难将它们包括到一个特定的类别中。相比之下,我们的CoLA是更适应性和可解释性的解决方案,用于解决这些问题。

对比表示学习利用数据内部模式来学习嵌入空间,其中相关信号被聚集在一起,而不相关信号则通过噪声对比估计(NCE)[8] 进行区分。CMC [37] 提出了一个对比学习框架,通过最大化同一场景不同视图之间的互信息来实现视图不变表示。SimCLR [6] 通过使用小批量中其他项目的增强视图来选择负样本。MoCo [9] 利用动量更新的旧负表示记忆库来摆脱批量大小限制,实现负样本的一致使用。据我们所知,我们是第一个将噪声对比估计引入到弱监督动作定位任务中的研究。实验结果显示,CoLA改进了困难片段表示,从而有利于动作定位。

3. Method

在这里插入图片描述

图2. 展示了提出的CoLA,包括四个部分:(a) 特征提取和嵌入,用于获取嵌入特征 X n E X_n^E XnE;(b) 动作性建模,用于收集与类别无关的动作可能性 A n n e s s \mathcal{A}_n^{ness} Anness;(c ) 困难和简单片段挖掘,用于选择困难和简单片段;(d) 网络训练,由动作损失和片段对比(SniCo)损失驱动。

一般来说,CoLA(如图2所示)遵循特征提取(第3.1节)、动作性建模(第3.2节)以及困难和简单片段挖掘(第3.3节)的流程。优化损失项和推断过程分别在第3.4节和第3.5节中详细说明。

3.1. Feature Extraction and Embedding

假设我们给定了一组 N N N 个未剪辑的视频 { V n } n = 1 N \{V_{n}\}_{n=1}^{N} {Vn}n=1N 及其视频级标签 { y n } n = 1 N \{y_{n}\}_{n=1}^{N} {yn}n=1N,其中 y n ∈ R C y_{n}\in \mathbb{R}^C ynRC 是一个多热向量, C C C 是动作类别的数量。按照常见做法 [27,28,14],对于每个输入的未剪辑视频 V n V_n Vn,我们将其划分为多帧不重叠的 L n L_n Ln 个片段,即 V n = { S n , l } l = 1 L n V_n = \{S_{n,l}\}_{l=1}^{L_n} Vn={Sn,l}l=1Ln。由于视频长度的变化,采样了固定数量的 T T T 个片段 { S n , t } t = 1 T \{S_{n,t}\}_{t=1}^{T} {Sn,t}t=1T。然后,分别使用预训练的特征提取器(例如 I3D [4])提取 RGB 特征 X n R = { x t R } t = 1 T X_{n}^{R}=\{x_{t}^{R}\}_{t=1}^{T} XnR={xtR}t=1T 和光流特征 X n O = { x t O } t = 1 T X_n^O=\{x_{t}^{O}\}_{t=1}^{T} XnO={xtO}t=1T。在此, x t R ∈ R d x_t^R\in\mathbb{R}^d xtRRd x t O ∈ R d x_t^O\in\mathbb{R}^d xtORd d d d 是每个片段的特征维度。随后,我们在 X n R X_n^R XnR X n O X_{n}^{O} XnO 的拼接上应用一个嵌入函数 f e m b e d f_{embed} fembed,以获得我们提取的特征 X n E ∈ R T × 2 d X_n^E\in\mathbb{R}^{T\times2d} XnERT×2d f e m b e d f_{embed} fembed 由一个时序卷积和一个 ReLU 激活函数实现。

我们引入了动作性(Actionness)的概念,它指的是每个片段中包含一般动作实例的可能性。在详细说明动作性建模过程之前,让我们回顾一下常用的时间类激活序列(T-CAS)。

3.2. Actionness Modeling

给定嵌入特征 X n E X_n^E XnE,我们应用分类器 f cls f_{\text{cls}} fcls 来获得片段级 T-CAS。具体来说,分类器包含一个时间卷积层,后接 ReLU 激活函数和 Dropout。这对于视频 V n V_n Vn 可以表述如下:

在这里插入图片描述

其中, ϕ c l s \phi_{cls} ϕcls 表示可学习的参数。得到的 A n ∈ R T × C \mathcal{A}_n \in \mathbb{R}^{T \times C} AnRT×C 表示在每个时间片段上发生的动作分类结果。

然后,关于建模动作强度(actionness),一种常见的方法是对每个片段进行二元分类,但这会带来额外的开销。由于在公式1中生成的T-CAS A n ∈ R T × C \mathcal{A}_n \in \mathbb{R}^{T \times C} AnRT×C 已经包含了片段级别的类别特定预测,我们简单地沿着通道维度对T-CAS进行求和( f s u m f_{sum} fsum),然后通过Sigmoid函数得到一个与类别无关的聚合值 A n n e s s ∈ R T {\mathcal{A}}_n^{ness} \in {\mathbb{R}}^T AnnessRT,用于表示动作强度。

在这里插入图片描述

3.3. Hard & Easy Snippet Mining

请注意,我们的目标是利用易于识别的片段作为先验信息来消除具有争议的片段的歧义性。我们系统地研究了用于构建硬片段和易片段的对比对的过程。

3.3.1 Hard Snippet Mining

在这里插入图片描述

图 3. 硬片段挖掘算法的示意图。左图:使用不同的掩码对侵蚀序列进行减法运算以获得内部区域(绿色)。右图:使用不同的掩码对膨胀序列进行减法运算以获得外部区域(粉色)。

直觉上,对于大多数位于动作或背景区间内的片段来说,它们远离时间边界,干扰较少,并且具有相对可靠的特征表示。然而,对于边界邻近的片段来说,它们不太可靠,因为它们处于动作和背景之间的过渡区域,从而导致检测结果不明确。

基于以上观察,我们认为边界邻近的片段在弱监督设置下可能是潜在的困难片段。因此,我们设计了一种新颖的硬片段挖掘算法,以从边界区域获取困难片段。然后,这些挖掘出的困难片段根据它们的位置被划分为困难动作和困难背景。

首先,我们对动作性分数进行阈值处理,以生成一个二进制序列(1或0分别表示动作或背景位置):

在这里插入图片描述
其中 ε ( ⋅ ) \varepsilon(\cdot) ε() 是Heaviside阶跃函数, θ b \theta_b θb 是阈值,即如果 A n n e s s ≥ θ b \mathcal{A}_n^{ness} \geq \theta_b Annessθb,则 A n b i n \mathcal{A}_n^{bin} Anbin 为1,否则为0。然后,如图3所示,我们应用两个级联的膨胀或腐蚀操作,以扩展或缩小动作区间的时间范围。具有不同膨胀或腐蚀程度的差异区域定义为困难背景或困难动作区域:

在这里插入图片描述

其中 ( ⋅ ; ∗ ) + (\cdot; *)^+ (;)+ ( ⋅ ; ∗ ) − (\cdot; *)^- (;) 分别表示使用掩码 * 进行的二值膨胀和腐蚀操作。内区域 R n i n n e r \mathcal{R}_n^{inner} Rninner 定义为使用较小掩码 m m m 和较大掩码 M \mathcal{M} M 的腐蚀序列之间的不同片段,如图3左部分所示(绿色区域)。类似地,外区域 R n o u t e r \mathcal{R}_n^{outer} Rnouter 计算为使用较大掩码 M \mathcal{M} M 和较小掩码 m m m 的膨胀序列之间的差异,如图3右部分所示(粉色区域)。经验上,我们将内区域 R n i n n e r \mathcal{R}_n^{inner} Rninner 视为困难动作片段集合,因为这些区域的 A n b i n = 1 \mathcal{A}_n^{bin}=1 Anbin=1。同样,外区域 R n o u t e r \mathcal{R}_n^{outer} Rnouter 被认为是困难背景片段集合。然后从 R n i n n e r \mathcal{R}_n^{inner} Rninner 中选取困难动作片段 X n H A ∈ R k h a r d × 2 d X_{n}^{HA}\in\mathbb{R}^{k^{hard}\times2d} XnHARkhard×2d

在这里插入图片描述

其中 I n i n n e r \mathcal{I}_n^{inner} Ininner R n i n n e r \mathcal{R}_n^{inner} Rninner 内片段的索引集。 I n a c t \mathcal{I}_{n}^{act} Inact 是大小为 k h a r d k^{hard} khard I n i n n e r \mathcal{I}_n^{inner} Ininner 的子集(即, ∣ I n a c t ∣ = k h a r d |\mathcal{I}_{n}^{act}|=k^{hard} Inact=khard),其中 k h a r d = m a x ( 1 , ⌊ T r h a r d ⌋ ) k^{hard} = max(1,\lfloor\frac{T}{r^{hard}}\rfloor) khard=max(1,rhardT⌋) 是控制选取困难片段数量的超参数, r h a r d r^{hard} rhard 是采样比例。考虑到 k h a r d > ∣ I n i n n e r ∣ k^{hard} > |\mathcal{I}_{n}^{inner}| khard>Ininner 的情况,我们采用有放回采样机制以确保总共能选取 k h a r d k^{hard} khard 个片段。同样,从 R n o u t e r \mathcal{R}_n^{outer} Rnouter 中选取困难背景片段 X n H B ∈ R k h a r d × 2 d X_n^{HB} \in \mathbb{R}^{k^{hard}\times2d} XnHBRkhard×2d

在这里插入图片描述

其中符号的定义类似于公式 5 中的定义,为简洁起见,我们在此省略。

3.3.2 Easy Snippet Mining

为了形成对比对,我们仍然需要挖掘具有区分性的简单片段。基于训练良好的全监督 I3D 特征,我们假设在视频片段中,动作性分数排名前 k k k 和后 k k k 的片段分别是简单动作片段 ( X n E A ∈ R k e a s y × 2 d ) (X_n^{EA}\in\mathbb{R}^{k^{easy}\times2d}) (XnEARkeasy×2d) 和简单背景片段 ( X n E B ∈ R k e a s y × 2 d ) (X_{n}^{EB}\in\mathbb{R}^{k^{easy}\times2d}) (XnEBRkeasy×2d)。因此,我们基于公式 2 计算的动作性分数进行简单片段挖掘。具体过程如下:
在这里插入图片描述
其中, S n D E S C \mathcal{S}_n^{DESC} SnDESC S n A S C \mathcal{S}_n^{ASC} SnASC 分别表示按降序和升序排序的 A n n e s s \mathcal{A}_n^{ness} Anness 的索引。 k e a s y = k^{easy}= keasy= m a x ( 1 , ⌊ T r e a s y ⌋ ) , r e a s y max(1,\lfloor\frac{T}{r^{easy}}\rfloor),r^{easy} max(1,reasyT⌋)reasy 是表示选择比例的超参数。请注意,我们移除了在难片段区域 R n i n n e r \mathcal{R}_n^{inner} Rninner R n o u t e r \mathcal{R}_n^{outer} Rnouter 中的片段,以避免冲突。

3.4. Network Training

基于挖掘出的难片段和易片段,我们的CoLA引入了一个额外的片段对比(SniCo)损失( L s \mathcal{L}_s Ls),并且与基线模型相比取得了显著的改进。总损失可以表示如下:
在这里插入图片描述
其中, L a \mathcal{L}_a La L s \mathcal{L}_s Ls分别表示动作损失和SniCo损失。 λ λ λ是平衡因子。我们详细说明这两个术语如下。

3.4.1 Action Loss

动作损失 ( L a ) (\mathcal{L}_a) (La) 是预测视频类别和真实标签之间的分类损失。为了获得视频级别的预测,我们聚合在公式 1 中计算的片段级别的类别得分。参考 [39,30,14],我们采用 top-k 平均策略:对于每个类别 c c c,我们取具有最大类别特定 T-CAS 值的 k e a s y k^{easy} keasy 项,并计算其平均值 a n ; c a_{n;c} an;c,即视频 V n V_n Vn 的类别 c c c 的视频级别类别得分。获得所有 C C C 类别的 a n ; c a_{n;c} an;c 后,我们在类别维度上对 a n a_{n} an 应用 Softmax 函数,以获得视频级别的类别概率 p n ∈ R C p_n\in\mathbb{R}^C pnRC。动作损失 ( L a ) (\mathcal{L}_a) (La) 以交叉熵形式计算如下:

在这里插入图片描述

其中 y ^ n ∈ R C \hat{y}_n\in\mathbb{R}^C y^nRC是归一化的真实标签。

3.4.2 Snippet Contrast (SniCo) Loss

对比学习已在图像或补丁级别上使用过[1, 10]。对于我们的应用,给定提取的特征嵌入 X n E X_n^E XnE,对比学习应用于片段级别。我们将其称为片段对比 (SniCo) 损失 ( L s ) (\mathcal{L}_s) (Ls),旨在细化困难片段的片段级特征,并获得更有信息量的特征分布。考虑到困难片段被分类为困难动作和困难背景,我们在 L s \mathcal{L}_s Ls 中相应地形成了两个对比对,即“HA 细化”和“HB 细化”,其中 HA 和 HB 分别是困难动作和困难背景的缩写。“HA 细化”旨在通过在特征空间中紧密地驱动困难动作和易动作片段来转换困难动作片段特征,“HB 细化”与此类似。

正式地说,查询 x ∈ R 1 × 2 d x\in\mathbb{R}^{1\times2d} xR1×2d、正样本 x + ∈ R 1 × 2 d x^+\in\mathbb{R}^{1\times2d} x+R1×2d S S S 个负样本 x − ∈ R S × 2 d x^-\in\mathbb{R}^{S\times2d} xRS×2d 是从预先挖掘的片段中选择的。如图 2(d) 所示,对于“HA 细化”, x ∼ X n H A , x + ∼ X n E A , x − ∼ X n E B x \sim X_{n}^{HA}, x^{+} \sim X_{n}^{EA}, x^{-} \sim X_{n}^{EB} xXnHA,x+XnEA,xXnEB;对于“HB 细化”, x ∼ X n H B , x + ∼ X n E B , x − ∼ X n E A x \sim X_{n}^{HB}, x^{+} \sim X_{n}^{EB}, x^{-} \sim X_{n}^{EA} xXnHB,x+XnEB,xXnEA。我们将它们映射到一个标准化单位球上以防止空间的崩塌或扩展。设立一个使用交叉熵损失的 A n ( S + 1 ) An(S+1) An(S+1) 类分类问题,用于表示正样本被选中超过负样本的概率。参考[9],我们计算查询与其他样本之间的距离,并使用温度参数 τ = 0.07 \tau=0.{07} τ=0.07

在这里插入图片描述

其中, x T x^T xT x x x 的转置,提出的 SniCo Loss 如下:

在这里插入图片描述

其中, S S S 代表负片段的数量, x s − ∈ R 2 d x_s^-\in\mathbb{R}^{2d} xsR2d 表示第 s 个负片段。通过这种方式,我们最大化同一类别(动作或背景)的容易片段和困难片段之间的互信息,这有助于优化特征表示,从而缓解单片段欺骗问题。

3.5. Inference

给定一个输入视频,我们首先预测其片段级别的类别激活以形成 T-CAS,并聚合第 3.4.1 节中描述的 top- k e a s y k^{easy} keasy 分数来获得视频级别的预测。然后选择得分大于 θ v \theta_v θv 的类别进行进一步定位。对于每个选定的类别,我们使用 θ s \theta_s θs 对其对应的 T-CAS 进行阈值处理以获得候选视频片段。最后,将连续片段分组成提议,并应用非极大值抑制 (NMS) 去除重复的提议。

4. Experiments

在这里插入图片描述

在这里插入图片描述

5. Conclusion

在本文中,我们提出了一个新颖的框架 (CoLA) 来解决弱监督动作定位中的单片段作弊问题。我们利用了一个直观的观点,即难片段通常位于动作实例的边界区域,并提出了一种难片段挖掘算法来定位它们。然后,我们应用 SniCo 损失,在易分类片段的帮助下,优化挖掘出的难片段的特征表示,这些易分类片段位于最具区分性的区域。在 THUMOS’14 和 ActivityNet v1.2 两个基准测试上进行的实验验证了 CoLA 的最新性能。

阅读总结

真想知道这些经常用对比损失还有高斯分布的的idea是怎么想出来的。

  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cola、sst-2和mrpc都是自然语言处理(NLP)中常用的数据集。 cola代表的是Language Understanding Evaluation(LUKE)的共同事业片中的句子相似度任务(STS)。在这个任务中,我们需要判断两个句子之间的相似性。该数据集由句子配对组成,每个句子配对都有一个二进制标签,表示两个句子是否具有相似的语义。我们可以使用这个数据集来开发和评估句子相似度模型。 sst-2代表的是斯坦福树库(Stanford Sentiment Treebank)的二分类情感分类任务。在这个任务中,我们需要将一个句子分类为积极的(positive)还是消极的(negative)。这个数据集包含了大量的电影评论,每个评论都有一个情感标签。sst-2是一个常用的情感分类数据集,适用于训练和评估情感分类模型。 mrpc代表的是微软研究院发布的Microsoft Research Paraphrase Corpus。在这个任务中,我们需要判断两个句子是否是近义词(也称为“改写”或“释义”)。该数据集由句子配对组成,每个配对都有一个二进制标签,表示两个句子是否具有相似的语义。mrpc是一个常用的句子相似度数据集,适用于训练和评估句子相似度模型。 这三个数据集在NLP研究和应用中被广泛使用,可以帮助开发者和研究人员评估各种NLP模型的性能。通过在这些数据集上进行训练和测试,我们可以获得各种任务上的准确性、召回率和F1分数等指标,进而改进和优化NLP模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值