单目标跟踪 Siamese系列网络:SiamFC、SiamRPN、one-shot跟踪、one-shotting单样本学习、DaSiamRPN、SiamRPN++、SiamMask

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


CNN:RCNN、SPPNet、Fast RCNN、Faster RCNN、YOLO V1 V2 V3、SSD、FCN、SegNet、U-Net、DeepLab V1 V2 V3、Mask RCNN

单目标跟踪SiamMask:特定目标车辆追踪 part1

单目标跟踪SiamMask:特定目标车辆追踪 part2

单目标跟踪 Siamese系列网络:SiamFC、SiamRPN、one-shot跟踪、one-shotting单样本学习、DaSiamRPN、SiamRPN++、SiamMask

单目标跟踪:跟踪效果

单目标跟踪:数据集处理

单目标跟踪:模型搭建

单目标跟踪:模型训练

单目标跟踪:模型测试


3.6.Siamese

学习目标:

  • 了解siamase的网络结构
  • 知道one-shotting学习
  • 了解siamase在目标跟踪中的应用

1.Siamese网络

Siamese network就是“连体的神经网络”,神经网络的“连体”是通过共享权值来实现的,如下图所示。共享权值意味着两边的网络权重矩阵一模一样,甚至可以是同一个网络。

如果左右两边不共享权值,而是两个不同的神经网络,叫伪孪生网络(pseudo-siamese network,伪孪生神经网络),对于pseudo-siamese network,两边可以是不同的神经网络(如一个是lstm,一个是cnn),也可以是相同类型的神经网络。

1.1 原理

Siamese网络衡量两个输入的相似程度,输出是一个[0,1]的浮点数,表示二者的相似程度。孪生神经网络有两个输入(Input1 and Input2),将两个输入feed进入两个神经网络(Network1 and Network2),这两个神经网络分别将输入映射到新的空间形成输入在新的空间中的表示。通过Loss的计算,评价两个输入的相似度。

传统的siamese network使用Contrastive Loss(对比损失函数),如下所示:

  • 其中Dw被定义为姐妹孪生网络的输出之间的欧氏距离。Dw欧式距离公式如下:

也可以是其他的距离度量方法,比如Cosine距离主 要用于词汇级别的语义相似度度量。

  • 其中Gw是其中一个子网络的输出。X1和X2是输入数据对。

  • Y值为1或0。如果模型预测输入是相似的,那么Y的值为0,否则Y为1。

  • max是表示0和m-Dw之间较大值的函数。
  • m是大于0的边际价值(margin value),边际价值表示超出该边际价值的不同不会造成损失,因为希望基于实际不相似对网络进行优化。

1.2 用途

孪生神经网络用于处理两个输入“比较类似"的情况。伪孪生神经网络适用于处理两个输入"有一定差别”的情况。比如,我们要计算两个句子或者词汇的语义相似度,使用siamese network比较适合;如果验证标题与正文的描述是否一致(标题和正文长度差别很大),或者文字是否描述了一幅图片(一个是图片,一个是文字),就应该使用pseudo-siamese network。也就是说,要根据具体的应用,判断应该使用哪一种结构,哪一种Loss。

  • 词汇的语义相似度分析,QA中question和answer的匹配,签名/人脸验证。
  • 手写体识别也可以用siamese network。
  • 还有kaggle上Quora的question pair的比赛,即判断两个提问是不是同一问题。
  • 在图像上,基于Siamese网络的视觉跟踪算法也已经成为热点。
  • 单样本学习

2.单样本学习

2.1 原理

传统的神经网络试图学习某一个类别的图像的表达,而One-Shot Learning 试图学习不同图像(可以同一类别或者不同类别) 的区别。

给定图片A和图片B, 将A转换为一个表达(embedding vector) p, 将B转换为 一个表达(embedding vector) q

• 如果 A 和 B 属于同一个类别, 那么我们希望 p 和 q 是相似的

• 如果 A 和 B 不属于同一个类别, 那么我们希望 p 和 q 是不相似的

• 相似度的度量, 欧几里得距离:

2.2 意义

  1. 减少训练数据

    • 深度学习需要大量的数据, MNIST 为了 10 个类别的区分, 需要 60,000 张训练图像, 平均一个类别需要6000 张训练图像

    • One-Shot 试图将一个类别的训练图像减少, 极端情况时减小到一张图片

  2. 在新类别的数据出现时, 无需重新训练

    • 传统的深度神经网络无法处理没有出现在训练集中的类别

    • 以员工刷脸打卡为例, 使用传统深度神经网络, 每一个新员工入职, 都是一个新的 类别, 需要重新训练深度神经网络

    • 如果每天都有新员工入职, 每天都要重新训练网络, 成本非常高

    • One-Shot learning 可以无需重新训练即可应用于新的类别的数据

3.siamese在目标跟踪中的应用

目标追踪任务是指在一个视频中给出第一帧图像的bbox的位置,在后续的帧中追踪该物体的任务。

目标追踪不同于目标检测的是:

1、需要给出首帧的标定框。

2、只需要给出标定框,后续的搜索范围往往在上一帧图像的附近。

孪生网络是使用深度学习进行目标追踪的重要解决方案,主要包括:孪生网络解决目标追踪开山之作SiamFC、SiamRPN、DaSiamRPN、SiamRPN++,SiamMask,下面对其进行简要介绍:

3.1 SiamFC(2016)

3.1.1 网络结构

SiamFC采用了全卷积式的Siamese网络实现目标跟踪,其网络结构如下图所示,具有两个权值共享的分支。其中,z为127×127的模板图像相当于要追踪的目标,x为255×255的搜索图像,我们要完成的就是在x中找到z的位置。

SiamFC有两个分支对应两个输入为z和x,将他们同时输入进行φ的计算,这里的作用就是进行特征提取,分别生成6×6×128和22×22×128的featuremap。φ所对应的特征提取网络采用的是AlexNet,其结构如下:

将生成的featuremap输入互相关层生成score map,实际上会进行如下的计算:

其中bI为每个位置对应的值,相当于是一个偏置,φ(x)和φ(z)是进行的卷积运算,通过卷积运算提取在x中与z最相似的部分。在SiamFC结构图中,输入的搜索图像中有红蓝两个区域在经过网络后与score map中的红蓝响应值相对应。网络输出的是17×17 的score map,而输入x是255×255的搜索图像,怎样将两者的位置进行映射呢。这里,将17×17的score map进行双三次插值生成272×272的图像,来确定物体的位置。但是为什么不生成255×255的图像呢?由于原始图像相对比较粗糙,为了使定位更加准确,所以生成272*272的结果。

3.1.2 模型输入

孪生网络有两个分支对应两个输入,z与x的大小并不是任意输入的,而是对目标区域进行了扩充,如下图所示:

上面的三张图是网络输入的模板图像z,下面对应的是网络输入的搜索图像x,红色为当前的所在帧的bounding-box。对于模板图像来说,根据第一帧的groundtruth会得到目标的(x_min,y_min,w,h)四个值,会通过以下公式生成模板图像的大小:

其中A=127*127,s是对图像进行的一种变换,先将包含上下文信息的(w+2p)×(h+2p)的图片扩展,然后进行resize,生成127×127的模板图像。 对于搜索图像x来说,会从整张图片中裁剪出255×255的图片,裁剪的中心为上一帧预测的bounding-box的中心。为了提高跟踪性能,选取了多种尺度进行预测。最初的SiamFC为5种尺度1.025^{-2,-1,0,1,2} ,其中255×255对应尺度为1。为了提升网络的FPS,又提出了存在3种尺度的SiamFC-3s。   当模板图像和搜索图像不够裁剪时,会对不足的像素按照RGB通道的均值进行填充。

3.1.3 损失函数

为了构造有效的损失函数,对搜索区域的位置点进行了正负样本的区分,即目标一定范围内的点作为正样本,这个范围外的点作为负样本,例如网络结构图中最右侧生成的score map中,红色点即正样本,蓝色点为负样本。score map中的groundtruth按下式进行标记:

其中c为物体在score map的中心,u为score map中任意一点,∣∣u−c∣∣是u与c的欧氏距离,R为距离的阈值,k为score map经过网络之后缩小的倍数,从网络结构可以看出,有三层的卷积,池化是以2为步长,所以图像经过网络后会缩小2^3=8倍。

SiamFC采用的损失函数是logistic loss,具体的损失函数形式如下: 对于score map中了每个点的损失:

其中v是score map中每个点真实值,y∈{+1,−1} 是这个点所对应的标签。 上式是score map中每个点的loss值,而对于score map整体的loss,则采用的是全部点的loss的均值。即:

D是生成的score map,∣D∣为heatmap的大小,uϵD代表其在score map中的位置。

3.1.4 训练与跟踪

训练过程使用随机梯度下降法对下式进行优化:

其中:θ代表着网络参数。

跟踪过程中模板图像只提取一次特征,目标图像在线不更新,对搜索图像进行5个尺度的搜索,利用用双三次插值将score map从 17×17 上采样到 272×272,进行跟踪目标的确定。

3.2 SiamRPN(2017)

3.2.1 网络结构

Siam-RPN提出了一种基于RPN的孪生网络结构,由孪生子网络和RPN网络组成,前者用来提取特征,后者用来产生候选区域。其中,RPN子网络由两个分支组成,一个是用来区分目标和背景的分类分支,另外一个是微调候选区域的回归分支,使整个网络实现了端到端的训练。

SiamRPN中的Siamese network模块与siamFC相同,使用预训练的AlexNet网络,可将其作为一种变换𝜑,将这种变换分别应用到模板支和检测支上,产生模板和搜索区域的特征𝜑(𝑧),𝜑(𝑥)。

RPN网络由两部分组成,一部分是分类分支,用于区分目标和背景,另一部分是回归分支,它将候选区域进行微调。

在介绍这两个分支之前,我们先回顾下相关的内容:

grid:指的对一张图像或者是featuremap进行平均地分割,但是并不一定是一个像素对应一个grid,也可能是多个像素对应一个grid。所有grid组成一个Proposal。

anchor:锚点,指的是在boundingbox生成之前会先在每个grid上生成一些候选框,然后将这些anchors候选框进行操作,生成boundingbox

一般候选框会有一些固定的参数,首先是长宽比,例如上图左边的三个anchors对应一个grid生成的三种不同长宽比的anchors,一般长宽比的数目都是固定的而且长宽比互为倒数,比如{0.5,1,2};其次,是尺度大小,也就是anchors的面积,一般同一个featuremap下的grid都是看作生成相同尺度的anchors,经过不同层的featuremap对应不同的尺度,也就生成不同尺度的anchors,例如左边和右边尺度不同的anchors。

NMS: 非极大值抑制。NMS可以理解为不是极大值就抑制它。如下图所示,有两个anchors都分类为狗,这时会计算两个框之间的IoU,如果大于某个阈值,则认为两个框检测的是同一个物体,将得分高的框保留,得分低的框去除。图中红色框得分0.9,绿色得分0.7,两个框的IoU大于某个阈值,则只保留红色来检测狗的位置。

siamRPN的输入与siamFC中的相同,在训练过程中,用cross-entropy loss作为分类分支的损失函数,用smooth L1loss作为回归分支的损失函数。

3.2.2 one-shot跟踪

SiamRPN是第一次将one-shot策略用在跟踪任务中:

检测帧在对每一帧目标进行检测时就是对proposals进行分类,即相当于一个分类器。该分类器进行分类时需要一个响应得分图,该响应图是由检测帧特征图用模板帧特征图作为卷积核进行卷积得到的。标识有weight for regression和weight for classification即为模板帧特征图,它用第一帧图像信息进行训练(也就是的one-shot策略,只用第一帧图像信息训练出一层网络的参数),然后将训练好的参数作为卷积核用到检测支中,对检测帧特征进行卷积得到响应图featuremap。(分类的是:17×17×2k,回归的是:17×17×4k)

3.2.3 模型创新

  • 区域选择策略是丢弃部分anchors产生的边界框,选择在目标周围𝑔×𝑔×𝑘的anchors而不是在整个特征图上的𝑚×𝑛×𝑘的anchors,如图g=7。

用cosine窗口和尺度变化penalty对剩下的proposals得分进行重新排序。在上一个策略中执行并删除了离目标较远的proposals后,cosine窗口用于抑制最大位移,然后增加penalty以抑制尺寸和比例的大幅变化。最后选出得分最高的前K个proposals,并用NMS选出最终的跟踪目标位置。另外,在跟踪目标得到后,通过线性插值更新目标尺寸,保持形状平稳变化。

3.2.4 损失函数

损失函数与faster-RCNN 中的损失函数类似,分类损失为交叉熵损失,回归损失采用归一化坐标的smooth L1 损失进行回归。Ax,Ay ,Aw,Ah表示anchors的中心点和宽高,Tx ,Ty,Tw,Th表示groundtruth的中心点和形状,标准化距离为:

3.2.5 模型训练

SIamRPN是端到端的训练模型,用SGD方法对网络进行训练,同时也运用了一些数据增强处理。在细节方面,因为相同目标在相邻帧变化不会很大,采用同一尺度5种不同比例的anchors[0.33,0.5,1,2,3],同时将IoU>0.6的定为正样本,IoU<0.3的定为负样本。

3.3 DaSiamRPN(2018)

DaSiamRPN网络的全称为Distractor-aware SiamRPN,是基于SiamRPN网络结构,提出更好的使用数据,针对跟踪过程的干扰物,利用更好的训练方式是跟踪更加的鲁棒。

DaSiamRPN认识到了现有的目标追踪数据集中存在的不平衡问题,即之前的目标追踪数据集会导致目标追踪算法的判别能力较差,造成这种现象的原因是,在目标周围的背景信息中,非语义背景(即真正的“背景”信息)占据了主要部分,语义背景(背景中的人、狗等实体)占据了极少一部分。这种不平衡的分布使得模型趋向于去学习到一个区分前景(目标+语义背景)和背景(非语义背景)的模型,而不是学习一个实例级别的表示方法。各种不同目标追踪算法的热图如下:

基于上面这个理论,为目标追踪算法添加了一些数据对,用于增强算法的判别能力,其中,Detection pairs:提出使用ImageNet Detection和COCO数据集,通过一些数据增强技术构造出样本对,这类样本对用于提高模型的泛化能力。其次,使用来自相同类别的负样本对。如下图中(b)。最后,使用来自不同类别的负样本对。如下图中(c)。添加这两类负样本可以使模型在超出视线、全遮挡的情况下,避免模型漂移到其他的目标上去。这两类样本对用于提高模型的判别能力

当模型跟踪失败的时候,模型采取一种“局部-全局”增大search region的策略去重新跟踪目标。如下图所示(红色是ground truth,绿色的是跟踪结果,蓝色的是search region):

detection scores 指的是算法判定追踪质量的分数,overlaps指的是ground truth与tracking box之间的IOU。至于如何判断模型何时跟踪失败,由于论文中使用多种策略增强了模型的判别能力,所以可以使用模型的判别分数来估算是否跟丢.

3.4 SiamRPN++(2019)

3.4.1 模型结构

SiamRPN++网络结构如下图所示,虚线的两边都是网络结构图,虚线左侧是特征提取网络结构,右侧是RPN结构图。其实SiamRPN++的网络结构与SiamRPN网络结构十分相似,而SiamRPN++就是在SiamRPN的基础上加入许多的创新点。

SiamRPN++网络以resNet50为backbone,进行特征提取。原始的ResNet主要应用于图像分类和识别任务,对于空间信息不敏感,而在跟踪任务中,空间信息对于目标的准确定位至关重要,所以要在跟踪任务中使用,需要对ResNet进行改进。原始ResNet具有32像素的尺度变化,不适合于稠密孪生网络的预测。如下图所示,通过修改conv4和conv5块以获得单位空间尺度变化,将最后两个块的尺度变化从16和32减少到8倍的尺度变化,并通过空洞卷积增加其感受域。在每个块输出端附加一个额外的1×1卷积层,以将输出通道减少到256。因为每一层padding操作被保留,模板图片处理得到的特征尺寸增加15X15,所以通过裁剪选取中间部分7X7大小的特征来作为模板图片特征。使用互相关层和全卷积层的组合来组合一个head模块来计算分类(用S表示)和bbox回归器(用B表示)。

3.4.2 模型创新

  • 针对平移不变性的改进

严格的平移不变性只存在于无填充网络中,如AlexNet。以前基于孪生的网络设计为浅层网络,以满足这一限制。然而,如果所使用的网络被ResNet或MobileNet等现代网络所取代,填充将不可避免地使网络变得更深,从而破坏了严格的平移不变性限制,不能保证物体最后的heatmap集中于中心。

当把正样本都放在图像中心时,网络只会对图像中心产生响应;如果把正样本均匀分布到某个范围内,而不是一直在中心时(所谓的范围即是指距离中心点一定距离,该距离为shift;正样本在这个范围内是均匀分布的),随着shift的不断增大,这种现象能够逐渐得到缓解。

  • 分层聚合

在以前仅使用像AlexNet这样的浅层网络,多层特性不能提供非常不同的作用。然而,考虑到感受野的变化,ResNet中的不同层更有意义。浅层的特征主要集中在低层次的信息上,如颜色、形状等,对于定位是必不可少的,而缺乏语义信息;深层的特征具有丰富的语义信息,在某些挑战场景(如运动模糊、形变等)中是有益的。使用这种丰富的层次信息有助于跟踪,从最后三个残差块中提取的多层特征,以进行分层聚合。将这些输出中分类featuremap称为 conv3、conv4、conv5的输出分别输入三个SiamRPN模块。由于对resnet网络的改动,三个RPN模块的输出尺寸具有相同的空间分辨率,因此直接对RPN输出采用加权和。

互相关计算模块是一个用来整合两个分支信息的核心操作。使用Depthwise Cross Correlation来实现更有效的信息关联,它具有更少的参数

Cross-Correlation用于SiamFC中,模版特征在搜索区域上按照滑窗的方式获取不同位置的响应值,最终获得一个一维的响应映射图。

Up-Channel Cross Correlation用于SiamRPN中,和Cross Correlation操作不同的是在做correlation操作之前多了两个卷积层,通道个数分别为256和256x2k,其中k表示每一个grid上面的anchor个数。其中一个用来提升通道数,而另一个则保持不变。之后通过卷积的方式,得到最终的输出。通过控制升维的卷积来实现最终输出特征图的通道数。

Depthwise Cross Correlation和UpChannel一样,深度互相关层预测模板和搜索图像之间的多通道相关性特征,模板图像经过卷积层后并不像SiamRPN那样将通道数增加2k倍,而是保持不变,同时搜索图像也与模板图像保持一致,两者逐通道相互卷积,之后接一个1×1的卷积层,再改变通道数,这样在保持精度的同时减少了参数量。

SiamRPN++很大程度上缓解了padding带来的平移不变性的破坏,从而在孪生网络中引入了深层的网络,从而带来了巨幅的准确率提升。

3.4.3 损失函数

损失函数与SiamRPN相同,不在赘述。

4.4.4 模型训练

SiamRPN++是端到端的训练模型,用SGD方法对网络进行训练。

3.5 SiamMask(2019)

与普通的视频跟踪网络不同的是,SiamMask可以同时完成视频跟踪和实例级分割的任务。如下图所示,与传统的对象跟踪器一样,依赖于一个简单的边界框初始化(蓝色)并在线操作。与ECO(红色)等最先进的跟踪器不同,SiamMask(绿色)能够生成二进制分割,从而更准确地描述目标对象。

3.5.1 网络结构

SiamMask的网络结构,提出了三分支的SiamMask网络。与之前的孪生网络十分相似的是,将模板图像与搜索图像输入网络,两者经过特征提取网络,特征提取网络如下表所示,生成15×15×256和31×31×256的featuremap,与SiamFC相似的是,将两个featuremap逐通道相互卷积,生成17×17×256的featuremap,将这个过程生成的像素值叫做RoW,如下图所示,蓝色的1×1×256的featuremap为heatmap的最大值,代表目标最有可能出现的位置。之后将featuremap输入三个分支中,图中

是1×1的卷积层,作用是改变通道的数量。

网络结构如下表所示:

在box分支中,17×17×256的featuremap经过1×1×(4k)的卷积层后生成17×17×4k的featuremap,这里k是每一个RoW生成k个anchors,这里实际上和SiamRPN相同,每四个一组,分别对应dx、dy、dw、dh四个值,代表着与groundtruth的距离。

  在score分支中,17×17×256的featuremap经过1×1×(2k)的卷积层后生成17×17×2k的featuremap,这里k是每一个RoW生成k个anchors,这里实际上和SiamRPN相同,每两个一组,分别对应分类为目标和背景的标签结果。   在Mask分支中。17×17×256的featuremap经过1×1×(63×63)的卷积层后生成17×17×(63×63)的featuremap,从featuremap中取出与RoW位置相同的像素值,为1×1×(63×63),对其做上采样,生成127×127×1的图像,在这个图像中所有的像素值都取0或1,生成的相当于是一个二进制掩码,目标像素值为1,背景像素值为0,这样就完成了实例级分割的任务。   三分支中的网络结构如下表所示:

除了三分支的SiamMask之外,作者还提出了二分支的SiamMask网络,如上图所示,删掉了box分支,只保留score和Mask分支:

通过Mask分支生成的二进制掩码来生成相对应的bounding box,二分支中的网络结构如下表所示:

3.5.2 模型创新

  • 改进的bounding box生成策略

设计了三种生成bounding box的策略如下图所示的红色、绿色和蓝色框

在之前的视频跟踪网络中,生成的都是平行于图片的x轴,y轴的bounding box。当然,SiamMask也能完成这样的任务,如图中红色框所示,在三分支的SiamMask网络中,box分支负责生成这样的bounding box。而在二分支的SiamMask网络中,利用Mask分支生成的二进制掩码取出目标所在的最小和最大的像素值,来生成Min-max的bounding box。

为了能够将bounding box尽可能的贴合物体,设计了MBR的生成策略,如图绿色框所示。同样,利用Mask分支生成的二进制掩码,求目标的最小包闭矩形,这样会导致生成的bounding box会有一定的倾斜。

还设计了一种策略Opt,如图中蓝色框所示。通过Mask分支生成的二进制掩码,求一个矩形区域使得矩形与目标像素的IoU最大,通过这种策略在一些计算目标与bounding box之间IoU的比赛中会提高SiamMask的成绩。

  • 掩膜细化模型

下图为特征提取网络和Mask分支的结构图,网络忽略了box分支和score分支,经过特征提取网络生成的1×1×256的featuremap,首先经过反卷积生成15×15×32的featuremap,之后每一次反卷积都通过Ui 结合多层的特征,最后经过一个3×3的卷积层和Sigmoid层生成127×127×1的二进制掩码。

下图为细化模型的结构图,经过细化模型可以实现上采样的过程中结合特征提取的featuremap信息。

3.5.3 损失函数

Mask分支的损失函数:

在Mask分支最后生成一个127×127×1的二进制掩码也需要对其进行标记,目标像素标记为+1,背景像素标记为-1,所以假设一个RoW中会有w×h个像素,cij为Mask中第n个RoW中第i,j个像素的真实标记,mij为对应的网络的输出。所以这里的Mask分支只会计算一个目标RoW在二进制掩码中的所有像素。

3.5.4 模型训练

siamMask是端到端训练模型,训练参数如下表所示:

总结:

  • Siamese网络衡量两个输入的相似程度,输出是一个[0,1]的浮点数,表示二者的相似程度。孪生神经网络有两个输入(Input1 and Input2),将两个输入feed进入两个神经网络(Network1 and Network2),这两个神经网络分别将输入映射到新的空间形成输入在新的空间中的表示。通过Loss的计算,评价两个输入的相似度。
  • 单样本学习(one-shotting)能够减小训练数据,使用较少的样本即可训练网络,当出现新的类型时无需重新训练网络
  • Siamese网络在目标跟踪中的应用有:
    • siamFC:开山之作
    • SiamRPN:将入RPN预测位置
    • DasiamRPN:考虑了样本不平衡的问题
    • SiamRPN++: 引入深层网络
    • SiamMask:加入了图像分割的内容

  • 10
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

あずにゃん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值