目标检测(七):FPN----特征金字塔网络

FPN:Feature Pyramid Networks for Object Detection 这篇文章主要基于 特征金字塔(Feature Pyramids) 解决了 目标检测系统中识别多尺度目标的不足

尽管特征金字塔是识别任务中实现多尺度目标检测的基本技术之一,但因为其 计算量大、内存占用高 而难以应用在深度学习目标检测中,因此先前的深度学习目标检测网络会直接利用卷积网络计算出的特征,只采用单一尺度的最高层特征进行预测,然而这种方法存在一个固有的弊端:低层特征和高层特征之间的语义信息存在很大差距,这就导致网络在预测时缺少低层语义信息,从而不利于检测小目标。为了处理目标大小差异十分明显的检测问题,经典做法是利用图像金字塔生成多尺度特征图进行预测,但这又会带来极大的计算量,所以这篇文章引入了带有 横向连接和跳跃连接 的特征金字塔,只需增加极少计算量就可以构建多尺度的高级语义特征图 [1]。

一、简介

识别多尺度目标在计算机视觉领域中是一项基本的挑战,而建立在图像金字塔上的特征金字塔,也就是 特征化图像金字塔,构成了这一挑战的标准解决方案,原因在于 特征金字塔具有尺度不变性,换句话说就是 目标的尺度变化可通过移动其在金字塔中的层级来抵消。因此我们只需令网络同时考虑 目标在图像中的位置其在金字塔中的层级,就可以实现多个不同尺度的目标检测。

随着深度学习的发展,特征金字塔的应用方式也在不断变化,大致经历了以下几个阶段:

1 人工特征之特征化图像金字塔

1
在人工特征时代 (如 HOG、SIFT、DPM 等) 大量应用了基于图像金字塔构建特征金字塔的方法,由于在图像金字塔的每一个层级上都进行特征化,最终得到的特征金字塔的每一层都具有较强的语义信息。但这样构建的特征金字塔非常苛刻,以至于类似上述方法的目标检测器需要进行密集尺度采样以获取较好的结果,从而使得模型的速度变慢。

  • 早期SIFT特征是在尺度空间的极值处提取的,用于特征点匹配;
  • HOG特征与后期的SIFT特征则是在整个图像金字塔上密集计算的,这些 HOG 和 SIFT 金字塔已被用于图像分类、对象检测、人体姿态估计等众多工作中。

总结来说,特征化图像金字塔的每一层以获取特征金字塔具有如下特点:

优点

  • 实现了多尺度的特征表示;
  • 所有层的特征图都具有 较强的语义信息,包括高分辨率层。

缺点

  • 推理时间显著增加,导致此方法在实际中难以应用;
  • 内存占用巨大,导致以图像金字塔的形式训练深度网络变得不可行;
  • 基于第二点,如果只在测试阶段使用图像金字塔,那么由于训练时网络只针对于某一个特定分辨率进行训练,可能会导致训练与推理阶段的不一致性。

2 卷积网络之单尺度特征图

由于特征化图像金字塔的每一层具有上述缺点,曾在识别任务中应用的人工特征逐渐被卷积网络 (如 AlexNet、GoogleNet、VGGNet 等) 计算的特征替代。这种特征 能够表达高级语义信息,且 对尺度变化更加鲁棒,有助于使用单一输入尺度计算的特征进行识别 (如 Over-Feat、R-CNN、SPPNet、Fast/Fatser R-CNN 等)。

  • OverFeat 通过在图像金字塔上应用 ConvNet 作为滑动窗口检测器,采用了类似于早期神经网络人脸检测器的策略;
  • R-CNN 采用了基于区域提议的策略,其中每个提议在使用 ConvNet 分类之前都进行了尺度归一化;
  • SPPnet 证明这种基于区域提议的检测器可以更有效地应用于在单一尺度图像上提取的特征图;
  • Fast/Faster R-CNN 提倡使用从单一尺度计算的特征,因为它在准确性和速度之间提供了很好的权衡。

2
尽管利用卷积网络计算特征具有对尺度变化的鲁棒性,但最终用于预测的特征层却缺乏低层语义信息,影响预测的准确性,而特征金字塔的所有层都具有很强的语义信息,因此仍然需要特征金字塔来获取最为准确的结果(如 ResNet 等)。

总结来说,使用单一尺度特征具有以下特点:

优点

  • 计算速度快;
  • 对尺度变化具有更强的 鲁棒性

缺点

  • 缺乏低层语义信息。

3 卷积网络之金字塔特征层级

要知道图像金字塔并非计算多尺度特征表示的唯一方式,深度卷积网络逐层计算的结果就是一个 特征层次结构,多尺度金字塔形状是特征层次结构固有的属性。
3
这种网络内的特征层次结构能够产生具有不同空间分辨率的特征图,但却引入了由不同深度引起的较大语义差距:低层特征图具有高分辨率,但语义信息的表达能力弱,适用于检测小目标;高层特征图具有低分辨率,但语义信息表达能力强,适用于检测大目标。如:

  • FCN 在多个尺度上对每个类别的部分分数求和,以计算语义分割;
  • Hypercolumns 使用类似的方法进行对象实例分割;
  • HyperNet、ParseNet 和 ION 在计算预测之前连接多个层的特征,这相当于对转换后的特征求和。
  • SSD 和 MS-CNN 在不结合特征或分数的情况下预测特征层次结构的多层上的对象。但是 SSD 并没有直接利用已经计算好的特征层,而是从网络的高层(VGG-conv4_3)开始选用某些层,再增加一些卷积层来构成新的金字塔特征层级。这种做法使得用于预测的特征中缺少低层高分辨率特征图的语义信息,不利于检测小目标。

4 卷积网络之top-down结构

通过上述三个阶段可以发现一个好的特征金字塔应该同时满足 多尺度所有尺度都具有强语义信息。这就是本文的目标。

那么这种特征金字塔该如何实现?在 Hourglass Net、Recombinator Net 等中均采用了一种 top-down融合 的思想,基本思路就是通过 top-down 和 skip/lateral-connection 将将跨分辨率和语义级别的低级特征图关联起来,借此来保证金字塔的每个尺度上都具有强语义信息,但它们的目标是 生成一个高分辨率的单一高级特征图,并在该图上进行预测,如用于分割的 U-Net、Sharp-Mask,用于人脸检测的 RecombinatorNet,用于关键点估计的 Stacked HourglassNet 等。

5

而本文则利用 top-down融合横向连接(lateral connection) 将低分辨率、强语义信息的特征与高分辨率、弱语义信息的特征相结合,构建了一个在所有层上都具有丰富的语义信息的特征金字塔,并 在该金字塔的每个级别上都独立进行预测
6

通过这种方法构建的网络内金字塔特征层级能够代替先前的特征金字塔,不仅 丰富了所有层的语义信息,而且也实现了在不牺牲表达能力、降低速度或增大内存的情况下,从单一输入快速构建金字塔结构的目标。

实验结果表示,仅基于FPN的Faster R-CNN检测器,在COCO检测基准上达到了最先进的单模型结果,此外,FPN 可以在所有尺度下进行端到端训练,并在训练/测试时一致使用,而使用图像金字塔时在内存方面是不可行的。

二、FPN模型

本文中的特征金字塔是指 基于 (具有从低到高的语义信息的) 卷积网络的金字塔特征层级构建出的一个始终具有高级语义信息的特征金字塔。如何能够让网络的每一层都具有高级特征呢?最直观的想法就是将低层分辨率高但语义信息弱的特征图和高层分辨率低但语义信息强的特征图组合在一起,FPN就是基于这一想法构建得到。

7

  • FPN的输入——任意大小的单尺度图像。
  • FPN的输出——以全卷积的形式在多个层级上生成的一定尺寸的特征图。
  • 上图所示的FPN整体结构由三部分组成——bottom-up pathway、top-down pathway、lateral connection

1 bottom-up pathway

FPN 对于这一通道没有进行特殊的改进或调整,保持了作为主干卷积网络的前馈计算部分 (也就是FPN结构图中最左侧区域)。它能够产生一个包含不同尺度特征图的特征层级,每一级采用step为2的降采样 (步长即输入尺寸和特征图尺寸的比例,以2倍递减)。

在一些网络中通常有一些层会输出相同大小的特征图,这些层被认为处在同一个 阶段(stage),比如 ResNet 中的卷积层 conv2_x、conv3_x 等:
8

在 FPN 网络中,每个阶段对应了金字塔中的一个级别,选取每个级别中最后一个卷积层的输出构成参考特征图集,经过语义丰富 (也就是后期的融合) 构建出特征金字塔。这种选择是很自然的,因为理论上每个阶段的最深层应该具有该阶段最强的语义特征。

  • ResNet 为例,输入尺寸为 224*224,对于阶段 conv2, conv3, conv4, conv5,选用每个阶段中最后一个残差块的输出特征图用于横向连接,简记为 {C2, C3, C4, C5},这些特征图的大小分别为 [56x56, 28x28, 14x14, 7x7] (对应了前面提到的特征图间的步长比例为2)。
  • 文中给出未使用 conv1 原因是其内存占用过大。

2 top-down pathway & lateral connection

2.1 外部结构
  • FPN结构图的右侧金字塔部分即 top-down 通道,作用是对低分辨率的特征图通过2x上采样来构建具有高分辨率的特征图
  • 中间区域是不同层之间的 横向连接,作用是对上采样后的特征图进行特征增强,补充其中缺失的部分高级语义信息。每一个横向连接会合并来自 bottom-up 和 top-down 通道中具有相同尺寸的特征图。
  • 那么 bottom-up 通道中的特征图语义信息比较弱,为什么还要使用其进行合并呢?原因在于想要获得精确的检测结果,除语义特征外还需要目标的位置信息,bottom-up 通道中由于子采样次数少,目标的位置信息更为准确
  • 此外,由于金字塔中所有的层都是共享分类器/回归器的,所以 固定了所有 top-down 额外层中特征图的通道数:d=256,也就是所有输出特征图的通道数都是相同的。
  • 同时在 top-down 额外层中 没有添加任何的非线性元素,影响不大。
2.2 特征融合
  1. 对 bottom-up 中的最后一个特征图 C5 执行 1x1 conv 以获得 top-down 中分辨率最低的特征图开始,直到获得分辨率最优的特征图;
  2. 对于 top-down 通道中低分辨率的特征图 采用最近邻上采样扩大2x
  3. 将上述上采样后的特征图通过 逐元素加法 与 bottom-up 中具有相同尺寸的特征图合并在一起,其中 bottom-up 的特征图在经过横向连接时需要进行一次 1x1 conv,目的是消除前后两者之间的通道不一致性
  4. 对合并后的特征图进行一次 3x3 conv 生成最终的预测用特征图 {P2, P3, P4, P5} 分别对应先前的 {C2, C3, C4, C5}(对应下图中的 {M2, M3, M4, M5} ),这里使用 3x3 conv 的目的是消除上采样带来的叠加效应

0
以上就是FPN 的构建成分,超级简单,因为作者在文中提到 Simplicity is central to our design,简单是设计的核心,尽管使用更为复杂的残差块能获得稍微好些的结果,但由于 FPN 的本质不在于此,故不需要采用复杂的结构。

2.3 对小目标友好

通过这一部分我们其实很容易发现,FPN 能够提升对小目标的检测效果是有理由的:不仅利用了 top-down 通道中传递的小目标的上下文信息,同时还为小目标增大了特征图的分辨率。
9

三、FPN的应用

作为在深层卷积网络中构建特征金字塔的通用解决方式,FPN 可以与很多先进的目标检测模型组合在一起。比如 R-CNN、RPN、Fast R-CNN等。

1 RPN+FPN

在 Fast R-CNN 中提出的 RPN 是一种基于滑动窗口的类别未知的目标检测器。原始的 RPN 是在一个单一尺度的卷积特征图上,基于密集的 3 × 3 3\times3 3×3 滑动窗口构建了一个小型子网络(下图左侧),用于执行分类任务(目标/非目标的二分类)和边界框回归任务。实现方式是在滑动窗口产生的锚框上执行一个 3 × 3 × 256 3\times3\times256 3×3×256 的卷积,然后通过两个相同的 1 × 1 × 256 1\times1\times256 1×1×256 的卷积完成分类任务和回归任务。这一部分通常被称为 head。其中分类任务的类别判定标准与回归任务的目标都是相对于一组锚框(下图右侧)定义的,这组锚框是预定义的,具有不同的尺度和宽高比以覆盖不同形状的目标。

10
我们可以通过用 FPN 替换 RPN 中的单一尺度特征图来调整 RPN。大致流程如下:

  • 将具有相同结构的 head(3x3 conv & two 1x1 convs) 附加至特征金字塔的每一层;
  • 由于 head 在特征金字塔的每一层上的所有位置都是密集滑动的,所以不必为特定层级设置多种尺度的锚框,一个层级上只需要设置一个尺度的锚框就可以。
  • 以 ResNet50 为主干网络,将锚框定义为在 [P2,P3,P4,P5,P6] 上分别具有 [32x32,64x64,128x128,256x256,512x512] 个像素的区域,同时在每一层上使用三种宽高比 [2:1, 1:1, 1:2](也就是一个位置对应三个锚框)。因此在整个特征金字塔上共有15种锚框。
  • 对于锚框的训练标签是通过与真实框的IOU交并比确定的:
    • 正标签:如果该锚框与给定的真实框有最高的IOU交并比或与其他任意真实框的交并比>0.7;
    • 负标签:与所有真实框的交并比<0.3的锚框。

head 的参数在金字塔的所有层上都共享时,与参数不共享的情况下性能表现是近似相同的,这表明 金字塔的所有层共享相似的语义信息。这就类似于使用特征化的图像金字塔,实现了每一层都具有强语义信息。之所以强调要保证各层级输出的通道数必须一致,是因为这样才能使用相同的参数,达到共享的目的,从而各层级可共享分类网络(分类器+边框回归器)。

通过下面这张图能更清晰的看到 FPN 的工作原理。
11

1.1 实现细节与结果
  • 按照 COCO 数据集,设置了五个评估指标 A R 100 , A R 1 k , A R s 1 k , A R m 1 k , A R l 1 k AR^{100}, {AR^{1k}}, {AR^{1k}_s}, {AR^{1k}_m}, {AR^{1k}_l} AR100,AR1k,ARs1k,ARm1k,ARl1k,前两个指标代表每幅图像有100或1000个proposals,后面三个指标是分别针对尺度为 small, medium, large 的目标。
  • 调整输入图像的大小使得较短边为 800 pixels,采用 synchronized(同步) SGD 法在 8个GPU 上进行训练,其中每个GPU上的每一个 mini-batch=2,每幅图像中包括 256个anchors。设置 weight decay=0.0001,momentum=0.9,lr=0.02(30k mini-batches) & 0.002(next 10k)
  • 整个训练时长约8小时。

0
为实现和原始 RPN 的公平对比,实验中设置了两个 baseline,即分别使用主干网络 ResNet-50 中的单一尺度特征图 C 4 ,   C 5 C_4,\ C_5 C4, C5,并保证超参数的一致性(即同样设置五个尺度的锚 [32*32, 64*64, 128*128, 256*256, 512*512])。
0

  • ( a ) (a) (a) ( b ) (b) (b) 相比,表明使用单个更高级别的特征图是不够的,这是因为在低分辨率和强语义信息之间存在权衡, C 5 C_5 C5 虽具有更强的语义特征,但其分辨率过低,位置信息相对更弱。
  • ( c ) (c) (c) 使用 FPN 后的 A R 1 k AR^{1k} AR1k 增加了8%,而 A R s 1 k AR^{1k}_s ARs1k 增加了12.9%,这表明 FPN 的金字塔特征表达形式极大地提高了 RPN 对目标尺度变化的鲁棒性。
1.2 消融实验

消融实验的目的是为了说明 FPN 的三个组件 lateral connection、top-down path、pyramid representation 的重要性。

0

  • 模型 ( d ) (d) (d) 中未设置 top-down 通道,直接将1x1的横向连接和3x3的卷积附加在bottom-up金字塔之后,模拟了重用金字塔特征层次结构的效果。其评估结果与 ( a ) (a) (a) 效果相当,但与 ( c ) (c) (c) 相差较大,推测是由于 bottom-up的特征金字塔每一层的语义信息差距较大,尤其是对于较深的ResNets。文中提到了尝试不共享预测部分,但得到的反而是性能下降,表明该问题没办法通过特定于层的预测部分(heads)解决。
    0

  • 模型 ( e ) (e) (e) 中未设置横向连接,只有上采样通道 top-down path。从实验结果可以看出,评估效果并不好。原因在于尽管 top-down 的特征金字塔具有较强的语义特征和高分辨率,但这些特征的位置信息并不精确,因为它们经过了多次上采样和下采样,而 更精确的位置信息可以直接从bottom-up通道中的同级经过横向连接传递至top-down通道。表明了使用横向连接的重要性。
    0

  • 模型 ( f ) (f) (f) 中未利用金字塔特征表示结构,仅将预测部分附加在了具有最高分辨率和最强语义特征的特征图 P 2 P_2 P2 之后,类似于 ( a ) (a) (a) ( b ) (b) (b),需要将 anchors 分配到该特征图中。尽管该模型要优于 ( a ) (a) (a) ( b ) (b) (b) 但却依然不如 FPN,这是因为 RPN 是具有固定窗口大小( 3 × 3 3\times3 3×3) 的滑动窗口检测器,在所有金字塔的层级上进行滑动扫描可以增加其对尺度方差的鲁棒性,提升检测结果。此外,单独使用 P 2 P_2 P2 会导致更多的锚点(750k),这是因为它的空间分辨率很大。这个结果表明,大量的锚本身不足以提高准确性
    0

2 Fast R-CNN+FPN

Fast R-CNN 常用于单尺度特征图的检测,因此如果将 FPN 应用在 Fast R-CNN 上,则需要将不同尺度的 RoI 分配到特征金字塔的不同层级上。那么如何进行分配呢?(关于 RoI Pooling 的解释可查看这个 [3] Region of interest pooling expalined)

对于输入图像中宽为 w w w,高为 h h h 的 RoI,通过
k = ⌊ k 0 + l o g 2 ( w h / 224 ) ⌋ k = \lfloor{k_0+log_2({\sqrt{wh}/224})}\rfloor k=k0+log2(wh /224) 进行计算可知,应将 RoI 分配至特征金字塔的第 P k P_k Pk 级别。其中:

  • 224 224 224 源于规范 ImageNet 的预训练大小;
  • k 0 k_0 k0 指的是大小为 w ∗ h = = 22 4 2 w*h==224^2 wh==2242 的 RoI 应映射到的层级,考虑到基于 ResNet 的 Faster R-CNN 以 C 4 C_4 C4 作为单尺度特征图,此处设置 k 0 = 4 k_0 = 4 k0=4

基于 ResNet-101 的 Faster R-CNN 结构图:
0

我对这一分配策略的理解是尺度越大的 RoI,对应着图像中较大的目标,也就对应了应当映射至特征金字塔中处于高层的特征图(比如对于初始RoI大小为 224 × 224 224\times224 224×224,利用上述公式可算得 k = 4 k=4 k=4,也就对应了金字塔中的 P 4 P_4 P4 层级);随着 RoI 尺度的减小,其应当映射到的特征图在特征金字塔中的层级也应该减小(比如对于RoI尺度减半后,大小为 112 × 112 112\times112 112×112,利用上述公式可算得 k = 3 k=3 k=3,也就对应了金字塔中的 P 3 P_3 P3 层级)。

那么如何将FPN 应用在 Fast R-CNN 上呢?论文中也给出了具体思路:

  • 在 Fast R-CNN 中,预测器(heads)是特定于类的分类器和边框回归器,因此应该将预测器应用于 FPN 中所有层级的所有 RoI 上。这里需要注意的是,所有预测器都是共享参数的,也就是所有层级共享同一预测器。
  • 对每一层级的特征图通过 RoI Pooling 提取 7 × 7 7\times7 7×7 的特征;
  • 由于 FPN 中 c o n v 5 conv5 conv5 也作为了特征金字塔结构的一部分,为与原模型中存在的全连接层作用保持一致,采取了在预测器(分类+回归)前增加两个 1024 − d 1024-d 1024d 的轻量级全连接层(后跟ReLu激活函数),这种方法与原来相比参数更少且速度更快。(由于ResNet中没有可用的预训练的全连接层,因此这些层都是随机初始化的)。

0

2.1 实现细节与结果
  • 按照 COCO 和 PASCAL(IoU阈值为0.5) ,设置了五个评估指标 A P , A P s , A P m , A P l , A P @ 0.5 AP, {AP_s}, {AP_m}, {AP_l}, AP@0.5 AP,APs,APm,APl,AP@0.5
  • 调整输入图像的大小使得较短边为 800 pixels,采用 synchronized(同步) SGD 法在 8个GPU 上进行训练,其中每个GPU上的每一个 mini-batch=2,每幅图像中包括 512个RoIs。设置 weight decay=0.0001,momentum=0.9,lr=0.02(60k mini-batches) & 0.002(next 20k)。每张图像使用 2000 个 RoI 进行训练,1000 个用于测试。 在 COCO 数据集上使用 FPN 训练 Fast R-CNN 大约需要 10 个小时。
  • 为研究 FPN 对 region-based object detectors 的作用,消融实验在 a fixed set of proposals 上进行,由于 FPN+RPN 对检测小目标的性能较好,因此选用了上一部分中 FPN+RPN 得到的proposals。

0

  • 模型 ( a ) (a) (a) 采用了单尺度特征图 C 4 C_4 C4 以及输出为 14 × 14 14\times14 14×14 的RoI池化并将整个 conv5 层作为隐藏层附加在 heads 之前。
  • 模型 ( b ) (b) (b) 采用了单尺度特征图 C 5 C_5 C5和RoI池化,但使用了一个具有 2-fc layers 的 MLP head。根据实验结果可以看出,该变体的效果并未得到提升。
  • 模型 ( c ) (c) (c) 为 FPN+Fast R-CNN,与模型 ( a ) (a) (a) 相比, A P + 2.0 % , A P s + 2.1 % AP + 2.0\%, AP_s+2.1\% AP+2.0%,APs+2.1%,与模型 ( b ) (b) (b) 相比, A P + 4.0 % , A P s + 5.1 % AP + 4.0\%, AP_s+5.1\% AP+4.0%,APs+5.1%。这表明 对于 region-based object detectors,特征金字塔要优于单尺度特征图
2.2 消融实验

0

  • 模型 ( d ) (d) (d) 中去掉了 top-down path,评估结果并不理想( A P = 24.9 % AP=24.9\% AP=24.9%);
  • 模型 ( e ) (e) (e) 中去掉了横向连接,可以看出效果也不太好( A P = 31.3 % AP=31.3\% AP=31.3%),但比模型 ( d ) (d) (d) 要稍好一些。由此来看,top-down 的缺少会使得精度显著下降(33.9%–>24.9%),这表明 Fast R-CNN 受到在具有高分辨率的特征图上使用低级特征的影响比较大。
  • 模型 ( f ) (f) (f) 中仅采用了金字塔中具有最高分辨率和最强语义特征的 P 2 P_2 P2,其效果( 33.4 % 33.4\% 33.4%)仍低于使用特征金字塔的模型 ( c ) (c) (c)。文中提出可能是因为 RoI pooling 是一种类似扭曲的操作,对区域的尺度不太敏感。 尽管该变体具有良好的准确性,但它是基于 { P k } \{P_k\} {Pk} 的 RPN proposals进行实验的,因此本质来说已经从金字塔表示中获得了优势。总之,特征金字塔的结构对于提升检测准确性是不可缺少的。
    0

3 Faster R-CNN+FPN

此处省略一万字…

4 DeepMask / Mask R-CNN+FPN

类似 DeepMask / Mask R-CNN,FPN 也是一个优良的图像分割提取掩码。下图中,应用 5 x 5 5x5 5x5 的滑窗于特征映射,以生成 14 x 14 14x14 14x14 的输出。之后,合并不同尺度的掩码以形成最终的掩码预测。

对这两种应用有兴趣的小伙伴可以自行查阅✌。
0

总结

FPN自身并不是目标检测器,而是一个配合目标检测器使用的特征检测器。它可以有效地将不同尺度下的特征进行融合,构建一个特征金字塔,并实现该金字塔中的每一层都是具有较强语义信息和精确位置信息共存的特征图,改进了对小目标的检测,并在一定程度上解决了多尺度目标检测的问题。

参考文献

[1] 【论文笔记】FPN —— 特征金字塔
[2] Feature Pyramid Networks for Object Detection 论文笔记
[3] Region of interest pooling expalined
[4] FPN(特征金字塔网络)的直觉、架构和表现简要介绍

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值