第七章:YOLO v2网络详解

(目标检测篇)系列文章目录


第一章:R-CNN网络详解

第二章:Fast R-CNN网络详解

第三章:Faster R-CNN网络详解

第四章:SSD网络详解

第五章:Mask R-CNN网络详解

第六章:YOLO v1网络详解

第七章:YOLO v2网络详解

第八章:YOLO v3网络详解

文章目录


技术干货集锦

0.摘要

我们介绍了YOLO9000,这是一种最先进的实时目标检测系统,可以检测超过9000个对象类别。首先,我们对YOLO检测方法进行了各种改进,包括新颖的方法和从先前工作中借鉴的方法。改进后的模型YOLOv2在PASCAL VOC和COCO等标准检测任务上达到了最先进的水平。通过一种新颖的多尺度训练方法,相同的YOLOv2模型可以以不同的尺寸运行,提供了速度和准确度之间的简单权衡。在67 FPS的情况下,YOLOv2在VOC 2007上获得76.8 mAP。在40 FPS的情况下,YOLOv2获得78.6 mAP,优于Faster R CNN with ResNet和SSD等最先进的方法,同时运行速度更快。最后,我们提出了一种同时进行目标检测和分类训练的方法。使用这种方法,我们同时在COCO检测数据集和ImageNet分类数据集上训练YOLO9000。我们的联合训练使得YOLO9000能够预测没有标注检测数据的对象类别。我们在ImageNet检测任务上验证了我们的方法。尽管只有44个类别有检测数据,但YOLO9000在ImageNet检测验证集上获得了19.7 mAP。在COCO中没有的156个类别中,YOLO9000获得了16.0 mAP。但是YOLO可以检测超过200个类别,它可以预测超过9000个不同的对象类别,并且仍然能够实时运行。

1.前言

 (Figure 1: YOLO9000. YOLO9000可以实时检测各种不同的物体类别。)

通用目标检测应该快速、准确,并能够识别各种不同的对象。自从神经网络的引入,检测框架变得越来越快速和准确。然而,大多数检测方法仍然局限于一小部分对象。当前的目标检测数据集与分类和标记等其他任务的数据集相比较有限。最常见的检测数据集包含数千到数十万张图像,具有几十到几百个标签[3][10][2]。而分类数据集则包含数百万张图像,并有数万到数十万个类别[20][2]。我们希望目标检测能够达到与对象分类相同的级别。然而,为了进行检测而标注图像的成本要比为分类或标记而标注图像的成本高得多(标记通常是用户免费提供的)。因此,在不久的将来,我们不太可能看到与分类数据集规模相同的检测数据集。我们提出了一种新的方法来利用我们已经拥有的大量分类数据,并将其用于扩展当前的检测系统的范围。我们的方法使用了一种层次化的对象分类视图,使我们能够将不同的数据集结合在一起。我们还提出了一种联合训练算法,可以在检测和分类数据上训练目标检测器。我们的方法利用标记的检测图像来学习精确定位对象,同时利用分类图像来增加其词汇量和鲁棒性。使用这种方法,我们训练了YOLO9000,一个实时的目标检测器,可以检测超过9000个不同的对象类别。首先,我们改进了基础的YOLO检测系统,得到了YOLOv2,一个最先进的实时检测器。然后,我们使用我们的数据集组合方法和联合训练算法,从ImageNet的9000多个类别以及COCO的检测数据中训练了一个模型。我们所有的代码和预训练模型都可以在http://pjreddie.com/yolo9000/上在线获取。

2.正文分析

2.更好

相对于最先进的检测系统,更好的YOLO存在多种缺点。与Fast R-CNN相比,YOLO的误差分析显示,YOLO会产生大量的定位错误。此外,与基于区域提议的方法相比,YOLO的召回率相对较低。因此,我们主要集中在提高召回率和定位准确性的同时,保持分类准确性。计算机视觉通常趋向于更大、更深的网络[6][18][17]。更好的性能通常依赖于训练更大的网络或将多个模型集成在一起。然而,对于YOLOv2,我们希望得到一个更准确的检测器,同时保持速度。我们不是通过扩展网络规模来实现,而是简化网络结构,使表示更易学习。我们汇集了过去的工作中的各种想法和我们自己的新颖概念,以改进YOLO的性能。结果的摘要可以在表2中找到。

批标准化。

批标准化在收敛性方面带来了显著的改进,同时消除了其他形式的正则化的需要[7]。通过在YOLO的所有卷积层上添加批标准化,我们在mAP上获得了超过2%的改进。批标准化还有助于对模型进行正则化。通过批标准化,我们可以在不过拟合的情况下从模型中移除dropout。

高分辨率分类器。

所有最先进的检测方法都使用在ImageNet上预训练的分类器[16]。从AlexNet开始,大多数分类器在小于256×256的输入图像上操作[8]。原始的YOLO在224×224的分辨率下训练分类器网络,并将分辨率增加到448用于检测。这意味着网络必须同时切换到学习目标检测并适应新的输入分辨率。对于YOLOv2,我们首先在ImageNet上的448×448的全分辨率下对分类网络进行微调,持续10个epoch。这给了网络时间来调整其滤波器,以在更高分辨率的输入上更好地工作。然后,我们在检测上对得到的网络进行微调。这个高分辨率分类网络使我们的mAP增加了近4%。

具有锚框的卷积。

YOLO使用完全连接的层直接预测边界框的坐标,这些层位于卷积特征提取器之上。而不是直接预测坐标,Faster R-CNN使用手动选择的先验框来预测边界框[15]。使用仅卷积层,Faster R-CNN中的区域建议网络(RPN)预测锚框的偏移和置信度。由于预测层是卷积层,RPN在特征图的每个位置预测这些偏移量。预测偏移而不是坐标简化了问题,并使网络更容易学习。我们从YOLO中移除全连接层,并使用锚框来预测边界框。首先,我们去掉一个池化层,以使网络的卷积层的输出具有更高的分辨率。我们还将网络缩小到操作416×416的输入图像,而不是448×448。我们这样做是因为我们希望在特征图中有一个奇数数量的位置,这样就可以有一个位于中心的单个位置来预测这些对象,而不是四个相邻的位置。对象,尤其是大对象,倾向于占据图像的中心,因此在中心位置有一个单一位置来预测这些对象是很好的,而不是四个附近的位置。YOLO的卷积层通过32倍的下采样图像,因此通过使用416的输入图像,我们得到一个13×13的输出特征图。当我们转向锚框时,我们还将类别预测机制与空间位置分离,并为每个锚框预测类别和物体性。继续使用YOLO,物体性预测仍然预测了地面真实值与提议框的IOU,类别预测预测了在有对象的情况下该类别的条件概率。使用锚框,我们的准确度略有下降。YOLO每个图像只预测98个框,但使用锚框,我们的模型预测超过一千个。如果没有锚框,我们的中间模型的mAP为69.5%,召回率为81%。使用锚框,我们的模型的mAP为69.2%,召回率为88%。尽管mAP下降了,但召回率的增加意味着我们的模型有更多的改进空间。

维度聚类。

在使用YOLO时,使用锚框遇到了两个问题。首先,盒子的尺寸是手动选择的。网络可以学习适当调整盒子,但如果我们为网络选择更好的先验,可以使网络更容易学习预测良好的检测结果。我们不再手动选择先验,而是在训练集边界框上运行k-means聚类算法,以自动找到好的先验。如果我们使用标准的k-means算法和欧氏距离,较大的盒子会产生比较小的盒子更大的误差。然而,我们真正想要的是导致良好IOU分数的先验,这与盒子的大小无关。因此,我们使用以下距离度量:d(box;centroid)=1−IOU(box;centroid)我们对不同的k值运行k-means算法,并绘制与最接近质心的平均IOU,如图2所示。我们选择k = 5作为模型复杂性和高召回率之间的良好平衡。聚类质心与手动选择的锚框明显不同。短而宽的盒子较少,而高而窄的盒子较多。我们将平均IOU与我们的聚类策略和手动选择的锚框的最接近先验进行了比较,见表1。只有5个先验时,质心的表现与9个锚框相似,平均IOU为61.0,而锚框的平均IOU为60.9。如果我们使用9个质心,平均IOU会显著提高。这表明使用k-means生成我们的边界框可以使模型具有更好的表示,并使学习任务更容易。

 (Figure 2: 在VOC和COCO数据集上进行边界框尺寸的聚类。我们对边界框的尺寸进行k-means聚类,以获得对我们模型的良好先验知识。左侧的图像显示了我们在不同k值选择下得到的平均IOU。我们发现k=5在召回率与模型复杂度之间达到了良好的平衡。右侧的图像显示了VOC和COCO数据集的相对中心点。两组先验都偏向于较瘦、较高的边界框,而COCO的尺寸变化比VOC更大。)

 (Table 1: VOC 2007数据集上边界框与最近的先验之间的平均IOU。使用不同的生成方法,计算VOC 2007数据集上物体与其最近的未修改先验之间的平均IOU。聚类方法比手动选择的先验有更好的效果)

细粒度特征。

这个修改后的YOLO在一个13×13的特征图上预测检测结果。虽然这对于大物体来说足够了,但对于定位较小物体来说,使用更细粒度的特征可能会有帮助。Faster R-CNN和SSD都在网络的不同特征图上运行它们的建议网络,以获得一系列的分辨率。我们采取了不同的方法,只需添加一个直通层,将26×26分辨率先前层的特征传递过来。直通层通过将高分辨率特征与低分辨率特征进行堆叠连接,而不是通过空间位置进行连接,类似于ResNet中的身份映射。这将26×26×512的特征图转换为13×13×2048的特征图,可以与原始特征进行连接。我们的检测器在这个扩展的特征图上运行,以便可以访问细粒度特征。这使性能增加了1%。

多尺度训练。

原始的YOLO使用448×448的输入分辨率。随着锚框的添加,我们将分辨率改为416×416。然而,由于我们的模型只使用卷积和池化层,因此可以实时调整大小。我们希望YOLOv2能够适应不同尺寸的图像,因此将这一点训练到模型中。我们不固定输入图像的尺寸,而是每隔几次迭代改变网络。每10个批次,我们的网络随机选择一个新的图像尺寸。由于我们的模型以32的倍数下采样,我们选择以下32的倍数:f320;352;:::;608g。因此,最小的选项是320×320,最大的是608×608。我们将网络调整为该尺寸并继续训练。

 (Figure 3: 使用尺寸先验和位置预测的边界框。我们将边界框的宽度和高度预测为相对于聚类中心的偏移量。我们使用sigmoid函数预测边界框的中心坐标,相对于滤波器应用的位置)

这种训练方式迫使网络学习在各种输入尺寸下进行良好的预测。这意味着同一网络可以在不同的分辨率下进行检测预测。网络在较小尺寸下运行速度更快,因此YOLOv2在速度和准确性之间提供了一个简单的权衡。在低分辨率下,YOLOv2作为一个廉价但相当准确的检测器运行。在288×288的分辨率下,它的帧率超过90FPS,mAP几乎与Fast R-CNN一样好。这使它非常适合较小的GPU、高帧率视频或多个视频流。在高分辨率下,YOLOv2是一个最先进的检测器,在VOC 2007数据集上的mAP达到了78.6,同时仍保持实时速度。在VOC 2007数据集上,YOLOv2与其他框架的比较请参见表3。

进一步的实验

我们在VOC 2012数据集上对YOLOv2进行了检测训练,表4显示了YOLOv2与其他最先进的检测系统的性能对比。YOLOv2达到了73.4的mAP,同时运行速度远远快于竞争方法。我们还在COCO数据集上进行了训练,并在表5中与其他方法进行了比较。在VOC指标(IOU=0.5)上,YOLOv2的mAP为44.0,与SSD和Faster R-CNN相当。

 (Table 3: PASCAL VOC 2007上的检测框架。YOLOv2比之前的检测方法更快、更准确。它还可以在不同的分辨率下运行,以便在速度和准确性之间进行简单的权衡。每个YOLOv2条目实际上是相同的训练模型,具有相同的权重,只是在不同的尺寸下进行评估。所有的计时信息都是基于Geforce GTX Titan X(原版,不是Pascal模型))

3.更快

我们希望检测准确性高,但也希望速度快。大多数应用于检测的领域,如机器人或自动驾驶汽车,都依赖于低延迟的预测。为了最大化性能,我们从头开始设计了快速的YOLOv2。大多数检测框架都依赖于VGG-16作为基础特征提取器[17]。VGG-16是一个功能强大、准确的分类网络,但过于复杂。在224×224分辨率下,VGG-16的卷积层需要进行306.9亿次浮点运算才能对一张图像进行单次处理。YOLO框架使用了基于Googlenet架构[19]的自定义网络。相比VGG-16,这个网络更快,一次正向传递只需要85.2亿次运算。然而,它的准确性略低于VGG-16。在224×224的单次裁剪情况下,YOLO的自定义模型在ImageNet上的top-5准确率为88.0%,而VGG-16为90.0%。

Darknet-19.

我们提出了一个新的分类模型,作为YOLOv2的基础。我们的模型基于以前在网络设计上的工作以及领域中的常识。与VGG模型类似,我们主要使用3×3的滤波器,并在每个池化步骤后将通道数加倍[17]。在网络中的网络(NIN)的工作基础上,我们使用全局平均池化进行预测,并使用1×1的滤波器在3×3卷积之间压缩特征表示[9]。我们使用批量归一化来稳定训练,加速收敛,并对模型进行正则化[7]。我们的最终模型称为Darknet-19,它有19个卷积层和5个最大池化层。详细描述请参见表6。Darknet-19仅需要55.8亿次运算来处理一张图像,但在ImageNet上实现了72.9%的top-1准确率和91.2%的top-5准确率。

 (表2:从YOLO到YOLOv2的路径。大多数列出的设计决策都导致mAP显著增加。两个例外是切换到具有anchor boxes的完全卷积网络和使用新的网络。切换到anchor box风格的方法增加了召回率,而不改变mAP,而使用新的网络减少了33%的计算量)

 (表4:PASCAL VOC2012测试检测结果。YOLOv2的性能与Faster R-CNN与ResNet和SSD512等最先进的检测器相当,并且速度快2-10倍)

分类训练。

我们使用标准的ImageNet 1000类分类数据集,在Darknet神经网络框架[13]下进行了160个周期的训练,使用随机梯度下降法,初始学习率为0.1,多项式衰减率为4,权重衰减为0.0005,动量为0.9。在训练过程中,我们使用了标准的数据增强技巧,包括随机裁剪、旋转以及色调、饱和度和曝光的变化。如上所述,在对224×224大小的图像进行初始训练后,我们在更大的尺寸448上对网络进行微调。对于这次微调,我们使用上述参数进行训练,但只进行10个周期,并从学习率10^-3开始。在这种更高的分辨率下,我们的网络达到了76.5%的top-1准确率和93.3%的top-5准确率。

检测训练。

我们通过删除最后一个卷积层,并添加三个3×3的卷积层,每个卷积层都有1024个过滤器,然后再添加一个最后的1×1卷积层,该卷积层的输出数量与检测所需的输出数量相匹配。对于VOC数据集,我们每个框预测5个具有5个坐标的框和每个框的20个类别,因此需要125个过滤器。我们还添加了一个从最后的3×3×512层到倒数第二个卷积层的直通层,以便我们的模型可以使用细粒度的特征。我们以学习率10^-3开始训练网络,将其在60和90个周期时除以10。我们使用权重衰减0.0005和动量0.9。我们使用与YOLO和SSD类似的数据增强方法,包括随机裁剪、颜色变换等。我们在COCO和VOC数据集上使用相同的训练策略。

 (表5:在COCO test-dev2015上的结果。表格修改自[11]。)

 4.更强大的方法:

我们提出了一种联合训练分类和检测数据的机制。我们的方法使用用于检测的图像来学习检测特定的信息,如边界框坐标预测和物体性质,以及如何对常见物体进行分类。它还使用只有类别标签的图像来扩展其可以检测的类别数量。在训练过程中,我们混合使用来自检测和分类数据集的图像。当我们的网络看到一个标记为检测的图像时,我们可以基于完整的YOLOv2损失函数进行反向传播。当它看到一个分类图像时,我们只从体系结构的分类特定部分进行损失反向传播。

这种方法面临一些挑战。检测数据集只有常见物体和普通标签,如“狗”或“船”。而分类数据集的标签范围更广泛和更深入。ImageNet有100多个品种的狗,包括“Norfolk terrier”、“Yorkshire terrier”和“Bedlington terrier”。如果我们想在这两个数据集上进行训练,我们需要一种合理的方法来合并这些标签。大多数分类方法使用跨所有可能类别的softmax层来计算最终的概率分布。使用softmax假设类别是相互排斥的。这在组合数据集时会出现问题,例如,您不希望使用这个模型来组合ImageNet和COCO,因为“Norfolk terrier”和“dog”这两个类别不是相互排斥的。相反,我们可以使用多标签模型来组合数据集,这不假设相互排斥。这种方法忽视了我们对数据的已知结构,例如,所有的COCO类别是相互排斥的。

层次分类。

ImageNet的标签是从WordNet中提取的,这是一个用于结构化概念及其关系的语言数据库[12]。在WordNet中,“Norfolk terrier”和“Yorkshire terrier”都是“terrier”的子类,而“terrier”又是“hunting dog”的一种,而“hunting dog”是“dog”的一种,而“dog”则是“canine”的一种,等等。大多数分类方法假设标签具有平坦的结构,然而在组合数据集时,结构正是我们所需要的。WordNet被构建为一个有向图,而不是树形结构,因为语言是复杂的。例如,“dog”既是“canine”的一种,也是“domestic animal”的一种,它们都是WordNet中的同义词集合。我们简化问题,通过从ImageNet的概念中构建层次树来解决。为了构建这棵树,我们检查ImageNet中的视觉名词,并查看它们在WordNet图中到根节点的路径,本例中为“physical object”。许多同义词集合只有一条路径通过图形,所以我们首先将所有这些路径添加到我们的树中。然后,我们迭代地检查剩下的概念,并添加尽可能少地扩展树的路径。因此,如果一个概念有两条路径到根节点,一条路径需要添加三个边到树中,而另一条路径只需要添加一个边,我们选择较短的路径。

("Terrier"的翻译是"猎犬"。"Canine"的翻译是"犬类"。"domestic animal"的中文翻译是"家畜"。)

最终结果是WordTree,一个具有层次结构的视觉概念模型。使用WordTree进行分类时,我们在每个节点上预测条件概率,即给定该同义词集合,每个子类的概率。例如,在“terrier”节点上,我们预测:P r(Norfolk terrierjterrier)P r(Yorkshire terrierjterrier)P r(Bedlington terrierjterrier):::如果我们想计算特定节点的绝对概率,我们只需沿着树的路径到达根节点,并乘以条件概率。因此,如果我们想知道一张图片是否是诺福克梗,我们计算:P r(Norfolk terrier)=P r(Norfolk terrierjterrier)∗P r(terrierjhunting dog)∗:::∗∗P r(mammaljP r(animal)∗P r(animaljphysical object)为了验证这种方法,我们使用1000类ImageNet构建了Darknet-19模型的WordTree。为了构建WordTree1k,我们添加了所有中间节点,将标签空间从1000扩展到1369。在训练过程中,我们将真实标签向上传播到树中,这样如果一张图片被标记为“Norfolk terrier”,它也会被标记为“dog”和“mammal”等。为了计算条件概率,我们的模型预测了一个包含1369个值的向量,并计算了同一概念的所有同义词集合的softmax函数值,参见图5。使用与之前相同的训练参数,我们的层次Darknet-19模型实现了71:9%的top-1准确率和90:4%的top-5准确率。尽管增加了369个额外的概念,并让我们的网络预测树结构,但我们的准确率只有轻微下降。以这种方式进行分类还有一些好处。对于新的或未知的对象类别,性能会逐渐降低。例如,如果网络看到一张狗的图片,但不确定是什么类型的狗,它仍然会高度自信地预测“dog”,但在子类中的置信度较低。

这个公式也适用于目标检测。现在,我们不再假设每张图片都包含一个对象,而是使用YOLOv2的物体性预测器来给出P r(physical object)的值。检测器预测一个边界框和一棵概率树。我们沿着树向下遍历,每次在分裂处选择最高置信度的路径,直到达到某个阈值,然后我们预测该对象类别。

 (图5:在ImageNet和WordTree上的预测。大多数ImageNet模型使用一个大的softmax来预测概率分布。使用WordTree,我们在共同上下位词上执行多个softmax操作。)

使用WordTree

来合理地将多个数据集组合在一起。我们只需将数据集中的类别映射到树中的同义词集合。图6展示了使用WordTree将ImageNet和COCO的标签组合在一起的示例。WordNet非常多样化,所以我们可以将这种技术应用于大多数数据集。

 图6:使用WordTree层次结构组合数据集。使用WordNet概念图,我们构建了一个视觉概念的层次树。然后,我们可以通过将数据集中的类别映射到树中的同义词集来将数据集合并在一起。这是为了说明目的而简化的WordTree视图。

联合分类和检测。

现在我们可以使用WordTree来组合数据集,我们可以在分类和检测上训练我们的联合模型。我们想要训练一个非常大规模的检测器,因此我们使用COCO检测数据集和完整的ImageNet发布中的前9000个类别创建我们的组合数据集。为了评估我们的方法,我们还添加了ImageNet检测挑战中尚未包含的任何类别。该数据集对应的WordTree有9418个类别。由于ImageNet是一个更大的数据集,所以我们通过过采样COCO来平衡数据集,使ImageNet只比COCO大4倍。使用这个数据集,我们训练YOLO9000。我们使用基本的YOLOv2架构,但只使用3个先验框而不是5个,以限制输出尺寸。当我们的网络看到一个检测图像时,我们按照正常的方式进行反向传播损失。对于分类损失,我们只在或以上的标签级别上进行反向传播损失。例如,如果标签是“dog”,我们不会将任何错误分配给树中更深处的预测,比如“German Shepherd”和“Golden Retriever”,因为我们没有那些信息。

 表7:YOLO9000在ImageNet上最好和最差的类别。来自156个弱监督类别中AP最高和最低的类别。YOLO9000在各种动物类别上学习到了良好的模型,但在服装或设备等新类别上面临困难。

当它看到一个分类图像时,我们只反向传播分类损失。为了做到这一点,我们只需找到预测该类别最高概率的边界框,并仅在其预测树上计算损失。我们还假设预测的边界框与地面真实标签之间的重叠至少为0.3的IOU,并根据这个假设反向传播目标性损失。使用这种联合训练,YOLO9000学会了使用COCO中的检测数据在图像中找到物体,同时使用ImageNet中的数据对这些物体进行广泛分类。我们在ImageNet检测任务中评估YOLO9000。ImageNet的检测任务与COCO共享了44个物体类别,这意味着YOLO9000只看到了大部分测试图像的分类数据,而没有看到检测数据。YOLO9000的mAP为19.7,其中在156个从未看到过任何标记检测数据的物体类别上的mAP为16.0。这个mAP高于DPM所取得的结果,但YOLO9000是在不同的数据集上以部分监督进行训练的[4]。同时,它还能够实时检测9000个其他物体类别。当我们分析YOLO9000在ImageNet上的性能时,我们发现它很好地学习了新的动物物种,但在学习服装和设备等类别上遇到困难。新的动物物种更容易学习,因为在COCO中的动物物体性预测具有很好的泛化能力。相反,COCO没有对任何类型的服装提供边界框标签,只提供人的标签,因此YOLO9000在建模“太阳镜”或“泳裤”等类别时遇到困难。

总结

  1. 结论 我们介绍了YOLOv2和YOLO9000,这是实时检测系统。YOLOv2是目前最先进的检测系统,并且在各种检测数据集上比其他系统更快。此外,它可以在各种图像尺寸上运行,以在速度和准确性之间提供平滑的权衡。YOLO9000是一个实时的框架,通过联合优化检测和分类,可以检测超过9000个物体类别。我们使用WordTree将来自各种来源的数据进行组合,并使用联合优化技术同时在ImageNet和COCO上进行训练。YOLO9000是缩小检测和分类之间数据集规模差距的重要一步。我们的许多技术在目标检测之外也具有普适性。我们对ImageNet的WordTree表示提供了一个更丰富、更详细的图像分类输出空间。在分类和分割领域中,使用层级分类的数据集组合将是有用的。像多尺度训练这样的训练技术可以在各种视觉任务中提供益处。对于未来的工作,我们希望使用类似的技术进行弱监督图像分割。我们还计划在训练期间使用更强大的匹配策略来为分类数据分配弱标签,以改善我们的检测结果。计算机视觉领域拥有大量的标记数据,我们将继续寻找方法将不同的数据来源和结构结合起来,构建更强大的视觉模型。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值