Region Proposal by Guided Anchoring阅读笔记

Abstract

区域锚点是现代物体检测技术的基石。最先进的探测器主要依赖于密集锚定方案,其中锚点在空间域上均匀地采样,具有预定义的一组尺度和纵横比。在本文中,我们重新审视了这个基础阶段。我们的研究表明,它可以更加有效和高效地完成。 具体来说,我们提出了一个名为Guided Anchoring的替代方案,它利用语义特征来指导锚定。所提出的方法联合预测可能存在感兴趣对象的中心的位置以及不同位置处的尺度和纵横比。在预测的锚形状之上,我们通过特征适应模块减轻特征不一致性。我们还研究使用高质量提案来提高检测性能。锚定方案可以无缝集成到提议方法和检测器中。通过引导锚定,我们在MS COCO上的召回率提高了9.1%,锚点数量比RPN基线少90%。我们还采用fast R-CNN,faster R-CNN和RetinaNet中的引导锚定,分别将检测mAP提高2.2%,2.7%和1.2%。

1. Introduction

锚点是回归参考和分类候选者,用于预测建议(用于两级探测器)或最终边界框(用于单级探测器)。现代物体检测器通常以大量密集分布的锚点开始。例如,采用faster RCNN [30],一种流行的对象检测框架,它首先从一组密集的锚点生成区域提议,然后将它们分类为特定的类,并通过边界框回归来细化它们的位置。

合理的锚设计有两个通用规则:对齐和一致性。首先,要使用卷积特征作为锚表示,锚点中心需要与特征映射像素很好地对齐。其次,感受野和语义范围在特征图的不同区域是一致的,因此不同位置的锚的尺度和形状应该是一致的。滑动窗口是遵循规则的简单且广泛采用的锚定方案。对于大多数检测方法,锚由这种统一方案定义,其中特征图中的每个位置与具有预定义比例和纵横比的k锚相关联。

基于锚定的检测方法已经在基准[7,22,8,5]和现实世界系统中显示出有效性。然而,上述均匀锚固方案不一定是制备锚的最佳方式。
该方案可能导致两个困难:(1)必须针对不同问题预定义一组固定宽高比的整齐锚。 错误的设计可能会妨碍探测器的速度和精度。
(2)为了对提案保持足够高的召回率,需要大量的锚点,而大多数锚点对应于与利益对象无关的候选区域。同时,大量锚点可能导致显着的计算成本,尤其是当方法在提议阶段涉及重型分类器时。

在这项工作中,我们提出了一种更有效的方法来准备锚,目的是减轻精心挑选的先验问题。我们的方法是通过观察物体不均匀分布在图像平面上来激发的。对象的尺寸也与图像内容,场景的位置和几何形状密切相关。遵循这种直觉,我们的方法分两步生成稀疏锚点:首先识别可能包含对象的子区域,然后确定不同位置的比例和纵横比。

可学习的锚形状很有前景,但它打破了上述一致性规则,因此为学习锚定表示提供了新的挑战,以便进行准确的分类和回归,锚点的尺度和纵横比现在是可变的而不是固定的,因此,不同的特征映射像素必须学习适合相应锚点的自适应表示。为了解决这个问题,我们引入了一个有效的模块来适应基于锚几何的特征。

我们使用上述引导锚定和特征适应方案制定引导锚定区域提议网络(GA-RPN)。由于动态预测的锚点,我们的方法比采用密集锚定方案的RPN基线高9.1%的召回率,少了90%的锚点。

通过预测比例和宽高比而不是基于预定义列表来固定anchor,我们的方案可以更有效地处理高或宽对象。除了区域建议之外,引导锚固方案可以很容易地集成到任何依赖锚的探测器中。 我们的方案可以实现一致的性能提升。例如,GA-Fast-RCNN,GA-Faster-RCNN和GA-RetinaNet比通过使用滑动窗口锚定在COCO数据集提取proposal的基线上分别提高了2.2%,2.7%和1.2%的整体mAP。此外,我们探索使用高质量的proposal,并使用GARPN proposal提出微调计划,这可以提高任何训练模型的性能。例如,它仅在3个时期内将完全收敛的faster R-CNN模型从37.4%改进到39.6%。

这项工作的主要贡献在于几个方面。
(1)我们提出了一种新的锚定方案,能够预测 非密集和预定义锚之外的非均匀和任意形状的锚。
(2)我们用两个分解条件分布来制定联合锚分布,并分别设计两个模块进行建模。
(3)我们研究了将特征与相应锚点对齐的重要性,并设计了一个特征适应模块,以根据底层锚点形状细化特征。
(4)我们研究了两阶段探测器的高质量建议的使用,并提出了一种改善训练模型性能的方案。

2. Related Work

**Classical object detectors.**滑动窗口,密集图像网格广泛应用于分类器,具有悠久的历史并且在经典计算机视觉中主导对象检测领域。滑动窗口范例,其中分类器应用于密集图像网格,具有悠久的历史并且在经典计算机视觉中主导对象检测领域。许多早期进展与更强大的手工特征密切相关,如直方图梯度图(HOG)[4],SIFT [24]和积分通道特征[6]。

**Two-stage object detectors.**两阶段方法一直是现代物体检测的主导方法。第一阶段生成稀疏的对象提议集,第二阶段对提案进行分类以及细化坐标。在早期探索[13,12]中,对象提议由外部模块生成[38,33]。faster R-CNN [30]引入了区域提议网络(RPN)作为对象提议组件。它使用一个小的完全卷积网络将每个滑动窗口锚点映射到一个低维特征。这种设计在后来的两阶段方法中被广泛采用[2,20,14]。

**Single-stage object detectors.**与两阶段方法相比,单阶段管道跳过对象建议生成并在一次评估中预测边界框和类别分数。尽管省略了提议步骤,但是单阶段方法仍然使用由滑动窗口产生的锚框。例如,SSD [23]和DenseBox [16]从特征映射中密集生成锚点,并将其评估为多类RPN。RetinaNet [21]与SSD有许多相似之处,增加了focal LOSS 和特征金字塔网络(FPN)[20]来解决前景 - 背景类不平衡和小物体。YOLOv2 [29]采用滑动窗锚来进行分类和空间位置预测,以实现比其先例更高的召回率。

**Cascaded classification and regression.**已经尝试[9,10,26,35,36,37,1]应用级联架构以拒绝早期层或阶段的简单样本,并且迭代地回归边界框以用于渐进式细化。

Comparison and difference.
我们总结了所提出的方法与传统方法之间的差异如下。

  • (i)以前的方法(单级,两级和多级)主要依靠滑动窗口密集均匀的锚点。我们抛弃了滑动窗口方案并提出了一个更好的对应方法来指导锚定并生成稀疏锚点,这在以前没有被探索过。
  • (ii)级联检测器采用多个阶段逐步细化检测边界框,这通常会导致更多的模型参数和推理速度的降低。这些方法采用RoI Pooling或RoI Align来提取边界框的对齐特征,这对于提议生成或单阶段检测器而言过于昂贵。
  • (iii)无锚定方法[16,17,28]通常具有简单的管道并在单个阶段内产生最终检测结果。 由于缺乏锚点和进一步基于锚点的细化,他们缺乏处理复杂场景和案例的能力。我们的重点是稀疏和非均匀的锚定方案,并使用高质量的方案来提高检测性能。为实现这一目标,我们必须解决特定于锚定方法的错位和不一致问题。此外,[17]假设分段掩码注释作为监督,其大小预测用于对多个特定规模网络的输出进行加权求和。
  • (iv)一些单发探测器[36,34]通过多元回归和分类来改进锚点。我们的方法与它们有很大不同。 我们不会逐步细化锚点,相反,我们会预测锚点的分布,它会被分解为位置和形状。常规方法未考虑锚和特征之间的对齐,因此它们多次使锚(由[x; y; w; h]表示)回归并且破坏对齐以及一致性。相反,我们强调这两个规则的重要性,因此我们只预测锚形状,但修复锚点中心并根据预测的形状调整特征。它们的分类目标是识别锚与某些基础事实对象的重叠是否大于阈值。 但我们的位置分支是预测一个点是否靠近对象中心而不是任何特定锚点的标签。

3. Guided Anchoring

锚是现代物体检测管道的基础。 主流框架,包括两阶段和单阶段方法,主要依赖于锚的统一布置。具体而言,具有预定义尺寸和纵横比的一组锚点将部署在大小为W*H的特征图上,步长为s。该方案效率低,因为许多锚被放置在不太可能存在感兴趣对象的区域中。另外,这种手工挑选的先验不切实际地假设物体的一组固定形状(即,比例和纵横比)。在这项工作中,我们的目标是开发一种更有效的锚定方案,以便根据物体的位置和形状的不均匀分布来安排具有可学习形状的锚。引导锚定方案的工作原理如下。物体的位置和形状可以用(x; y; w; h)形式的4元组来表征,其中(x; y)是中心的空间坐标,宽度w和高度h。假设我们从给定的图像I中描绘一个对象,那么它的位置和形状可以被认为遵循以I为条件的分布,如下所示:
在这里插入图片描述
该分解捕获了两个重要的直觉:(1)给定图像,对象可能仅存在于某些区域中;以及(2)对象的形状(即比例和纵横比)与其位置密切相关。按照这个公式,我们设计了一个锚点生成模块,如图1中的红色虚线框所示。该模块是由两个分支组成的网络,分别用于位置和形状预测。给定图像I,我们首先导出特征图FI。在FI之上,位置预测分支产生指示对象的可能位置的概率图,而形状预测分支预测与位置相关的形状。给定两个分支的输出,我们通过选择预测概率高于特定阈值的位置和每个所选位置处的最可能形状来生成一组锚。由于锚形状可以变化,不同位置的特征应该捕获不同范围内的视觉内容。考虑到这一点,我们进一步引入了一个特征适配模块,它根据锚形状调整特征。上述锚生成过程基于单个特征图。物体检测的最新进展[20,21]表明,在不同层次的多个特征图上进行操作通常是有帮助的。 因此,我们还开发了一个多级锚生成方案,它按照FPN架构收集多个特征图上的锚点[20]。注意,在我们的设计中,锚生成参数在所有涉及的特征级别上共享,因此该方案是参数高效率的。

3.1. Anchor Location Prediction

如图1所示,锚位置预测分支产生与输入特征映射FI大小相同的概率图p(.|FI),其中每个P(i,j|FI)都对于与图像I上的点( ( i + 0.5 ) ∗ s , ( j + 0.5 ) ∗ s (i+0.5)*s,(j+0.5)*s (i+0.5)s,(j+0.5)s),其中s是特征图的步长,比如说两个相邻anchor之间的距离。P的值表示对象中心存在于该位置的概率。在我们的公式中,使用子网NL预测概率图p(|FI).该网络将1 * 1卷积应用于基本特征图FI以获得对象性分数的特征图,然后通过逐元素的Sigmod函数将其转换为概率值。虽然更深的子网络可以做出更准确的预测,但我们从经验上发现卷积层后面的S形变换在效率和准确度之间取得了很好的平衡。基于得到的概率图,我们然后通过选择对应概率值高于预定阈值L的那些位置来确定可能存在对象的活动区域。此过程可以过滤掉90%的区域,同时仍保持相同的召回。如图4所示,不包括天空和海洋等区域,而锚点集中在人和冲浪板周围。由于不需要考虑那些被排除的区域,我们用掩模卷积[19,31]替换随后的卷积层以获得更有效的推理。

3.2. Anchor Shape Prediction

在确定对象的可能位置之后,我们的下一步是确定每个位置可能存在的对象的形状。这是通过锚形预测分支实现的(图1(c))。此分支与传统的边界框回归非常不同,因为它不会更改锚点位置,也不会导致锚点和锚点特征之间的错位。具体地,给定特征图FI,该分支将预测每个位置的最佳形状(w; h),即,可以导致具有最近的真实边界框的最高IoU的形状。虽然我们的目标是预测宽度w和高度h的值,但我们根据经验发现直接预测这两个数字并不稳定,因为它们的范围很大。相反,我们采用以下转换:
在这里插入图片描述
形状预测分支将输出dw和dh,然后如上所述将其映射到(w; h),其中s是步幅, σ \sigma σ是经验比例因子(在我们的实验中 σ \sigma σ= 8)。这种非线性变换将输出空间从近似值[0; 1000]映射到[-1; 1],导致更容易和稳定的学习目标。在我们的设计中,我们使用子网NS进行形状预测,1*1个卷积层,其产生包含dw和dh的值的双通道映射,以及通过方程2,实现逐像素转换。

注意,该设计与传统锚定方案的不同之处在于,每个位置仅与动态预测形状的一个锚相关联,而不是与预定形状的一组锚相关联。我们的实验表明,由于位置和形状之间的密切关系,我们的方案可以实现比基线方案更高的召回率。值得注意的是,我们的方案允许任意纵横比,因此它能够更好地捕获那些极高或极宽的物体,例如火车和滑雪板。

3.3. Anchor Guided Feature Adaptation

在采用滑动窗口方案的传统RPN或单级检测器中,锚在整个特征图上是均匀的,即它们在每个位置共享相同的形状和比例。因此,特征图可以学习一致的表示。然而,在我们的方案中,锚的形状因地点而异。在这种情况下,我们发现遵循先前的约定(完全卷积分类器统一应用于特征图)[30]可能不是一个好的选择。理想情况下,大锚的特征应该在大区域上编码内容,而小锚的特征应该相应地具有较小的范围。根据这种直觉,我们进一步设计了一个锚引导特征适应组件,它将根据底层锚形状转换各个位置的特征,
在这里插入图片描述
其中 f i f_{i} fi是第i个位置的特征, ( w i , h i ) (w_{i},h_{i}) wi,hi是相关anchor的大小。对于这种依赖于位置的变换,我们采用3 *3可变形卷积层[3]来实现NT。图一中所示,首先,我们从形状分支预测偏移,然后使用可变性卷积在原始的特征图上,得到 f i ′ f^{'}_{i} fi在改编的特征之上,我们可以进行进一步的分类和边界框回归。

3.4. Training

Joint objective. 所提出的框架使用多任务损失以端到端方式进行优化。所提出的框架使用多任务丢失以端到端方式进行优化。除了传统的分类损失Lcls和回归损失Lreg之外,我们还为锚定位Lloc和锚形状预测Lshape引入了两个额外的损失,这些损失在前面的章节中有所介绍。它们通过以下损失共同优化。
在这里插入图片描述
Anchor location targets.
为了训练锚定位分支,对于每个图像,我们需要二进制标签图,其中1表示放置锚的有效位置,否则为0。在这项工作中,我们使用地面实况边界框来指导二进制标签图生成。特别是,我们希望在物体中心附近放置更多的锚,而远离中心的更少锚。首先,我们将ground-truth边界框 ( x g ; y g ; w g ; h g ) (x_{g}; y_{g}; w_{g}; h_{g}) xg;yg;wg;hg映射到相应的特征地图尺度,并获得 ( x g 0 ; y g 0 ; w g 0 ; h g 0 ) (x^{0}_{g}; y^{0}_{g}; w^{0}_{g}; h^{0}_{g}) xg0;yg0;wg0;hg0。我们将R(x; y; w; h)表示为中心为(x; y)的矩形区域和w*h的大小。预计锚点将靠近ground-truth的中心放置以获得更大的初始IoU,因此我们为每个框架定义了三种类型的区域:
(1)中心区域CR = R ( x g ′ ; y g ′ ; σ 1 w g ′ ; σ 1 h g ′ ) (x^{'}_{g}; y^{'}_{g};\sigma_{1} w^{'}_{g}; \sigma_{1} h^{'}_{g}) xg;yg;σ1wg;σ1hg定义框的中心区域。 CR中的像素被指定为正样本。
(2)IR=R ( x g ′ ; y g ′ ; σ 2 w g ′ ; σ 2 h g ′ ) (x^{'}_{g}; y^{'}_{g};\sigma_{2} w^{'}_{g}; \sigma_{2} h^{'}_{g}) xg;yg;σ2wg;σ2hg-CR 这些区域被标记忽略,在训练的时候被排除 ( σ 2 > σ 1 ) (\sigma_{2}>\sigma_{1}) σ2>σ1
(3)IR之外的区域被被标记为负样本。
以前的工作[16]提出了平衡采样的“灰色区域”,它与我们的位置目标具有相似的定义,但仅适用于单个特征图。由于我们使用FPN的多个特征级别,我们还考虑了相邻特征映射的影响。具体而言,每个级别的要素图应仅针对特定比例范围的对象,因此仅当要素图与目标对象的比例范围匹配时,才在要素图上指定CR。相邻级别的相同区域设置为IR,如图2所示.CR通常占整个特征图的一小部分,因此我们使用Focal Loss [21]来训练位置分支。

Anchor shape targets.
确定每个锚的最佳形状目标有两个步骤。首先,我们需要将锚点与ground-truth边界框匹配。 接下来,我们将计算最佳形状^ w和^ h,其可以最大化锚和匹配的地面真实边界框之间的IoU。
**Anchor shape targets.**确定每个锚的最佳形状目标有两个步骤。首先,我们需要将锚点与地面实况边界框匹配。 接下来,我们将计算最佳形状 w和 h,其可以最大化锚和匹配的ground-truth边界框之间的IoU。先前的作品[30]将候选锚分配给地面真实边界框,其产生具有锚的最大IoU值。 但是,这个过程不适用于我们的情况,因为我们的锚点的w和h不是预定义的而是变量。为了克服这个问题,我们在变量锚 a w h a_{wh} awh=(x_{0}; y_{0}; w; h)和地面实况边界框gt = ( x g ; y g ; w g ; h g ) (x_{g}; y_{g}; w_{g}; h_{g}) xg;yg;wg;hg之间定义IoU,如下所示,表示为vIoU。
在这里插入图片描述

其中IoUnormal是IoU的典型定义,w和h是变量。注意,对于任意锚位置(x0; y0)和地面实况gt,vIoU(awh; gt)的分析表达式是复杂的,并且难以在端到端网络中有效地实现。因此,我们使用另一种方法来近似它。 给定(x0; y0),我们采样w和h的一些常见值来模拟所有w和h的枚举。然后我们用gt计算这些采样锚点的IoU,并使用最大值作为vIoU( a w h a_{wh} awh gt)的近似值。在我们的实验中,我们采样9对(w; h)不同尺度和纵横比作为准确性和效率的权衡。我们最终将位置(x0; y0)分配给产生最大vIoU的ground-truth实况。而不是直接回归最佳形状^ w和^ h,我们采用有界iou损失[32]的变体来最大化锚点和相应的地面实况边界框之间的IoU。损失定义与原始paper几乎相同,只是我们只优化w和h,因为锚位置是固定的。

在这里插入图片描述

3.5. The Use of High-quality Proposals

通过所提出的引导锚定方案(GA-RPN)增强的RPN可以产生比传统RPN更高质量的提议。我们通过使用如此高质量的建议,探索如何提高传统两级探测器的性能。首先,我们研究由RPN和GA-RPN生成的提案的IoU分布,如图3所示.GA-RPN提案相对于RPN提案有两个显着优势:(1)积极提案的数量较大,(2)高IoU提案的比例更为显着。一个直截了当的想法是用现有的GA-RPN替换现有模型中的RPN,并对端到端的模型进行训练。然而,这个问题并非易事,并且采用与以前完全相同的设置只能带来有限的增益(例如,小于1点)。 根据我们的观察,使用高质量建议的先决条件是根据提案分布调整培训样本的分布。因此,我们设置了更高的正/负阈值,并且在训练使用GARPN的探测器与RPN相比时使用更少的样本。除了端到端培训,我们发现GA-RPN提议能够通过微调计划来提升训练有素的两阶段探测器。
在这里插入图片描述

4. Experiments

4.1. Experimental Setting

Dataset. 我们在具有挑战性的MS COCO 2017基准测试中进行实验[22]。
Implementation details. 如果没有另外说明,我们使用ResNet-50 [15]和FPN [20]作为所有实验的骨干网络。作为一种常见的惯例,我们将图像调整为1333 * 800的比例,而不改变宽高比。设置KaTeX parse error: Expected 'EOF', got '\lmabda' at position 45: …,\lambda_{1}=1,\̲l̲m̲a̲b̲d̲a̲_{2}=0.1.我们使用8个GPU的同步SGD,每个小批量共有16个图像(每个GPU 2个图像)。我们总共训练12个时期,初始学习率为0.02,并且在8和11时刻将学习率降低0.1。 运行时在TITAN X GPU上测量。
**Evaluation metrics.**使用平均召回(AR)测量RPN的结果,平均召回(AR)是不同IoU阈值(从0.5到0.95)的召回的平均值。 每图像的100,300和1000个提议的AR表示为AR100,AR300和AR1000。针对100个提议计算用于小型,中型和大型对象(ARS,ARMARL)的AR。 使用标准COCO度量评估检测结果,其将IoU的mAP平均值从0.5到0.95。

4.2. Results

我们首先通过比较GA-RPN与RPN基线的回忆和先前最先进的区域提议方法来评估我们的锚定方案。 同时,我们与RPN的一些变体进行比较。 “RPN + 9锚点”在每个特征级别使用3个比例和3个宽高比进行广泛注释,而基线仅使用1个比例和3个宽高比,[20]。“RPN +迭代”表示连续应用两个RPN头,它们之间有另外的3*3个卷积层. “RefineRPN”表示与[36]类似的结构,其中锚点在FPN之前和之后被回归并分类两次。
如表1所示,我们的方法大大优于RPN基线。 具体而言,AR300分别提高了10.5%和AR1000提高了9.1%。 值得注意的是,具有较小骨干网络的GARPN可以实现比具有较大骨干网络的RPN高得多的召回率。我们令人鼓舞的结果得到了图4所示的定性结果的支持,其中我们展示了稀疏和任意形状的锚点,并可视化两个分支的输出。据观察,锚点更多地集中在物体上,并为随后的物体提议提供了良好的基础。在图5中,我们展示了在滑动窗锚定和引导锚定时生成的提议的一些示例。
在这里插入图片描述
在这里插入图片描述
迭代回归和分类(“RPN +迭代”和“RefineRPN”)仅为RPN带来有限的增益,这证明了上述对齐和一致性规则的重要性,并且简单地多次精炼锚点是不够有效的。 保持锚的中心固定并基于锚形状调整特征是重要的。
为了研究导向锚定的泛化能力及其提高检测性能的能力,我们将其与两阶段和单阶段检测管道相结合,包括Fast R-CNN [12],Faster R CNN [30]和RetinaNet [21]。对于两级探测器,我们用GA-RPN替换原始RPN,对于单级探测器,滑动窗锚定方案用建议的导向锚定替换。表2中的结果表明,引导锚定不仅增加了RPN的提议召回,而且大大提高了检测性能。 通过引导锚固,这些探测器的mAP分别提高2.3%,2.7%和1.2%。
为了进一步研究高质量提案的有效性并调查微调方案,我们采用完全融合的更快的R-CNN模型,并使用预先计算的RPN或GA-RPN提议对其进行微调。 我们将探测器微调3个时期,学习率分别为0.02,0.002和0.0002。 表3中的结果说明RPN提议不能带来任何收益,而高质量的GA-RPN提案为训练模型带来2.2%的mAP改进,仅花费3个时期的时间成本。
在这里插入图片描述

4.3. Ablation Study

Model design. 我们在设计中省略了不同的组件来研究每个组件的有效性,包括位置预测,形状预测和特征适应。结果显示在表4中。形状预测分支显示有效,其导致4.2%的增益。 位置预测分支带来了微小的改进。然而,这个分支的重要性反映在它获得稀疏锚点的有用性上,从而导致更有效的推理。特征适应模块带来的明显增益表明需要根据预测的锚形状重新排列特征图。此模块有助于捕获与锚范围相对应的信息,尤其是对于大对象。
Anchor location. 位置阈值L控制锚分布的稀疏性。 采用不同的阈值将产生不同数量的锚。为了揭示L对效率和性能的影响,我们改变阈值并比较以下结果:每个图像的平均锚点数,最终提议的召回和推理运行时间。从表5中我们可以观察到大多数背景区域的对象性得分接近0,因此小L可以大大减少锚点数量超过90%,而召回率仅略有下降。 值得注意的是,RPN中的头部只是一个卷积层,因此加速不明显。然而,锚的数量的显着减少提供了使用较重的头部执行更有效推断的可能性。
在这里插入图片描述
Anchor shape. 我们将我们方法生成的锚点集与预定义形状的滑动窗口锚点进行比较。由于我们的方法仅预测特征图的每个位置处的一个锚而不是不同尺度和纵横比的k(我们的基线中的k = 3)锚,因此总锚号减少1 / k。我们在图6中展示了具有滑动窗锚的锚的尺度和纵横比分布。结果表明,引导锚固方案相对于预定义的锚尺度和形状具有很大的优势。预测的锚点覆盖更广泛的尺度和纵横比,其具有与地面实况对象类似的分布,并提供具有更高覆盖ground-truth对象的初始锚点池。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值