关于行人检测Cascade Classification我搜到的资料集合

目标检测经典算法笔记,转自http://blog.csdn.net/u012116229/article/details/45057937

转载  2015年04月15日 13:14:54

在计算机视觉领域,最基本也最经典的一个问题就是目标识别(Object Detection):给出一张图像,用detector检测出图像中特定的object(如人脸)。这方面的论文最经典的恐怕要数《Rapid Object Detection using a Boosted Cascade of Simple Features》这篇了,截止目前(2015.4.2)已经引用10834次。Matlab的Computer Vision System Toolbox中的vision.CascadeObjectDetector System 

matlab工具箱(自带,不需下载)Matlab的Computer Vision System Toolbox中的vision.CascadeObjectDetector System 官方文档:http://cn.mathworks.com/help/vision/ref/vision.cascadeobjectdetector-system-object.html

http://cn.mathworks.com/help/vision/ug/train-a-cascade-object-detector.html#

http://cn.mathworks.com/help/vision/ug/train-a-cascade-object-detector.html#btugex8

在matlab中输入detector = vision.CascadeObjectDetector,可以看到详细介绍

以及 OpenCV中提供的Cascade Classification 都是基于这篇论文的算法。该算法的特点是在保证高准确率的基础上,速度也非常快。本文就结合自己的理解,对这篇论文做一个简略的阅读笔记。由于太过经典,网上有各种关于该论文的资料可供读者参详,本文只是个人笔记,不求详尽。

首先,目标检测的基本原理就是先通过训练集学习一个分类器,然后在测试图像中以不同scale的窗口滑动扫描整个图像;每次扫描做一下分类,判断一下当前的这个窗口是否为要检测的目标。算法的核心是分类,分类的核心一个是用什么特征,一个是用哪种分类器。该论文的贡献也就是在这两个方面。

特征

我们的分类器是对一个窗口(如20*20)进行分类,那就需要用到这个窗口的特征,比如颜色直方图、SIFT特征。本文中用的是 Harr-like 特征。解释一下。

Harr-like 特征是一类矩形特征,该文用了以下四种:

特征值的计算方式是:先分别求灰色矩阵和白色矩阵中的像素值(对于灰度图就是它的灰度值)的和,然后两者相减。由于四种中的每一种又可以有不同的大小,不同的位置,通过计算,可以验证一个24*24的窗口中有16万个这样的特征。

首先补充一下为什么这样的特征可以用,举个例子吧,看下图,两个矩形是通过后面的adaboost选出来的最好用的中的两个。第一个可以反映出眼睛区域更dark;第二个反映出眼睛比鼻梁上端更dark。

第二个问题是,这么多特征,每一个都要计算矩形里面的像素值和,计算量太大了有木有!该论文的一个贡献是提出了用Integral Image来重新表示一幅图像,其实是个很简单的trick,但把计算量一下就缩减了一个量级。

图像I中的x,y处的像素值用 i(x,y)表示; 积分图像II(与I大小一样)中x,y处的像素值用ii(x,y)表示。对应位置怎么转换呢? 其实就是把原图像中该位置左边和上边的所有像素值加起来。用公式表达:

是个迭代的式子。把原图像逐个像素扫描一遍就得到积分图像。于是,矩形D的像素值和就可以用 4+1-(2+3)算了,复杂度是O(1)。

第三个问题是,难道我分类器要用这么多特征吗,难道我每次检测一个窗口要计算16万个特征吗?这就是该论文的第二个贡献了,用AdaBoost选择少数几个最好用的特征。

AdaBoost分类器

AdaBoost是一种ensemble分类器,也就是把多个弱分类器结合起来形成一个强分类器。每个弱分类器的准确率并不高,但最后形成的强分类器的准确率就很高了,而且已经被证明有很大的margin,也就是有很好的泛化能力。

16万个特征,用每个特征做一个弱分类器,弱分类器使用决策树这种最简单的分类器。说白了,就是用一个固定大小和位置的矩形特征,在所有正负样本上训练,找到一个阈值让它的分类错误率最低。

所谓AdaBoost也就是:迭代T次,对于第t次,所有的弱分类器都做一下分类,选择一个分类错误率最低的弱分类器;迭代T次,就产生T个弱分类器。这T个弱分类器加起来就是最后得到的强分类器。

AdaBoost的核心的分类器的权重和根据错误率做的权重更新,这里不赘述,比较简单。

可以看到,最后产生的强分类器使用了T个特征,而不是全部的16万个。论文中说道,用200个特征就能产生95%的识别率了。

到这里,我们的分类器就搞定了,就可以拿来做object detection了。 But, one more thing…

Cascade 分类器

上面得到了分类器,在检测图像时,对于每个窗口,我们都要计算T个特征。这固然可以,但是,作者的第三个贡献就是提出级联分类器的方法,检测一个窗口未必要计算所有这T个特征。

该方法的assumption是在检测的所有窗口中,false的占觉得大多数。

我们前面得到了一个强分类器。这里呢,我们需要m个强分类器。从头到尾串起来。每次检测一个窗口,先用第一个强分类器检测,如果是false,直接放弃后面m-1个分类器的检测,该处没有object;否则就继续执行第二个强分类器的检测… 如果中间某个stage(强分类器)结果是false,直接结束,该处没有object;如果所有m个分类器全部是true,那么该处有object。 级联分类器的关键是强分类器的次序安排:把简单的、false negative低的安排在最前面。 这样可以快速判断出那些不相关的区域,把更多的计算量用在潜在区域。

举例

这里以论文中的人脸识别实验为例,做些补充。

  • 训练集:图像大小2424.正样本只有人脸,共49162个(包括镜面图像);负样本是不包含人脸的图片,随机选择了9544个24*24的子窗口。正负样本基本平衡。
  • 实验中级联分类器前5层含有的特征数(也就是弱分类器数)分别是:1, 10, 25, 25, 50.如果第一层能拒绝掉大部分非相关区域的话,可以看到计算量小的喜人。
  • 训练集的图像如果不是上述大小,要平滑一下并做上采样或下采样。然后转为灰度图。测试图像也用灰度图。
  • 测试图像大小无所谓。滑动窗口的初始大小也是24*24,然后以1.2倍的速度放大(由于Harr特征的特殊性,分类器的scaling比测试图像的scaling更方便)。
  • 一个位置处会检测出好多框,把重叠的求个均值。

遗留问题:级联分类器的具体训练和选择方法。

参考和推荐:

Viola P, Jones M. Rapid object detection using a boosted cascade of simple features[C]//Computer Vision and Pattern Recognition, 2001. CVPR 2001. Proceedings of the 2001 IEEE Computer Society Conference on. IEEE, 2001, 1: I-511-I-518 vol. 1.

[http://blog.csdn.net/watkinsong/article/details/7631241]

[http://cn.mathworks.com/help/vision/ref/vision.cascadeobjectdetector-class.html]

[http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html]

[http://www.slideshare.net/hirantha129/rapid-object-detection-using-boosted-cascade-of-simple-features]

Rapid Object Detection using a Boosted Cascade of Simple Features 部分翻译
转自:http://blog.csdn.net/TonyShengTan/article/details/41542161
Rapid ObjectDetection using a Boosted Cascade of Simple Features          


使用简单特征级联分类器的快速目标检测


注:部分翻译不准处以红色字体给出
 
翻译,Tony,tony.sheng.tan@gmail.com
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
摘要:
本文介绍一种机器学习在目标检测中的视觉应用,其能够迅速的处理图像,并能达到一个较高的识别率。这项工作之所以有成就是因为存在以下三个关键特点:第一介绍一种新型的图像表示,我们称之为“积分图像”,其允许我们探测器使用的特征可以快速的计算。第二,是一个基于Adaboost的学习算法,其能从一个大的集合中选择出少量关键的视觉特征,并产生一个及其有效的分类器【5】。第三个贡献是,将一些越来越复杂的分类器连接成一个“级联”(cascade),它能够允许的图像的背景区域迅速被丢弃,而花费更多的计算在有前途的对象地区上。“级联”可以被当看做一个物体明确关注焦点的机制,它不同于以前的方法,来提供丢弃的地区不可能包含感兴趣的对象的统计性保证。在人脸检测领域,该系统产生的检出率媲美于以前最好的系统。在实时应用中,检测器运行为15帧每秒,且不需要图像差分和肤色检测。
Abstract
This paper describes a machine learningapproach for visual object detection which is capable of processing images extremelyrapidly and achieving high detection rates. This work is distinguished by threekey contributions. The first is the introduction of a new image representationcalled the “Integral Image” which allows the features used by our detector tobe computed very quickly. The second is a learning algorithm, based onAdaBoost, which selects a small number of critical visual features from alarger set and yields extremely efficient classifiers[6]. The thirdcontribution is a method for combining increasingly more complex classifiers ina “cascade” which allows background regions of the image to be quicklydiscarded while spending more computation on promising object-like regions. Thecascade can be viewed as an object specific focus-of-attention mechanism whichunlike previous approaches provides statistical guarantees that discardedregions are unlikely to contain the object of interest. In the domain of facedetection the system yields detection rates comparable to the best previoussystems. Used in real-time applications, the detector runs at 15 frames persecond without resorting to image differencing or skin color detection.
 
 
 
 
 
 
 
1.说明


本文汇集了新的算法和领悟,来建立一种鲁棒,快速的物体检测框架。这个框架被人脸检测任务证明了。为此目的我们建立了一个正面的人脸检测系统,实现检测,并且误报率相当于公布的最好结果【16,12,15,11,1】。这个人脸检测系统在其检测能力方面可以以其非常快的速度区别于以前的系统。在384x288像素的图像上进行操作,人脸以每秒15帧的速度被检测出来,在一个传统奔腾3,700MHz的机器上。在其他人脸检测系统中,需要辅助信息,例如帧差,彩色图像中的像素颜色,已经被用到高帧率检测中。而我们的系统的高帧率只建立在单一的灰度图像信息中。那些其他的辅助信息也可以加入到我们的系统来实现一个更高的检测帧率。
我们的目标检测框架有三个主要的贡献。我们将介绍这些思路简要介绍下然后在随后的章节中详细描述。本文的第一个贡献是一种新的图像表示为积分图像,可以非常快的进行特征计算。思路部分出于Papageorgiou的等人的工作。我们的检测系统不直接在图像强度上进行操作【10】。与这些作者相同我们使用一组特征,这会让人联想到的Haar的基础功能(虽然我们也会使用相关的过滤器,但其比Haar滤波器更复杂)。为了在多尺度能非常迅速的计算这些特征,我们引入对于图象积分图像表示。积分图像可以对每个像素进行少量操作得到。一旦计算完成,这些在任何尺度空间任何位置的类Haar特征中的任意一个可以以常数时间计算完成。
本文的第二贡献是提出构造一个分类器的方法,该方法使用AdaBoost 【6】选择小数量的重要特征来构造分类器。任何图像子窗口内Harr-like特征总的数量是非常大的,远远大于像素数。为了确保快速分类,学习过程必须排除大部分可用的特征,并集中在一个小的关键特征。出于Tieu和Viola的工作,特征选择是通过一个简单的修改AdaBoost的程序实现。弱学习是受约束的因此,每个弱分类器的返回能只依靠单一的特征【2】。作为每个阶段提升(Boosting)处理的结果,其选择一个新的分类器,可以被看作是一个特征选择的过程。AdaBoost算法提供了一种有效的学习算法和泛化性能的强界限【13,9,10】。
   本文的第三个主要贡献是一种依次连接一些复杂的分类成级联结构方法,这大大提高了检测器的速度,通过集中注意到图像有希望(为目标)的区域。关注焦点的方法的背后思想是:通常可以迅速确定目标在图像中可能会被发现的位置。进一步更复杂的处理,只保留这些有可能的区域。这种方法注意的关键指标是过程中的“错误判错”(false negative把目标当成非目标)率。其要求是,全部目标(及大部分)必须顺利通过关注滤波器(the attentional filter)。
我们将描述这样一个过程,训练极端例子,和有效的分类器,作为关注操作(attention operator)的监督。术语监督是指关注操作被训练来检测特定类的实例。在人脸检测领域有可能实现少于1%的“错误判错”(false negative把目标当成非目标)率和40%误报率,通过使用两个Harr-like特征构造的分类器。该滤波器的效果是减少了超过一半探测器必须进行计算最终的位置。
没有被初始化滤波器排除的子窗口将会被一系列滤波器处理,每一个滤波器都比前一个更复杂。一旦子窗口被滤波器拒绝,将不会被进一步处理。级联结构识别检测过程本质上是一个退化的决策树,与Geman和其同事的工作有关【1,4】。
一个非常快速的人脸检测器将有广阔的实际应用。这些包括用户界面,图像数据库,和电话会议。在快速帧速率不是必要的应用程序中,我们的系统将允许大量的额外后处理和分析。此外,我们的系统可以在一个广泛的小型低功率器件实现,包括手持设备和嵌入式处理器。在我们的实验室,我们已经在Compaq iPAQ手持设备(该器件具有低功耗200 MIPS的强大ARM处理器,此处理器缺乏浮点运算)上执行这个人脸检测器,并取得了两帧每秒的结果。
在本文的其余部分描述我们的贡献和一些实验结果,包括详细描述我们的实验方法。紧密相关的工作在每节结束的地方。
2.特征


我们的目标检测程序,将图像分类基于简单的特征的值。有很多理由来使我们使用特征值而不是直接使用像素值。最常见的原因就是特征可以进行编码成点对点的结构到领域的知识,这种知识是使用有限数量的训练数据很难学习的。这个系统也有第二个使用特征点关键理由:使用特征的系统将比基于像素的系统更快。被使用的简单的特征会使人联想到Haar为基础的功能(functions),其被Papageorgiou等人在【10】中使用。更具体地说,我们使用三种特征。2-个矩形特征值是两个矩形区域内的像素的总和之间的差。区域具有相同的大小和形状,水平或垂直相邻的(see Figure 1). 3-矩形的特征计算两个外侧矩形的和减去中间矩形的和。最后4-矩形特征计算矩形对角线之间的差。
考虑到探测器的基础分辨率24x24,矩形特征完整的集是相当大的,超过180000。需要注意的是不同于Haar基础算法,矩形特征集是过完备的。




2.1积分图像


矩形特征可以非常迅速地计算使用我们称之为积分图像的中间表示。积分图像在(x,y)处的值为该点左侧和上部所有像素的和,概括为:




其中ii(x,y)为积分图像,i(x,y)为原始图像。使用下面两个方程来再现:




其中表示行的累计和。,,计算积分图像只需要计算一遍原始图像。
利用积分图像通过参考附近四个阵列可以计算任何位置的矩形和(如图2)。两个矩形的差可以通过参考八个阵列来求得。由于2-矩形特征定义上涉及相邻的矩形的和,其可以通过六个相关阵列计算,3-矩形特征需要8个相关阵列,4-矩形特征需要9个。
2.2个特征的探讨


与其他的替代如方向可调滤波器相比,矩形特征有些原始【5,7】。可调滤波器,及其派生,是优秀的边界分析,图像压缩,纹理分析工具。相反矩形特征相当粗糙,虽然其对边缘的存在,条型,和其他简单的图像结构敏感。不同于方向可调滤波器,矩形特征只有唯一可用的的方向,或者是垂直的,或者是水平的,或者是对角线。矩形特征集却提供了丰富的图像表示,并支持有效的学习。与积分图像相结合,矩形特征集的高效率为其有限的灵活性提供了补偿。
3.学习分类功能


给定一个特征集,包括正训练集(目标)和负训练集(非目标),任何数量的机器学习的方法,可以用来学习一个分类函数。在我们的系统中,一个变种AdaBoost是同时用来选择一个小特点集合和训练分类器的【6】。Adaboost的最初形式,是提升一些简单的学习算法(有时称为弱学习算法)的分类性能。还有由AdaBoost学习程序提供一些正式保障(formal guarantees),Freund和Schapire证明各级的强分类器的训练误差以指数级的速度趋于零。更重要的是一些结果后来被证明具有泛化性能【14】。关键的发现是,泛化性能和样本的边缘有关,并且AdaBoost实现了大幅度的提速。
上面提到,与每个图像子窗口关联的矩形特征有超过180000个,远大于像素数。尽管每个功能可以非常有效地计算,但一套完整的计算是耗时的。我们由实验总结出的假设是,这些特征中的一小部分就能够形成一个有效的分类器。而我们的最大挑战就是找到这一小部分特征。为了实现这一目标,弱学习算法的设计来选择单一的矩形特征,这个特征能够最好的分离的正负样本(这是类似于图像数据库检索领域的方法【2】)。对于每一个特征,弱学习器确定最优的阈值分类功能,以最小化样本的错误分类数量。若分类器包含一个特征,一个阈值,和一个正负校验来指示不等式方向:


这里使用一个24x24的图像子窗口,表格1中显示了提升过程。
在实践中,没有一个单一的特征可以在较低的错误率的前提下进行分类的任务。在提升过程中,最初几轮的特征选择错误率为0.1到0.3。在后几轮的特征选择时,由于其任务难度加大,错误率为0.4到0.5 。
3.1学习讨论


许多普通特征选择程序已经被提出( 【18】中第8章综述)。我们最终的应用要求有一个激进的丢弃的绝大多数特征的方法。一个类似的识别问题,由Papageorgiou等人提出,他们提出了使用特征方差来选择特征的方案【10】。从1734个特征中选择37个特征的,其表现出了良好的效果。
Roth等人提出了一种基于Winnow指数感知器学习规则的特征选择过程【11】。Winnow学习过程收敛到一个许多这些权重为零的解。然而,大量的特征被保留(也许几百或者几千)。








3.2学习结果


虽然关于训练的细节和最终系统的表现在第五部分描述,单几个简单的结果是值得探讨的。实验结果表明,由200个特征组成的正面人脸分类器识别率为95%,错检率为1%,在14084个图像中。这些结果是令人信服的,但没有在真实情况下进行测试。在计算方面,该分类器可能比任何其他已发表的系统更快,需要0.7秒扫描一个384×288像素的图像。不幸的是,提高检测性能的最简单的方法,即添加新的特征到分类器,却直接增加了计算时间。用于人脸检测的任务,选择的AdaBoost的初始矩形特征是有意义的和容易理解的。第一个特征选择似乎强制放在这样一些特征,比如位置的眼睛往往比鼻子和脸颊区域深(见图3)。这种特征在检测子窗口相比相对较大,并且这种特征对人脸的大小和位置不敏感。第二特征选择的依赖于属性眼睛比鼻梁暗。




4.级联的注意事项


本节描述了构建一个级联分类器的算法,达到提高检测性能的同时,从根本上减少计算时间。关键关注点是较小的,然而更有效的提升分类器可以被构成,这种分类器能拒绝很多非目标子窗口,同时检测出几乎所有的目标。(例如:提升分类器的阈值可以进行调整,使误检率接近于零。)简单的分类器被用来去掉大多数非目标子窗口。而在被接受之后,更复杂的分类器将被调用来达低的误报率(false positive rates)。在检测过程中的整体形态是一个退化的决策树,我们所说的“瀑布(cascade)”(见图4)第一个分类器获得一个正样本检测结果,触发第二个分类器一个评估结果,第二个分类器也被调整,以得出高检测率。从第二个分类器检测为正样本的继续触发第三个分类器,以此类推。任何一个判断为非目标的将使子窗口马上被拒绝。级联阶段通过使用AdaBoost训练分类器来组成,然后调整阈值是漏报率最小。注意,默认的AdaBoost阈值的设计目的是训练集上产生低的错误率。一般来说一个较低的阈值产生较高的检测率和误报率高。例如,一个出色的一级分类器可以从一个2-特征的强分类器的构建,通过降低阈值来减少漏报率。对训练集进行验证,可以调节阈值使其检测通过100%的人脸和40%非人脸。图3描述了对两种特征进行分类。




这两个特征分类器使用总计约60个微处理器的指令的计算量。似乎很难想象,任何其他简单的滤波器可以实现如此高的拒绝率。通过比较在每个子窗口扫描一个简单的形象的模板,或一个单层感知器,将需要至少20倍的操作。
级联的结构反映了一个事实,任一单一的图像子窗口内的绝大多数是非目标的。因此级连结构试图尽可能早的拒绝尽可能多的非目标部分。当一个真正的目标进入级联结构,将会触发每一层分类器的正结果,这将极其罕见。
就像一个决策树,随后的分类器使用这些通过之前的所有阶段的例子来进行训练。结果是,第二分类器面临一个比前一个分类器更艰巨的任务。通过第一个分类器的例子将比典型的例子更加困难。更深层的分类器面临的更困难的例子,推动整体ROC曲线向下。在一个给定的检出率的情况下,更深层次的分类器有较高的误报率。
4.1训练的级联分类器


级联的训练过程中,涉及到两种类型的权衡。在大多数情况下分类器使用更多的特征将达到较高的检测率和较低的误报率。同时,使用更多特征的分类器将会产生更多的计算量,在原则上可以定义为一个优化框架:
i)     分类器的级数。
ii)    每级中使用特征的数量。
iii)  每级的阈值。
以尽量减少特征的预期数量。不幸的是,找到最佳的是一个非常困难的问题。
在实践中,一个非常简单的框架是用来产生一种高效的分类器是。级联中的每个阶段降低了误报率但降低了检测率。判断为正目标是需要一个较高的识别率和较低的误报率。每个阶段的训练通过添加特征直到目标的检测和误报率满足要求(这些比率是在验证集检测器检测确定)。添加级联分类器的级数,直到误检率和检出率达到标准。
4.2检测器级联的讨论


完整的人脸检测的有38个阶段,超过6000的特征。不过级联结构产生了快速的平均检测时间。在一个困难的数据集,包含507个面和75000000个子窗口,人脸脸使用10的特征,人脸被检测出来,每个子窗口使用平均10个特征评价(feature evaluations)。相比较而言,该系统比Rowley等【12】构建的检测系统实现快15倍。
与级联类似的概念在人脸检测系统中出现是由Rowley等人提出的,其使用了两个探测器网络【12】。Rowley等人用更快的但不精确的网络进行预审来找到可能为人脸的区域,再用慢的,但是精确的网络进行处理。尽管难以准确确认,但Rowley等人的双网络人脸系统在已知人脸检测器中最快的。
级联结构检测处理本质上是退化的决策树。Amit和Geman提出的相关理论也是如此。不同于使用固定的检测器的技术,Amit和Geman提出另一种观点,在简单图像共同出现的不同寻常的特征被用来触发一个更复杂的检测进行评价。这样完整的检测过程中不需要在许多潜在位置和尺度的图像进行评价。而这一基本观点是非常有价值的,在他们的实施中首先必须在每个位置进行一些特征检测器的评估。这些特征将被分组,来找到“不同寻常”的出现。在实践中,由于我们的探测器的形式和功能,使得其非常有效,我们的探测器的摊销成本在每个尺度和位置的评估远远快于基于图像的边缘寻找和分组。
    在最近的工作中Fleuret和Geman提出了新的人脸检测技术,它依赖于一个“链”的测试顺序,其意味着人脸出现在一个特定的尺度和位置【4】。Fleuret和Geman提出的图像属性测定,细尺度边缘背离,这与简单的矩形特征不同,其在所有尺度上存在,而且具有可解释的。这两种方法从他们的学习理念的根本上不同。在Fleuret和Geman的学习过程的动机是密度估计密度判别,而我们的探测器是纯粹的判别。最后,Fleuret和Geman方法的误判率似乎是高于像Rowley等人以前的方法。不幸的是,文章中没有定量结果的报告。包含的示例图像各有2到10的误报。

Computer Vision System的MATLAB TOOLBOX (2012-03-08 07:37:37)转载▼


转自:http://blog.sina.com.cn/s/blog_50363a790100wn8s.html
    该工具箱包括用于特征提取、运动检测、目标检测、目标跟踪、立体视觉、视频处理、视频分析的算法。工具包括视频文件I/O,视频显示,绘图以及合成。这些功能以MATLAB函数、MATLAB系统对象、Simulink块的形式提供。针对快速原型和嵌入式系统设计,该系统工具箱也支持定点算法和c代码产生。
    关键特性:
▪ 特征检测,包括 FAST, Harris, Shi & Tomasi, SURF, and MSER detectors
▪ 特征提取和putative feature matching
▪ 目标检测和跟踪,包括 Viola-Jones detection and CAMShift tracking
▪ 运动估计,包括 block matching, optical flow, and template matching
▪ RANSAC-based estimation of geometric transformations or fundamental matrices
▪ Video processing, video file I/O, video display, graphic overlays, and compositing
▪ 用于simulink的Block library

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值