YOLOv1的翻译与理解

YOLO是一种基于深度学习的目标检测系统,以其简洁的网络结构和高速运行著称。它将检测视为回归问题,通过单层神经网络预测边界框和类别概率,从而避免了传统方法中的复杂管道和慢速处理。YOLO在保证速度的同时,能全局理解图像,减少了背景误报,但在小目标检测上可能不够精确。该模型展示了实时目标检测的新途径。
摘要由CSDN通过智能技术生成

YOLO:You Only Look Once

YOLO论文地址:https://arxiv.org/pdf/1506.02640.pdf

论文翻译部分

摘要部分

YOLO是一种新的目标检测方法,传统的目标检测是重用分类器去检测,与传统不同之处在于,YOLO 把目标检测作为空间分离边界框还有对应类别的可能性的回归问题。单层的神经网络直接一次性从整张图片预测出边界框和对应类别可能性。由于整个检测管道是一个单层的神经网络,它就可以直接对检测性能进行端到端的优化。YOLO的整体架构是非常快的,基于YOLO模型处理图像的速度可以达到一秒45帧。Fast YOLO是一个更小的网络,处理速度达到每秒155帧的同时还达到了其他瞬时检测工具的mAP(全部类别的平均精度)的两倍。比起最先进的检测系统,YOLO产生更多本地化的错误,但是很少产生在背景预测上的误报。YOLO已经训练好了一些常见的对象的检测模型。当从自然图像推广到其他比如艺术的领域时,YOLO表现得比DPM、RCNN之类的其他检测方法更好。

我的简要概括:YOLO作为图像目标检测方法,网络层数少、运行快,运行的时候能一次性把框和分类标签对应的概率找出来。虽然正确率不比最先进的框架,但是在背景预测这事上很少错判。

介绍部分

人们看一眼图像就能立马知道图像的目标是什么,以及它们在哪里,它们如何相互作用。人的视觉系统是既快又准的,能让我们进行一些复杂的任务比如不加思索地驾驶车辆。实际上,既快又精准的目标检测算法也能让计算机在没有特殊传感器的情况下进行驾驶工作,可以辅助设备向用户传达实时场景信息,并且释放通用的、响应式的机器人系统的潜力。

现在检测系统重新利用分类器去实现检测。为了检测目标,这些系统为目标开了一个分类器并且计算目标在测试图像中的各种位置和角度。诸如可变形零件模型DPM这样的系统是用了一个平滑窗口方法,分类器在整个图像均匀分布的位置上运行。

近期像R-CNN的一些方法是使用候选框方法先生成了一些可能的边界框,再在这些边界框上运行分类器。在分类之后,后处理一般是重置边界框,消除重复的预测,并且基于场景内的其他对象进行重新评估边界框。这些复杂的方法既慢又难以优化,因为每个独立组件一定会被分别训练。

YOLO将目标检测重构为一个单回归问题,直接从图像像素中框出目标并且标注对应类别的可能性。使用YOLO预测目前的目标是什么、在哪里。

YOLO简单到令人耳目一新:如下图,单个的卷积网络同时预测多个边界框和对应类别可能性。YOLO训练全部图像并直接优化检测能力。
图1
这个一体化模型有多个优于传统目标检测的方法。

首先YOLO非常快。 因为YOLO将检测建立为一个不需要复杂管道的回归问题。只要在测试时间内在一张新图像上运行YOLO的神经网络就可以进行目标检测。YOLO的基础的网络在Titan X GPU上无需批处理的情况下每秒跑45帧,并且一个快版本YOLO能每秒跑150多帧。这意味着YOLO可以实时处理视频流,延迟少于25毫秒。还有,YOLO的全类别平均精确度能达到别的实时系统的两倍。

其次,YOLO在预测时会全局性地推理图像。 不像滑动窗口和候选框技术,YOLO在训练和预测时考虑了全局图像,所以隐形编码了有关图像对应类别的信息。Fast R-CNN是一个高级检测方法,误认了在图像中目标的背景斑块,因为他不能看到更多内容。YOLO在背景上犯错的次数少于Fast R-CNN的一半。

最后,YOLO训练好了常见的目标的优秀样本模型。当在自然图像中训练和在人造图像测试时,YOLO比一些像DPM、R-CNN之类有着一个宽边距的顶级的检测方法表现得好。因为YOLO可推广性非常强的,在应用于新领域或无法预期的输入时不太可能失败。

YOLO还在精确度甩开了顶尖的检测系统。当在图像中快速识别目标时,它力争精准地局部化一些目标,特别是小的那些,YOLO会更进一步地检查在事件中的权衡曲线( tradeoffs我想可能是指拟合曲线?)。

统一检测

YOLO统一了目标检测的分离式组件到一个单层神经网络。YOLO的神经网络使用来自于整张图像的特征去预测每一个边界框。这也同时预测了一张图像中所有类中的所有边界框。这意味着YOLO的网络全局性地推理了关于整张图像和图像中的所有目标。YOLO设计了能够端到端训练的试试速度并保持一个比较高的平均精确度。

YOLO将输入图像分割成 S × S S \times S S×S个格子,如果目标中心落入了格子单元中,那么这个格子单元就需要负责去检测那个目标。

每一个格子单元预测 B B B个边界框和那个框的置信度。这些置信度反映了这个模型有多么确信框内包含了一个目标以及它所预测的框的对应的精确度如何。形式上YOLO定义了 P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Object)*IOU^{truth}_{pred} Pr(Object)IOUpredtruth当作置信度, P r ( O b j e c t ) Pr(Object) Pr(Object)是指此处是否有物体,有的话值为1,没有的话值为0,IOU是指交集除以并集,即预测的部位和实际部位的交叉部位面积与并集面积的比值,交集越大那么说明越准确,整个公式就是预测是否有物体以及预测的置信度如何。

每个边界框由五个预测值组成: x , y , w , h 和置信度 x,y,w,h和置信度 x,y,w,h和置信度 ( x , y ) (x,y) (x,y)代表有关于网格单元边界方框的中心坐标。预测的宽高是相对于整张图片而言的。置信度代表真实框和预测框之间 I O U IOU IOU

每个栅格单元也预测了有条件分类的可能性, P r ( C l a s s i ∣ O b j e c t ) Pr(Class_i|Object) Pr(ClassiObject),这些是在栅格包含目标的情况下可能性,YOLO也对每个栅格预测一系列类别的可能性,不论有多少B框。在测试时将条件概率和单独框预测置信度,如公式 P r ( C l a s s i ∣ O b j e c t ) ∗ P r ( O b j e c t ) ∗ I O U p r e d t r u t h Pr(Class_i|Object)*Pr(Object)*IOU^{truth}_{pred} Pr(ClassiObject)Pr(Object)IOUpredtruth,给了我们每个框特定置信度分数,这些分数是包含了框中类别出现的概率以及预测框与目标的适应度的编码。

图2
如上述图像,YOLO模型将预测当做了回归问题。它将图像分割成 S × S S \times S S×S个栅格并为每个栅格做B个边界框预测,预测那些框的置信度和C个类别可能性。这些预测被编码成一个 S × S × ( B ∗ 5 + C ) S \times S \times (B*5+C) S×S×(B5+C)的张量。为了在 P A S C A L V O C P_{ASCAL}VOC PASCALVOC评估YOLO,YOLO成员使用 S = 7 , B = 2 S=7 ,B=2 S=7B=2 . P A S C A L V O C P_{ASCAL}VOC PASCALVOC有二十个类别标签,所以 C C C 就取 20 20 20 ,我们最后预测的是 7 × 7 × 30 7 \times 7 \times 30 7×7×30 的张量。

神经网络设计

YOLO实现了卷积神经网络模型,并且在 P A S C A L V O C P_{ASCAL}VOC PASCALVOC数据集上评估它。神经网络的初始卷积层从图像中提取特征,同时全连接层预测输出可能性和坐标。

YOLO的神经网络架构通过谷歌网络加速来为图像分类。YOLO网络有24个卷积层和2个全连接层,和 Lin et al比较类似,YOLO仅仅使用 3 × 3 3 \times 3 3×3的卷积层和 1 × 1 1 \times 1 1×1还原层,而不用谷歌网络的初级模型。整个网络会放在图三展示。

YOLO成员也训练了一个快版本的YOLO去支持快速的目标检测。Fast YOLO使用了更少的卷积层和每层更少的滤波器,除了神经网络的规模,YOLO和Fast YOLO的训练和预测参数都相同。
图三
图三是网络架构图,检测网络有24个卷积层和两个全连接层。交替的 1 × 1 1 \times 1 1×1卷积层从前面的网络层中减少特征空间。提前在一半的ImageNet分类任务方案中训练卷积层,然后为检测提供双倍的方案。

训练

YOLO成员们提前在ImageNet的1000个分类的比赛数据集中训练了卷积网络。前训练用了图三中的头20个卷积层、1个平均池化层和1一个全连接层。训练这个网络大概用了一周并且一个收获是前五的准确率在ImageNet 2012 验证集达到了88%,类似在Caffe的模型库中的谷歌网络模型。YOLO使用了Darknet框架来训练和推理。

之后YOLO开发者们将模型改造用作检测,Ren etal.指出不论加卷积层还是全连接层都来作前训练网络都可以改善性能。这里有他们的样例,我们加了4个卷积层和两个全连接层和随机初始化的权重矩阵。检测常常需要精确的可视化信息,所以我们将网络的输入规模从 224 × 224 224 \times 224 224×224扩大至 448 × 448 448 \times 448 448×448.

最后的层预测了边界框坐标和类别可能性。通过图像宽高标准化了边界框的宽高,以至于它们落在0和1之间。我们将边界框的 X X X Y Y Y坐标参数化成一个突出的栅格单元定位偏移量,所以它们可以在0~1之间回弹。

我们使用了线性的激活函数为最后的层,并且所有其它层使用leak rectified linear激活函数,这是ReLU的一种。

{ 0.1 x ,     o t h e r w i s e x ,           i f     x > 0 \left\{^{x, \ \ \ \ \ \ \ \ \ if \ \ \ x>0}_{0.1x, \ \ \ otherwise}\right. {0.1x,   otherwisex,         if   x>0

我们优化了模型输出的平方和误差。使用平方和误差的原因是它比较好优化,然而它并没有完美地和我们想要最大限度提高平均精确度的目标结合起来。它会把定位错误和分类错误等同起来,这不是一个好的办法。并且在每一张图像中的许多栅格单元都不能涵盖所有的目标。这便将那些栅格单元的置信度向0推进,经常会导致涵盖目标的单元产生梯度爆炸问题。这样就会导致模型的不稳定,导致训练早期出现分歧。

为了纠正这个问题。我们增加了边界框定位预测的损失函数以及增加不含目标的框的置信度预测值的损失函数。我们使用两个参数 λ c o o r d \lambda_{coord} λcoord λ n o o b j \lambda_{noobj} λnoobj去完成这项任务。我们将其设置为 λ c o o r d = 5 \lambda_{coord}=5 λcoord=5 λ n o o b j = 5 \lambda_{noobj}=5 λnoobj=5

平方和误差也平等地对待大框小框的误差,我们的误差矩阵应该反映出大框中的小偏差比小框中的更小。我们是局部定位我们预测的边界框的宽高的平方根而不是直接的宽高。

YOLO对每个栅格单元预测多个边界框。在训练时我们只想要一个边界框来预测每一个目标。我们认定一个 I O U IOU IOU最高的预测框作为对一个目标的可信的预测。这便让预测边界框之间出现了专门分工,每一个预测框会尽力预测一个一个确定的大小、纵横比或者目标类别,来改善整体的召回率。

在训练期间,我们最优化了多重损失函数:
图4

由于某些字符不好打出来,我干脆把解释写在图上

图5

注意,如果一个目标出现在栅格单元中(即之前讨论的类别的可能性),则损失函数只会惩罚分类误差。如果预测的框很接近真实框(有着所有栅格单元中最高的 I O U IOU IOU)也仅仅只会惩罚边界框坐标误差。

我们训练的网络是经过135个epoch的训练以及验证数据集来自 P A S C A L V O C 2007 a n d 2012 P_{ASCAL} VOC 2007 and 2012 PASCALVOC2007and2012。当测试2012验证集的同时我们也加入了2007的测试集来训练。整场训练我们使用了一个64大小的批次,0.9的动能值和0.0005的衰减速度。

此处穿插补充动能的解释:主要是用在计算参数更新方向前会考虑前一次参数更新的方向,如果当下梯度方向和历史参数更新的方向一致,则会增强这个方向的梯度,若当下梯度方向和历史参数更新的方向不一致,则梯度会衰退。然后每一次对梯度作方向微调。这样可以增加学习上的稳定性(梯度不更新太快),这样可以学习的更快,并且有摆脱局部最佳解的能力。

我们设定的学习率如下:对于第一个epoch,我们慢慢地将学习率从 1 0 − 3 10^{-3} 103提升至 1 0 − 2 10^{-2} 102。如果我们从一个高的学习率开始我们的模型,经常会发生偏离,因为不稳定的梯度。我们保持学习率为 1 0 − 2 10^{-2} 102训练75个epoch,然后以 10 − 3 10{-3} 103的学习率训练30个epoch,最后以 10 − 4 10{-4} 104的学习率训练30个epoch。

为了避免过拟合,我们使用dropout(dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃)和广泛数据增强。一个dropout层在一个第一个连接层比率设为0.5,以此阻止层与层之间的相互拟合。我们添加随机缩放比例和高达于原图像大小的20%的平移来做数据增强。我们也通过高达图像HSV色彩空间的1.5倍的HSV值来随机调整了图像的曝光度和饱和度。

推论

就像训练中一样,预测一张侧视图的检测框仅仅需要一个神经网络计算。在 P A S C A L V O C P_{ASCAL} VOC PASCALVOC网络上为每张图预测98个边界框和每个框的类别可能性。YOLO在测试图像中表现十分快,因为它不像那些基于分类器的方法一样,它仅仅只需要一个单层网络计算。

这个栅格设计加强了边界框预测的空间多样性。它常常对于目标落入哪个栅格是很清楚的,并且它会为每一个目标预测一个框。然而,一些大的目标或者目标接近多个单元边界时肯定会被多个单元强力定位。非极大值抑制会被用来筛选多个检测框。虽然性能的表现不像R-CNN或者DPM中那么重要,非极大值抑制也还是会增加2~3%的mAP。

YOLO的限制

YOLO强加了预测边界框的空间约束,因为每一个栅格单元值预测两个框,并且只能有一个分类。这样的空间约束限制了可预测的相邻目标的数量。我们的模型会加强对成组出现的小目标的预测,比如鸟群。

因为我们的模型学习了从数据中预测边界框,它会努力推广至新的或者不同寻常的纵横比或结构的目标。我们的模型也可以用活动的粗糙的特征来预测边界框,因为我们的架构有对于输入图像的多重下采样层。

最后,当我们训练一个大概的预测性能的损失函数时,我们的损失函数对那些在小边界框和的大边界框上的误差是一样的。一个在大框的小误差经常是良好的,但是一个在小框上的小误差就对 I O U IOU IOU有非常大的影响了。我们主要的误差来源是不准确的定位。

对比其他检测系统

目标检测是一个计算机视觉的核心问题。检测流程通常由提取输入图像中的一系列突出的特征开始,然后分类器或者定位器通常用作在特征空间中确认目标。这些分类器或者定位器既以滑动窗口方式运行在整张图像上,又在图像局部区域运行。我们对比了YOLO检测系统和其他的顶尖的检测框架,突出了关键的相似处和不同点。

DPM模型。DPM使用一个滑动窗口处理目标检测。DPM使用一个无连接的方式提取静态特征,将区域分类,在高分的区域预测边界框。我们的系统用一个单卷积神经网络取代了所有的这些不同之处。这个网络负责特征提取,边界框的预测,非极大值抑制,还有同时进行上下文的推理。这个网络训练了内嵌的特征和在检测任务中优化这些特征,而不是静态的特征。我们的统一架构使得它比DPM模型更快,更准确。

R-CNN.R-CNN和它的变种选择了候选框而非滑动窗口在图像中寻找目标。有选择性地搜索生成潜在的边界框,一个卷积网络提取特征,一个SVM为框标记得分,一个线性模型调整边界框,还有非最大值抑制消除了重复的检测。每一个复杂的流程阶段肯定精确地独立调整以及最终系统非常慢,在测试时每张图像要超过40s。

YOLO参考了一些和R-CNN相似的东西。每一个栅格单元处理候选框还有用卷积特征来评估那些框。然而,我们的系统在候选栅格单元放了一些限制,让同一个目标的多重检测慢了下来。我们的系统也提出更少的边界框,每张图像只要98个框来比较,进行了大概两千次选择性搜索。最后,我们的系统将这些独立组件集成成了一个最优化连接模型。

其他快速检测和Faster R-CNN 专注于通过共享计算和使用神经网络来推理局部而不用选择性搜索对R-CNN的加速。当他们对R-CNN进行加速和精准度改善时,都还是达不到实时的性能。

许多研究成果都专注于对DPM流程加速,他们使用了级联以及将计算放入GPU中使得HOG计算加快了。然而,DPM跑的实时系统仅仅达到30Hz。

与其尝试最优化一个大的预测流程的组件,YOLO选择完全抛弃流程,并且专门为快而设计。

对于单个类别的检测器,比如脸或者人,都应该被高度优化,因为他们要处理更少的变量。YOLO是一个通用的目标检测,被训练用作同时检测一系列目标。

Deep MultiBox模型,不像R-CNN一样,Szegedy et al.训练一个卷积神经网络来预测感兴趣的地方,而不用选择性搜索。MultiBox也可以用作单个目标检测,可以通过用一个单类别预测来替换预测置信度来实现。然而,MultiBox不能用作通用目标检测,并且仍然只是一种更大预测流程的组成部分。不管是YOLO还是MultiBox都用了一个卷积神经网络来预测一张图像的边界框,但是YOLO是一个完整的检测系统。

OverFeat。Sermanet et al.训练了一个卷积神经网络来实现定位和适应,也就是用定位器来做检测。OverFeat在滑动窗口中十分有效率,但它仍然是无连接系统。OverFeat优化了定位,但没有优化检测性能。像DPM,它的定位器在做预测时只能看到本身的信息。OverFeat不能推断全局信息,因此需要关键的后处理来实现检测一致性。

MultiGrasp模型。我们的网络在设计上很相似, Redmon et al将其设计成抓取检测的工作方式。我们的栅格用的边界框预测就是基于MultiGrasp系统的回归来抓取。然而,抓取检测是一个比目标检测更简单的任务。MultiGrasp仅仅需要为一张包含一个目标的图形来预测一个单个可抓取的区域。这并没有估计大小、定位或者目标边界框或者预测类别,仅仅是找一个适合抓取的区域。YOLO既预测了一张多目标多分类的图像边界框,也预测了其类别可能性。

案例

首先,我们在 P A S C A L V O C 2007 P_{ASCAL} VOC 2007 PASCALVOC2007上比较了YOLO和其他实时检测系统。为了弄清楚YOLO和R-CNN的变量之间的区别,我们通过YOLO和R-CNN(其中一个最高版本的的R-CNN)探索了在 V O C 2007 VOC 2007 VOC2007上的误差。基于不同的误差作图,我们认为YOLO可以适用于重新评估Fast R-CNN检测以及减少来自背景误判的误差,这让性能有了极大的推进。我们也展示了 V O C 2012 VOC 2012 VOC2012的结果且对比当前最顶尖的预测方法的mAP。最终,我们认为YOLO在这两个人造数据集上推广到新领域时比其他检测方法表现更好。

对比其他实时系统

许多研究都致力于专注标准化的快速检测流程的目标检测。然而,只有Sadeghi et al.真正地制造了一个能实时跑的检测系统。我们对比了YOLO和他们的在GPU上的DPM执行过程,既有30Hz的也有100Hz的。然而其他方法没有达到实时的里程碑。我们也对比他们的相对mAP和加速审查准确率性能来权衡目标检测系统的可用性。

Fast YOLO在 P A S C A L P_{ASCAL} PASCAL上是最快的目标检测方法。总所周知,这是现有的最快的目标检测方法。在52.7%的mAP中,它的准确率是之前的实时系统的两倍多。YOLO将mAP提升至63.4%,同时仍然保持着实时系统的性能。

我们也用 V G G − 16 VGG-16 VGG16来训练YOLO。这个模型准虽然更准确但比YOLO更慢。与其他依赖于 V G G − 16 VGG-16 VGG16的检测系统相比,它是有用的,但由于它比实时速度慢,本文的其余部分集中在我们更快的模型上。

Fastest DPM有效地在没有损失太多mAP情况下加速了DPM,但是它仍然没有达到实时系统的性能的两倍。这也让DPM受到了相对于其他神经网络较低的检测准确率的限制。

R-CNN除去R让静态候选框提案取代了选择性搜索。尽管它比R-CNN更快,但还是没能达到实时的要求并且在没有好的候选框时准确率还不高。

Fast R-CNN加速了R-CNN的分类阶段,但是仍然依靠选择性搜索,这导致几乎两秒才能让一张图像生成候候选框。因此高的mAP但是速度只有0.5fps,这很仍然不能满足实时要求。

最近Faster R-CNN 用一个神经网络取代了选择性搜索来生成候选框,和Szegedy et al很相似。在我们的测试中,他们的最精准模型达到了7fps的速度,并且一个更小也没有那么精确地模型跑了18fps的速度。VGG-16的Faster R-CNN版本可以达到10mAP以上,但是也有六次比YOLO慢,Zeiler Fergus Faster R-CNN 仅有2.5次比YOLO慢,但它也同样是比YOLO更低的精度。

VOC 2007的误差分析

为了更好地评估YOLO和顶尖检测模型的区别,我们看一下VOC 2007上的损失结果。我们对比了YOLO和Fast R-CNN,因为Fast R-CNN是在 P A S C A L P_{ASCAL} PASCAL上性能最高的检测算法之一,并且检测是可以公开的。

我们使用了 Hoiem et al的一套方法和工具。对每一个测试中的种类,我们都去观察对于那个种类最高预测值情况。每个预测都是既正确又基于以下类型的误差来分类的:

  • Correct:正确类别且IOU>0.5
  • Localization: 正确类别,0.1<IOU<0.5
  • Similar:类别相似,IOU>0.1
  • Other: 错误类别,IOU>0.1
  • Background: 任意目标的 IOU < 0.1

图4
上图表现了每个误差类型的分解,对20个类别的误差平均的结果。

YOLO努力去正确地定位目标。YOLO的定位误差比别的误差组合更多。Faster R-CNN 使得定位误差更少,但是更多的背景误差。13.6%的顶尖预测算法都是假正例,就是没有包含任何目标也被当成预测成功。Fast R-CNN预测成背景的概率几乎是YOLO的三倍。

将Fast R-CNN和YOLO结合

YOLO让比Fast R-CNN更少的背景错误出现。通过用YOLO去消除产生自Fast R-CNN背景预测的错误,我们就能获得一个至关重要的性能提升。对于每一个R-CNN预测的边界框,我们都可以通过检查他们来看看YOLO是否预测了一个更小的框。如果是,我们基于YOLO的预测出的概率和两个框重合的地方来提升这次的预测性能。

最好的Fast R-CNN模型在VOC 2007测试集上达到了71.8%的mAP。当结合YOLO时,它的mAP增长了3.2%,到达75%,我们也尝试结合了顶尖的Fast R-CNN模型和其他几个版本的Fast R-CNN模型。在表二中的细节能看出来,那些集合能让mAP微量地增加0.3%至0.6%。

YOLO的提升并不只是模型集成的副产品,因为结合不同版本的Faster R-CNN几乎没有什么好处。相反,恰恰是因为YOLO在测试时犯了不同错误,才使得Faster R-CNN有了如此有效的提升。

不幸的是,此次结合并没有从YOLO的速度中获取增益,因为我们独立地跑了每个模型,然后才将结果连接起来。然而,因为YOLO是如此之快,它相比Faster R-CNN并没有增加什么过重的计算时间。

VOC 2012结果

在VOC 2012测试集上,YOLO在mAP上得分为57.9%。从表三可看出,这比当前的顶尖算法要低一些,和最初的用VGG-16的R-CNN很相近。和最接近的竞争对手相比,我们的系统在小目标识别方面比较难堪。

  \  
  \  
  \  

  \  
注1:全部图片来自YOLOv1的论文,论文地址已在本篇博客头部中放置。
注2:全篇来自一位四级压线选手的徒手翻译,若有理解错误的地方,还请指正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值