论文学习笔记:CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes

CSRNet是2018年提出来的人群计数模型,其论文发表于CVPR会议。
论文链接:CSRNet

Abstract 摘要

我们提出了一个拥挤场景识别网络CSRNet,它提供了一种数据驱动的深度学习方法,可以理解高度拥挤的场景,进行精确的计数估计,并提供高质量的密度图。我们提出的CSRNet由两个主要部分组成:一个是作为二维特征提取的前端卷积神经网络(即模型中的前端网络frontend ),另一个是用于后端的扩展CNN(后端网络backend),它使用扩展的核(空洞卷积操作)来传递更大的感受野,并代替池化操作。因为CSRNet的全卷积结构,所以它是一个很容易训练的模型。我们在四个数据集(ShanghaiTech dataset, the UCF CC 50 dataset,the WorldEXPO’10 dataset, and the UCSD dataset)上的结果均是当前最高水平(the state-of-the-art)。在ShanghaiTech Part B dataset中,CSRNet的平均绝对误差(MAE)比以前的先进方法低47.3%。我们还扩展了目标应用程序来计算其他对象,例如TRANCOS数据集中的车辆。结果表明,CSRNet显著提高了输出质量,相比于之前的state-of-the-art,MAE降低了15.4%。

一、Introduction 介绍

越来越多的网络模型被开发出来,为人群流量监控、人群管理(原文词语是assembly controlling,不知道怎么翻译)和其他安全服务提供了有效的解决方案。现有的拥挤场景分析方法从简单的人群统计(输出目标图像中的人数)发展到密度图呈现(显示人群分布特征)[6]。这种发展符合现实生活应用的需求,因为相同数量的人群可能有完全不同的人群分布(如图1所示),因此仅仅计算人群数量是不够的。密度分布图有助于我们获得更准确和全面的信息,这对于在踩踏和暴乱等高风险环境下做出正确决策至关重要。然而,如何生成准确的密度分布图是一个挑战。一个主要的困难来自于预测方式:由于生成的密度值遵循逐像素的预测,因此输出的密度图必须包含空间相关性,以便能够呈现最近像素之间的平滑过渡。另外,由于场景的多样性,如不规则的人群聚集和不同的摄像机视角,在没有深度神经网络(DNN)而使用传统方法时会使任务变得十分困难。拥挤场景分析的最新发展依赖于基于深度神经网络的方法,因为它们在语义分割任务中获得了很高的精度,并且在视觉显著性检测(visual saliency)方面取得了明显的进步。使用深度神经网络(DNN)的额外好处来自于热情的硬件社区,DNN在GPU、FPGA和ASIC上得到了快速的发展和研究实现,其中,在低功耗、小尺寸的监控设备中部署拥塞场景分析方案是十分适宜的。

在这里插入图片描述

图一:第一行的图片显示了ShanghaiTech Part B数据集中包含95人的三张图片,但空间分布完全不同。第二排的图片显示了它们的密度图。

以往的拥挤场景分析大多是基于多尺度体系结构。他们在这个领域已经取得了很高的性能,但是他们所使用的设计也带来了两个显著的缺点:训练时间太长和分支结构不有效(例如MCNN网络)。我们设计了一个实验来证明MCNN并没有比表1中更深层、更规则的网络表现更好。论文(Single-image crowd counting via multi-column convolutional neural network)中使用MCNN的主要原因是不同尺寸的卷积滤波器提供了灵活的感受野。直观地说,MCNN的每一列都是针对一定程度的拥挤场景。然而,使用MCNN的效果可能并不显著。我们展示图2来说明MCNN中由三个独立列(代表大、中、小接收野)学习的特征,并用ShanghaiTech Part A数据集对其进行评估。图中的三条曲线说明这三个独立列在50个具有不同拥挤密度的测试用例中有着非常相似的结果(估计的错误率),这意味着这种分支结构中的每一列学习到了几乎相同的特征。它违背了MCNN设计的初衷,即每个列学习不同的特性。

在这里插入图片描述

图二:利用MCNN的三个预训练列对ShanghaiTech Part A数据集中50个样本的误差估计。Small、Medium、Large分别代表MCNN中具有小、中、大内核的列。

在本文中,我们设计了一个更深层次的网络CSRNet来计算人群数量并生成高质量的密度图。与一些最新的使用深度CNN作为附加的工作不同,我们专注于设计一个基于CNN的密度图生成器。我们的模型使用纯卷积层作为主干来支持具有灵活分辨率的输入图像。为了限制网络的复杂度,我们在所有层中使用小尺寸的卷积滤波器(如3×3)。我们将VGG-16[21]的前10层作为前端,将空洞卷积层(dilated convolution layers)作为后端,以扩大感受野并在不丢失分辨率的情况下提取更深层的特征(因为不使用池化层)。

在这里插入图片描述

表一:为了证明MCNN可能不是最好的选择,我们设计了一个更深的,单列的网络,与MCNN相比参数更少。拟建小型网络的架构为:CR(32,3)−M−CR(64,3)−M−CR(64,3)−M−CR(32,3)−CR(32,3)−CR(1,1)。CR(m,n)表示具有m个滤波器的卷积层,其大小为n×n,然后是ReLu层。M是最大池层。结果表明,在ShanghaiTech Part A数据集上,单列版本获得了更高的性能和更低的MAE、MSE。

利用这种创新结构,相比于CP-CNN网络结构,我们在ShanghaiTech Part A, Part B, UCF CC 50, and WorldExpo’10 数据集中的平均绝对误差(MAE)分别降低了7%、47.3%、10.0%和2.9%。在将这项工作扩展到基于TRANCOS数据集的车辆计数之后,我们实现了比当前最佳方法FCN-HA低15.4%的MAE。

本文其余部分的结构如下:Sec.2 介绍了以往人群计数和密度图生成的工作。Sec.3 介绍了本模型的体系结构和参数设置。 Sec.4 给出了几个数据集的实验结果。 Sec.5 总结论文

二、Related work 以往研究

遵循Loy[25]等人提出的观点:人群场景分析的潜在解决方案可分为三类:基于检测的方法、基于回归的方法和基于密度估计的方法。通过与深度学习相结合,基于CNN的解决方案在这一任务中表现出更强的能力,并优于传统方法。

2.1 Detection-based approaches 基于检测的方法

早期的研究大多集中在基于检测的方法上,使用类似于移动窗口的检测器来检测人并计算人数[26]。这些方法需要训练有素的分类器从整个人体中提取低层次的特征(如Haar wavelets[27]和HOG(histogram oriented gradients)[28])。但是,由于大多数目标对象都被遮挡,因此它们在高度拥挤的场景中表现不佳。为了解决这个问题,研究人员检测特定的身体部位而不是整个身体来完成人群场景分析[29]。

2.2 Regression-based approaches 基于回归的方法

由于基于检测的方法不能适应高度拥挤的场景,研究人员尝试采用基于回归的方法从裁剪的图像块中学习提取特征之间的关系,然后计算特定对象的数目。更多的特征,例如前景和纹理特征,已经被用于生成低级信息[30]。遵循类似的方法,Idrees等人[22]提出了一种利用傅立叶分析和基于关键点筛选[31]的特征提取模型。

2.3 Density estimation-based approaches 基于密度估计的方法

在进行基于回归的解决方案时,忽略了一个称为saliency的关键特性,这会导致局部区域的结果不准确。Lempitsky等人[32]提出了一种通过学习局部区域特征与其对象密度映射之间的线性映射来解决这个问题的方法。它整合了学习过程中的显著性(saliency)信息。由于理想线性映射很难获得,Pham等人[33]使用随机森林回归来学习非线性映射,而不是线性映射。

2.4 CNN-based approaches 基于卷积神经网络的方法

文献也都集中在基于CNN的密度图预测方法上,因为它在分类和识别方面取得了成功[34,21,35]。在Walach和Wolf[36]的工作中,他们使用了一种选择性采样(selective sampling,可能是空洞卷积操作的灵感来源)和layered boosting(暂时不知道怎么翻译)的方法。而不是使用基于块分割(patch-based)的训练。Shang等人[37]尝试使用CNNs的端到端回归方法,该方法将整个图像作为输入,并直接输出最终的人群计数。Boominanathan等人[19]的 第一个工作是纯粹使用卷积网络和双列结构来生成密度图。Marsden等人[38]探索单列全卷积网络而Sindagi等人[39]提出了一种多列卷积神经网络MCNN来预测人群密度。Onoro和Sastre[20]也有类似的想法,他们提出了一种称为Hydra-CNN结构的尺度感知计数模型用于密度估计。很明显,基于CNN的解决方案的性能优于Sec2.1-2.3中提到的方法。

2.5 Limitations of the state-of-the-art approaches 最新方法的局限性

最近Sam等人[4] 提出了一种利用密度级分类器来选择不同的回归因子的Switch-CNN算法。辛达吉等人[5] 提出了一个上下文金字塔CNN( Contextual Pyramid CNN),它使用CNN网络来估计不同层次的上下文,以获得更低的计数误差和更好的质量密度图。这两个解决方案都达到了the state-of-the-art,并且都使用了基于多列的体系结构(MCNN)和密度级分类器。然而,我们观察到这些方法的几个缺点:(1)根据文献[18]中描述的训练方法,多列cnn难以训练。这种臃肿的网络结构需要更多的时间来训练。(2) 多列CNN引入了冗余结构,如我们在Sec.1中所说,不同列似乎表现相似,没有明显差异。(3) 两种解决方案都需要在发送图片之前使用密度级分类器(density level classification )。然而,在实时拥挤场景分析中,由于目标数目变化幅度很大,密度级别的粒度很难定义。此外,使用细粒度分类器意味着需要实现更多的列,这使得设计更加复杂,并导致更多冗余。(4) 这些工作花费了大量的密度级分类参数来标记输入区域,而不是为最终的密度图生成分配参数。由于MCNN的分支结构效率不高,生成密度图所需参数的缺乏降低了最终精度。考虑到这些缺点,我们提出了一种新的方法来集中精力对拥挤场景中的深层特征进行编码并生成高质量的密度图。

三、Proposed Solution

我们的基本思想是设计一个更深层次的CNN,以获取具有更大接收野的高级特征,并生成高质量的密度图,而不会野蛮地扩展网络复杂性。在这一部分中,我们首先介绍了我们提出的体系结构,然后给出了相应的训练方法。

3.1 CSRNet architecture

借鉴文献[19,4,5]中类似的思想,我们选择VGG16[21]作为CSRNet的前端,因为它具有较强的迁移学习能力和灵活的结构,可以方便地将后端连接起来生成密度图。在CrowdNet[19]中,作者直接从VGG-16开始切割前13层,并添加1×1卷积层作为输出层。而没有修改的模型会导致性能非常差。其他体系结构,例如文献[4]中使用VGG-16作为密度级分类器,在将输入图像发送到MCNN最合适的列之前对其进行标记,而CP-CNN[5]则将分类结果与密度图生成器的特征相结合。在这些情况下,VGG-16作为辅助执行,而不会显著提高最终精度。本文的CSRNet模型首先去除了VGG16的全连接层部分,然后在VGG-16中加上了全卷积层。这个前端网络的输出大小是原始输入大小的1/8。如果我们继续叠加更多的卷积层和池层(VGG-16中的基本组件),输出大小将进一步缩小,并且很难生成高质量的密度图。受文献[10,11,40]的启发,我们尝试将空洞卷积层作为后端,以提取更深层的显著性信息,同时保持输出分辨率。

3.1.1Dilated convolution 空洞卷积

我们设计的关键部件之一是空洞卷积层。二维空洞卷积可定义为:
在这里插入图片描述
y(m,n)是输入x(m,n)和滤波器w(i,j)的空洞卷积输出,其长度和宽度分别为m和n。参数r是空洞率(dilation rate)。如果r=1,空洞卷积变为正常卷积。

在分割任务中,空洞的卷积层已经被证明可以显著提高精度[10,11,40],它是池化层的一个很好的替代方案。虽然池化(如最大池化和平均池化)被广泛用于保持不变性和控制过拟合,但它们也会显著降低空间分辨率,意味着特征地图的空间信息丢失。反卷积层[41,42]可以减轻信息的丢失,但是额外的复杂性和执行延迟可能并不适合所有情况。空洞卷积是一个更好的选择,它使用稀疏核(如图3所示)来替代池化层和卷积层的组合。这种特性使得网络在不增加参数数目或计算量的情况下扩大了感受野(例如,增加更多的卷积层可以使感受野变大,但会引入更多的运算)。在空洞卷积中,一个带有k×k滤波器的小核函数被放大到k+(k−1)(r−1),从而可以在保持相同分辨率的前提下灵活地聚合多尺度上下文信息。如图3所示,正常卷积得到3×3的感受野,两个扩张的卷积分别提供5×5和7×7的感受野。

在这里插入图片描述
在保持特征图分辨率方面,与卷积层+池化层+反卷积层方案相比,空洞卷积具有明显的优势。我们在图4中选取一个例子进行说明。输入是一个群体的图像,通过两种方法分别处理,以产生相同大小的输出。在第一种方法中,输入被一个因子为2的最大池层进行下采样,然后将其送到一个 3×3 卷积层。由于生成的特征图仅为原始输入的1/2,因此需要通过反卷积层(双线性插值)进行上采样。在另一种方法中,我们尝试空洞卷积,并将相同的 3×3 卷积核应用于因子为2的空洞核。输出与输入共享相同的维度(这意味着不需要池化和反卷积层)。最重要的是,空洞卷积的输出包含更详细的信息(指我们放大的部分)。
在这里插入图片描述

图4:空洞卷积与最大池化层、卷积层和上采样的比较。两种运算都使用3×3的卷积核,空洞率为2。

3.1.2 Network Configuration 网络结构

我们在表3中提出了四种前端结构相同但后端空洞率不同的网络配置。在前端方面,我们采用VGG-16网络[21](去掉全连接层),并且只使用3×3内核。根据文献[21]的研究,当针对相同大小的感受野时,使用更多的小核卷积层比使用更少的层和更大的核更有效。

通过移除全连接层,我们试图从VGG-16中确定需要使用的层数。最关键的部分取决于准确性和资源开销(包括训练时间、内存消耗和参数数量)之间的权衡。实验表明,当VGG-16[21]的前10层只保留3层池化层而不是5层时,可以实现最佳的折中效果,以抑制池化操作对输出精度的不利影响。由于CSRNet的输出(密度映射)较小(输入尺寸的1/8),我们选择了因子为8的双线性插值进行缩放,并确保输出与输入图像具有相同的分辨率。在相同的大小下,CSRNet生成的结果与使用PSNR(Peak Signal-to-Noise Ratio)和SSIM(Structural Similarity in Image [43])的真实性结果具有可比性。
在这里插入图片描述

表3:CSRNet的网络结构。所有卷积层都使用填充来保持先前的大小,卷积层的参数表示为“conv-(核大小)-(滤波器数目)-(空洞率)”,最大池化层在2×2像素窗口上进行,步长为2。

3.2 Training method

在本节中,我们将提供CSRNet网络进行训练的具体细节。通过利用常规的CNN网络(没有分支结构),CSRNet易于实现和快速部署。

3.2.1 Ground truth generation

根据文献[18]中的密度图生成方法(MCNN提出的密度图生成方法),我们使用几何自适应核来处理高度拥挤的场景。通过使用高斯核(标准化为1)对每个头部注释进行模糊处理,然后考虑每个数据集所有图像的空间分布并生成真实图像。几何自适应核定义为:
在这里插入图片描述
对于真实图像δ中的每个目标对象xi,我们使用di求平均来表示其与最近k个邻居的平均距离。我们用参数为σi的高斯核卷积δ(x,x)来生成密度图,其中x是图像中像素点的位置。在实验中,我们遵循文献[18]中给出的参数:β=0.3,k=3。对于稀疏人群的输入,我们将高斯核函数调整为平均头部大小以模糊所有注释。不同数据集的设置如表2所示。
在这里插入图片描述
(编者注:后续将会有关于人群计数中密度图生成方法的详细讲解)

3.2.2 Data augmentation

我们从每幅图像的不同位置裁剪9个块(patch),大小为原始图像的1/4。前四个patches包含图像的四分之四,没有重叠,而其他五个patches则从输入图像中随机裁剪。之后,我们对patches进行镜像变换操作使我们的训练集加倍。

3.2.3 Training details

我们使用一种简单的方法将CSRNet训练为端到端结构。前10个卷积层由训练有素的VGG-16微调而成[21]。对于其他层,初始值来自0.01标准偏差的高斯初始化。训练时采用随机梯度下降法(SGD),学习速率固定在1e-6。此外,我们选择欧式距离来衡量真实密度图和我们生成的预测密度图之间的差异。(此方法和文献[19,18,4]是一样的)损失函数如下:
在这里插入图片描述
其中N为训练批的大小,Z(Xi;Θ)为CSRNet生成的输出,参数为Θ。Xi表示输入图像,而Z GT是输入图像Xi的真实结果。(这里使用的是L2损失函数,即MSEloss)

四、Experiments

我们在五个不同的公共数据集中展示了我们的方法[18,3,22,23,44]。与以前最先进的方法[4,5]相比,我们的模型更小,更精确,更容易训练和构建。在这一部分中,我们介绍了评估指标,然后在ShanghaiTech Part A 数据集上进行了消融实验(ablation study可自行百度),以分析我们模型的结构(如表3所示)。在消融研究的同时,我们评估并比较了我们提出的方法和之前在所有这五个数据集中最先进的方法。我们模型的实现基于Caffe框架[13]。

4.1 Evaluation metrics 评价指标

MAE和MSE用于评估,其定义如下:
在这里插入图片描述
(评价指标这一块儿不再多说,现在大部分人群计数领域的论文基本都是用MAE和MSE作为评估模型的指标)

我们还利用PSNR和SSIM对ShanghaiTech Part A 数据集输出密度图的质量进行了评价。为了计算PSNR和SSIM,我们遵循文献[5]中给出的预处理方法,包括密度图的大小调整(与原始输入相同大小),并对真实密度图和预测密度图进行插值和归一化。

4.2 Ablations on ShanghaiTech Part A

通过在ShanghaiTech Part A数据集上的消融实验,最后确定了模型CSRNet-B的效果最好,所以后续的实验均使用CSRNet-B结构
在本小节中,我们使用ShanghaiTech Part A数据集[18]对CSRNet的四种配置进行了分析,该数据集是一个新的大规模人群统计数据集,包括482张拥挤场景的图像,共有241667人被标记。由于场景极其拥挤,视角多变,分辨率不固定,从这些图像中进行计数是一项挑战。这四种配置如表3所示。CSRNet-A是所有空洞率为1的网络。CSRNet-B和D在其后端分别保持2和4的空洞率,而CSRNet-C则合并了2和4的空洞率。这四种模型的参数数目均为16.26M,我们打算用不同的空洞率来比较结果。在使用Sec. 3.2中方法对ShanghaiTech Part A数据集进行训练后,我们使用Sec. 4.1中提出的指标进行评估。我们尝试使用dropout方法[45]以防止潜在的过拟合问题,但没有明显的提升,所以我们模型中不使用dropout。详细的评估结果如表4所示,其中CSRNet-B的误差最小(精度最高)。因此,我们使用CSRNet-B作为后续实验的CSRNet。
在这里插入图片描述

4.3 Evaluation and comparison 评估和比较

4.3.1 ShanghaiTech dataset

ShanghaiTech人群统计数据集包含1198幅注释图像,总人数为330165人[3]。该数据集由两部分组成:a部分包含482幅从互联网上随机下载的高度拥挤场景的图像;B部分包括716幅从上海街道采集的人群场景相对稀疏的图像。我们使用该数据集对我们的方法进行了评估,并与最近的六项研究进行了比较,结果如表5所示。结果表明,与其他方法相比,我们的方法在A部分达到了最低的MAE(最高的精确度),并且我们得到的MAE比最先进的CPCNN低7%。与CP-CNN相比,CSRNet在B部分的MAE也降低了47.3%。为了评估生成的密度图的质量,我们将我们的方法与MCNN和CP-CNN使用Part A数据集进行比较,并遵循Sec. 3.2中的评估指标。测试用例的样本可以在图5中找到。结果如表6所示,CSRNet达到了最高的SSIM和PSNR。我们还将ShanghaiTech数据集的质量结果汇总至表11。
在这里插入图片描述

在这里插入图片描述

图5:第一行显示了ShanghaiTech Part A数据集中的测试集样本。第二行显示每个样本的真实情况,第三行显示CSRNet生成的密度图。

在这里插入图片描述

4.3.2 UCF CC 50 dataset

UCF CC 50数据集包括50幅不同透视和分辨率的图像[22]。每张图片的注释人数从94人到4543人,平均1280人。按照[22]中的标准设置进行5倍交叉验证。MAE和MSE的结果比较见表7,生成的密度图质量见表11。
在这里插入图片描述

4.3.3 The WorldExpo’10 dataset

世博会的10个数据集[3]由3980个注释帧组成,这些帧来自108个不同的监控摄像机拍摄的1132个视频序列。该数据集分为训练集(3380帧)和测试集(600帧),分别来自五个不同的场景。整个数据集提供感兴趣区域(ROI)。在重新处理过程中,每一帧及其点图都被ROI覆盖,我们按照第3.2节中的说明训练我们的模型。结果见表8。所提出的CSRNet在5个场景中有4个达到了最佳精度,并且平均达到了最佳精度。
在这里插入图片描述

4.3.4 The UCSD dataset

UCSD数据集[23]有2000帧被监控摄像机捕捉。这些场景包含了稀疏的人群,每张图片从11人到46人不等。还提供了感兴趣区域(ROI)。由于每帧的分辨率固定且较小(238×158),在频繁的池化操作后很难生成高质量的密度图。因此,我们使用双线性插值对帧进行预处理,将其调整为952×632。在2000帧中,我们使用帧601到1400作为训练集,其余帧作为测试集。在模糊注释之前。3.2,所有的帧和对应的点地图都用ROI进行了屏蔽。运行UCSD数据集的精度如表9所示,我们的性能优于MCNN之外的其他大多数方法。实验结果表明,该方法不仅可以对高度密集的人群执行计数任务,而且可以对相对稀疏的场景执行计数任务。此外,我们在表11中提供了生成的密度图的质量。
在这里插入图片描述

4.3.5 TRANCOS dataset

除了人群统计之外,我们还在TRANCOS数据集[44]上进行了车辆计数实验,以证明我们方法的鲁棒性和通用性。TRANCOS是一个公共交通数据集,包含1244张不同拥挤交通场景的图像,这些图像由46796辆带注释车辆的监控摄像头拍摄。此外,还为评估提供了感兴趣区域(ROI)。图像的透视图不是固定的,图像是从不同的场景中收集的。网格平均绝对误差(GAME)[44]用于本测试的评估。(由于研究内容不同,此部分定义内容不做翻译,有需求可自行查阅论文)

我们将我们的方法与以前最先进的方法进行了比较[47,32,20,24]。[20]中的方法使用类MCNN网络来生成密度图,而[24]中的模型采用了完全卷积神经网络(FCN)和长短期记忆网络(LSTM)的组合。结果如表10所示,图6中有三个示例。我们在四个不同的GAME中都取得了显著的改进。与[20]的结果相比,CSRNet的GAME分别降低了67.7%(0),降低了60.1%(1),降低了48.7%(2),降低了22.2%(3),是最好的解决方案。表11中还显示了生成的密度图的质量。
在这里插入图片描述
在这里插入图片描述

(图11是该模型在不同数据集下进行测试的结果,指标分别使用PSNR和SSIM)
在这里插入图片描述

五、Conclusion

在这篇论文中,我们提出了一个新的架构称为CSRNet,以一个容易训练的端到端方法来进行人群计数和高质量的密度图生成。我们使用空洞卷积层来融合拥挤场景中的多尺度上下文信息。利用空洞卷积层的优势,CSRNet可以在不损失分辨率的情况下扩大感受野。我们在四个人群统计数据集中展示了我们的模型,并展示了最先进的性能。我们还将我们的模型扩展到车辆计数任务中,我们的模型也达到了最好的精度。

六、Acknowledgement

这项工作得到了IBM-Illinois Center for Cognitive Computing System Research (C3SR)的支持,C3SR是IBM AI Horizons Network的一部分。

七、Write in the end

以上是对论文《CSRNet: Dilated Convolutional Neural Networks for Understanding the Highly Congested Scenes》的完整中文翻译内容,采取的方法是机翻+人工修正。如果此文有任何翻译不正确或者读者有不理解的地方,欢迎在底下评论区留言,编者看到了一定会进行回复。

后续的工作包括人群计数密度图生成方法的讲解,相关模型代码的复现等等,已经撰写完成的文章会在下方加上链接。

密度图生成方法:https://blog.csdn.net/qq_40356092/article/details/108140273

  • 13
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值