Deep Reinforcement Learning for Unsupervised Video Summarization with Diversity-Representativeness R

Deep Reinforcement Learning for Unsupervised Video Summarization with Diversity-Representativeness Reward
paper: https://arxiv.org/abs/1801.00054
code: https://github.com/KaiyangZhou/pytorch-vsumm-reinforce
conference: AAAI 2018

Abstract

  视频摘要的目的是为了方便大规模的视频浏览,产生简短、简洁的摘要,这些摘要具有多样性和代表性。本文将视频摘要描述为一个顺序决策过程,并开发了一个深度摘要网络(DSN)来进行视频摘要。DSN为每个视频帧预测一个概率,该概率表示一个帧被选中的可能性,然后根据概率分布采取措施选择帧,形成视频摘要。为了训练我们的DSN,我们提出了一个端到端的、基于强化学习的框架,在这个框架中,我们设计了一个新颖的奖励函数,它共同考虑到生成的摘要的多样性和代表性,而完全不依赖于标签或用户交互。在培训过程中,奖励功能会判断生成的摘要的多样性和代表性,而DSN通过学习生成更加多样化和更具代表性的摘要来努力获得更高的奖励。由于不需要标签,我们的方法可以完全不受监督。在两个基准数据集上的大量实验表明,我们的无监督方法不仅优于其他最先进的无监督方法,而且与大多数已发表的监督方法相比甚至更优。

Contribution

  1. 作者为训练DSN开发了一个端到端、基于强化学习的框架,在这个框架中,作者提出了一个无标签的奖励函数,它共同解释了生成的摘要的多样性和代表性。据作者所知,作者的工作是首次将强化学习应用于无监督视频摘要;
  2. 作者将无监督的方法扩展到有监督的版本,以利用标签;
  3. 作者在两个基准数据集上进行了大量的实验,结果表明作者的无监督方法不仅优于其他最先进的无监督方法,而且与大多数已发表的有监督方法相比甚至更优越。

Proposed Approach

  作者将视频摘要描述为一个顺序决策过程。特别地,开发了一个深度摘要网络(DSN)来预测视频帧的概率,并根据预测的概率分布来决定选择哪些帧。我们提出了一个端到端的、基于强化学习的DSN训练框架,其中我们设计了一个多样性-代表性reward函数,它直接评估生成摘要的多样性和代表性,如图1所示。
在这里插入图片描述

Deep Summarization Network(DSN)

  作者提出的深度摘要网络采用编解码框架。编码器是一个卷积网络,它从长度为T的输入视频帧 { v t } t = 1 T \{v_t\}^T_{t=1} {vt}t=1T中提取视觉特征 { x t } t = 1 T \{x_t\}^T_{t=1} {xt}t=1T。解码器是一个双向递归神经网络(BiRNN),顶部有一个完全连接层(FC)。BiRNN将整个视觉特征 { x t } t = 1 T \{x_t\}^T_{t=1} {xt}t=1T作为输入,并生成相应的隐藏状态 { h t } t = 1 T \{h_t\}^T_{t=1} {ht}t=1T。每一个 h t h_t ht都是前向隐含状态 h t f h_t^f htf和后向隐含状态 h t b h^b_{t} htb的级联,它封装了未来信息和过去信息,重点放在 t t h t^{th} tth帧周围的部分。以sigmiod函数为结尾的FC层为每个帧预测一个概率 p t p_t pt从中可以对帧选择动作进行 a t a_t at采样: p t = σ ( W h t ) (1) p_t=\sigma(Wh_t) \tag{1} pt=σ(Wht)(1) a t ∼ B e r n o u l l i ( p t ) (2) a_t\sim \rm{Bernoulli}(p_t) \tag2 atBernoulli(pt)(2)其中 σ \sigma σ代表sigmoid函数, a t ∈ { 0 , 1 } a_t\in \{0,1\} at{0,1}表明第t帧是否被选中。为了简洁起见,省略了公式(1)中的偏差。视频摘要由选定的帧组成, S = { v y i ∣ a y i = 1 , i = 1 , 2 , . . . } S=\{v_{y_i}|a_{y_i}=1,i=1,2,... \} S={vyiayi=1,i=1,2,...}.
  实际上,作者使用GoogLeNet在ImageNet上预训练作为CNN model。视觉特征 { x t } t = 1 T \{x_t\}^T_{t=1} {xt}t=1T是从GoogLeNet倒数第二层提取的。对于RNN单元,我们采用LSTM来增强RNN捕捉视频帧中长期相关性的能力。在训练过程中,作者只更新解码器。

Diversity-Representativeness Reward Function

  在训练期间,DSN将获得一个reward R ( S ) R(S) R(S),用于评估生成的摘要的质量,DSN的目标是通过生成高质量的摘要来最大限度地提高预期回报。一般来说,一个高质量地视频摘要既要多样化又能代表原始视频,这样就可以最大限度地保存整个视频中的时间信息。为此(To this end), 我们提出了一个新的奖励来评估生成的摘要多样性和代表性。所提出的奖励由多样性reward R d i v R_{div} Rdiv和代表性奖励 R r e p R_{rep} Rrep组成,具体如下。
  Diversity reward. 我们通过在未来空间中衡量被选择帧的差异来评估生成摘要多样性程度。将选定帧的索引设为 Y = { y i ∣ a y i = 1 , i = 1 , . . . , ∣ Y ∣ } \mathcal{Y}=\{y_i|a_{y_i}=1,i=1,...,|\mathcal{Y}|\} Y={yiayi=1,i=1,...,Y},我们计算 R d i v R_{div} Rdiv作为所选择帧之间成对差异的平均值:
R d i v = 1 ∣ Y ∣ ( ∣ Y ∣ − 1 ) ∑ t ∈ Y ∑ t ′ ∈ Y t ′ ≠ t d ( x t , x t ′ ) (3) R_{div}=\frac{1}{|\mathcal{Y}|({|\mathcal{Y}|-1})}\sum_{t\in \mathcal{Y}}\sum_{{t'\in \mathcal{Y}}\atop{t'\neq t}}d(x_t,x_{t'})\tag{3} Rdiv=Y(Y1)1tYt=ttYd(xt,xt)(3)其中, d ( ⋅ , ⋅ ) d(\cdot,\cdot) d(,)是差异方程,计算方法如下:
d ( x t , x t ′ ) = 1 − x t T x t ′ ∣ ∣ x t ∣ ∣ 2 ∣ ∣ x t ′ ∣ ∣ 2 (4) d(x_t,x_{t'})=1-\frac{x^T_tx_{t'}}{||x_t||_2||x_{t'}||_2}\tag{4} d(xt,xt)=1xt2xt2xtTxt(4)

此处让我懵了一会儿,才大致略懂,如有建议,请在评论区指正,不胜感激。
成对差异平均值作者采用随机帧之间求差异,之后求平均的思路。由于 t ′ ≠ t t'\neq t t=t,排除t本身,所以有 ( ∣ Y ∣ − 1 ) (|\mathcal{Y}|-1) (Y1)个与t比较的帧,一共比较了t次,所以分母为 ∣ Y ∣ ( ∣ Y ∣ − 1 ) {|\mathcal{Y}|({|\mathcal{Y}|-1})} Y(Y1)。这里 ∣ Y ∣ |\mathcal{Y}| Y我的理解是帧数。
Cosine距离作者在这里使用Cosine距离来进行计算两个矩阵的距离,其中 ∣ ∣ ⋅ ∣ ∣ 2 ||\cdot||_2 2是矩阵的二阶范数。整体的目的是为了归一化因子。

  Intuitively,所选取的视频帧多样性(或者是多差异性)越大,agent可以获取的多样性奖励越高。然而,公式3将视频视为随机可置换项,忽略了序列数据固有的时间结构。事实上,两个时间上遥远的框架之间相似性应该被忽略,因为它们对于故事情节的构建至关重要。To overcome this problem, 我们设置 d ( x t , x t ′ ) = 1 d(x_t,x_{t'})=1 d(xt,xt)=1,if ∣ t − t ′ ∣ > λ |t-t'|>\lambda tt>λ, 其中 λ \lambda λ控制时间间隔程度。我们将在实验部分验证这个假设。
  Representativeness reward. 这个reward衡量生成的摘要在多大程度上可以代表原始视频。为此(To this end,)我们将视频摘要的代表性程度描述为k-medoids问题。特别的是,我们希望agent选择一组medoid,使得视频帧与最近的mediods之间的平方误差平均值最小。因此,我们定义 R r e p R_{rep} Rrep R r e s = exp ⁡ ( − 1 T ∑ t = 1 T min ⁡ t ′ ∈ Y ∣ ∣ x t − x t ′ ∣ ∣ 2 ) (5) R_{res}=\exp(-\frac{1}{T}\sum_{t=1}^T{\min\limits_{t'\in \mathcal Y}}||x_t-x_{t'}||_2)\tag{5} Rres=exp(T1t=1TtYminxtxt2)(5)有了这个reward,agent可以选择特征空间中靠近集群中心的帧。 R r e p R_{rep} Rrep的另一种形式是由所选帧获得的逆重建误差,但该公式计算量太大。
  Diversity-representativeness reward. R d i v R_{div} Rdiv R r e p R_{rep} Rrep是互补的,共同引导DSN的学习: R ( S ) = R d i v + R r e p (6) R(S)=R_{div}+R_{rep}\tag{6} R(S)=Rdiv+Rrep(6)
  在训练过程中, R d i v R_{div} Rdiv R r e p R_{rep} Rrep在数量级上是相似的。事实上,在训练过程中保持 R d i v R_{div} Rdiv R r e p R_{rep} Rrep在同一数量级是非常重要的,因此它们在梯度计算中都不会占主导地位。在没有选择帧的情况下,我们给DSN零reward,即采样动作都是零。

Training with Policy Gradient

  摘要agent的目标是通过最大化期望收益来学习一个参数为 θ \theta θ的策略函数 π θ \pi_\theta πθ: J ( θ ) = E p θ ( a 1 : T ) [ R ( S ) ] , (7) J(\theta)=\mathbb E_{p_\theta(a_{1:T})}[R(S)],\tag{7} J(θ)=Epθ(a1:T)[R(S)],(7)其中 p θ ( a 1 : T ) p_\theta(a_{1:T}) pθ(a1:T)代表所有可能动作序列的概率分布, R ( S ) R(S) R(S)是由公式6计算。 π θ \pi_\theta πθ是由我们的DSN定义的。
  根据REINFORCE算法,我们可以计算目标函数的导数 J ( θ ) J(\theta) J(θ),w.r.t. (with respect to: 涉及,谈到)参数 θ \theta θ如下式 ∇ θ J ( θ ) = E p θ ( a 1 : T ) [ R ( S ) ∑ t = 1 T ∇ θ log ⁡ π θ ( a t ∣ h t ) ] , (8) \nabla_\theta J(\theta)=\mathbb{E}_{p_\theta(a_{1:T})}[R(S)\sum_{t=1}^T\nabla_\theta \log\pi_\theta(a_t|h_t)],\tag{8} θJ(θ)=Epθ(a1:T)[R(S)t=1Tθlogπθ(atht)],(8)其中 a t a_t at是时间t时刻,DSN给与的action, h t h_t ht是BiRNN隐含层。
  由于等式8涉及到高维动作序列的期望值,这是很难直接计算的,我们通过在同一视频上运行N episodes agent 来近似梯度,然后取平均梯度 ∇ θ J ( θ ) ≈ 1 N [ ∑ n = 1 N ∑ t = 1 T R n ∇ θ log ⁡ π θ ( a t ∣ h t ) ] , (9) \nabla_\theta J(\theta)\approx\frac{1}{N}[\sum_{n=1}^N\sum_{t=1}^TR_n\nabla_\theta \log\pi_\theta(a_t|h_t)],\tag{9} θJ(θ)N1[n=1Nt=1TRnθlogπθ(atht)],(9)其中 R n R_n Rn是第n个episode. 公式9也被称为情节化强化算法。
  虽然公式9中的梯度是一个很好的估计,但它可能包含高的方差,这将使网络难以收敛。一个常见的策略是使用一个恒定的baseline b减去reward,所以梯度变成 ∇ θ J ( θ ) ≈ 1 N [ ∑ n = 1 N ∑ t = 1 T ( R n − b ) ∇ θ log ⁡ π θ ( a t ∣ h t ) ] , (10) \nabla_\theta J(\theta)\approx\frac{1}{N}[\sum_{n=1}^N\sum_{t=1}^T(R_n-b)\nabla_\theta \log\pi_\theta(a_t|h_t)],\tag{10} θJ(θ)N1[n=1Nt=1T(Rnb)θlogπθ(atht)],(10)其中b是一个简单地计算为至今所经历的奖励的移动平均数,以提高计算的效率。

Regularization

  由于选择更多的帧也会增加reward,我们在DSN产生的概率分布 p 1 : T p_{1:T} p1:T上加上一个正则化项,以限制选择用于摘要帧的百分比。受到启发,训练过程中作者尽量最小化以下公式: L p e r c e n t a g e = ∣ ∣ 1 T ∑ t = 1 T p t − ε ∣ ∣ 2 (11) L_{percentage}=||\frac{1}{T}\sum_{t=1}^Tp_t-\varepsilon||^2\tag{11} Lpercentage=T1t=1Tptε2(11)其中 ε \varepsilon ε决定要选择的帧的百分比。
  此外,我们也增加了 ℓ 2 \ell2 2正则化项在权重参数 θ \theta θ上,以避免过拟合。 L w e i g h t = ∑ i , j θ i , j 2 . (12) L_{weight}=\sum_{i,j}\theta^2_{i,j}.\tag{12} Lweight=i,jθi,j2.(12)

Optimization

  我们通过随机梯度法优化了策略函数的参数 θ \theta θ 。通过结合由公式10,11,12计算的梯度,我们更新 θ \theta θ: θ = θ − α ∇ θ ( − J + β 1 L p e r c e n t a g e + β 2 L w e i g h t ) (13) \theta=\theta-\alpha\nabla_\theta(-J+\beta_1L_{percentage}+\beta_2L_{weight})\tag{13} θ=θαθ(J+β1Lpercentage+β2Lweight)(13)其中 α \alpha α是学习率, β 1 \beta_1 β1 β 2 \beta_2 β2是用来平衡权重的超参数。
  实际操作中,我们使用Adam作为优化算法。作为学习的结果,网络采取的action导致高reward的对数概率增加,而导致低reward的动作的对数概率降低。

Extension to Supervised Learning

  提供一个视频的关键帧序列, Y ∗ = { y i ∗ ∣ i = 1 , . . . , ∣ Y ∗ ∣ } , \mathcal{Y}^*=\{y_i^*|i=1,...,|\mathcal{Y}^*|\}, Y={yii=1,...,Y},我们使用最大似然估计(MLE)去最大化选择 Y ∗ \mathcal{Y}^* Y log ⁡ p ( t ; θ ) \log p(t;\theta) logp(t;θ)指定的关键帧的对数概率,其中 t ∈ Y ∗ t\in\mathcal{Y}^* tY. p ( t ; θ ) p(t;\theta) p(t;θ)是由公式1计算得来。目标表示为 L M L E = ∑ t ∈ Y ∗ log ⁡ p ( t ; θ ) . (14) L_{MLE}=\sum_{t\in\mathcal{Y}^*}\log p(t;\theta).\tag{14} LMLE=tYlogp(t;θ).(14)

Summary Generation

  对于一个测试视频,我们应用一个已经训练好的DSN去预测选择帧的概率,作为重要性得分。我们通过平均同一个镜头内的帧级分数来计算镜头级别分数。对于时间分割,我们使用了(Potapov et al。2014年)。为了生成摘要,我们通过最大化总分来选择镜头,同时确保摘要长度不超过一个限制(通常是视频长度的15%)。最大化步骤本质上是0/1背包问题,即NP-hard问题。通过动态规划得到了一个近似最优解。
  除了实验部分评价生成摘要,我们也对DSN的原始预测进行了定性分析,以排除摘要生成步骤的影响,从而更好地理解DSN所学的知识。

Experiments

Datasets我们在SumMe和TVSum上评估我们的方法。SumMe由25个用户视频组成,涵盖各种主题,如假日和体育。SumMe中的每段视频从1分钟到6分钟不等,由15到18个人进行注释,因此每个视频都有多个基本的真相摘要。TVSum包含50个视频,包括新闻、纪录片等主题。每段视频的持续时间从2到10分钟不等。与SumMe类似,TVSum中的每个视频都有20个注释器,它们提供帧级的重要性分数。我们将重要性得分转换为基于镜头的摘要以供评估。除了这两个数据集之外,我们还利用了另外两个数据集,OVP有50个视频和YouTube有39个视频(不包括卡通视频),以评估我们在增加训练数据的情况下的方法。
  Evaluation metric为了与其他方法进行公平比较,我们计算F分数作为评估自动摘要和基本真相摘要之间相似性的度量。我们也处理多个地面真相摘要。
  Evaluation settings.我们使用三种设置,如(Zhang et al。2016b)评估我们的方法。(1)规范:我们使用标准的5倍交叉验证(5FCV),即80%的视频用于训练,其余的用于测试.(2) 增强:我们仍然使用5FCV,但是我们使用OVP和YouTube在每个折叠中增加训练数据。(3) 传递:对于一个目标数据集,如SumMe或TVSum,我们用另外三个数据集作为训练数据来测试模型的Transfer能力。
  Implementation details.我们将视频的采样速度降低了2 fps。作者把时间距离 λ \lambda λ设为20, ε \varepsilon ε设置为0.5,episodes的数量N为5.通过交叉验证优化了式13中的其他超参数 α \alpha α, β 1 \beta_1 β1, β 2 \beta_2 β2。在本文中,我们将RNN单元中的隐藏维度设置为256。当训练达到一个最大的epochs(在我们的例子中是60个)时,停止训练。当奖励增加一段时间(我们的实验中为10个事情)时,会执行早期停止,我们的方法基于Theano.
  Comparison为了与其他方法相比较,我们自己实现了统一抽样、K-medoids和字典选择。

Quantitative Evaluation

  我们首先将我们的方法与几个学习目标不同的基线进行比较。然后,我们将我们的方法与目前最先进的无监督/有监督的方法在三种评估环境下进行比较。
  Comparison with baselines我们将基线模型设定为只用 R d i v R_{div} Rdiv和只用 R r e p R_{rep} Rrep训练的模型,分别用D-DSN和R-DSN表示。我们将两种奖励一起训练的模型表示为DR-DSN,扩展到到监督的版本。我们也验证了提出的技术(我们现在称之为 λ \lambda λ-technique)的忽略了相似性距离当计算 R d i v R_{div} Rdiv时忽略了相似性距离有效性.这个模型用 D S N s u p DSN_{sup} DSNsup表示。
在这里插入图片描述
  表1展示了我们方法在SumMe和TVSum数据集上不同变体的结果,我们能够看到DR-DSN,很明显在这两个数据集上都优于D-DSN和R-DSN,,这表明通过协同使用 R d i v R_{div} Rdiv R r e p R_{rep} Rrep,我们可以更好地教会DSN生成多样化和代表性的高质量摘要。将无监督模型与有监督模型进行比较,我们发现DR-DSN在两个数据集(SumMe为41.4 vs.38.2,TV Sum为57.6 vs.54.5)上显著优于DSN,这证明了我们的假设,即DSN可以从强化学习中受益更多,而不是从监督学习中受益。
  在DR-DSN中加入 L M L E L_{MLE} LMLE(式(14))的监督信号,进一步提高了摘要性能(SumMe提高了1.7%,TVSum提高了0.9%)。这是因为标签编码了对视频内容的高层次理解,DR-DSN s u p _{sup} sup利用这些信息来学习更多有用的模式。
  在这两个数据集上,R-DSN的性能略优于D-DSN,这是因为不同的摘要通常包含与视频主题无关的冗余信息。我们观察到D-DSN的性能优于不考虑时间距离帧的D-DSN w / o λ _{w/o\lambda} w/oλ.当在训练中使用λ-technique时,在早期阶段,大约50%∼70%的距离矩阵被设置为1(在不同的视频中变化)。随着训练时间的增加,这一比例也随之上升,最终保持在80%∼90%左右。这是有意义的,因为选择时间上遥远的帧可以带来更高的回报,而DSN鼓励这样做的多样性reward函数。
  Comparison with unsupervised approaches. 表2显示了DR-DSN对SumMe和TVSum的其他无监督方法的结果。可以看出,DR-DSN在两个数据集上的性能都优于其他无监督方法。总的来说,DR-DSN比目前最先进的GAN d p p _{dpp} dpp好5.9%。在TVSum上,DR-DSN大大超过GAN${dpp} 11.4 % . 虽 然 我 们 的 奖 励 函 数 类 似 于 G A N 11.4\%.虽然我们的奖励函数类似于GAN 11.4%.GAN{dpp}$概念的目标,但是我们直接在特征空间中对所选帧的多样性和代表性进行建模,这对于指导DSN找到好的解决方案更为有用。除此之外,我们还注意到,在训练的总成绩和TVE-2的指标上,我们并没有明确地将训练的总成绩(TVE-2)和训练的总成绩(TVE-2)进行了比较。此外,DR-DSN是在SumMe上的训练表现为40.2%,在TVSum上的训练表现为57.2%,这说明模型对训练数据没有过度拟合(注意,我们在训练目标函数中没有明确优化F-score指标)。
在这里插入图片描述

  Comparison with supervised approaches. 表3报告了我们的监督模型、DR-DSN s u p _{sup} sup和其他监督方法的结果。在基于LSTM的方法方面,我们的DSN-SUP s u p _{sup} sup分别比其他方法(Bi LSTM、DPP-LSTM和GAN s u p _{sup} sup)的SumMe和TVSum分别高出1.0%∼12.0%和3.2%∼7.2%。有趣的是,我们的无监督方法DR-DSN的摘要性能甚至优于TVSum上最先进的有监督方法(57.6 vs.56.3),并且优于SumMe上的大多数有监督方法。这些结果有力地证明了我们的学习框架的有效性。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Comparison in the Augmented (A) and Transfer (T) settings. 表4将我们的方法与当前最先进的基于LSTM的方法在A和T设置下进行了比较。在典型环境下的结果也展示了通过增加训练数据所获得的改进。在A组中,DR-DSN s u p _{sup} sup的表现性能略好于GAN s u p _{sup} sup SumMe(43.9 vs. 43.6),然而它被GAN s u p _{sup} sup 击败(59.8 vs. 61.2).这可能是因为GAN s u p _{sup} sup中的LSTM模型有更多的隐藏单元(1024个,而我们的256个)。在T设置中,DSN s u p _{sup} sup表现在两个数据集上都是最好的,这表明我们的模型能够在数据集之间传递知识。此外,有趣的是,我们的无监督模型DR-DSN在这两种情况下都优于或可与其他方法相媲美。总的来说,我们坚信通过使用一个更大的模型和/或设计一个更好的网络架构,我们可以用我们的学习框架获得更好的摘要性能。
  我们还对不同的gated RNN单元进行了实验,即LSTM与GRU并发现基于LSTM的模型始终优于基于GRU的模型(见表5)。这可以解释为LSTM中的存储机制具有更高的复杂度,从而允许学习更复杂的模式。

Qualitative Evaluation

Video summaries. 我们提供了一个关于一个男人做辣香肠三明治的例子视频的定性结果(见图2)。一般来说,这四种方法都能产生跨越时间结构的高质量摘要,只有在某些帧中观察到微小的变化。基本真相的峰值区域几乎被捕捉到。然而,由监督模型DSN s u p _{sup} sup制作的总结更接近原始视频传达的完整故事情节,即从食物准备到烹饪。这是因为DSN s u p _{sup} sup从标签中获益,可以更好地捕捉高级概念。
Predicted importance scores. 我们将DR-DSN和DSN s u p _{sup} sup的原始预测形象化,如图3所示。通过将预测与实际情况相比较,我们可以更深入地了解DSN的学习效果。值得注意的是,无监督模型预测的重要性得分曲线在某些方面与监督模型预测的曲线相似。更重要的是,这些部分与人类认为重要的部分是一致的。这有力地证明了我们的多样性代表性奖励函数的强化学习能够很好地模仿人类的学习过程,有效地教会DSN识别重要的框架。

Conclusion

  针对无监督视频摘要问题,提出了一种无标签强化学习算法。在两个基准数据集上的大量实验表明,使用我们的无监督奖励函数进行强化学习的效果优于其他最先进的无监督方法,并且产生的结果与大多数有监督的方法相比甚至更好

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值