ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Paper-----Rich feature hierarchies for accurate object detection and semantic segmentation(精修)

2021-03-06 17:01:47  阅读:222  来源: 互联网

标签:segmentation semantic VOC 特征 区域 精修 CNN 方法 我们


论文标题:Rich feature hierarchies for accurate object detection and semantic segmentation

标题翻译:丰富的特征层次结构,可实现准确的目标检测和语义分割

论文作者:Ross Girshick Jeff Donahue Trevor Darrell Jitendra Mali

论文地址

RCNN的GitHub地址

-----------------------✂下面是正文✂---------------------------

摘要

  过去几年,在权威数据集PASCAL VOC上,物体检测水平在达到一定精度后已经停滞了几年。效果最好的方法是融合了多种低维图像特征和高维语义的复杂融合系统。在本篇论文里,我们提出了一种简单并且可扩展的检测算法,可以将VOC2012上最好结果的平均精度均值提高30%以上——达到了53.3%。我们的方法结合了两个关键的因素:

  • 1、在候选区域中自下而上使用大型卷积神经网络(CNNs),用以定位和分割物体。

  • 2、当带标签的训练数据不足时,先针对辅助任务进行有监督预训练,再进行特定任务的调优(迁移学习),就可以产生明显的性能提升。

  因为我们将区域提案与CNN结合,因此我们将我们的方法称为 R-CNN(Region proposals with CNN features):基于区域的CNN特征算法。完整系统的源代码可以从:http://www.cs.berkeley.edu/~rbg/rcnn 获得。

1、引言

  特征问题,在过去十年,各类视觉识别任务的进展都很大程度取决于SIFT[27]和HOG[7] 的使用。但是,如果我们查看经典的视觉识别任务PASCAL VOC对象检测的性能[13],则可以认为2010~2012年之间进展缓慢,取得的微小进步都是通过构建一些集成系统和采用一些成功方法的变种才达到的。

  SIFT和HOG是块状方向直方图(blockwise orientation historgrams),可以大致与V1(灵长类动物视觉通路的第一个皮质区域)中的复杂细胞相关联。但是我们知道识别发生在多个下游阶段(我们是先看到了一些特征,然后才意识到这是什么东西),也就是说对于视觉识别来说,更有价值的信息是层次化的,多阶段的。

        Fukushima 的 “neocognitron”,一种受生物学启发用于模式识别的层次的、移动不变性模型,算是这方面最早的尝试。然而neocognitron 缺乏监督学习算法。Lecun等人的工作表明基于反向传播的随机梯度下降(SGD)对训练卷积神经网络(CNNs)非常有效,CNNs被认为是继承自 neocognitron的一类模型。

  CNNs在1990年代被广泛使用,但是随着SVM的崛起而淡出研究主流。2012年,Krizhevsky等人在ImageNet大规模视觉识别挑战赛(ILSVRC)上的出色表现重新燃起了世界对CNNs的兴趣(AlexNet)。他们的成功在于在120万的标签图像上使用了一个大型的CNN,并且对LeCun 的CNN进行了一些改造(比如ReLU和Dropout Regularization)。

  ImageNet 出色的表现在ILSVRC2012 workshop上得到了热烈的讨论。提炼出来的核心问题是:ImageNet的CNN网络在PASCAL VOC挑战中的物体检测任务上表现会是如何?

  我们通过将图像分类和目标检测之间的差别量化转换,回答了这个问题。本论文是第一个说明在PASCAL VOC的物体检测任务上CNN比基于简单类HOG特征的系统有大幅的性能提升。我们主要关注了两个问题:使用深度网络定位物体和在小规模的标注数据集上进行大型网络模型的训练。

  与图像分类不同的是检测需要定位一个图像内的许多物体。一个方法是将框定位看做是回归问题。但Szegedy等人的工作说明这种策略并不有效(在VOC2007上他们的平均精度均值是30.5%,而我们达到了58.5%)。另一个可选择的方法是使用滑动窗口探测器,通过这种方法使用CNNs至少已经有20年的时间了,其通常用于一些特定的种类如人脸,行人等。为了获得较高的空间分辨率(较多的像素意味着更多的原始信息),这些CNNs都只采用了两个卷积层和两个池化层。我们本来也考虑过使用滑动窗口的方法,但是由于网络层次更深,输入图形有非常大的感受野(195*195)和步长(32*32 ),这使得采用滑动窗口的方法很困难。

  我们是通过操作“recognition using regions”范式,解决了CNN的定位问题。测试时,对这张图片,产生了接近2000个与类别无关的提名区域,对每个区域使用CNN抽取了一个固定长度的特征向量,然后借助专门针对特定类别数据的线性SVM对每个区域进行分类。我们不考虑region的大小,使用图像变换的方法来对每个不同形状的提名区域,对每个CNN抽取了一个固定长度的特征向量,然后借助专门针对特定类别数据的线性SVM对每个区域进行分类。我们不考虑每个提名区域的大小,使用图像仿射变形的方法来对每个不同形状的提名区域产生一个固定大小的图像作为 CNN 输入。图1展示了我们方法的全貌并突出展示了一些实验结果。由于我们结合了region proposals和CNNs,所以起名RCNN:regions with CNN features。

  检测中面对的第二个挑战是标签数据太少,现在可获得的数据远远不够用于训练一个大型卷积网络。传统方法多是采用无监督训练,再进行监督调优。本文的第二个核心观点是在辅助数据集(ILSVRC)上进行有监督预训练,再在小数据集上针对特定问题进行调优。这是在训练数据稀少的情况下的一个非常有效的训练大型卷积神经网络的方法。我们的实验中,针对检测的调优将平均精度均值调高了8个百分点。调优后,我们的系统在VOC2010上达到了 54%的平均精度均值,远远超过高度优化的基于 HOG的可变性部件模型(deformable part model,DPM)。我们还向读者指出 Donahue等人的同期工作[11]的研究表明,Krizhevsky 的CNN可以用作黑箱特征提取器(无需进行微调),从而在某些识别任务(包括场景分类,细粒度子分类和域自适应)上表现出出色的性能。

  我们的系统也很高效,都是小型矩阵向量相乘和贪婪NMS这些特定类别的计算。这个计算特性源自于特征在不同类别之间的共享(对于不同类别,CNNs提取到的特征是一样的),这比之前使用的区域特征少了两个数量级的维度。

  分析我们方法所造成错误的模式特点,对进一步提高很有帮助,所以我们借助 Hoiem等人的定位分析工具做实验结果的报告和分析。分析结果,我们发现主要的错误是因为定位误差,而定位框回归可以有效的降低这类错误。

  介绍技术细节之前,我们提醒大家由于 R-CNN 是在提名区域上进行操作,所以可以很自然地扩展到语义分割任务上。只要很小的改动,我们就在 PASCAL VOC 语义分割任务上达到了很有竞争力的结果,在 VOC2011测试集上平均语义分割精度达到了 47.9%。

2、用R-CNN进行物体检测

  我们的物体检测系统包含三个模块,第一个,产生类别无关的region proposals,这些推荐定义了一个候选区域的集合;第二个是一个大型卷积神经网络,用于从每个区域抽取特定大小的特征向量;第三个是一个指定类别的线性SVM。本部分,将展示每个模块的设计,并介绍他们的测试阶段的用法,参数是如何学习到的,最后给出在PASCAL VOC 2010~2012和 ILSVRC2013上的检测结果。

 

2.1、模块设计

区域推荐(region proposals)

  近年来有很多研究都提出了产生无关于类别的区域推荐方法。比如:objectness(物体性),selective search(选择性搜索),category-independent object proposals(类别无关物体推荐),constrained parametric min-cuts(受限参最小剪切,CPMC),multi-scal combinatorial grouping(多尺度联合分组),以及Ciresan等人的方法,将CNN用在规律空间块裁剪上以检测有丝分裂细胞,也算是一种特殊的区域推荐类型。由于RCNN对特定区域算法是不关心的,所以我们采用了选择性搜索以方便和前面的工作进行可控的比较。

特征提取(Feature extraction)

  我们使用Krizhevsky等人所描述的CNN的一个Caffe实现版本,在输入为227*227大小的图片上对每个推荐区域抽取了一个 4096维度的特征向量,通过五个卷积层和两个全连接层进行前向传播,最终得到了一个 4096维的特征向量。读者可以参考AlexNet获得更多的网络架构细节。

  为了计算region proposal的特征,我们首先要对图像进行转换,使得它符合CNNs的输入(架构中的 CNNs只能接受固定大小:227*227pixel)。这个变换有很多办法,我们使用了最简单的一种。无论候选区域是什么尺寸和宽高比,我们都把候选框变形成CNN接受的尺寸。具体的,变形之前,我们现在候选框周围加上16像素的padding,再进行各向异性缩放。这种形变使得平均精度均值提高了3到5个百分点,在补充资料中,作者对比了各向异性和各向同性缩放方法。

2.2、测试分析

  在测试阶段,我们在测试图像上使用selective search 抽取了2000个推荐区域(实验中,我们使用了选择性搜索的快速模式),对每一个推荐区域进行变形,再通过CNN前向传播计算出特征。然后我们使用对每种类别训练出的SVM给整个特征向量中的每个类别打分。然后给出一张图像中所有的打分区域,然后使用非极大值抑制(每个类别都是独立进行的),去掉一些和高分区域的交并比大于阈值的候选框。

运行分析

  两个特性可以使得检测变得很高效。首先,所有的CNN参数都是跨类别共享的。其次,通过CNN计算的特征向量相比其他通用方法(比如spatial pyramids with bag-of-visual-word encodings 带有视觉词袋编码的空间金字塔)相比,维度是很低的。UVA检测系统的特征比我们的要多两个数量级(360K 与 4K)。

  这种共享的结果就是计算推荐区域特征的耗时可以分摊到所有类别的头上(GPU:每张图13s,CPU:每张图53s)。唯一的和具体类别有关的计算是特征向量和SVM权重和点积,以及非极大值抑制算法。实践中,所有的点积都可以批量化成一个单独矩阵间运算。特征矩阵的典型大小是 2000*4096,SVM权重的矩阵是 4096*N,其中N是类别的数量。

  分析表明R-CNN可以扩展到上千个类别,而不需要借用近似技术(如hashing)。即使有10万个类别,矩阵乘法在现代多核CPU上只需要 10s 而已。但是这种高效不仅仅是因为使用了区域推荐和共享特征。由于较高维度的特征,UVX系统存储 100k linear predictors 需要 134G的内存,而我们只要 1.5GB,比我们高了两个数量级。

  有趣的是R-CNN和最近 Dean等人使用 DPMs 和 hashing做检测的工作相比,他们用了1万个干扰类,每五分钟可以处理一张图片,在VOC 2007上的 平均精度均值能达到16%,我们的方法中1万个检测器由于没有做近似,可以在CPU上一分钟跑完,达到了 59%的平均精度均值。(3.2节)

2.3、训练

有监督的预训练

  我们在大型辅助训练集 ILSVRC2012分类数据集(没有约束框数据)上预训练了CNN。预训练采用了Caffe的CNN库。总体来说,我们的CNN十分接近Krizhevsky等人的网络的性能,在ILSVRC2012分类验证集在top-1错误率上比他们高2.2%。差异主要来自于训练过程的简化。

特定领域的参数调优

  为了让我们的CNN适应新的任务(即检测任务)和新的领域(变形后的推荐窗口)。我们只使用变形后的推荐区域对CNN参数进行随机梯度下降训练。我们替换掉了ImageNet专用的1000-way分类层,换成了一个随机初始化的21-way分类层(其中20是VOC的类别数,1代表背景)。而卷积部分都没有改变。我们对所有的推荐区域进行分类,如果其和真实标注的框的交并比 >= 0.5 就认为是正例,否则就是负例。SGD开始的learning rate 是 0.001(是初始化预训练时的十分之一)。这使得调优得以有效进行而不会破坏初始化的成果。每轮SGD迭代,我们统一使用32个正例窗口(跨所有类别)和96个背景窗口,即每个mini-batch的大小为128。另外我们倾向于采样正例窗口,因为和背景相比,他们很稀少。

目标种类分类器

  假设训练一个检测汽车的二分类器。很显然,一个图像区域紧紧包裹着一辆汽车应该就是正例。同样的,没有汽车的就是背景区域,也就是负例。较为不明确的是怎么样标注那些和汽车部分重叠的区域,我们使用交并比的重叠阈值来解决这个问题,低于这个阈值的就是负例。这个阈值我们选择了 0.3,是在验证集上基于{0, 0.1,...0.5}通过网格搜索得到的(交叉验证)。我们发现认真选择这个阈值很重要。如果设置为0.5,就会降低平均精度均值5个点,设置为0,就会降低4个点,0也就代表正例就严格的是标注的框。

  一旦特征提取出来,应用标签数据,我们就完成了优化一类线性SVM的任务。由于训练数据太大,难以装进内存,我们选择了标注的 hard negative mining method,高难负例挖掘算法收敛很快,实践中只需要在所有图像上经过一轮训练,平均精度均值就基本停止增加了。

  在补充材料中,我们讨论了为什么微调与SVM训练中正例和负例的定义不同。我们还将讨论为什么必须训练检测分类器,而不是简单地使用经过微调的CNN的最后一层(fc8)的输出。

2.4、在PASCAL VOC 2010~2012上的结果

  按照PASCAL VOC的最佳实践步骤,我们在VOC2007的数据集上验证了我们所有的设计思路和参数处理,我们在VOC2012上训练和优化了SVM,最终结果在VOC 2010~12的数据库中的评估服务器上提交了两个结果(一个是有定位框回归,一个没有)。

  表1展示了在VOC2010的结果,我们将自己的方法同四种先进基准方法做对比,其中包括SegDPM,这种方法将DPM检测子与语义分割系统相结合并且附加的inter-detector的环境和图片检测器。更加恰当的是同Uijling的UVA系统比较,因为两种方法同样基于候选框算法。对于候选框区域的分类,他们通过构建一个四层的金字塔,并且将之与SIFT模板结合,SIFT为扩展的OpponsentSIFT和RGB-SIFT描述子,每一个向量被量化为 4000-word的codebook。分类任务由一个交叉核的SVM承担,对比这种方法的多特征方法,非线性内核的SVM方法,我们在平均精度均值达到了一个更大的提升,从 35.1%提升到53.7%,而且速度更快。我们的方法在 VOC 2011/2012测试集上达到了相似的检测效果平均精度均值 53.3%。

3、可视化、消融和模型的误差

3.1、可视化学习到的特征

  直接可视化第一层非常容易理解,他们主要捕获方向性边缘和对比色。难以理解的是后面的层,Zeiler and Fgrgus 提出了一种很棒的用于可视化的反卷积办法。我们则使用了一种简单的非参数化方法,直接展示网络学习到的东西。

  这个想法是输出网络中一个特定单元,然后把它当做一个物体检测器来使用。方法是这样的,先计算所有抽取出来的推荐区域(大约1000万),计算每个区域所导致的对应单元的激活值,然后按激活值对这些区域进行排序,然后进行最大值抑制,最后展示分值最高的若干个区域。这个方法让被选中的单元在遇到它想激活的输入时“自己说话”。我们避免平均化是为了看到不同的视觉模式和深入观察单元计算的不变性。

  我们可视化了第五层的池化层 pool5,其是卷积网络的最后一层,feature map(卷积核和特征数的总称)的大小是 6*6*256 = 9216维。忽略边界效应,每个pool5单元拥有195*195的感受野,输入227*227像素,pool5中间的单元,几乎是一个全局视角,而边缘的单元有较小的带裁切的支持。

  图3的每一行显示了pool5 单元的最高的16个激活区域情况,这个实例来自于在VOC 2007上我们调优的CNN,这里只展示了 256个单元中的6个(附录D包含更多),我们看看这些单元都学到了什么。第二行,有一个单元看到狗和斑点的时候就会激活,第三行对应红斑点,还有人脸,当然还有一些抽象的模式,比如文字和带窗口的三角结构。这个网络似乎学到了一些类别调优相关的特征,这些特征都是形状,纹理,颜色和材质特性的分布式表示。而后续的fc6层则对这些丰富的特征建立大量的组合来表达各种不同的事物。

3.2、消融研究(Ablation studies)

没有调优的各层性能

  为了理解那一层对于检测的性能十分重要,我们分析了CNN最后三层的每一层在 VOC 2007上面的结果。Pool5在3.1 中做过简短的表述。最后两层下面来总结一下。

  fc6 是一个与pool5连接的全连接层。为了计算特征,它和 pool5的 feature map(reshape成一个 9216维度的向量)做了一个 4096*9216的矩阵乘法,并添加了一个 bias 向量。中间的向量是逐个组件的半波整流(component wise half wave rectified)

   fc7是网络的最后一层,跟 fc6 之间通过一个 4096*4096 的矩阵相乘。也是添加了 bias 向量和应用了RELU。

  我们先来看看没有调优的CNN在PASCAL 上的表现,没有调优是指所在的CNN参数就是在ILSVRC 2012上训练后的状态。分析每一层的性能显示,来自于fc7的特征泛化能力不如fc6的特征。这意味着29%的CNN参数,也就是 1680万的参数可以移除掉,而且不影响平均精度均值。更多惊喜的是即使同时移除fc6和fc7,仅仅使用pool5的特征,即只使用CNN参数的6%也能有非常好的结果。可见CNN的主要表达力来自于卷积层,而不是全连接层。这个发现提醒我们也许可以在计算一个任意尺寸的图片的稠密特征图(dense feature map)时仅仅使用CNN的卷积层。这表示可以直接在 pool5 的特征上进行滑动窗口检测的实验。

调优后的各层性能

  我们现在看看调优后在VOC 2007上的结果表现。提升非常明显,平均精度均值提升了8个百分点,达到了54.2%。fc6和fc7的提升明显优于pool5,这说明 pool5从ImageNet学习的特征通用性很强,在它之上的大部分提升主要是在学习领域相关的非线性分类器。

对比最近的特征学习方法

  很少有特征学习方法应用于VOC数据集。我们找到的两个最近的方法都是基于固定探测模型。为了参照的需要,我们也将基于基本HOG的DFM方法的结果加入比较。

  第一个DPM的特征学习方法,DPM ST将HOG中加入略图表征的概率直方图。直观的,一个略图表征概率通过一个被训练出来的分类 35*35 像素路径为一个 150 略图表征的随机森林方法计算。

  第二个方法,DPM HSC,将 HOG特征替换成一个稀疏编码的直方图。为了计算HSC,在每个像素上使用一个学习到的 1007*7像素(灰度空间)原子求解稀疏编码激活,由此产生的激活以三种方式(全波和半波)整流,空间池化,L2标准化,然后进行幂运算。

  所有的RCNN变种算法都要强于这三个 DPM 方法(表2,8~10行),包括两种特征学习的方法与最新版本的 DPM方法比较,我们的平均精度均值要多大约20个百分点,61%的相对提升。略图表征与HOG相结合的方法比单纯HOG的性能高出2.5%,而HSC的方法相对于HOG提升4个百分点(当内在的与他们自己的DPM基准比较,全都是用的非公共 DPM执行,这低于开源版本)。这些方法分别达到了 29.1%和34.3%。

3.3、检测误差分析

  为了揭露出我们方法的误差模型,我们使用Hoiem提出的优秀的检测分析工具,来理解调参是怎么改变他们,并且观察相对于 DPM方法,我们的错误形式。这个分析方法全部的介绍超出了本文的介绍范围,我们建议读者查阅文献[21]来了解更加详细的介绍(例如“normalized AP”的介绍),由于这些分析是不太有关联性,所以我们放在图4和图5的题注里讨论。

3.4、定位框回归

  基于误差分析,我们使用了一种简单的方法减少定位误差,受到 DPM[17]中使用的约束框回归训练启发,我们训练了一个线性回归模型,在给定一个选择区域的pool5特征时去预测了一个新的检测窗口。详细的细节参考附录C。表1,表2 和图4的结果说明这个简单的方法修复了大量的错位情况,提升了3~4个百分点。

4、语义分割

  区域分类是语义分割的标准技术,这使得我们很容易将R-CNN 应用到PASCAL VOC分割任务的挑战。为了和当前主流的语义分割系统(称为O2P,second-order piiling[4])做对比,我们使用了一个开源的框架。O2P使用CPMC针对每张图片产生了150个区域推荐,并预测每个区域的品质,对于每个类别,进行支撑向量回归(support vector regression,SVR)。他们的方法很高效,主要得益于CPMC区域的品质和多特征类型的强大二阶池化(second -sencond pooling,SIFT和LBP的增强变种)。我们也注意到Farabet等人[16]将CNN用作多尺度逐像素分类器,在几个高密度场景标注数据集(不包括PASCAL)上取得了不错的成绩。

  我们学习[2, 4]将Haeiharan等人提供的额外标注信息补充到PASCAL分割训练集中。设计选择和超参数都在 VOC2011验证集上进行交叉验证。最后的测试结果只执行了一次。

用于分割的CNN特征

  为了计算CPMC区域上的特征,我们执行了三个策略,每个策略都先将矩形窗口变形到 227*227大小。第一个策略完全忽略区域的形状(full ignore),直接在变形后的窗口上计算 CNN特征,就和我们检测时做的一样。但是,这些特征忽略了区域的非矩形形状,两个区域也许包含相似的约束框却几乎没有重叠。因此,第二个策略(fg,foreground)只计算前景遮罩(foreground mask)的CNN特征,我们将所有的背景像素替换成平均输入,这样减去平均值后他们就会变成0。第三个策略(full+fg),简单的并联全部(full)特征和前景(fg)特征;我们的实验验证了他们的互补性。

在VOC 2011 上的结果  

  表3显示了在VOC 2011验证集上与O2P相比较时的结果(每个类别的计算结果见补充材料)。在每个特征计算策略中,FC6总是优于FC7,下面就针对FC6进行讨论,fg策略略优于full,表明掩蔽区域形状提供了更强的信号,更加符合我们的直觉。然而,full+fg 的平均精度为 47.9%,比 fg优4.2%(也稍优于O2P),这表明即使提供了FG特征,由full特征提供的上下文也包含有很多信息。值得注意的是,训练20个SVR,在我们的full+fg 特征在单核上只需要1个小时,而在O2P特征则需要10个小时。

  在表4中,我们给出了 VOC 2011测试集上的结果。将我们最佳执行方法(full + fg)与两个强大的基准算法进行比较。我们的方法在 21 个类别中的 11 个达到最高的分割精度,最高的总体分割精度为 47.9%,平均跨类别(但可能与O2P结果在任何合理的误差范围内)。通过微调可能会取得更好的成绩。

5、总结

  最近几年,物体检测陷入停滞,表现最好的检测系统是,将较为复杂的多种低层次的图像特征与高层次的物体检测器语义分类以及场景分类器相结合的方法。本文提出了一种简单并且可扩展的物体检测方法,达到了VOC 2012数据集中,相对之前最好性能的 30%的提升。

  我们取得这个性能主要通过两个方面:第一是应用了自底向上的候选框训练的高容量的卷积神经网络进行定位和分割物体。另外一个是使用在标签数据匮乏的情况下训练一个大规模神经网络的方法。我们展示了在有监督的情况下使用丰富的数据集(图片分类)预训练一个网络作为辅助性的工作是很有效的,然后采用稀少数据去调优定位任务的网络。我们猜测“有监督的预训练 + 特定领域的调优” 这一标准方法对数据稀少的视觉问题是很有效的。

  最后,我们注意到将计算机视觉中经典的工具和深度学习(自底向上的区域候选框和卷积神经网络)组合是非常重要的,否则这些成果是得不到的。不可以违背科学探索的主线,因为这两个部分是自然而且必然的结合。

致谢

  这项研究得到了DARPA Mind的Eye和MSEE计划的部分支持,由NSF授予IIS-0905647,IIS-1134072和IIS-1212798,MURI N000014-10-1-0933的支持,以及丰田的支持。 本研究中使用的GPU由NVIDIA Corporation慷慨捐赠。

标签:segmentation,semantic,VOC,特征,区域,精修,CNN,方法,我们
来源: https://blog.csdn.net/shanzsz/article/details/114442836

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有