FairMOT论文解读

论文地址:https://arxiv.org/abs/2004.01888

摘要

近年来,作为多目标跟踪的核心组件的目标检测和重新识别取得了显着进展。 但是,很少有人关注在单个网络中完成两项任务以提高推理速度。 沿此路径进行的初始尝试最终导致结果降低,这主要是因为未正确学习重新标识分支。 在这项工作中,我们研究了故障背后的根本原因,并因此提出了解决问题的简单基准。 它以30 fps的速度远远超过了公共数据集的最新水平。 我们希望这个基准可以启发并帮助评估该领域的新想法。 可以在https://github.com/ifzhang/FairMOT获得代码和经过预训练的模型。
关键字:一次性MOT,简单基准,无锚点

1 引言

多目标跟踪(MOT)已经成为计算机视觉领域的长期目标[3,37,6,40]。目的是估计视频中多个感兴趣对象的轨迹。成功完成任务可以使许多应用程序受益,例如动作识别,公共安全,运动视频分析,老人护理和人机交互。
最先进的方法[23,46,11,3,37,6,40]通常通过两个单独的模型解决该问题:检测模型首先通过对图像中的框进行边界来定位感兴趣的对象,以及然后,关联模型为每个边界框提取重新标识(Re-ID)特征,并根据在特征上定义的某些度量将其链接到现有轨道之一。近年来,分别在对象检测[27,12,44,26]和Re-ID [43,6]上取得了显着进步,这反过来又提高了跟踪性能。但是,这些方法无法以视频速率执行推理,因为两个网络不共享功能。
随着多任务学习的成熟[15],联合检测物体并学习Re-ID特征的一键式方法开始引起人们的更多关注[35,33]。 由于两个模型共享大多数功能,因此它们有可能显着减少推理时间。 然而,与两步法相比,单步法的准确性通常会显着下降。 特别是,ID开关的数量增加了很多,如实验部分所示。 结果表明,将这两项任务结合起来并非易事,应谨慎对待。 我们没有使用大量技巧来提高跟踪准确性,而是研究了失败的原因,并提出了一个简单而有效的基准。 确定了对跟踪结果至关重要的三个因素。
(1)锚不适合Re-ID。当前的单发跟踪器[35,33]都是基于锚的,因为它们是从对象检测器[26,12]修改而来的。 但是,锚有两个原因不适合学习Re-ID功能。 首先,对应于不同图像补丁的多个锚点可能负责估计同一对象的身份。 这导致网络的严重歧义。 有关说明,请参见图1。 此外,功能图通常会下采样8次以平衡准确性和速度。 这对于检测是可以接受的,但对于ReID来说太粗糙了,因为对象中心可能与在粗略锚点位置提取的用于预测对象身份的特征不对齐。 我们通过将MOT问题作为高分辨率特征图之上的像素级关键点(对象中心)估计和身份分类问题来解决该问题。
在这里插入图片描述
图1(a)黄色和红色的锚点负责估计相同的ID(穿蓝色衬衫的人),尽管图像补丁非常不同。 此外,基于锚的方法通常在粗网格上运行。 因此,很有可能在锚点(红色或黄色星形)提取的特征未与对象中心对齐。 (b)免锚的做法受歧义的影响较小。

(2)多层特征聚合。这对于MOT尤为重要,因为Re-ID功能需要利用低级和高级功能来容纳大小对象。 我们在实验中观察到,由于提高了处理标度变化的能力,因此这有助于减少一次性方法的身份切换。 请注意,对于两步方法而言,改进并不那么重要,因为在裁剪和调整大小操作之后,对象将具有相似的比例 。
(3)ReID特征的维数。以前的ReID方法通常学习高维特征,并在其基准上取得了可喜的结果。 但是,我们发现低维特征实际上对MOT更好,因为它的训练图像比ReID少(我们不能使用ReID数据集,因为它们仅提供裁剪后的人物图像)。 学习低维特征有助于减少过小适合小数据的风险,并提高跟踪的鲁棒性。
我们提出了一个简单的基线,该基线共同考虑了以上三个因素。 请注意,我们不要求在算法上具有新颖性。 相反,我们的贡献在于,首先确定单次跟踪器背后的挑战,然后将在计算机视觉的不同领域开发的多种技术和概念组合在一起,以解决以前的MOT工作中忽略的挑战。
我们的方法的概述如图2所示。我们首先采用无锚对象检测方法来估计高分辨率特征图上的对象中心[44,17,45,9]。 消除锚点减轻了歧义性问题,并且高分辨率特征图的使用使Re-ID特征能够更好地与对象中心对齐。 然后,我们添加了一个并行分支,用于估算用于预测对象身份的逐像素Re-ID特征。 特别是,我们学习了低维Re-ID特征,这些特征不仅减少了计算时间,而且提高了特征匹配的鲁棒性。 我们为骨干网[13]配备了“深层聚合”运算符[41],以融合来自多个层的要素,以便处理不同规模的对象。
在这里插入图片描述
图2-一键式MOT跟踪器概述。 首先将输入图像馈送到编码器-解码器网络,以提取高分辨率特征图(步幅= 4)。 然后,我们添加两个简单的并行头,分别用于预测边界框和Re-ID特征。 提取预测的对象中心的特征以进行时间边界框链接。

我们通过评估服务器评估我们在MOT Challenge基准测试中的方法。 它在2DMOT15 [18],MOT16 [24],MOT17 [24]和MOT20 [7]数据集的所有在线跟踪器中排名第一。 实际上,它在2DMOT15,MOT17和MOT20数据集上的性能也优于脱机跟踪器(MOT20是最新的数据集,以前的工作都没有报告过结果)。 尽管取得了很好的效果,但该方法还是非常简单,并且以30 FPS的速度运行。 我们希望它可以用作该领域的强大基准。 该代码以及预训练的模型将被发布。

2相关工作

在本节中,我们通过将MOT的相关工作分别分为两步法和一次性方法来简要回顾它们。 我们讨论了这些方法的优缺点,并将它们与我们的方法进行了比较。

2.1 两步法MOT

最新的MOT方法(例如[37,40,23,46,11])通常将对象检测和Re-ID视为两个单独的任务。他们首先应用CNN检测器,例如[27,12,26],以多个框定位图像中所有感兴趣的对象。然后,在一个单独的步骤中,他们根据框裁剪图像,并将其馈送到身份嵌入网络以提取Re-ID特征,然后将框链接以形成多个轨道。这些作品通常遵循标准的盒式链接做法,即首先根据Re-ID特征和边界框的并集​​交集(IoU)计算成本矩阵,然后使用卡尔曼滤波器[36]和匈牙利算法[16]完成链接任务。少数作品[23,46,11]使用更复杂的关联策略,例如组模型和RNN。
两步方法的优点在于,它们可以针对每个任务分别使用最合适的模型,而不会做出折衷。此外,他们可以根据检测到的边界框裁剪图像补丁,并在预测Re-ID功能之前将其调整为相同大小。这有助于处理对象的比例变化。结果,这些方法[40]在公共数据集上取得了最佳性能。但是,它们通常非常慢,因为对象检测和Re-ID功能嵌入都需要大量计算,而没有它们之间的共享。因此,很难实现许多应用中所需的视频速率推断。

2.2 一步法MOT

随着深度学习中多任务学习的成熟[15,25,30],单次MOT已开始引起更多研究关注。核心思想是在单个网络中同时完成对象检测和身份嵌入(Re-ID功能),以通过共享大部分计算来减少推理时间。例如,Track-RCNN [33]在Mask-RCNN [12]的顶部添加了一个Re-ID头,并为每个提案回归了边界框和Re-ID功能。 JDE [35]是在YOLOv3 [26]框架之上引入的,该框架可实现接近视频速率的推断。但是,单发方法的跟踪精度通常低于两步方法的跟踪精度。我们发现这是因为学习到的Re-ID功能不是最佳的,这会导致大量的ID切换。我们深入研究了原因,发现在锚点提取的身份嵌入特征与对象中心不对齐,这导致了严重的歧义。为了解决该问题,我们建议对对象检测和身份嵌入使用无锚方法,这可以显着提高所有基准上的跟踪精度。

3 技术方法

在本节中,我们分别介绍骨干网络,物体检测分支和Re-ID特征嵌入分支的详细信息。

3.1 骨干网络

我们采用ResNet-34 [13]作为我们的骨干,以便在准确性和速度之间取得良好的平衡。 为了适应不同规模的对象,如图2所示,将深层聚合(DLA)[44]的一种变体应用于骨干网。与原始DLA [41]不同,它在低层聚合和低层聚合之间具有更多的跳跃连接,类似于特征金字塔网络(FPN)[19]。 此外,上采样模块中的所有卷积层都由可变形的卷积层代替,以便它们可以根据对象的尺寸和姿势动态调整感受野。 这些修改也有助于减轻对齐问题。 生成的模型名为DLA-34。 将输入图像的大小表示为Himage×Wimage,然后输出要素图的形状为C×H×W,其中H = Himage / 4和W = Wimage / 4。

3.2 物体检测分支

继[44]之后,我们将对象检测视为高分辨率特征图上基于中心的包围盒回归任务。 特别是,将三个并行回归头(regression heads)附加到主干网络以分别估计热图,对象中心偏移和边界框大小。 通过对骨干网的输出特征图应用3×3卷积(具有256个通道)来实现每个磁头(head),然后通过1×1卷积层生成最终目标。

Heatmap Head

这个head负责估计对象中心的位置。 这里采用基于热图的表示法,这是界标点估计任务的事实上的标准(de facto standard for the landmark point estimation task)。 尤其是,热图的尺寸为1×H×W。如果热图随真是物体中心崩溃( collapse),则在热图中某个位置的响应预计为1。 随着热图中位置和对象中心之间的距离,响应呈指数衰减。

Center Offset Head

该head负责更精确地定位对象。 回想一下,特征图的跨度为4,这将引入不可忽略的量化误差。 请注意,对象检测性能的优势可能很小。 但是对于跟踪至关重要,因为应根据准确的对象中心提取Re-ID功能。 我们在实验中发现,ReID功能与对象中心的仔细对齐对于性能至关重要。

Box Size Head

该头部负责估计每个锚点位置的目标边界框的高度和宽度。 该头部与Re-ID功能没有直接关系,但是定位精度将影响对象检测性能的评估。

3.3身份嵌入分支 Identity Embedding Branch

身份嵌入分支的目标是生成可以区分不同对象的特征。 理想情况下,不同对象之间的距离应大于同一对象之间的距离。 为了实现该目标,我们在主干特征之上应用了具有128个内核的卷积层,以提取每个位置的身份嵌入特征。 生成的特征图为E∈R128×W×H。 从特征图中提取对象在(x,y)处的Re-ID特征Ex,y∈R128

3.4 Loss Functions

Heatmap Loss

在这里插入图片描述
损失函数定义为具有焦点损失( focal loss)像素级逻辑回归( pixel-wise logistic regression)[20]
在这里插入图片描述

Offset and Size Loss

在这里插入图片描述

Identity Embedding Loss

我们将对象身份嵌入视为分类任务。 特别是,训练集中具有相同标识的所有对象实例都被视为一个类。
在这里插入图片描述

3.5 Online Tracking

在本节中,我们将说明模型的推论以及如何使用检测结果和身份嵌入来执行box跟踪。

Network Inference 网络推理

网络使用大小为1088×608的图像作为输入,与先前的JDE [35]相同。 在预测的热图之上(top),我们根据热图得分执行非最大抑制(NMS),以提取峰值关键点。 我们保留热点图得分大于阈值的关键点的位置。 然后,我们根据估计的偏移量和框大小来计算相应的边界框。 我们还在估计的对象中心提取身份嵌入。

Online Box Linking 在线盒链接

我们使用标准的在线跟踪算法来实现盒子链接。 我们根据第一帧中的估计框来初始化多个小轨迹。 在随后的帧中,我们根据Re-ID特征和IoU测量的距离将这些框链接到现有的Tracklet(轨迹片段)。 我们还使用卡尔曼滤波预测tracklet在当前帧中的位置。 如果距离链接的检测距离太远,我们会将相应的成本设置为无穷大,这样可以有效地防止将检测与较大的运动链接在一起。 我们按照每个步骤更新跟踪器的外观特征,以处理外观变化,如[4,14]中所述。

4 实验

数据集和标准

继[35]等之前的工作之后,我们通过组合来自六个公共数据集的训练图像进行人体检测和搜索,组成了一个大型训练数据集。 特别是,ETH [10]和CityPerson [42]数据集仅提供边界框注释,因此我们仅对它们进行训练。 CalTech [8],MOT17 [24],CUHK-SYSU [39]和PRW [43]数据集提供边界框和身份注释,我们在其上训练检测和身份嵌入分支。 由于ETH数据集中的一些视频也出现在MOT16数据集的测试集中,因此我们将它们从训练数据集中删除以进行公平比较。 在一些烧蚀(ablative)实验中,我们建议在较小的数据集上训练我们的模型,以节省计算成本,这将在后面进行详细描述。
我们在四个基准的测试集上广泛评估了我们方法的各种因素:2DMOT15,MOT16,MOT17和最近发布的MOT20。 与[35]中一样,我们使用平均精度(AP)评估检测性能,并使用假阳性率( false accept rate)0.1真正率(True Positive Rate,TPR)评估Re-ID功能。 我们使用CLEAR度量[2]和IDF1 [28]来评估跟踪精度。

4.2实施细节

我们使用[44]中提出的DLA-34变体作为我们的默认主干。 在COCO检测数据集[21]上预先训练的模型参数用于初始化我们的模型。 我们使用Adam优化器对模型进行了30个epoch的训练,起始学习率为
1e-4。学习率分别在20和27个epoch下降到1e-5和1e-6。 batch size设置为12。我们使用标准的数据增强技术,包括旋转,缩放和颜色抖动。 输入图像的大小调整为1088×608,特征图的分辨率为272×152。 两个RTX 2080 GPU的训练时间约为30小时。

4.3 Ablative Study 烧蚀研究

Anchor-based vs. Anchor-free 依赖锚框与无锚框

先前的单发跟踪器( one-shot trackers)基于锚,该锚遭受前几节中描述的未对准问题。 在本节中,我们通过在我们的方法之上构造一个基于锚的基线,通过用[35]中使用的基于锚的方法替换检测分支,在数字上验证该论点。 对于公平比较的两种方法,我们将其余因素保持相同。 请注意,本节中的模型是在大型训练数据集上进行训练的,因为当我们使用小型数据集进行训练时,基于锚的方法会获得非常差的结果。 结果示于表1。
在这里插入图片描述
表1 在MOT15数据集的验证视频上评估基于锚和无锚的方法。 使用大型训练数据集,并且所有模型都训练了10个epoch。 ↑表示越大越好,而↓意味着越小越好。 最好的结果以粗体显示。

我们可以看到,对于不同的步幅,基于锚的方法获得的MOTA得分始终低于无锚方法。 例如,当跨度为8时,无锚方法的TPR分数要比基于锚的基线好得多(85.5%比75.3%),这意味着无锚方法的Re-ID功能具有明显的优势 。 主要原因是锚点和对象中心之间的未对齐会严重影响网络的学习。
值得注意的是,为基于锚的方法增加特征图分辨率甚至会降低MOTA分数。 这是因为当我们使用高分辨率特征图时,将会有更多未对齐的正锚,这将使网络训练更加困难。 我们没有显示跨度为2的结果,因为锚点的显着增加超过了我们GPU的内存容量。
相比之下,与基于锚的方法相比,我们的无锚方法受对准误差问题的影响较小,并且MOTA得分明显更高。 尤其是,对于四个跨度,ID开关的数量从137显着减少到93。 更重要的是,当将步幅从8减小到4时,我们的方法会受益匪浅。将步幅进一步减小到2会降低结果的质量,因为引入了较低级别的特征会使表示形式对外观变化的鲁棒性降低。
我们还可视化了图3中不同模型所学习的Re-ID特征。我们可以看到,对于基于锚的方法,尤其是在跨度为4时,不同身份的特征是混合在一起的。 相比之下,对于我们的免锚方法,它们是完全分开的。
在这里插入图片描述
图3 我们绘制了使用t-SNE [22]的四个模型所学习的测试集中所有人的Re-ID特征。 同一个人的特征用相同的颜色表示。

多层特征聚合

本部分评估骨干网中多层特征聚合的影响。 特别是,我们评估了许多主干,例如vanilla ResNet [13],特征金字塔网络(FPN)[19],高分辨率网络(HRNet)[31]和DLA-34 [44]。 为了公平比较,将方法的其余因素控制为相同。 对于本实验中的所有方法,最终特征图的跨度为4。 特别是,我们为vanilla ResNet添加了三个上采样操作,以获得stride-4特征图。 按照先前的工作[38],我们将2DMOT15数据集的训练子集分为5个训练视频和6个验证视频。 为了减少计算成本,此处不使用大规模训练数据集。
结果显示在表2中。我们可以看到,在ResNet-34之上构建的DLA-34与普通的ResNet-34相比,可显着提高MOTA得分。 特别是,TPR从35.0%显着增加到67.3%,这反过来又将ID开关(ID)的数量从372减少到136。实验结果表明,由于具有多种功能,Re-ID功能的判别能力有所提高要归功于层特征融合。
在这里插入图片描述
表2 在2DMOT15数据集上评估不同的网络骨架,最优结果粗体标出。

通过比较ResNet-34和ResNet-50的结果,我们可以看到使用较大的网络也可以提高MOTA总体得分。 但是,如果我们查看详细的指标,我们发现改进主要来自AP测量的增强检测结果。 但是,Re-ID特征几乎无法从较大的网络中受益。 例如,TPR仅从35.0%提高到35.4%。 相比之下,DLA-34的数字为 67.3%。 结果表明,在改善身份嵌入方面,多层融合相对于使用更深层的网络具有明显的优势。
我们还比较了其他多层融合方法,例如HRNet [31]和FPN [19]。 两种方法都比ResNet-34获得更好的MOTA分数。 改进不仅来自增强的检测结果,还归因于Re-ID特征的改进的区分能力。 例如,HRNet的TPR从35.0%增加到63.8%。
DLA-34模型比FPN和HRNet具有更多优势。 我们发现DLA-34中的可变形卷积(deformable convolution)是产生差距(gap)的主要原因,因为它可以减轻由小物体的下采样引起的未对准问题。 如表3所示,我们可以看到DLA-34在中小型物体上的性能主要优于HRNet。
在这里插入图片描述
表3-骨干对不同规模对象的影响。 小:面积小于6000; 中:面积从6000到25000; 大:面积大于25000。

通过t-SNE [22],我们在图4的测试集中可视化了所有人的Re-ID特征。 我们可以看到,vanilla ResNet-34所学习的特征没有区别,因为不同身份的特征大多混合在一起。 这将在链接阶段导致大量的ID切换。 HRNet学会的Re-ID特征变得更好,除了粉红色和绿色的点非常混乱。 此外,DLA-34的Re-ID特征比两种基准方法更具区分性。
在这里插入图片描述
图4-我们使用t-SNE [22]绘制了三个骨干网分别学习的所有人的Re-ID特征。 同一个人的特征用相同的颜色表示。 DLA-34学习到的特征在判别能力方面具有明显的优势。 我们用红色箭头突出显示四个人的特征。 如底部图像所示,四个人的外观对应于不同颜色的框。

The Re-ID Feature Dimension (Re-ID特征维度)

以前的作品通常不进行消融研究就学习512维特征。 但是,我们在实验中发现特征维实际上起着重要的作用。 通常,为了避免过度拟合,训练高维Re-ID特征需要大量训练图像,这对于单次跟踪问题是不可用的。 先前的两步方法受此问题的影响较小,因为它们可以利用提供可裁剪人图像的大量Re-ID数据集。 包括我们在内的单发方法无法使用它们,因为它需要原始的未裁剪图像。 一种解决方案是通过减小Re-ID特征的维数来减少其对数据的依赖性。
我们在表4中评估了多个维度选择。我们可以看到,当维度从512减少到128时,TPR持续提高,这表明使用低维度特征的优势。 将尺寸进一步减小到64会开始降低TPR,因为Re ID特征的代表能力受到影响。 尽管MOTA分数的变化很小,但ID切换的数量实际上从210个大大减少到136个。这实际上在改善用户体验方面起着至关重要的作用。 通过减小Re-ID特征的维数,推理速度也略有提高。 值得注意的是,只有在我们访问少量训练数据时,使用低维Re-ID特征的论据才成立。 当训练数据的数量增加时,由特征维数引起的差距将变小。
在这里插入图片描述
表4 在2DMOT15数据集上评估Re-ID特征维度。

4.4 The State-of-the-arts

我们将我们的方法与最先进的方法进行了比较,包括一步方法和两步方法。
一步MOT方法只有两篇发表的著作,即JDE [35]和TrackRCNN [33],可以共同执行对象检测和身份特征嵌入。 特别是,TrackRCNN需要附加的分割注释,并使用针对分割任务的不同指标来报告结果。 因此,在这项工作中,我们仅将其与JDE进行比较。
为了公平比较,我们使用与[35]中相同的数据进行训练和测试。 具体来说,我们使用2DMOT15-train和MOT16-test进行验证。 CLEAR度量[2]和IDF1 [28]用于测量性能。 结果显示在表5中。我们可以看到,我们的方法在两个数据集上的表现都比JDE出色。 特别是,ID开关的数量从218减少到80,这在改善用户体验方面有很大的提高。 结果证明了无锚方法比以前基于锚的方法的有效性。 两种方法的推理速度都接近视频速率,而我们的方法则更快。
在这里插入图片描述
表5 与两个数据集上最新的单发跟踪器的比较。 MOT16测试的结果是从MOT挑战服务器获得的。
两步式MOT方法我们将我们的方法与最新的在线跟踪器(在线跟踪器意味着它仅使用当前帧之前的信息进行跟踪; 离线跟踪器可以使用整个视频。)进行了比较,其中包括在表6中针对MOT Challenge数据集的两步方法。 由于我们不使用公共检测结果,因此采用“专用检测器”协议。 我们分别报告2DMOT15,MOT16,MOT17和MOT20数据集的测试集的结果。 在进行测试之前,我们会在每个数据集上对模型进行10个epoch的微调。 所有结果都是在MOT挑战评估服务器上获得的。
在这里插入图片描述
*表6 与“专用检测器”协议下的最新技术比较。 值得注意的是,两步跟踪器的计算时间(Hz)仅计入关联步长。 但是对于单发追踪器来说,它对整个系统都很重要。 单次跟踪器以“ ”标记。

我们的方法在四个数据集的所有在线跟踪器中排名第一。 实际上,它在2DMOT15和MOT17数据集上的所有在线和离线跟踪者中也分别获得了最高的MOTA分数。 考虑到我们的方法非常简单,这是一个非常好的结果。 另外,我们的方法可以实现视频速率推断。 相反,大多数高性能跟踪器(例如[11,40])通常比我们的慢。

5 结论

我们为单次多对象跟踪提供了一个简单的基准。 我们从研究为什么以前的方法(如[35])无法获得与两步法类似的结果的原因开始。 我们发现在对象检测和身份嵌入中使用锚是导致结果下降的主要原因。 特别地,对应于对象的不同部分的多个附近的锚可能负责估计会导致网络训练歧义的相同的身份。 我们提供了一种简单的无锚方法,该方法在30 fps的几个基准数据集上表现优于先前的最新技术。 我们希望它能激发和评估该领域的新想法。

FairMOT论文解读参考博客:

https://zhuanlan.zhihu.com/p/126558285
https://zhuanlan.zhihu.com/p/127738264
https://cloud.tencent.com/developer/article/1616262
https://blog.csdn.net/sinat_33486980/article/details/105611295

CenterNet论文解读:

https://blog.csdn.net/c20081052/article/details/89358658
https://baijiahao.baidu.com/s?id=1644905321397514137&wfr=spider&for=pc
扔掉anchor!真正的CenterNet——Objects as Points论文解读
超越yolov3,Centernet 原理详解(object as points)

1 heatmap热力图

https://blog.csdn.net/baidu_40840693/article/details/85055520
https://blog.csdn.net/Einstellung/article/details/82858974
https://blog.csdn.net/weixin_39875161/article/details/91494481

2 可变形卷积网络

可变形卷积网络–Deformable Convolutional Networks
Deformable Conv

3 深层聚合网络

cvpr2018 Deep Layer Aggregation(DLANet)

4 高斯核函数

1.高斯核函数
2.https://blog.csdn.net/FengqiangDu/article/details/102729612

JDE论文解读:

MOT论文笔记《Towards Real-Time Multi-Object Tracking》

SE-Net

最后一届ImageNet冠军模型:SENet
【CV中的Attention机制】最简单最易实现的SE模块

迁移学习

一文看懂迁移学习:怎样用预训练模型搞定深度学习?
深度学习框架_PyTorch_模型预训练_PyTorch使用预训练模型全流程(实例:CIFAR图像分类)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值