YOLOv9最新改进系列:超越VIT!重新思考CNN大核注意力设计,显著提升小目标检测性能!

YOLOv9最新改进系列:超越VIT!重新思考CNN大核注意力设计,显著提升小目标检测性能!

YOLOv9原文链接戳这里,原文全文翻译请关注B站Ai学术叫叫首er

B站全文戳这里!

详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:AI学术叫叫兽 源码在相簿的链接中,动态中也有链接,感谢支持!祝科研遥遥领先!


arge Separable Kernel Attention: Rethinking the
Large Kernel Attention Design in CNN(提出原文戳这)

详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:AI学术叫叫兽 源码在相簿的链接中,动态中也有链接,感谢支持!祝科研遥遥领先!
截止到发稿时,B站YOLOv9最新改进系列的源码包,已更新了11种的改进!自己排列组合2-4种后,考虑位置不同后可排列组合上千种!!专注AI学术,关注B站博主:Ai学术叫叫兽er!

摘要

大型可分离核注意力(LSKA)模块的视觉注意力网络(VAN)已被证明在各种基于视觉的任务上提供了卓越的性能,超过了视觉转换器(ViTs)。然而,这些LSKA模块中的逐深度卷积层随着卷积核尺寸的增加,计算和内存占用呈二次增长。为了缓解这些问题,并使VAN的注意力模块能够使用极大的卷积核,我们提出了一种大型可分离核注意力模块,称为LSKA。LSKA将深度卷积层的2D卷积核分解为级联的水平1D和垂直1D内核。与标准LKA设计不同,提出的分解使得可以直接使用注意力模块中的深度卷积层的大内核,而不需要任何额外的块。我们证明,与标准LKA模块相比,VAN中的提议LSKA模块可以获得相当的性能,并降低计算复杂性和内存占用。我们还发现,随着内核尺寸的增加,提议的LSKA设计使VAN更加偏向于对象的形状而不是纹理。此外,我们对LKA和LSKA在VAN、ViTs和最近的ConvNeXt上的鲁棒性进行了基准测试,这些基准测试在以前的工作中很大程度上没有被探索过。我们的实验结果表明,当内核尺寸增加时,VAN中的提议LSKA模块显著降低了计算复杂性和内存占用,同时超过了ViTs、ConvNeXt,并与VAN中的LKA模块在对象识别、对象检测、语义分割和鲁棒性测试上提供了类似的性能。

1 简介

在过去的十年里,卷积神经网络(CNN)的结构和优化技术得到了迅速发展。这种演变来自于激活函数的设计[1] - [3],提出了CNN参数的正则化方法[4] - [6],构建了新的优化方法[7] - [9],代价函数[10] - [12],以及新的网络结构[13] - [17]。CNN中的大多数突破都围绕着人类认知过程,特别是人类视觉系统。

由于平移等变性(translational equivariance)和局部性(locality)属性,CNN是各种基于视觉的任务的特征编码器的常见选择,包括图像分类[13] - [15]、语义分割[18] - [21]和目标检测[22][25]。通过使用注意力机制,可以进一步提高CNN在这些基于视觉的任务中的性能。例如,作者在[26] - [30]中表明,注意力机制通过产生与人类眼睛和大脑一致的显著区域来提高CNN的性能。虽然带有注意力机制的CNN正在取得成效,但最近在视觉领域对自注意力网络的适应性的增加,例如视觉转换器(ViT)及其变体[31][32],在图像分类、目标检测和语义分割方面已经超过了CNN。与CNN相比,ViT的优越性能归因于Multi-Head-Self-Attention(MHSA)作为其关键组件的更好的缩放行为[33]。然而,ViT在视觉领域中的有效性是以高分辨率输入图像时计算和内存占用呈二次增长为代价的。尽管如此,像Swin-Transformer这样的ViT的有效性[32]重新打开了重新探索自VGG网络引入以来一直处于阴影下的CNN的设计选择的大门[33]。

与CNN相比,ViT在图像分类方面取得成功的其中一个主要原因是其能够模拟输入图像的长程依赖性。CNN中可以通过使用具有注意力机制的大感受野来模拟这种长程依赖性[34]。CNN中的大感受野可以通过堆叠许多卷积操作[28]或使用较大的内核大小[35]获得。虽然前者可能导致模型大小的增加,但后者由于其内存和计算需求而被认为成本过高。然而,在最近的一项研究中,作者表明,CNN中的大内核可以通过连接级联的深度卷积和扩张深度卷积来模拟,而不会导致计算和内存使用量的二次增加[34]。他们提出的视觉注意力网络(VAN)使用具有简单注意力机制的一组内核,称为大核注意力(LKA),如2c所示。LKA模块采用具有小感受野内核的标准深度卷积来捕捉局部依赖性并补偿网格问题[36],然后是具有大感受野内核的扩张深度卷积来模拟长程依赖性。这种深度卷积和扩张深度卷积的组合相当于所提出的大规模CNN内核[33][35]。扩张深度卷积的输出馈送到1×1卷积以推断注意力图。然后将输出注意力图乘以输入特征以进行自适应特征细化。
在这里插入图片描述
带有LKA的VAN已被证明在图像分类、目标检测和语义分割方面优于最先进的ViTs和CNN。然而,如[35]所指出的,大尺度深度卷积核的朴素设计仍然会引起高计算量和内存使用量,降低模型效率随着核大小的增加。我们的初步结果如图1所示,与[35]的初步结果相符,我们发现VAN的LKA模块中深度卷积的设计(不使用深度膨胀卷积)对于大到35×35和53×53的核大小来说计算效率低下。

在本文中,我们首先研究了带有简单注意力模块的深度卷积在VAN中对大核大小的效果。我们将这种带有大核和注意力模块的深度卷积设计称为LKA-trivial。其次,我们提出了VAN中的分离式深度卷积版本。分离式深度卷积将给定的k×k卷积核均匀地分为1×k和k×1个可分离的卷积核,这些卷积核在输入特征上以级联方式起作用。在其他因素保持不变的情况下,VAN中LKA-trivial模块的提出的分离式深度卷积显著减少了随着核尺寸增加的参数数量的二次增长。我们将这种修改后的设计称为LSKA-trivial。此外,这种内核分解类型还与深度膨胀卷积兼容,允许我们在VAN中提出LKA模块的完全可分离版本。我们将这种提出的LKA模块的可分离版本称为LSKA。我们发现,即使在更大的核大小下,提出的LSKA版本的LKA也能在VAN中获得类似的性能,同时计算效率更高。此外,在更大的核大小下,提出的LSKA模块增强了输入图像的长程依赖性,而不会引起高昂的计算和内存使用量。

为了正式说明提出的LSKA在VAN中的有效性,我们对一系列下游任务进行了广泛的评估,并将LSKA与LKA在VAN中进行对比。我们还调查了所提出的LSKA和其他基线模型(如VAN中的LKA、ViTs [32]、[37]–[39]和ConvNeXt [33])在各种失真数据集(如常见杂质、语义转移和未在先前工作中探索的分布自然对抗性示例)上的鲁棒性。我们工作的贡献可以总结如下:

1)我们解决了深度卷积核随着核大小的增加在LKA-trivial和LKA in VAN中的计算效率问题。我们通过将k×k卷积核替换为级联的1×k和k×1卷积核,有效降低了LKA-trivial和LKA in VAN中随着核尺寸增加而产生的参数数量的二次增长,同时没有性能下降。
2)我们在各种基于视觉的任务(包括图像分类、目标检测和语义分割)上实验验证了LSKA在VAN中的有效性。我们证明,与原始LKA中的小核相比,LSKA可以从大核中受益,同时保持相同的推理时间成本。
3)我们对包含各种图像扰动的5个多样化ImageNet数据集进行基准测试,其中包括LKA-based VAN、LSKA-based VAN、ConvNeXt和最先进的ViTs。我们的结果表明,与先前的大的卷积核CNN和ViTs相比,LSKA-based VAN是一个鲁棒的学习器。
4)我们提供的定量证据表明,与ViTs和以前的大核cnn相比,基于lska的VAN中由大核学习的特征编码了更多的形状信息和更少的纹理。此外,在特征表示中编码的形状信息的数量与对不同图像失真的鲁棒性之间存在高度相关性。这一证据有助于我们解释为什么基于lska的VAN是一个健壮的学习器。

本文的其余部分组织如下。在第二节中,我们介绍了在大型内核设计和关注网络方面所做的最新工作。第3节介绍了我们提出的用于VAN的LSKA设计,第4节给出了实验结果。第5节提供了不同大核分解方法和核尺寸的消融研究。第六节与最先进的模式作了比较。第七节展示了LSKA-VAN、cnn和ViTs之间的鲁棒性比较。最后,我们在第八节结束我们的工作。

2 相关工作

2.1 带有大核的CNN

在过去的十年中,为了改进卷积神经网络(CNN)架构以适应一般的图像识别任务,已经做了大量的研究工作。除了AlexNet [13]和Inception [14]网络之外,这些CNN架构中的核设计主要局限于3×3(例如VGG [40]、ResNet [15]、MobileNets [41]),这是因为它具有随着权重层深度的增加而提高的计算效率。为了尝试使用较大的核大小,文献[42]中的作者提出了一个由相对较大的7×7核组成的局部关系网络(LR-Net)。尽管其性能优于传统的ResNets(具有相同的核大小),但当核大小进一步增加时,LR-Net的性能下降了。为了弥补层次变换器和CNN之间的性能差距,ConvNeXt [33]通过逐渐将Transformer的设计引入ResNet来进行实证研究。他们发现了几个关键组件,可以改善CNN的性能,例如改变训练过程(如Swin Transformer)、改变阶段计算比率、使用更少的激活和归一化层以及使用更大的核大小。与LR-Net类似,他们发现当核大小超过7×7时,性能会趋于饱和。

最近,[35]中的作者重新审视了长期以来被忽视的大型核CNN设计。他们证明,在MobileNetV2中,通过将一组小型权重核替换为少数重新参数化的大型权重核,可以获得大型的有效感受野(ERFs),并部分模拟人类对物体形状的理解。他们提出的大型核网络(ReplkNet)具有31×31的大型核大小,在ImageNet分类上比Swin Transformer高出0.3%,在MS-COCO检测上比ResNet-101高出4.4%。然而,ReplkNet会产生高昂的计算开销,从而限制了其在其他领域(如分割)的有效性。例如,[43]的作者表明,原始的大型核卷积会损害分割任务的性能,因为随着核大小的增加,参数大小增加导致模型出现过度拟合问题。为了解决这个问题,他们提出了具有大型1×k和k×1卷积核的全局卷积网络(GCN) [43],以提高语义分割性能。

最近的一项工作,SLaK [44],观察到随着核大小增加到31、51和61以上,ReplkNet [35]的性能开始趋于平稳。为了解决大型核的可训练性问题,SLaK将大型核分解为两个矩形核(即51×5和5×51),并使用动态稀疏技术来减少可学习参数。与这些方法不同,我们在基于CNN的视觉注意力网络(VAN)中采用可分离核进行深度卷积和深度膨胀卷积,并引入注意力模块,以进一步提高其计算效率。

2.2 大核注意机制

注意力机制被用于选择图像中最重要区域。通常,它们可以分成四类:空间注意力 [26]、[28]、[29]、[31],通道注意力 [26]、[27]、[45],时间注意力 [46]、[47] 和分支注意力 [48]、[49]。在这里,我们更关注通道注意力和空间注意力,因为它们与我们的工作更相关。通道注意力关注模型层的“什么”语义属性。由于特征图的每个通道都是一个检测器的响应图,也称为滤波器 [50],通道注意力机制允许模型关注跨通道的特定对象属性 [27]。与通道注意力不同,空间注意力关注模型应该关注“在哪里”语义相关的区域。STN [29]、GENet [51] 和非局部神经网络 [28] 是涉及不同类型空间注意力方法的一些代表性作品。

自注意力[52]是一种空间注意力,已应用于CNN和ViTs [31],[32]。视觉注意力网络(VAN) [34]提出了一种新的CNN主干网络,该网络结合了CNN的属性和自注意力模块。作者采用了具有大型核注意力(LKA)模块的CNN网络架构,以实现CNN的局灶性、长程依赖性和自注意力模块的空间适应性特性,类似于ViTs。此外,LKA模块具有通道适应性,这在标准的CNN和变压器中的自注意力模块中并不自然存在。为了提高计算效率,LKA采用具有深度卷积的膨胀卷积[53](DW-D-Conv)来实现更大的有效感受野(ERFs)。

即使VAN在图像分类、目标检测和语义分割方面比一系列transformer网络(如PVT-V2 [37]、Swin Transformer [32]和Twins-SVT [54])取得了更好的性能,我们的工作表明,LSKA可以进一步降低VAN的计算复杂性,同时不损失任何性能。

3 方法

在本节中,我们首先讨论如何通过使用1D卷积核来设计LSKA模块来重构LKA模块(使用和不使用扩展深度卷积)。然后总结了LSKA模块的几个关键特性,并分析了LSKA模块的复杂度。

3.1.制定

在这里插入图片描述
我们首先设计基本的LKA块,不使用膨胀深度卷积,如图2a所示。给定一个输入特征图 F ∈ R C × H × W F \in \mathbb{R}^{C \times H \times W} F∈RC×H×W,其中C是输入通道数,H和W分别表示特征图的高度和宽度,设计LKA的简单方法是在2D深度卷积中使用大的卷积核。使用等式1-3可以获得LKA的输出。

请添加图片描述
请添加图片描述

其中 * 和 ⊗ \otimes ⊗ 分别代表卷积和哈达玛积。 Z C Z^{C} ZC 是通过将大小为 k × k k \times k k×k 的核 W 与输入特征图 F 进行卷积获得的深度卷积的输出。值得注意的是,F 中的每个通道 C 都按照 [41] 中的方式与核 W 中的相应通道进行卷积。等式1中的 k 也代表核 W 的最大感受野。然后使用 1 × 1 1 \times 1 1×1 的卷积核进行卷积以获得注意力图 A C A^{C} AC 。LKA 的输出 F ˉ C \bar{F}^{C} FˉC 是注意力图 A C A^{C} AC 和输入特征图 F C F^{C} FC 的哈达玛积。可以发现,LKA 模块中的深度卷积将导致计算复杂度随着核大小的增加而呈二次方增长。我们称这种设计为 LKA-trivial,以区别于 [34] 中提到的实际设计。可以很快发现,在 VAN 中,增加 LKA-trivial 中的核大小将导致计算复杂度呈二次方 ( k 2 k^{2} k2) 增长(参见图 3)。

为了减轻LKA-trivial中大核大小深度卷积的计算成本高的问题,作者在[34]中提出将大核大小的深度卷积分解为小核大小的深度卷积,然后是具有相当大核大小的膨胀深度卷积(图2c)。这种大核分解有助于减轻深度卷积单独使用大核大小而导致的计算成本二次方增加的问题。如[34]所述,LKA的输出可以如下所示获得。

Z ˉ C = ∑ H , W W ( 2 d − 1 ) × ( 2 d − 1 ) C ∗ F C (4) \bar{Z}^{C}=\sum_{H, W} W_{(2 d-1) \times(2 d-1)}^{C} * F^{C} \tag{4}

请添加图片描述

其中d是扩张率。等式4中的 Z ˉ C \bar{Z}^{C} ZˉC表示深度卷积的输出,其核大小为 ( 2 d − 1 ) × ( 2 d − 1 ) (2d-1) \times (2d-1) (2d−1)×(2d−1),捕获了局部空间信息,并对后续深度卷积的网格效应进行了补偿(参见等式5)。深度卷积的核大小为 ( ⌊ k d ⌋ × ⌊ k d ⌋ ) \left(\left\lfloor\frac{k}{d}\right\rfloor \times\left\lfloor\frac{k}{d}\right\rfloor\right) (⌊dk​⌋×⌊dk​⌋),其中 ⌊ . ⌋ \lfloor . \rfloor ⌊.⌋表示向下取整操作。扩张深度卷积负责捕获深度卷积输出的全局空间信息。尽管LKA设计在很大程度上改进了LKA-trivial,但当核大小超过 23 × 23 23 \times 23 23×23时,它仍然在VAN中引起高计算复杂度和内存占用(参见图3)。

3.2

大可分离核与注意力

通过将深度卷积和深度扩展卷积的二维权核拆分为两个级联的一维可分离权核,可以得到等效的改进LKA结构。我们将LKA模块的这种修改后的配置称为LSKA,如图2d所示。在[34]之后,LSKA的输出如下所示。

请添加图片描述

LKA-trivial的可分离版本可以用类似的方式获得,我们将其命名为LKA-trivial,如图2b所示。从图3可以看出,与LKA-trivial和LKA相比,LSKA-trivial和LSKA都显著降低了VAN的计算复杂度。在接下来的小节中,我们报告了LSKA区别于一般卷积、自关注和LKA的特性。

在这里插入图片描述

3.3 LSKA的性质

通过回顾之前的注意机制[27]、[28]、[31]、[32],与一般卷积、自注意和LKA模块相比,LSKA模块成功的四个重要特性如表I所示。
在这里插入图片描述长距离依赖。如第II-B节所述,自注意力机制[52]是一个关键组件,使转换器能够模拟长程依赖。然而,最近的工作[33],[35]表明大核是捕捉全局信息的另一种方法。为了实现这一目标,我们遵循[34]中的LKA设计,将大核分解为两个小核,而不是使用[33],[35]中的简单大核设计,因为它具有高计算足迹和优化难度[43]。为了验证我们提出的LSKA的长距离依赖性,我们利用有效感受野(ERF)生成方法,如[?],[35],[44]所述,生成VAN-LSKA-Tiny的ERF图,如图4所示。热图中分布的更大程度的暗区表示更大的ERF。从图4a到4f,我们观察到暗区从核大小7扩展到65,这表明LSKA方法可以有效地捕获图像中的长距离依赖。

在这里插入图片描述

空间和信道适应性。如第II-B节所述,空间注意和通道注意是基于上下文依赖关系自适应地重新校准特征权重的两种常见策略。我们的工作继承了LKA的设计,与自关注相比,LKA包含了更低参数和计算复杂度的属性。LKA与LSKA的不同之处在于,我们采用了水平和垂直级联的内核,进一步降低了内存和计算复杂度,如图2d所示。

对于极大型核的可扩展性。如图3所示,VAN中的LKA-trivial会导致计算成本随着核大小的增加而呈二次方增长。LKA设计显著降低了计算足迹,但是当核大小超过23 \times 23时,模型参数的数量会随着核大小的增加而增加。当最近最先进的SLaK-Decomposed和SLaK-Sparse Decomposed方法[44]被引入VAN时,当核大小超过100时,它们比LKA具有更低的参数数量和计算足迹。请注意,图3中的结果是为VAN-Small网络报告的。令人惊讶的是,与LKA和SLaK相比,所提出的LKA-trivial和LKA的LSAKA-trivial和LSAKA版本不仅降低了计算成本,而且保持了VAN的模型参数数量相对恒定。请注意,核大小也指最大感受野(MRF)。

关于精度性能,如表VIII所示,随着核大小从23增加到53,LSKA-Base显示出持续增长。相反,LKA-Base在核大小超过23后开始饱和。这些结果表明,就参数大小、FLOPs和精度而言,LSKA在极大型核上具有可扩展性。

3.4 LSKA的复杂性分析

在本小节中,我们计算了图3中提出的LSKA-Trivial、LSKA、LKA-Trivial和LKA注意力模块的浮点运算次数(FLOPs)和参数数量。请注意,在以下分析中忽略了偏置项以简化计算。我们还假设LSKA和LKA的输入特征图大小和输出特征图大小相同(即H×W×C)。为了简洁起见,我们只提供用于计算LSKA和LKA的FLOPs和参数数量的方程。然而,同样的方程可以用来计算LKA-Trivial和LSKA-Trivial的参数和FLOPs。原始LKA的参数和FLOPs可以按如下方式计算:

请添加图片描述
其中k是核大小,d是膨胀率。LSKA关注模块的flop总数和参数计算方法如下:

请添加图片描述
通过将第14式和第12式的第一个项相等,我们注意到提出的LSKA可以在原始LKA设计的逐点卷积层中节省 2 d − 1 2 \frac{2d-1}{2} 22d−1​ 参数。同样,通过比较第14式和第12式的第二个项,我们注意到提出的LSKA可以在原始LKA设计的膨胀逐点卷积层中节省 1 2 ⌊ k d ⌋ \frac{1}{2}\left\lfloor\frac{k}{d}\right\rfloor 21​⌊dk​⌋ 参数。在FLOPs方面节省的数量与参数的数量相同。还可以看出,LSKA在计算上比LSKA-Trivial更有效。因此,除非另外说明,在与LKA和现有最先进方法进行比较时,我们报告的是LSKA的性能。

3.5 模型体系结构

在这项工作中,我们遵循VAN[34]的架构设计,如表II所示。模型的超参数如下:

S i S_{i} Si​:输入主干中卷积层的步长和第i阶段的下采样;
K i K_{i} Ki​:输入主干中第i阶段卷积层的核大小和下采样;
C i C_{i} Ci​:第i阶段中输出通道的数量;
E i E_{i} Ei​:第i阶段卷积前馈层的扩展比;
L i L_{i} Li​:第i阶段中的块数;

在这里插入图片描述
根据VAN的设计,我们的模型由一个输入主干层和四个后续阶段组成。输入主干的第一层包含一个7x7卷积层,步长为4,后面跟着一个批量归一化层。该层将输入分辨率降低4倍,并将通道数增加到32或64,具体取决于模型容量。

在这里插入图片描述
除了第1阶段之外,每个阶段都以一个3x3卷积开始,步长为2,下采样层紧随其后。接着是一个卷积块,其中包含批量归一化、LSKA模块和一个卷积前馈网络(CFFN)如图5所示。 我们的模型包括在深度卷积之前和之后的1x1卷积用于通道交互,这是在[17]、[33]、[35]、[57]中的常见做法。为了提供更多的非线性,在LSKA之前和CFFN内部附加了GELU激活层。VAN中的LKA和我们的工作之间的主要区别在于,我们用LSKA层替换了每个卷积块的LKA层。

为了提供更多讨论实例,我们设计了三种不同容量的VAN-LSKA,即VAN-LSKA Tiny、VAN-LSKA-Small和VAN-LSKA-Base。这些模型包含与VAN中LKA相同的卷积块数量、通道数和CFFN的扩展比,以便在第4节中对这两种注意力模块进行公平比较。

…详情见原文!

8 结论

本文解决了在LKA模块中增加核大小时深度卷积的计算效率问题。为了缓解这些问题,我们提出了一种简单的策略,使用级联的水平(横向)和垂直(纵向)一维深度卷积,这有效地减少了深度卷积在LKA-trivial和VAN中的LKA中产生的参数数量和计算量的二次增长。实验结果表明,VAN中的提出的LSAKA可以在核大小、参数大小和速度之间取得良好的权衡,同时保持与LKA-trivial和LKA相当或更好的性能,在各种计算机视觉任务中。我们进一步研究了LSAKA的鲁棒性,并证明与以前的大的核CNN和ViT相比,LSAKA是一个鲁棒的学习器。我们提供了定量证据表明,增加LSAKA的核大小使模型在表示中编码更多的形状信息而纹理更少。由于表示中编码的形状信息数量与鲁棒性之间存在高度相关性,这有助于我们理解为什么基于LSAKA的VAN是一个鲁棒的学习器。另一方面,我们的工作可能为未来探索LSAKA在其他领域(如视频任务或声学任务)的好处开辟了新的方向。

9 修改步骤!

9.1 修改YAML文件

详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:AI学术叫叫兽 源码在相簿的链接中,动态中也有链接,感谢支持!祝科研遥遥领先!

9.2 新建.py

详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:AI学术叫叫兽er 源码在相簿的链接中,动态中也有链接,感谢支持!祝科研遥遥领先!

9.3 修改tasks.py

详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:AI学术叫叫兽er 源码在相簿的链接中,动态中也有链接,感谢支持!祝科研遥遥领先!

三、验证是否成功即可

执行命令

python train.py

改完收工!
关注B站:Ai学术叫叫兽er
从此走上科研快速路
遥遥领先同行!!!!

详细的改进教程以及源码,戳这!戳这!!戳这!!!B站:AI学术叫叫兽er 源码在相簿的链接中,动态中也有链接,感谢支持!祝科研遥遥领先!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值