关于YOLOV4目标检测算法的理解

1.算法介绍

在anchor free 算法源源不断的涌现后,我以为基于anchor的算法已经过时了,结果YOLOv4出现了。
YOLO系列算法一直延续了快速的属性,这个也不例外。
YOLOv4引入了大量先进的特性以增强网络的识别能力。
前面几部分主要是介绍了文章引入的新特性,最后一部分画出来整体网络图。
下面是性能图:
在这里插入图片描述

2.网络主体如下:

在这里插入图片描述
作者把目标检测网络概括成四个部分,分别为主干网络、颈部网络、头部网络。
主干网络:有很多种,例如VGG-16,ResNet-50/101,Darknet-53等等。主要的作用是对图片进行特征提取。
颈部网络:最著名的就是FPN,以及它的各种变体改进版。
头部网络:分为两种:one-stage、two-stage两类。
one-stage算法:头部网络为稠密检测,也就是利用滑动窗口的思想对目标框的坐标和种类同步回归。经典算法:SSD、YOLO、RetinaNet等。
two-stage算法:头部为分步检测,先预测出目标框的坐标然后再对目标框中的目标进行回归。经典算法:Faster-RCNN等

3.bag of freebies的概念

bag of freebies:就是再不增加训练花费的基础上增加模型的准确率。例如数据增强、边界框回归损失函数。
数据增强属于图形预处理的一部分,主要的作用是对输入的图像进行各种变换,可以获得数据的扩充。另一方面数据增强还能产生前所未有的图片,增加输入图片的多样性,从而增加面对不同环境模型的鲁棒性。例如,光学和几何学就是常见的两种数据增强的方法。对于光学的数据增强我们主要是调整图片的亮度、对比度、色调、饱和度或者随机增加噪声等等,而对于几何学的数据增强包括几何失真、随机缩放、剪裁、翻转、旋转等等。
上述两种方法都是对图像进行逐个像素级的调整,并保留调整区域的原始像素信息。现在从事数据增强的研究人员开始把重心放到遮挡问题上面来了,例如随机选择一块或者多个矩阵区域,将其全部置零例如Cutout。另外还有将多幅图片转换成一幅图片的方法:MixUp、CutMix。
mixUp:使用两张不同的图片乘以不同的系数然后相加,最后需要根据它们不同的系数来调整标签。
CutMix:将图片剪裁一部分并覆盖到其他图片上,并根据图片的大小来调整标签。
如下图
在这里插入图片描述
边界框回归损失函数:传统的目标检测用的是均方误差(MSE),直接对目标框的中心点坐标和宽高进行回归。但是这种做法是假设四个点是相互独立的,但是实际上有一定的关联。实际评价检测框的指标是使用IOU,这两者是不等价的,多个检测框可能有相同大小的损失值,但IOU可能差异很大,为了解决这个问题就引入了IoU Loss。
IoU Loss:
L o s s I o U = − l n ( I o U ) Loss_{IoU}=-ln(IoU) LossIoU=ln(IoU)
实际上很多都是这样定义的
L o s s I o u = 1 − I o U Loss_{Iou}=1-IoU LossIou=1IoU
但是IoU loss也不完美,存在以下两个缺点:IoU Loss 有2个缺点:
1、当预测框和目标框不相交时,IoU(A,B)=0时,不能反映A,B距离的远近,此时损失函数不可导,IoU Loss 无法优化两个框不相交的情况。
2、假设预测框和目标框的大小都确定,只要两个框的相交值是确定的,其IoU值是相同时,IoU值不能反映两个框是如何相交的。
因此提出了GIoU Loss。

GIoU Loss:
G I o U = I o U − ∣ C − ( A ∪ B ) ∣ ∣ C ∣ GIoU=IoU-\frac{|C-(A\cup B)|}{|C|} GIoU=IoUCC(AB) 其 中 A 为 预 测 框 , B 为 回 归 框 , C 为 A B 的 最 小 外 接 矩 阵 其中A为预测框,B为回归框,C为AB的最小外接矩阵 ABCAB
L o s s G I o U = 1 − G I o U Loss_{GIoU}=1-GIoU LossGIoU=1GIoU

也就是说GIoU损失函数相对于IoU损失函数而言,Loss额外加上了最小外接矩阵减去A并B的差值所占最小外接矩阵的比例。
G I o U ( A , B ) ≤ I o U ( A , B ) GIoU(A,B)\leq IoU(A,B) GIoU(A,B)IoU(A,B) − 1 ≤ G I o U ( A , B ) ≤ 1 -1\leq GIoU(A,B)\leq 1 1GIoU(A,B)1当A,B完全重合时GIoU的值为1,但A,B完全不相交时GIoU的值 → \rightarrow -1。
在这里插入图片描述
GIoU Loss也存在一定的不足,比如A如果完全包裹B的话,GIoU就会退化成IoU,无法区分相对位置的关系。
基于IoU和GIoU存在的问题,作者提出了两个问题:
1、直接最小化预测框与目标框之间的归一化距离是否可行,以达到更快的收敛速度。
2、如何使回归在与目标框有重叠甚至包含时更准确、更快。
好的目标损失函数应该考虑以下三点因素:重叠面积、中心点距离、长宽比。
基于问题一,提出了Distance-IoU Loss(DIoU loss),先对于GIoU loss收敛素的更快,该Loss考虑了重叠面积和中心点距离,但没有考虑到长宽比;
基于问题二,提出了Complete-IoU Loss(CIoU Loss),其收敛的精度更高,以上三个因素都考虑到了。

DIoU loss:
L o s s D I o U = 1 − I o U + ρ 2 ( b , b g t ) c 2 Loss_{DIoU}=1-IoU+\frac{\rho^2(b,b^{gt})}{c^2} LossDIoU=1IoU+c2ρ2(b,bgt)
其中, b b b b g t b^{gt} bgt分别代表着预测框和回归框的中心点, ρ 2 \rho^2 ρ2表示欧氏距离,表示 c c c的最小外界矩形的对角线距离。
当两个框完全重合时, L I o U = L G I o U = L D I o U = 0 L_{IoU}=L_{GIoU}=L_{DIoU}=0 LIoU=LGIoU=LDIoU=0,当两个框不相交时, L I o U → 2 L_{IoU}\rightarrow2 LIoU2。比GIoU Loss收敛速度更快,对于目标框包裹预测框的这种情况,DIoU Loss可以收敛的很快,而GIoU Loss此时退化为IoU Loss收敛速度较慢。

CIoU Loss:
CIoU的惩罚项是在DIoU的惩罚项基础上加了一个影响因子 α v \alpha v αv,这个因子把预测框长宽比和目标框的长宽比考虑进去。
L o s s C I o U = 1 − I o U + ρ 2 ( b , b g t ) c 2 + α v Loss_{CIoU}=1-IoU+\frac{\rho^2(b,b^{gt})}{c^2}+\alpha v LossCIoU=1IoU+c2ρ2(b,bgt)+αv
其中 α \alpha α 是用于做trade-off的参数, α = v ( 1 − I o U ) + v \alpha=\frac{v}{(1-IoU)+v} α=(1IoU)+vv v v v 是用来衡量长宽比一致性的参数,定义为 v = 4 π 2 ( a r c t a n w g t h g t − a r c t a n w h ) 2 v=\frac{4}{\pi ^2}(arctan\frac {w^{gt}}{h^{gt}}-arctan\frac {w}{h})^2 v=π24(arctanhgtwgtarctanhw)2

4.bag of specials的概念:

bag of specials:只花费少量计算成本就能够大幅度显著增强目标检测精度的模块或者后处理方法。这些模块用于增强模型中的某些属性,如扩大感受野、引入注意力机制、增强特征集成能力等等,还有后处理方式如NMS。
增强感受野的模块:通常有SPP、ASPP、RFB。
SPP:全称叫Spatial Pyramid Pooling(空间金字塔池化),将特征图分成dxd块,从而形成空间金字塔,然后每个小块使用最大池化操作,最后输出一维特征向量。因为是一维特征向量,所以不适合全卷积网络。而后在YOLOv3中对SPP进行了改进,变成了内核大小为K x K最大池化层,并进行串联。其中 k = 1 , 5 , 9 , 13 k={1,5,9,13} k=1,5,9,13 s t r i d e = 1 stride= 1 stride=1。在这样设计下,较大的K x K最大池化层能够有效的增强主干网络的感受野。
ASPP:全称叫Atrous Spatial Pyramid Pooling(空洞空间金字塔池化),可以理解为空洞卷积和最大池化的结合。
空洞卷积:
在这里插入图片描述
(a) 普通卷积,1-dilated convolution,卷积核的感受野为3x3
(b) 空洞卷积,2-dilated convolution,卷积核的感受野为7x7
(c) 空洞卷积,4-dilated convolution,卷积核的感受野为15x15
两个3x3的卷积串联,感受野为5x5,如果是一个3x3的卷积和一个3x3的扩张率为2的空洞卷积串联,那么它们的感受野为7x7。
空洞卷积可以大大增加感受野的范围。结合最大池化操作就形成了ASPP。
在这里插入图片描述
RFB:全称叫Receptive Field Block(感受野块)。
在说这个之前先说一下Inception网络模型。这个模型主要是为了解决如何在有限的计算资源内提高模型的准确率。一般而言就是提高网络的深度以及宽度。但是会带来两个问题:
a) 容易发生过拟合。当深度和宽度不断增加的时候,需要学习到的参数也不断增加,巨大的参数容易发生过拟合。
b) 均匀地增加网络的大小,会导致计算量的加大。
为了解决这个问题引入稀疏特性和将全连接层转换成稀疏连接。这个思路的缘由来自于两方面:1)生物的神经系统连接是稀疏的;2)有文献指出:如果数据集的概率分布能够被大型且非常稀疏的DNN网络所描述的话,那么通过分析前面层的激活值的相关统计特性和将输出高度相关的神经元进行聚类,便可逐层构建出最优的网络拓扑结构。说明臃肿的网络可以被不失性能地简化。
inception结构的主要思路是:如何使用一个密集成分来近似或者代替最优的局部稀疏结构
以下是Inception v1的网络结构图在这里插入图片描述
对于上图中做出几点解释:
  a)采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
  b)之所以卷积核大小采用1、3和5,主要是为了方便对齐;
  c)文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了;
  d)网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。
  e) 引入1x1卷积操作的目的是为了减少卷积层的计算量,并引入更多的非线性,提高泛化能力。
后续版本的Inception结构核心思想不变,仅仅对结构进行了优化。
RFB结构主要是在Inception的基础上加入了空洞卷积层(dilated convolution)。
特点:1、不同尺寸卷积核的卷积层构成的多分枝结构,这部分可以参考Inception结构。2、引入了dilated卷积层,dilated卷积层主要作用也是增加感受野,和deformable卷积有异曲同工之处。

在这里插入图片描述
注意力模块:主要分为 channel-wise attention and point-wise attention两方面,代表算法分别为 Squeeze-and-Excitation (SE) 和 Spatial Attention Module (SAM)。
Squeeze-and-Excitation(SE):
在这里插入图片描述
上图是SENet的Block单元,图中的Ftr是传统的卷积结构,X和U是Ftr的输入(C’xH’xW’)和输出(CxHxW),这些都是以往结构中已存在的。SENet增加的部分是U后的结构:对U先做一个Global Average Pooling(图中的Fsq(.),作者称为Squeeze过程),输出的1x1xC数据再经过两级全连接(图中的Fex(.),作者称为Excitation过程),最后用sigmoid(论文中的self-gating mechanism)限制到[0,1]的范围,把这个值作为scale乘到U的C个通道上, 作为下一级的输入数据。这种结构的原理是想通过控制scale的大小,把重要的特征增强,不重要的特征减弱,从而让提取的特征指向性更强。
Spatial Attention Module (SAM):
在这里插入图片描述
具体步骤:
1、这一次是在轴的方向上对不同特征图上相同位置的像素值进行全局的MaxPooling和AvgPooling操作,分别得到两个spatial attention map并将其concatenate,shape为[2, H, W]。
2、再利用一个7*7的卷积对这个feature map进行卷积。后接一个sigmoid函数。
本文作者将SAM(空间注意力模块)模块中的的空间注意机制改成了点注意机制
在这里插入图片描述
特征集成:在特征集成这一方面,早期主要是通过skip connection(跳级链接)和hyper-column(超列)来将低级物理特征集成成高级语义特征。后面随着FPN网络的出现变得越来越流行,提出了很多改进版本,如SFAM、ASFF和BiFPN等等。
FPN再熟悉不过了,在这里也就不在叙述了。
SFAM:网上找不到资料,而且论文地址也失效了,很奇怪。
ASFF:全称叫Adaptively Spatial Feature Fusion(自适应空间特征融合)
为了充分利用高层特征的语义信息和低层特征的细粒度特征,我们采用的最多的是FPN网络,但是FPN网络真的可以充分利用不同尺度的特征吗?因此提出了ASFF网络用以更加充分的提取不同尺度的特征。ASFF网络的核心思想是特征融合,认为不同尺度的特征对各个预测结果都有一定准确率的贡献。例如ASFF-1这一层,他的输入来自于Level 1,2,3,将Level 2,3经过不同的下采样转化为Level 1图片一样的大小,因为是相加所以还需要将通道数调整到一致,然后它们分别乘上 α \alpha α β \beta β γ \gamma γ,再相加就得到了ASFF-1的特征图。ASFF-2、ASFF-3层也是类似的处理方式。而 α \alpha α β \beta β γ \gamma γ的值采用自适应的方式获得,通过resize后的level1~level3的特征图经过1×1的卷积得到的,然后需要进行softmax处理,使得它们的范围都在[0-1]之间。例如 α i j ∗ \alpha_{ij}^* αij
α i j ∗ = e α i j e α i j + e β i j + e γ i j \alpha_{ij}^*=\frac{e^{\alpha_{ij}}}{e^{\alpha_{ij}} +e^{\beta_{ij}} +e^{\gamma_{ij}}} αij=eαij+eβij+eγijeαij
在这里插入图片描述
BiFPN:全称叫weighted bi-directional feature pyramid network (加权双向特征金字塔网络)
PANet 的效果比 FPN ,NAS-FPN 要好,就是计算量更大;作者从 PANet 出发,移除掉了只有一个输入的节点。这样做是假设只有一个输入的节点相对不太重要。这样把 PANet 简化;作者在相同 level 的输入和输出节点之间连了一条边,假设是能融合更多特征,有点 skip-connection 的意味。PANet 只有从底向上连,自顶向下两条路径,作者认为这种连法可以作为一个基础层,重复多次。如何确定重复几次呢,这是一个速度和精度之间的权衡。
在这里插入图片描述
本文采用的是PAN,并进行了一定的更改,把PAN的addition成concatenation
在这里插入图片描述
Mish激活函数
我们常用的激活函数是ReLU,它实质上解决了传统tanh和sigmoid激活函数中经常遇到的梯度消失问题。而后出现的改进版LReLU和PReLU,它们主要目的是解决输出小于零时ReLU的梯度为零的问题。但是依然还有一个很大的问题,就是x=0是不可导的问题,因此Mish几何函数应运而生。以上无边界(即正值可以达到任何高度)避免了由于封顶而导致的饱和。理论上对负值的轻微允许允许更好的梯度流,而不是像ReLU中那样的硬零边界。
M i s h ( x ) = x ∗ t a n h ( l n ( 1 + e x ) ) Mish(x)=x*tanh(ln(1+e^x)) Mish(x)=xtanh(ln(1+ex))
在这里插入图片描述
网络选择:
大量研究表明在ImageNet数据集上,就分类任务而言,CSPResNext50比CSPDarknet53要好得多。然而在coco数据集上就检测而言,CSPDarknet53比CSPResNext50要好。
对于分类网络而言,检测网络需要以下几点要求:
1.输入图片需要更高的分辨率——用来检验小物体。
2.更多的层——更高的感受野用来覆盖增加大小的输入图片。
3.更多的参数——使模型能够在单个图片上检测大小不同的对象。
最终该论文选择了CSPDarknet53作为主干网络、SPP附加模块、PANet路径聚合作为颈部网络和YOLOv3(基于锚点)头部网络作为YOLOv4的整体网络。

5.BoF and BoS的选择

激活函数:ReLU, leaky-ReLU, parametric-ReLU,ReLU6, SELU, Swish, 和 Mish中选择
包围框回归损失函数:MSE, IoU, GIoU,CIoU, DIoU
数据扩充:CutOut, MixUp, CutMix
正则化方法:DropOut, DropPath ,Spatial DropOut , or DropBlock
通过均值与方法进行网络激活层的标准化:Batch Normalization (BN) ,Cross-GPU Batch Normalization (CGBN or SyncBN), Filter Response Normalization (FRN) , 或者Cross-Iteration Batch Normalization (CBN)
跳连接:Batch Normalization (BN) ,Cross-GPU Batch Normalization (CGBN or SyncBN), Filter Response Normalization (FRN) , 或者Cross-Iteration Batch Normalization (CBN)

正则化方法:
以前正则化的方法只有DropOut,后来被玩出花来了。一句话概括一下
Dropout :完全随机扔
SpatialDropout :按channel随机扔
Stochastic Depth :按res block随机扔
DropBlock :每个feature map上按spatial块随机扔
Cutout :在input层按spatial块随机扔
DropConnect :只在连接处扔,神经元不扔。
以上方法我就不详细介绍了,就说说DropOut和DropBlock的区别,如下图
在这里插入图片描述
(a)原始输入图像
(b)绿色部分表示激活的特征单元,b图表示了随机dropout激活单元,但是这样dropout后,网络还会从drouout掉的激活单元附近学习到同样的信息
©绿色部分表示激活的特征单元,c图表示本文的DropBlock,通过dropout掉一部分相邻的整片的区域(比如头和脚),网络就会去注重学习狗的别的部位的特征,来实现正确分类,从而表现出更好的泛化。
最后作者选择了DropBlock,进行正则化。

6.额外的提升

1.新的数据扩充方式:马赛克、自对抗训练。
2.利用遗传算法来选择最优的超参数。
3.修改了SAM、PAN、Cross mini-Batch Normalization(CmBN)

马赛克技术:代表这一种新的数据扩充的方式,混合四张图片为一张图,对于上文所说的CutMix仅仅只混合了两张图片,如下图所示
在这里插入图片描述
这使得网络拥有检测正常一张图片以外的对象的能力,此外批标准化从每一层上的四个不同的图片计算激活统计信息,这将大大减小大量小批次样本尺寸的需要。
自对抗训练:这是一种新的数据增强技术,一共分为两个阶段。第一阶段,神经网络改变原始图像而不是网络的权值,通过这种方式,神经网络对自己进行了一次对抗性攻击,改变了原始图像,造成了一种欺骗,认为图像上没有所需要的目标。第二阶段,神经网络以正常的方式在已经改变的图片上进行训练。
改进的批标准化:
下图是Batch Normalization(BN)和Cross-Iteration Batch Normalization(CBN)的算法流程图
BN直白点就是统计一个批次里面网络每一层的权值信息,将网络每一层权值拉到标准正态分布上。但是批次size不能太小,一般来讲批次size大小超过16 后,bn效果基本不会收到影响。这种方法的缺点就是需要不同显卡上的数据进行同步以及devices间的数据传递。
CBN就换了一个思路,通过计算几个相近的batch的近似统计参数来解决该问题。
在这里插入图片描述

假设一个批次包含着4个小批次,对于BN而言,我们先累积第一批次的的权值,然后根据权值的计算BN(即算出均值和方差),最后进行标准化,然后计算第二张图时,我们会累积第一张图和第二张图的权值,并计算BN,再进行标准化,一直到第四次,我们将全部的权值来进行计算批标准化的值,我们在标准化后会对权值和scale、shift同步更新。
对于CBN而言,每次更新完权值后,会累积这一次和前3次批标准化的值,然后再进行批标准化并更新scale、shift,然后把更新后的信息运用到下次权值更新上。
本文采用的时CmBN,是CBM的改进版本。它只收集单个批次中的小批次之间的统计信息。与BN不同的是它不仅会累积整个批次的权值还会累积整个批次计算过程中的标准化的值,并最后更新一次权值和cale、shift。
在这里插入图片描述

7.其他的一些改进

Class label smoothing(标签平滑):
简单点就是本来正负标签为[0,1]改成[0.05,0.95]或者类似概率。
这样做有以下两点原因:

  1. 无法保证模型的泛化能力,容易造成过拟合;
  2. 全概率和0概率鼓励所属类别和其他类别之间的差距尽可能加大,而由梯度有界可知,这种情况很难适应。会造成模型过于相信预测的类别。

CSPDarknet53:前面的CSP指的是Cross Stage Partial(跨阶段部分),来自于CSPNet。
深度学习一直有个问题,就是随着近几年的发展,在精度提高的同时网络也越来越深,那就导致了我们训练的时间越来越长,在运行过程中需要很大的运算量。而CSPNet作者认为推理计算过高的问题是由于网络优化中的梯度信息重复导致的。CSPNet通过将梯度的变化从头到尾地集成到特征图中,在减少了计算量的同时可以保证准确率。
CSPNet提出主要是为了解决三个问题:
1.增强CNN的学习能力,能够在轻量化的同时保持准确性。
2.降低计算瓶颈
3.降低内存成本
我们先以DenseNet为例,介绍以下CSPNet的构成原理
在这里插入图片描述
在这里插入图片描述
作者的思路是将基础层的特征图分为两个部分,然后通过一个跨阶段的层次连接将它们合并起来。主要的目的是通过分裂梯度流,使得梯度往不同的网络路径上传播,而且已经证实了通过切换连接和转换的步骤,传播的信息具有较大的差异性。

作者对于转换的过程,又做了如下的c,d实验,设计了CSPDenseNet的两个变体来展示这种梯度流截断是如何影响网络的学习能力的,以证明局部转换层对于整个CSP网络的重要性。
在这里插入图片描述
局部转换层一般由1x1的卷积层构成,设计的目的就是为了最大化梯度组合的差异,局部转换层是一种层次化的特征融合机制,采用截断梯度流的策略,防止不同的层学习重复的梯度信息。©和(d)显示了两种不同的融合策略,CSP (fusion first)是指将两部分生成的feature map连接起来,然后进行转换操作,如果采用这种策略,将会重用大量的梯度信息。至于CSP(fusion last)策略,稠密块的输出将经过局部转换层,然后与来自第1部分的feature map进行连接。如果采用CSP(最后融合)策略,梯度信息将不会被重用,因为梯度流被截断。采用CSP (fusion last)策略进行图像分类,计算代价明显降低,但Top-1的准确率仅下降0.1%。另一方面,CSP(fusion first)策略确实帮助显著降低了计算成本,但最高的精确度显著降低了1.5%。在信息集成过程中,采用跨阶段的拆分和合并策略,可以有效地减少重复的可能性。
言归正传,我们现在来聊一下本文的CSPDarknet53。
在这里插入图片描述
卷积核大小和数量就不贴出来了,画面会糊。

8.YOLOv4的组成

主干网络:CSPDarknet53
颈部网络:SPP , PAN
头部网络:YOLOv3
主干网络的Bag of Freebies (BoF) :CutMix and Mosaic data augmentation, DropBlock regularization,Class label smoothing
主干网络的Bag of Specials (BoS) :Mish activation, Cross-stage partial connections (CSP), Multiinput weighted residual connections (MiWRC)
检测网络的Bag of Freebies (BoF) : CIoU-loss,CmBN, DropBlock regularization, Mosaic data augmentation, Self-Adversarial Training, Eliminate grid sensitivity, Using multiple anchors for a single ground truth, Cosine annealing scheduler , Optimal hyper-parameters, Random training shapes
检测网络的Bag of Specials (BoS) : Mish activation,SPP-block, SAM-block, PAN path-aggregation block,DIoU-NMS
整体网络图:
在这里插入图片描述网络图太长了,凑合以下吧。
前面主干网络是改进型Darknet-53,颈部网络的是SPP , PAN(其中绿色部分是SPP),头部网络是YOLOv3。
主干网络:
在这里插入图片描述
颈部网络:
在这里插入图片描述
头部网络:
在这里插入图片描述
差不多就是上面这样样子。
这篇博客写了快一周,里面可能有部分错误,往指正!

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值