【论文阅读】DETRs Beat YOLOs on Real-time Object Detection


DETRs 在实时物体检测方面击败 YOLOs

在这里插入图片描述

摘要

YOLO系列由于在速度和准确性之间的合理权衡,已成为最受欢迎的实时目标检测框架。然而,我们观察到YOLO的速度和准确性受到NMS的负面影响。最近,基于端到端Transformer的检测器(DETRs)为消除NMS提供了一种替代方案。尽管如此,高计算成本限制了它们的实用性,并阻碍了它们充分发挥排除NMS的优势。在本文中,我们提出了实时检测Transformer(RT - DETR),据我们所知,这是第一个解决上述困境的实时端到端目标检测器。我们借鉴先进的DETR,通过两个步骤构建RT - DETR:首先专注于在提高速度的同时保持准确性,然后在保持速度的同时提高准确性。具体来说,我们设计了一个高效的混合编码器,通过解耦尺度内交互和跨尺度融合来快速处理多尺度特征,从而提高速度。然后,我们提出了不确定性最小的查询选择,为解码器提供高质量的初始查询,从而提高准确性。此外,RT - DETR支持灵活的速度调整,通过调整解码器层数来适应各种场景,而无需重新训练。我们的RT - DETR - R50 / R101在COCO上实现了53.1% / 54.3%的AP,在T4 GPU上达到108 / 74 FPS,在速度和准确性上均优于先前先进的YOLO。此外,RT - DETR - R50在准确性上比DINO - R50高出2.2%的AP(53.1% AP对50.9% AP),在FPS上高出约21倍(108 FPS对5 FPS)。使用Objects365进行预训练后,RT - DETR - R50 / R101实现了55.3% / 56.2%的AP。

论文地址:https://arxiv.org/abs/2304.08069
代码地址:https://github.com/lyuwenyu/RT-DETR

一、介绍

实时目标检测是一个重要的研究领域,具有广泛的应用,如目标跟踪[43]、视频监控[28]和自动驾驶[2]等。现有的实时检测器通常采用基于CNN的架构,其中最著名的是YOLO检测器[1, 10 - 12, 15, 16, 25, 30, 38, 40],因为它们在速度和准确性之间取得了合理的平衡。然而,这些检测器通常需要非极大值抑制(NMS)进行后处理,这不仅减慢了推理速度,还引入了超参数,导致速度和准确性的不稳定。此外,考虑到不同场景对召回率和准确性的重视程度不同,有必要仔细选择合适的NMS阈值,这阻碍了实时检测器的发展。

最近,基于端到端Transformer的检测器(DETRs)[4, 17, 23, 27, 36, 39, 44, 45]因其精简的架构和消除了手工制作的组件而受到学术界的广泛关注。然而,它们的高计算成本使其无法满足实时检测的要求,因此无NMS的架构并没有显示出推理速度的优势。这促使我们探索DETRs是否可以扩展到实时场景,并在速度和准确性上超越先进的YOLO检测器,消除NMS对实时目标检测造成的延迟。

为了实现上述目标,我们重新思考DETRs,并对关键组件进行详细分析,以减少不必要的计算冗余并进一步提高准确性。对于前者,我们观察到,尽管引入多尺度特征有助于加速训练收敛[45],但它导致输入编码器的序列长度显著增加。多尺度特征交互导致的高计算成本使Transformer编码器成为计算瓶颈。因此,实现实时DETR需要重新设计编码器。对于后者,先前的工作[42, 44, 45]表明,难以优化的对象查询阻碍了DETRs的性能,并提出了查询选择方案,用编码器特征代替普通的可学习嵌入。然而,我们观察到,当前的查询选择直接采用分类分数进行选择,忽略了检测器需要同时对对象的类别和位置进行建模的事实,这两者都决定了特征的质量。这不可避免地导致具有低定位置信度的编码器特征被选为初始查询,从而导致相当程度的不确定性并损害DETRs的性能。我们将查询初始化视为进一步提高性能的突破口。

在本文中,我们提出了实时检测Transformer(RT - DETR),据我们所知,这是第一个实时端到端目标检测器。为了快速处理多尺度特征,我们设计了一个高效的混合编码器来取代普通的Transformer编码器,通过解耦不同尺度特征的尺度内交互和跨尺度融合,显著提高了推理速度。为了避免具有低定位置信度的编码器特征被选为对象查询,我们提出了不确定性最小的查询选择,通过明确优化不确定性为解码器提供高质量的初始查询,从而提高准确性。此外,由于DETR的多层解码器架构,RT - DETR支持灵活的速度调整,以适应各种实时场景而无需重新训练。

RT - DETR在速度和准确性之间实现了理想的平衡。具体来说,RT - DETR - R50在COCO val2017上实现了53.1%的AP,在T4 GPU上达到108 FPS,而RT - DETR - R101实现了54.3%的AP和74 FPS,在速度和准确性上均优于先前先进的YOLO检测器的L和X模型,如图1所示。我们还通过缩小编码器和解码器并使用更小的骨干网络开发了缩放的RT - DETR,其性能优于更轻量级的YOLO检测器(S和M模型)。此外,RT - DETR - R50在准确性上比DINO - Deformable - DETR - R50高出2.2%的AP(53.1% AP对50.9% AP),在FPS上高出约21倍(108 FPS对5 FPS),显著提高了DETRs的准确性和速度。在使用Objects365 [35]进行预训练后,RT - DETR - R50 / R101实现了55.3% / 56.2%的AP,实现了令人惊讶的性能提升。更多的实验结果在附录中提供。

在这里插入图片描述

主要贡献总结为:(i)我们提出了第一个实时端到端目标检测器RT - DETR,它不仅在速度和准确性上优于先前先进的YOLO检测器,还消除了NMS后处理对实时目标检测的负面影响;(ii)我们定量分析了NMS对YOLO检测器速度和准确性的影响,并建立了端到端速度基准来测试实时检测器的端到端推理速度;(iii)提出的RT - DETR通过调整解码器层数来支持灵活的速度调整,以适应各种场景而无需重新训练。

二、相关工作

2.1 实时目标检测器

YOLOv1 [31]是第一个基于CNN的一阶段目标检测器,实现了真正的实时目标检测。经过多年的不断发展,YOLO检测器已经超越了其他一阶段目标检测器[21, 24],成为了实时目标检测器的代名词。YOLO检测器可分为两类:基于锚点的[1, 11, 15, 25, 29, 30, 37, 38]和无锚点的[10, 12, 16, 40],它们在速度和准确性之间取得了合理的平衡,并广泛应用于各种实际场景中。

2.2 端到端目标检测器

端到端目标检测器以其精简的流水线而闻名。Carion等人[4]首次提出了基于Transformer的端到端检测器DETR,因其独特的特性而受到广泛关注。特别是,DETR消除了手工制作的锚点和NMS组件,而是采用二分匹配并直接预测一对一的对象集。尽管有明显的优势,但DETR存在一些问题:训练收敛缓慢、计算成本高和查询难以优化。许多DETR变体被提出以解决这些问题。加速收敛:Deformable - DETR [45]通过使用多尺度特征增强注意力机制的效率来加速训练收敛。DAB - DETR [23]和DN - DETR [17]通过引入迭代精化方案和去噪训练进一步提高性能。Group - DETR [5]引入了组式的一对多分配。降低计算成本:Efficient DETR [42]和Sparse DETR [33]通过减少编码器和解码器层数或更新的查询数量来降低计算成本。Lite DETR [18]通过交错方式减少低级特征的更新频率来提高编码器的效率。优化查询初始化:Conditional DETR [27]和Anchor DETR [39]降低了查询的优化难度。Zhu等人[45]为两阶段DETR提出了查询选择,DINO [44]建议混合查询选择以帮助更好地初始化查询。当前的DETR仍然计算量很大,且不是为实时检测而设计的。我们的RT - DETR大力探索降低计算成本,并尝试优化查询初始化,优于最先进的实时检测器。

三、检测器的端到端速度

3.1 分析 NMS

NMS是目标检测中广泛使用的后处理算法,用于消除重叠的输出框。NMS需要两个阈值:置信度阈值和IoU阈值。具体来说,分数低于置信度阈值的框将被直接过滤掉,每当任何两个框的IoU超过IoU阈值时,分数较低的框将被丢弃。这个过程会一直迭代,直到处理完每个类别的所有框。因此,NMS的执行时间主要取决于框的数量和两个阈值。为了验证这一观察结果,我们使用YOLOv5 [11](基于锚点的)和YOLOv8 [12](无锚点的)进行分析。

我们首先计算在相同输入上用不同置信度阈值过滤输出框后剩余的框的数量。我们从0.001到0.25采样置信度阈值来计算两个检测器剩余框的数量,并将它们绘制在柱状图上,这直观地反映了NMS对其超参数很敏感,如图2所示。随着置信度阈值的增加,更多的预测框被过滤掉,需要计算IoU的剩余框的数量减少,从而减少了NMS的执行时间。

在这里插入图片描述

此外,我们使用YOLOv8在COCO val2017上评估准确性,并测试不同超参数下NMS操作的执行时间。请注意,我们采用的NMS操作指的是TensorRT的efficientNMSPlugin,它涉及多个内核,包括EfficientNMSFilter、RadixSort、EfficientNMS等,我们只报告EfficientNMS内核的执行时间。我们在T4 GPU上使用TensorRT FP16进行测试,输入和预处理保持一致。超参数和相应的结果如表1所示。从结果中我们可以得出结论,EfficientNMS内核的执行时间随着置信度阈值的降低或IoU阈值的增加而增加。原因是高置信度阈值直接过滤掉更多的预测框,而高IoU阈值在每轮筛选中过滤掉的预测框较少。我们还在附录中可视化了YOLOv8在不同NMS阈值下的预测。结果表明,不适当的置信度阈值会导致检测器出现明显的误报或漏报。在置信度阈值为0.001和IoU阈值为0.7时,YOLOv8实现了最佳的AP结果,但相应的NMS时间处于较高水平。考虑到YOLO检测器通常报告模型速度并排除NMS时间,因此需要建立一个端到端速度基准。

在这里插入图片描述

3.2 端到端速度基准

为了能够公平地比较各种实时检测器的端到端速度,我们建立了一个端到端速度基准。考虑到NMS的执行时间受输入的影响,有必要选择一个基准数据集并计算多张图像的平均执行时间。我们选择COCO val2017 [20]作为基准数据集,并为上述的YOLO检测器附加TensorRT的NMS后处理插件。具体来说,我们根据基准数据集上对应准确性的NMS阈值测试检测器的平均推理时间,排除I/O和MemoryCopy操作。我们使用该基准测试基于锚点的检测器YOLOv5 [11]和YOLOv7 [38],以及无锚点的检测器PP - YOLOE [40]、YOLOv6 [16]和YOLOv8 [12]在T4 GPU上使用TensorRT FP16的端到端速度。根据结果(参见表2),我们得出结论,对于YOLO检测器,具有同等准确性的无锚点检测器优于基于锚点的检测器,因为前者需要的NMS时间更少。原因是基于锚点的检测器比无锚点的检测器产生更多的预测框(在我们测试的检测器中多出三倍)。

四、实时 DETR

4.1 模型概述

RT - DETR由骨干网络、高效混合编码器和带有辅助预测头的Transformer解码器组成。RT - DETR的概述如图4所示。具体来说,我们将骨干网络的最后三个阶段{S3, S4, S5}的特征输入到编码器中。高效混合编码器通过尺度内特征交互和跨尺度特征融合将多尺度特征转换为图像特征序列(参见第4.2节)。随后,采用不确定性最小的查询选择来选择固定数量的编码器特征作为解码器的初始对象查询(参见第4.3节)。最后,带有辅助预测头的解码器迭代地优化对象查询以生成类别和框。

在这里插入图片描述

4.2 高效混合编码器

计算瓶颈分析:引入多尺度特征加速了训练收敛并提高了性能[45]。然而,尽管可变形注意力降低了计算成本,但序列长度的急剧增加仍然使编码器成为计算瓶颈。正如Lin等人[19]所报道的,在Deformable - DETR中,编码器占GFLOPs的49%,但对AP的贡献仅为11%。为了克服这个瓶颈,我们首先分析了多尺度Transformer编码器中存在的计算冗余。直观地说,包含关于对象丰富语义信息的高级特征是从低级特征中提取的,因此在连接的多尺度特征上进行特征交互是多余的。因此,我们设计了一组具有不同类型编码器的变体,以证明同时进行尺度内和跨尺度特征交互是低效的,如图3所示。特别地,我们使用DINO - Deformable - R50,其中使用了在RT - DETR中更小的数据读取器和更轻的解码器进行实验,并首先删除DINO - Deformable - R50中的多尺度Transformer编码器作为变体A。然后,插入不同类型的编码器以基于A产生一系列变体,详细说明如下(每个变体的详细指标参见表3):

  • A → B:变体B将单尺度Transformer编码器插入A中,该编码器使用一层Transformer块。多尺度特征共享该编码器进行尺度内特征交互,然后连接作为输出。
  • B → C:变体C基于B引入跨尺度特征融合,并将连接的特征输入到多尺度Transformer编码器中进行同时的尺度内和跨尺度特征交互。
  • C → D:变体D通过使用单尺度Transformer编码器进行尺度内交互和使用PANet风格[22]的结构进行跨尺度融合来解耦尺度内交互和跨尺度融合。
  • D → E:变体E基于D增强了尺度内交互和跨尺度融合,采用了我们设计的高效混合编码器。

在这里插入图片描述

在这里插入图片描述

混合设计:基于上述分析,我们重新思考了编码器的结构,并提出了一个高效的混合编码器,由两个模块组成,即基于注意力的尺度内特征交互(AIFI)和基于CNN的跨尺度特征融合(CCFF)。具体来说,AIFI基于变体D进一步降低了计算成本,仅在S5上使用单尺度Transformer编码器进行尺度内交互。原因是将自注意力操作应用于具有更丰富语义概念的高级特征可以捕捉概念实体之间的联系,这有助于后续模块对对象进行定位和识别。然而,由于低级特征缺乏语义概念,并且与高级特征交互存在重复和混淆的风险,因此低级特征的尺度内交互是不必要的。为了验证这一观点,我们在变体D中仅在S5上进行尺度内交互,实验结果如表3所示(参见行DS5)。与D相比,DS5不仅显著降低了延迟(快35%),而且提高了准确性(高0.4% AP)。CCFF基于跨尺度融合模块进行优化,在融合路径中插入了几个由卷积层组成的融合块。融合块的作用是将两个相邻尺度的特征融合为一个新特征,其结构如图5所示。融合块包含两个1×1卷积来调整通道数,N个由RepConv [8]组成的RepBlocks用于特征融合,两条路径的输出通过元素相加进行融合。我们将混合编码器的计算表述为:

在这里插入图片描述

其中Reshape表示将平坦化特征的形状恢复为与S5相同的形状。

在这里插入图片描述

4.3不确定性最小的查询选择

为了降低DETR中优化对象查询的难度,后续的一些工作[42, 44, 45]提出了查询选择方案,它们的共同点是使用置信度分数从编码器中选择前K个特征来初始化对象查询(或仅位置查询)。置信度分数表示特征包含前景对象的可能性。然而,检测器需要同时对对象的类别和位置进行建模,这两者都决定了特征的质量。因此,特征的性能分数是一个潜在变量,与分类和定位都相关。基于此分析,当前的查询选择导致所选特征存在相当程度的不确定性,从而导致解码器的初始化次优,并阻碍了检测器的性能。

为了解决这个问题,我们提出了不确定性最小的查询选择方案,该方案明确构建并优化认知不确定性,以对编码器特征的联合潜在变量进行建模,从而为解码器提供高质量的查询。具体来说,特征不确定性U被定义为定位P和分类C的预测分布之间的差异,如式(2)所示。为了最小化查询的不确定性,我们将不确定性集成到损失函数中,用于基于梯度的优化,如式(3)所示。

在这里插入图片描述

其中ˆY和Y表示预测和真实值,ˆY = {ˆc, ˆb},ˆc和ˆb分别表示类别和边界框,ˆX表示编码器特征。

有效性分析:为了分析不确定性最小的查询选择的有效性,我们可视化了在COCO val2017上所选特征的分类分数和IoU分数,如图6所示。我们绘制了分类分数大于0.5的散点图。紫色和绿色点分别表示从使用不确定性最小的查询选择和普通查询选择训练的模型中选择的特征。

散点图最显著的特征是紫色点集中在图的右上角,而绿色点集中在右下角。这表明不确定性最小的查询选择产生了更多高质量的编码器特征。此外,我们对两种查询选择方案所选的编码器特征进行了定量分析。紫色点比绿色点多138%,即更多绿色点的分类分数小于或等于0.5,这些可以被认为是低质量特征。并且紫色点比绿色点多120%,其分类分数和IoU分数都大于0.5。从密度曲线也可以得出相同的结论,其中紫色和绿色之间的差距在图的右上角最为明显。定量结果进一步表明,不确定性最小的查询选择为查询提供了更多准确分类和精确定位的特征,从而提高了检测器的准确性(参见第5.3节)。

在这里插入图片描述

4.4 缩放的RT - DETR

由于实时检测器通常提供不同规模的模型以适应不同的场景,RT - DETR也支持灵活的缩放。具体来说,对于混合编码器,我们通过调整嵌入维度和通道数量来控制宽度,通过调整Transformer层数和RepBlocks的数量来控制深度。解码器的宽度和深度可以通过操纵对象查询的数量和解码器层数来控制。此外,RT - DETR的速度通过调整解码器层数支持灵活调整。我们观察到,在末尾去除一些解码器层对准确性的影响最小,但大大提高了推理速度(参见第5.4节)。我们将配备ResNet50和ResNet101 [13, 14]的RT - DETR与YOLO检测器的L和X模型进行比较。可以通过应用其他更小的(例如ResNet18/34)或可扩展的(例如CSPResNet [40])骨干网络以及缩放的编码器和解码器来设计更轻的RT - DETR。我们在附录中将缩放的RT - DETR与更轻的(S和M)YOLO检测器进行了比较,它们在速度和准确性上都优于所有S和M模型。

五、实验

5.1 与SOTA对比

表2对比了RT - DETR与当前实时(YOLOs)和端到端(DETRs)检测器的性能,其中仅对比了YOLO检测器的L和X模型,S和M模型的对比在附录中。我们的RT - DETR和YOLO检测器的输入尺寸均为(640, 640),其他DETRs的输入尺寸为(800, 1333)。FPS在T4 GPU上使用TensorRT FP16进行报告,对于YOLO检测器,根据第3.2节中提出的端到端速度基准,使用官方预训练模型进行测试。我们的RT - DETR - R50实现了53.1%的AP和108 FPS,而RT - DETR - R101实现了54.3%的AP和74 FPS,在速度和准确性上均优于具有相似规模的最先进YOLO检测器和具有相同骨干网络的DETRs。实验设置在附录中展示。

在这里插入图片描述

与实时检测器对比:我们比较了RT - DETR与YOLO检测器的端到端速度(参见第3.2节)和准确性。我们将RT - DETR与YOLOv5 [11]、PP - YOLOE [40]、YOLOv6 - v3.0 [16](以下简称YOLOv6)、YOLOv7 [38]和YOLOv8 [12]进行了比较。与YOLOv5 - L / PP - YOLOE - L / YOLOv6 - L相比,RT - DETR - R50在准确性上提高了4.1% / 1.7% / 0.3% AP,在FPS上提高了100.0% / 14.9% / 9.1%,并且在参数数量上减少了8.7% / 19.2% / 28.8%。与YOLOv5 - X / PP - YOLOE - X相比,RT - DETR - R101在准确性上提高了3.6% / 2.0%,在FPS上提高了72.1% / 23.3%,并且在参数数量上减少了11.6% / 22.4%。与YOLOv7 - L / YOLOv8 - L相比,RT - DETR - R50在准确性上提高了1.9% / 0.2% AP,在FPS上提高了96.4% / 52.1%。与YOLOv7 - X / YOLOv8 - X相比,RT - DETR - R101在准确性上提高了1.4% / 0.4% AP,在FPS上提高了64.4% / 48.0%。这表明我们的RT - DETR实现了最先进的实时检测性能。

与端到端检测器对比:我们还将RT - DETR与使用相同骨干网络的现有DETRs进行了比较。我们根据在COCO val2017上对应准确性的设置测试了DINO - Deformable - DETR [44]的速度进行对比,即使用TensorRT FP16进行速度测试,输入尺寸为(800, 1333)。表2显示,RT - DETR在速度和准确性上均优于所有具有相同骨干网络的DETRs。与DINO - Deformable - DETR - R50相比,RT - DETR - R50在准确性上提高了2.2% AP,在速度上提高了21倍(108 FPS对5 FPS),两者都有显著提高。

5.2 混合编码器的消融研究

我们评估了第4.2节中设计的变体的指标,包括AP(使用1×配置进行训练)、参数数量和延迟,如表3所示。与基线A相比,变体B在准确性上提高了1.9% AP,延迟增加了54%。这证明了尺度内特征交互是重要的,但单尺度Transformer编码器的计算成本很高。变体C比B在准确性上提高了0.7% AP,延迟增加了20%。这表明跨尺度特征融合也是必要的,但多尺度Transformer编码器需要更高的计算成本。变体D比C在准确性上提高了0.8% AP,但延迟减少了8%,这表明解耦尺度内交互和跨尺度融合不仅降低了计算成本,而且提高了准确性。与变体D相比,DS5延迟减少了35%,但准确性提高了0.4% AP,这表明低级特征的尺度内交互是不必要的。最后,变体E比D在准确性上提高了1.5% AP。尽管参数数量增加了20%,但延迟减少了24%,使编码器更加高效。这表明我们的混合编码器在速度和准确性之间实现了更好的平衡。

5.3 查询选择的消融研究

我们对不确定性最小的查询选择进行了消融研究,结果在RT - DETR - R50上使用1×配置进行报告,如表4所示。RT - DETR中的查询选择根据分类分数选择前K(K = 300)个编码器特征作为内容查询,所选特征对应的预测框作为初始位置查询。我们比较了两种查询选择方案在COCO val2017上选择的编码器特征,并计算了分类分数大于0.5和分类分数与IoU分数都大于0.5的比例。结果表明,不确定性最小的查询选择所选的编码器特征不仅提高了高分类分数的比例(0.82%对0.35%),而且提供了更多高质量的特征(0.67%对0.30%)。我们还评估了在COCO val2017上使用两种查询选择方案训练的检测器的准确性,其中不确定性最小的查询选择实现了0.8% AP的提高(48.7% AP对47.9% AP)。

在这里插入图片描述

5.4 解码器的消融研究

表5展示了使用不同数量的解码器层训练的RT - DETR - R50的推理延迟和准确性。当解码器层数设置为6时,RT - DETR - R50实现了最佳准确性53.1% AP。此外,我们观察到相邻解码器层之间的准确性差异随着解码器层索引的增加而逐渐减小。以列RT - DETR - R50 - Det6为例,使用第5个解码器层进行推理仅在准确性上损失0.1% AP(53.1% AP对53.0% AP),同时延迟减少了0.5 ms(9.3 ms对8.8 ms)。因此,RT - DETR通过调整解码器层数支持灵活的速度调整而无需重新训练,从而提高了其实用性。

在这里插入图片描述

六、局限性与讨论

局限性:尽管提出的RT - DETR在速度和准确性上优于具有相似规模的最先进实时检测器和端到端检测器,但它与其他DETRs存在相同的局限性,即对小物体的性能仍然不如强大的实时检测器。根据表2,RT - DETR - R50比L模型中最高的APval S(YOLOv8 - L)低0.5% AP,RT - DETR - R101比X模型中最高的APval S(YOLOv7 - X)低0.9% AP。我们希望这个问题在未来的工作中得到解决。

讨论:现有的大型DETR模型[3, 6, 32, 41, 44, 46]在COCO test - dev [20]排行榜上展示了令人印象深刻的性能。提出的RT - DETR在不同规模上保留了与其他DETRs同质的解码器,这使得我们可以用高精度预训练的大型DETR模型来蒸馏我们的轻量级检测器。我们相信这是RT - DETR相对于其他实时检测器的优势之一,并且可能是未来探索的一个有趣方向。

七、结论

在这项工作中,我们提出了一种实时端到端检测器,称为RT - DETR,它成功地将DETR扩展到实时检测场景,并实现了最先进的性能。RT - DETR包括两个关键改进:一个高效的混合编码器,能够快速处理多尺度特征;以及不确定性最小的查询选择,提高了初始对象查询的质量。此外,RT - DETR支持无需重新训练的灵活速度调整,并消除了两个NMS阈值带来的不便,使其在实际应用中更加便捷。RT - DETR及其模型缩放策略拓宽了实时目标检测的技术途径,为超越YOLO的各种实时场景提供了新的可能性。我们希望RT - DETR能够投入实际应用。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Limiiiing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值