论文阅读:[2020CVPR]ROAM: Recurrently Optimizing Tracking Model(循环优化跟踪模型)

论文阅读:ROAM: Recurrently Optimizing Tracking Model
论文链接:https://arxiv.org/abs/1907.12006
论文主体:
跟踪分为两个模块:
1)可调整大小以适应形状变化的跟踪模型:跟踪模型包含两个分支,其中响应生成分支通过预测置信度得分图来确定目标的存在,而bounding box回归分支通过将坐标移位回归到设置在滑动窗口位置上的box anchor来估计目标的精确的bbox。
2)负责模型更新的神经优化器(offline):离线学习型神经优化器负责在线更新跟踪模型,以适应外观变化。

摘要
设计了一个由生成响应和目标边界框回归组成的跟踪模型,第一个部分生成一个热图显示对象在不同的位置的出现,第二部分回归相对边界框转移到用于滑动窗口的anchor。由于两个组件都使用了可调整大小的卷积滤波器来适应对象的形状变化,因此我们的跟踪模型不需要枚举不同大小的anchor,从而节省了模型参数。为了有效地适应目标模型外观变化,我们建议离线训练一个循环神经优化器在元学习设置中更新跟踪模型,这样可以在几个梯度下降步骤中收敛模型。这提高了更新跟踪模型的收敛速度,同时获得了更好的性能。此外,还提出了一个简单而有效的训练技巧:随机滤波缩放,以防止过拟合,大大提高了泛化性能。
1. Introduction:
用于模型更新的训练样本通常是基于估计的边界框收集的,但可能是不准确的。这些小的误差会随着时间累积,逐渐导致模型退化。SiamRPN借鉴了目标检测中的region proposal网络的思想,将跟踪任务分为两个分支,分别从背景中对目标进行分类,并参考不同位置的anchor回归出准确的边界框。由于没有在线模型更新,它在边界框估计方面具有较高的精度,但与最先进的方法相比,其鲁棒性较差。这篇文章为了解决上述问题,提出了由两个模块:响应生成(response generation)和边界框回归(boundingbox regression)组成的跟踪框架,第一个部分生成一个响应图表示覆盖在预设滑动窗口上的anchors上的可能性,第二部分通过anchors得到准确的矩形来预测bounding box。而不是像在目标检测中枚举不同横纵比的anchor。作者建议每个位置仅使用一个大小的anchor,通过双线性插值调整其相应卷积滤波器的大小来使其适应形状变化,从而节省模型参数和计算时间。
为了有效地使跟踪模型适应跟踪过程中的外观变化,作者提出了一种循环模型优化方法来学习更有效的梯度下降,在1-2步内收敛模型更新,并更好地推广到未来的帧。核心思想是训练一个可以转化该模型已较小的梯度不长收敛到较好解的神经优化器。在训练阶段,首先使用神经优化器更新跟踪模型,然后将其应用于未来的帧,以获得用于最小化的误差信号。在此特定设置下,结果优化器收敛跟踪分类器的速度比基于SGD的优化器快得多,尤其是对于学习初始跟踪模型而言。
Contributions:
1. 提出了一种由可调大小响应生成器和bounding box回归器组成的跟踪模型,其中每个空间位置只使用一个大小的anchor,其相应的卷积滤波器可以通过双线性插值来适应形状的变化。
2. 提出了一种在元学习环境下训练的循环神经优化器,它以更快的收敛速度循环地更新跟踪模型。
3. 在OTB、VOT、LaSOT、GOT10k和TrackingNet等大型数据集上进行了全面的实验,与先进的跟踪器相比,论文跟踪器取得了良好的性能。
2. 相关工作重点提取:
通过生成响应跟踪:通过卷积LSTM循环生成目标模板过滤器,在动态存储网络中将对象信息写入可寻址的外部存储器和从可寻址的外部存储器读取对象信息,以及分心感知增量学习,其利用目标周围的hard-negative模板来抑制干扰,去改进SiamFC模板匹配中的边界影响。
SiamRPN和++在大规模数据集上通过离线训练估计精确的边界框方面显示出SOTA的结果。与这些算法在每个空间位置设置一组具有不同纵横比的预定义anchor不同,作者采用了可调整大小的anchor点来适应对象的形状变化,从而节省了模型参数和计算时间。
Meta-Tracker(E.park,ECCV2018)提出在元学习环境下训练初始跟踪模型,取得了令人满意的结果。但是,该算法在后续帧中仍然使用传统的SGD算法对跟踪模型进行优化,不能有效地适应新的外观,模型更新速度慢;与这些跟踪器相比,我们的离线学习循环神经优化器只需一到两个梯度步骤就可以更新模型,使得运行速度更快,准确率更高。
元学习:与其他因梯度尺度不同而容易对每个参数更新输出增量的工作不同,作者将循环神经网络产生的自适应学习率与计算出的梯度相关联,以实现模型更新的快速收敛。
3. 算法介绍:
跟踪器包含两个主要模块:
1)可调整大小以适应形状变化的跟踪模型:跟踪模型包含两个分支,其中响应生成分支通过预测置信度得分图来确定目标的存在,而bounding box回归分支通过将坐标移位回归到设置在滑动窗口位置上的box anchor来估计目标的精确的bbox。
2)负责模型更新的神经优化器(offline):离线学习型神经优化器负责在线更新跟踪模型,以适应外观变化。
注意,响应生成和边界框回归都构建在从主干CNN网络计算的特征图上。整个框架见图1。
在这里插入图片描述
图1:ROAM流程图:在给定小批量训练样本块的情况下,利用特征网络提取深层特征。根据ground truth及其梯度 ∇ θ ( t − 1 ) l ( t − 1 ) {\nabla _{{\theta ^{(t - 1)}}}}{l^{(t - 1)}} θ(t1)l(t1)更新损失 l ( t − 1 ) {l^{(t - 1)}} l(t1) ,使用跟踪模型预测每个样本的响应图和边界框。接下来,将先前学习率、当前参数、当前更新损耗及其梯度的元素堆栈输入到坐标LSTM中,以生成自适应学习率,如式(11) 在这里插入图片描述所示。然后,使用式(9) 在这里插入图片描述中所示的一个梯度下降步骤来更新模型。最后将更新后的模型应用于随机选择的未来帧,以获得用于最小化的元损失,如式(13) 在这里插入图片描述
3.1. 可调整大小的跟踪器
模仿相关滤波器,使用具有相同对象形状的卷积滤波器来产生响应和进行bbox回归。这意味着当对象的形状改变时,模型参数的数量可能在不同的序列中变化,甚至在同一视频中的不同帧中变化。然而,目标是元训练一个固定大小的跟踪模型的初始化,该模型可以适应不同的视频,并为后续的帧不断更新。为了解决这个问题,我们像[33](Meta-Tracker)中那样,在与特征映射卷积之前,使用双线性插值将预定义的卷积滤波器扭曲到特定的大小,从而能够在随后的帧中循环地优化固定的整形模型。
这样保存了reg filter的参数,并实现了更快的速度。注意,在离线训练和测试/跟踪阶段,我们在每个 τ \tau τ帧,即恰好在每次模型更新之前更新滤波器大小及其对应的anchor。通过这种修改,我们可以用 θ ( 0 ) {\theta ^{(0)}} θ(0)来初始化跟踪模型,并在后续的帧中循环地优化跟踪模型,而不需要担心对象的形状变化。
3.2. 循环模型优化
传统的优化方法由于小学习率和受限的训练样本,存在收敛慢的问题,而单纯地提高学习率则会存在训练损失震荡的风险。
论文的关键思想基于一个假设:一个好的optimizer应该可以更新模型来达到未来帧上更好的表现(泛化)。
算法设计了一个循环神经优化器,它被训练成在几个梯度步骤中将模型收敛到一个好的解,以更新跟踪模型。在离线训练阶段,使用循环神经优化器对跟踪模型执行一步梯度更新,然后最小化其在接下来的几帧中的损失。一旦离线学习阶段(offline training)结束,就使用这个学习到的神经优化器来循环地更新跟踪模型,以适应外观变化。通过这种方式训练的优化器将能够快速收敛模型更新,以很好地泛化未来的帧跟踪,为未来的帧跟踪生成良好的模型。
将响应生成网络表示为 C ( F ; θ c f ) C(F;{\theta _{cf}}) C(F;θcf) ,将bbox回归网络表示为 R ( F ; θ r e g ) R(F;{\theta _{reg}}) R(F;θreg) ,其中F为特征映射输入,θ为参数。跟踪损失由响应损失和回归损失两部分组成。
在这里插入图片描述
其中第一部分是L2损失,第二部分是平滑的L1损失。B表示ground truth box。注意采用了边界框坐标的参数化,如[36]中所示。M是使用2D高斯函数构建的响应标签map:
在这里插入图片描述
其中 ,在这里插入图片描述 α控制响应图的形状。一个典型的跟踪过程使用历史训练样本更新跟踪模型,然后在随后的帧上测试该更新的模型,直到下一次更新。我们在元学习范式中模拟这个场景,通过循环地优化响应回归网络,然后在未来的框架上测试它。
具体地说,通过以下方式更新跟踪网络
在这里插入图片描述
其中, λ ( t − 1 ) {\lambda ^{(t - 1)}} λ(t1) 是fully element-wise学习率,和reg网络参数 θ ( t − 1 ) {\theta ^{(t - 1)}} θ(t1)具有相同的维度, ⊙ \odot 表示element-wise乘法。学习率是通过以下公式循环生成的:
在这里插入图片描述
其中, O ( ⋅ ; ω ) O( \cdot ;\omega ) O(;ω)是一个参数为 的coordinate-wise LSTM网络, ω \omega ω在所有输入维度上共享参数, σ \sigma σ是sigmoid函数,约束预测的学习率。LSTM的输入 L ( t − 1 ) {L^{(t - 1)}} L(t1)是一个element-wise栈,存储了之前的学习率 λ ( t − 2 ) {\lambda ^{(t - 2)}} λ(t2)、当前的参数 θ ( t − 1 ) {\theta ^{(t - 1)}} θ(t1),当前的更新损失 l ( t − 1 ) {l^{(t - 1)}} l(t1)和更新损失的梯度 ∇ θ ( t − 1 ) l ( t − 1 ) {\nabla _{{\theta ^{(t - 1)}}}}{l^{(t - 1)}} θ(t1)l(t1), along a new axis。
我们会得到 ∣ θ ∣ × 4 \left| \theta \right| \times 4 θ×4的矩阵,其中 ∣ θ ∣ \left| \theta \right| θ是参数 θ \theta θ的个数。注意:当前的更新损失 l ( t − 1 ) {l^{(t - 1)}} l(t1)被广播以具有和其他向量兼容的形状。为了更好地理解这个处理过程,我们可以将LSTM的输入看做一个mini-batch向量, ∣ θ ∣ \left| \theta \right| θ是batch size,4是输入向量的维度。
当前的更新损失 l ( t − 1 ) {l^{(t - 1)}} l(t1)通过n个更新样本的mini-batch来计算,如下式:
在这里插入图片描述
其中 ( F j , M j , B j ) ({F_j},{M_j},{B_j}) (Fj,Mj,Bj)是从前 τ \tau τ帧中收集的更新样本, τ \tau τ是在线跟踪模型更新之间的帧间隔。最后,我们在随机选择的未来的一帧上测试更新后的模型 θ t {\theta ^t} θt ,同时得到meta loss:
在这里插入图片描述
其中 δ \delta δ [ 0 , τ − 1 ] \left[ {0,\tau - 1} \right] [0,τ1]中随机选择。
在实验中发现采用更多的未来帧并不会提升表现效果,反而会在离线训练阶段耗费更多时间。
在离线训练阶段,作者在多个视频的mini-batch上进行上述流程,得到一个用于优化neural optimizer的平均meta loss,
在这里插入图片描述
其中N是batch size,T是模型更新次数, V i ∼ p ( V ) {V_i} \sim p(V) Vip(V) 是从训练集中采样的视频切片,需要注意的是,初始回归参数 θ ( 0 ) {\theta ^{(0)}} θ(0) 和初始学习率 λ ( 0 ) {\lambda ^{(0)}} λ(0) 也是训练变量,和neural optimizer O联合学习。通过最小化平均meta loss,我们的目标是训练一个neural optimizer,可以更新跟踪模型,在后续帧上很好地泛化,对跟踪模型进行有利的初始化,能够广泛适用于不同的任务(例如视频)。整个算法流程如下
在这里插入图片描述
在这里插入图片描述
图2. 循环神经优化器的计算图(在梯度的反向传播过程中忽略虚线)
3.3. 梯度流
对于初始帧,我们旨在学习有益的跟踪网络 θ ( 0 ) {\theta ^{(0)}} θ(0) 和学习率 λ ( 0 ) {\lambda ^{(0)}} λ(0) ,可以通过一个梯度步长快速适应不同的视频,和 θ ( 1 ) {\theta ^{(1)}} θ(1) 密切相关。因此,我们可以通过梯度更新步骤和更新损失的梯度进行反向传播。
对于后续帧,我们的目标是学习在线神经优化器O,独立于被优化的跟踪模型。因此,我们选择忽略沿更新损失梯度 ∇ θ ( t − 1 ) l ( t − 1 ) {\nabla _{{\theta ^{(t - 1)}}}}{l^{(t - 1)}} θ(t1)l(t1)的梯度路径(虚线路径),这种简化可以使得训练更多地集中在提升神经优化器以减少损失,而不是次要项目,例如LSTM输入或损失梯度。
3.4. 随机滤波器缩放(RFS)
由于过度拟合,神经优化器很难在新任务上很好地泛化。通过分析神经优化器的学习行为,发现初步训练的优化器将预测类似的学习率(见图3:左)。将其归因于特定规模的网络输入过大。
如果我们利用固定的最优学习率,虽然它在梯度下降中可以获得最低的损失,但对于不同尺度的输入x将不能很好的泛化,即过拟合。所以将跟踪模型 θ \theta θ乘以随机采样的向量 ε \varepsilon ε(与 θ \theta θ具有相同维度),于是目标函数变为 f ε ( θ ) = f ( θ ε ) {f_\varepsilon }(\theta ) = f(\frac{\theta }{\varepsilon }) fε(θ)=f(εθ),这样在实践中就无需修改训练样本 { x , y } \{ x,y\} {x,y}就可以间接缩放网络输入x。学习的神经优化器被迫为不同尺度的输入预测自适应学习率(见图3:右),而不是为相似的尺度输入产生相似的学习率,这提高了它的泛化能力。
在这里插入图片描述
4. 所提出结构的在线训练:
使用离线训练的神经优化器、初始回归模型和学习率进行在线跟踪。整个过程类似于离线培训,只是我们不计算元损失或其梯度。
·模型初始化:
在给定第一帧的情况下,我们首先以所提供的边界框为中心裁剪图像块并计算其特征地图。然后使用此示例以及离线学习的 θ ( 0 ) {\theta ^{(0)}} θ(0) λ ( 0 ) {\lambda ^{(0)}} λ(0)执行一步渐变更新,以构建初始模型 θ ( 1 ) {\theta ^{(1)}} θ(1) ,如(9)在这里插入图片描述 所示。
·bbox估计:
首先通过响应生成发现目标的存在,然后通过bbox回归预测准确的bbox来估计对象bbox。我们在生成的响应上采用了[22]中使用的惩罚策略来抑制尺度和纵横比变化较大的anchor点。此外,我们还将响应图乘以类高斯运动图来抑制较大的运动。由anchor计算的与响应映射的最大分数相对应的边界框是最终预测。为了使结果更平滑,将此估计对象大小与前一个对象大小进行线性插值。此外还设计了一种改进的跟踪器,它使用多尺度搜索来估计对象框,称为ROAM。我们将带bbox回归的ROAM命名为ROAM++。
·模型更新:
我们每隔 τ \tau τ帧更新一次模型。尽管离线训练使用以前的 τ \tau τ 帧来执行模型的一步梯度更新,但在实践中,我们发现使用一个以上的步骤可以进一步提高跟踪过程中的性能。因此在实验中采用了使用前两个 τ \tau τ帧的两步梯度更新。
5. 实验细节:
·Patch裁剪:

给定对象的边界框 ( x 0 , y 0 , w , h ) ({x_0},{y_0},w,h) (x0,y0,w,h),图像块的感兴趣区域具有相同的中心 ( x 0 , y 0 ) ({x_0},{y_0}) (x0,y0),并且具有更大的尺寸 S w = S h = γ w h {S_w} = {S_h} = \gamma \sqrt {wh} Sw=Sh=γwh 其中s是比例因子,以覆盖一些背景。然后,将感兴趣区域调整到用于批处理的固定大小S×S,其中 是基于预定义大小为B对象计算的将其表示为基本对象大小(BOS)。
·网络结构:
使用预先训练的VGG-16的前12个卷积层作为特征提取器。删除顶部最大池图层以提高要素地图的空间分辨率。响应产生网络C和包围bbox回归网络均由两层卷积层组成,第一层降维为512×64×1×1,第二层为64×1×21×21的相关层和64×4×21×21的回归层。对于神经优化器O,使用具有20个隐藏单元的两个堆叠的LSTM层。
·超参数:
设置更新间隔 τ = 5 \tau {\rm{ = 5}} τ=5,更新样本批量 n = 5 n {\rm{ = 5}} n=5 ,感兴趣区域比例因子 γ = 5 \gamma {\rm{ = 5}} γ=5 ,BOS值 B = 5 B {\rm{ = 5}} B=5。响应生成采用 α = 5 α {\rm{ = 5}} α=5 ,细胞神经网络特征提取器的特征步长为 c = 5 c {\rm{ = 5}} c=5。用于初始图像块增强的尺度和纵横比因子为s , r = [ 0.811.2 ] r = [0.811.2] r=[0.811.2]
·训练细节:
使用ADAM优化,在4个GPU(每个GPU 4个视频)上对16个长度为31的视频片段进行小批量优化来训练框架。用于训练的数据集包括视频数据集:ImageNet VID、TrackingNet、LaSOT、GOT10k,以及图像数据集:ImageNet Det、COCO。在训练过程中,随机提取视频数据集的连续序列片段,并重复相同的静止图像,形成图像数据集的视频片段。注意,通过略微拉伸和缩放图像来随机增加训练剪辑中的所有帧。对于初始回归参数 θ ( 0 ) {\theta ^{(0)}} θ(0) 和初始学习率 λ ( 0 ) {\lambda ^{(0)}} λ(0) ,我们使用1e-6的学习率。对于循环神经优化器O,使用1e-3的学习率。每隔5个时期,两个学习率都会增加0.5倍。
6. 实验结果
在这里插入图片描述
表1:VOT-2016和VOT-2017的结果。评价指标包括期望平均重叠度(EAO)、准确度(Acc.)、鲁棒性(Rob.)。
在这里插入图片描述
在这里插入图片描述
表2:GOT-10K的检测结果。评价指标包括平均重叠(AO)、0.5重叠阈值下的成功率。(SR0.5),0.75重叠阈值成功率。(SR0.75)。
在这里插入图片描述
在这里插入图片描述
图6.不同类型ROAM的消融实验
图6左:
1)SGD:用传统的SGD代替循环神经优化器进行模型更新(使用与ROAM相同的梯度步数);2)Roam-w/o RFS:在没有RFS的情况下训练循环神经优化器;
3)SGD-Oracle:在测试阶段使用地面真实bbox为SGD构建更新样本;
4)ROAM-Oracle:在测试阶段使用地面真实bbox为ROAM构建更新样本。
图6右:
1)ROAM-GRU:使用两个堆叠的门控循环单元(GRU)[6]作为神经优化器;
2)ROAM-FC:使用两个线性全连接层,然后使用tanh激活函数作为神经优化器;
3)ROAM-ConstLR:使用学习的恒定的单元学习率进行模型优化,而不是使用自适应生成的学习率。
7. 总结
为了有效地在线更新跟踪模型以实现外观自适应,论文提出了一种在元学习环境下分几个梯度步骤的循环模型优化方法。针对不同梯度尺度容易导致过拟合的参数更新增量,使用LSTM循环生成自适应学习率来跟踪模型优化。此外,提出了一种简单而有效的训练技巧,通过随机缩放跟踪模型中使用的卷积滤波器来防止过拟合,从而显著提高了性能。

Appendix:
什么是循环神经网络?

循环神经网络(下面简称RNNs)可以通过不停的将信息循环操作,保证信息持续存在,可以有效地对序列信息(如语音)进行预测。即利用前面的信息对后面的事件进行分类。
在这里插入图片描述
上图为一个简单的RNNs。A是一组神经网络(可以理解为一个网络的自循环),它的工作是不停的接收Xt并且输出ht。从图中可以看出A允许将信息不停的在内部循环,这样使得它可以保证每一步的计算都保存以前的信息。也可以将其展开为下图:
在这里插入图片描述
将RNNs的自循环结构展开,像是将同一个网络复制并连成一条线的结构,将自身提取的信息传递给下一个继承者。这种链式的结构揭示了RNNs与序列和列表类型的数据密切相关。(处理序列问题)。
但在实践过程中,RNNs通过前短期(相关信息与需要该信息的位置距离较近)的信息预测当前任务进行响应的操作较为成功,而通过前长期信息(有用信息与需要进行处理信息的地方之间的距离较远)预测当前任务进行相应的操作容易导致RNNs不能学习到有用的信息,最终推导的任务可能失败。故引入LSTMs这种特殊的RNNs。
什么是LSTM(长短期记忆网络)?
该网络设计出来是为了解决上述长依赖问题。所有循环神经网络都具有神经网络的重复模块链的形式。在标准的RNN中,该重复模块将具有非常简单的结构,例如单个tanh层。标准的RNN网络如下图所示
在这里插入图片描述
LSTMs也具有这种链式结构,但是它的重复单元不同于标准RNN网络里的单元只有一个网络层,它的内部有四个网络层。LSTMs的结构如下图所示。
在这里插入图片描述
其中: 黄色块类似于CNN里的激活函数操作,粉色圆圈表示点操作,单箭头表示数据流向,箭头合并表示向量的合并(concat)操作,箭头分叉表示向量的拷贝操作。
LSTMs的核心思想:
LSTMs的核心是细胞状态,用贯穿细胞的水平线表示。细胞状态像传送带一样。它贯穿整个细胞却只有很少的分支,这样能保证信息不变的流过整个RNNs。细胞状态如下图所示
在这里插入图片描述
LSTM网络能通过一种被称为门的结构对细胞状态进行删除或者添加信息。门能够有选择性的决定让哪些信息通过。门的结构很是一个sigmoid层和一个点乘操作的组合。因为sigmoid层的输出是0-1的值,这代表有多少信息能够流过sigmoid层。0表示都不能通过,1表示都能通过。
一个LSTM里面包含三个门来控制细胞状态。这三个门分别称为忘记门、输入门和输出门。LSTM的第一步就是决定细胞状态需要丢弃哪些信息。这部分操作是通过一个称为忘记门的sigmoid单元来处理的。它通过查看 h t − 1 {h_{t - 1}} ht1 x t {x_{t }} xt信息来输出一个0-1之间的向量,该向量里面的0-1值表示细胞状态 C t − 1 {C_{t - 1}} Ct1 中的哪些信息保留或丢弃多少。0表示不保留,1表示都保留。
在这里插入图片描述
下一步是决定给细胞状态添加哪些新的信息。这一步又分为两个步骤,首先,利用 和通过一个称为输入门的操作来决定更新哪些信息。然后利用 h t − 1 {h_{t - 1}} ht1 x t {x_{t }} xt通过一个tanh层得到新的候选细胞信息 C ~ t {\tilde C_t} C~t,这些信息可能会被更新到细胞信息中。
在这里插入图片描述
下面将更新旧的细胞信息 C t − 1 {C_{t - 1}} Ct1 ,变为新的细胞信息 C t {C_t} Ct。更新的规则就是通过忘记门选择忘记旧细胞信息 C ~ t {\tilde C_t} C~t的一部分,通过输入门选择添加候选细胞信息 的一部分得到新的细胞信息 C t {C_t} Ct
在这里插入图片描述
更新完细胞状态后需要根据输入的 h t − 1 {h_{t - 1}} ht1 x t {x_t} xt来判断输出细胞的哪些状态特征,这里需要将输入经过一个称为输出门的sigmoid层得到判断条件,然后将细胞状态经过tanh层得到一个-1~1之间值的向量,该向量与输出门得到的判断条件相乘就得到了最终该RNN单元的输出。
在这里插入图片描述
对LSTMs的进一步的探索就是注意力(attention),attention的思想是让RNN在每一步挑选信息的时候都能从更大的信息集里面挑选出有用信息。例如,利用RNN模型为一帧图片生成字母,它将会选择图片有用的部分来得到有用的输入,从而生成有效的输出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值