[论文阅读]VirConv(KITTI SOTA 2023.10.17)——用于多模态 3D 目标检测的虚拟稀疏卷积

VirConv

Virtual Sparse Convolution for Multimodal 3D Object Detection
用于多模态 3D 目标检测的虚拟稀疏卷积
论文网址:VirConv
论文代码:VirConv

简读论文

这篇论文提出了一个称为VirConv的操作符,用于基于虚拟点的多模态3D对象检测。主要的贡献和创新点包括:

  1. 提出了Stochastic Voxel Discard (StVD)机制,用于加速网络并提高密度鲁棒性。StVD通过丢弃大量冗余的附近体素来减轻计算量,同时保留远处的体素。这可以大大加速检测速度。

  2. 提出了Noise-Resistant Submanifold Convolution (NRConv)层,用于编码体素特征,减少噪声的影响。NRConv通过将体素反投影到图像平面,在2D图像空间扩展3D稀疏卷积的感受野,可以区分2D图像中的噪声模式,从而抑制噪声的负面影响。

  3. 基于VirConv操作符,构建了三个检测器:高效的VirConv-L,高精度的VirConv-T,以及半监督的VirConv-S。

  4. 在KITTI数据集上进行了详细的实验验证。VirConv-T和VirConv-S在3D检测leaderboard上目前排名第二和第一。VirConv-L以56ms的速度运行,精度也很有竞争力。

  5. 在nuScenes数据集上也进行了实验,证明了方法的泛化性能。

  6. 通过大量的ablation study验证了各个组件的有效性,包括StVD的采样策略,NRConv的设计,以及变换精炼方案(TRS)。

总体来说,该论文针对虚拟点存在的密度问题和噪声问题,设计了StVD和NRConv两种创新机制来解决,并在此基础上构建了高效和高精度的3D检测模型,在KITTI数据集上取得了state-of-the-art的性能。论文内容丰富,结构清晰,论证充分,是一个高质量的工作。

详解VirConv网络

VirConv网络主要由四个部分组成:

  1. 输入层:将LiDAR点云和图像生成的虚拟点云融合在一起,转化为体素表示作为网络输入。

  2. VirConv模块:网络的主体部分,由多个VirConv块组成,每个块包含Stochastic Voxel Discard (StVD)层
    StVD(Stochastic Voxel Discard)是VirConv网路中设计的一个重要模块,目的是加速网络计算和提高对稀疏输入的鲁棒性。其主要思路和设计如下:1.StVD包含输入端的采样和网络内部的随机丢弃两部分。2.输入端采样:将输入的体素根据其距离分到不同的bin中,对近距离bin随机均匀采样保留一定数量;对远距离bin全部保留。3.网络内部随机丢弃:在每个VirConv块中,以一定概率丢弃部分附近冗余体素,模拟更稀疏的训练样本。4.输入端采样可大幅减少冗余输入体素,加速网络计算。网络内部随机丢弃可增强对稀疏输入的鲁棒性。5.采样比例经实验确定,保留10%近距离体素和全部远距离体素取得最佳精度和速度trade-off。丢弃比例为15%也获得了最佳检测精度。6.StVD不同于其他降采样方法,保留了关键的远处体素,同时移除大量近处冗余,既提速又保证精度。总之,StVD通过保留远处信息充足而近处冗余的特点,实现了在虚拟点云条件下,有效减少计算量的同时保持关键信息,是VirConv获得高速度的关键模块。、Noise-Resistant Submanifold Convolution (NRConv)层
    NRConv(Noise-Resistant Submanifold Convolution)是VirConv网络中设计的另一个核心模块,目的是编码体素特征并减少深度补全噪声的影响。其设计思路如下:1.利用标准的3D子流形卷积在3D空间编码体素局部几何特征。2.将体素坐标反投影到图像空间,在2D图像域使用2D卷积扩大感受野。3.将上述2D和3D特征简单拼接,获得同时包含3D局部信息和2D全局上下文的Noise-Resistant特征。4.3D卷积编码空间信息,2D卷积扩大感受野,可识别图像空间中的噪声模式。5.不需要额外的去噪模块或监督信息,通过延展感受野隐式降噪。6.保留了边界有用信息,同时抑制了不成典型分布的深度补全噪声。总之,NRConv通过融合2D和3D特征,既保留了3D局部几何特征,又引入2D全局上下文,可以隐式识别和抑制深度补全引入的噪声,是VirConv获得高精度的关键模块。 和3D稀疏卷积层。StVD用于加速和增强鲁棒性,NRConv用于特征编码和降噪。

  3. 卷积中间层:在VirConv模块后面接几个普通的3D卷积层和全连接层,进一步集成特征。

  4. 输出层:包括回归预测层和分类预测层,分别预测3D框的参数和类别。

具体来说,输入点云经过体素化和输入层采样后,进入VirConv模块。VirConv模块包含多个级联的VirConv块,每个块 Apply StVD、NRConv和下采样的3D稀疏卷积。StVD会随机丢弃一定比例的附近冗余体素,NRConv则通过把体素投影到图像平面,同时编码2D和3D特征来抑制噪声。随着网络层数的增加,特征图被逐步下采样,提升了感受野。经过VirConv模块后,再通过几层全卷积网络和全连接网络集成全局信息,最终预测3D框及其类别。

整体网络结构清晰简洁,不同模块功能明确,既考虑了效率,也考虑了鲁棒性和降噪,非常适合增强的虚拟点云输入。

摘要

最近,通过深度补全网络融合 RGB 图像和 LiDAR 数据的基于虚拟/伪点的 3D 目标检测受到了极大关注。然而,图像生成的虚拟点非常密集,在检测过程中引入了大量的冗余计算。同时,深度补全不准确带来的噪声显著降低了检测精度。本文提出了一种快速而有效的主干网,称为 VirConvNet,基于新算子 VirConv(虚拟稀疏卷积),用于基于虚拟点的 3D 目标检测。 VirConv 由两个关键设计组成:
(1) StVD(随机体素丢弃) StVD 通过丢弃大量附近的冗余体素来缓解计算问题。
(2) NRConv(抗噪声子流形卷积)。 NRConv 通过在 2D 图像和 3D LiDAR 空间中编码体素特征来解决噪声问题。通过集成 VirConv,首先基于早期融合设计开发了高效的流程 VirConv-L。然后,基于变换后的细化方案构建了高精度管道 VirConv-T。最后,开发了一个基于伪标签框架的半监督管道 VirConv-S。在KITTI汽车3D检测测试排行榜上,VirConv-L以56ms的快速运行速度实现了85%的AP。VirConv-T 和 VirConv-S 达到了 86.3% 和 87.2% AP 的高精度,目前分别排名第二和第一。

引言

3D 目标检测在自动驾驶中发挥着至关重要的作用 [Monocular plan view networks for autonomous driving-2019, Multimodal virtual point 3d detection-2021]。 LiDAR 传感器以点云的形式测量场景 [Multi-view 3d object detection network for autonomous driving-2017] 的深度,并能够在各种照明环境中可靠地定位物体。虽然基于 LiDAR 的 3D 目标检测近年来取得了快速进展,但其在远处物体上的性能显着下降,这些物体在扫描中不可避免地具有稀疏的采样密度。与激光雷达扫描不同,彩色图像传感器提供高分辨率采样和丰富的场景上下文数据。 RGB 图像和 LiDAR 数据可以相互补充,通常可以提高 3D 检测性能 [Transfusion-2022, Focal sparse convolutional networks for 3d object detection-2022, Multi-task multi-sensor fusion for 3d object detection-2019, Bevfusion-2022, Frustum pointnets for 3d object detection from rgb-d data-2018]。
早期的方法用图像特征扩展了LiDAR点的特征,例如语义掩模和2D CNN特征。他们没有增加点云数量;因此,远处的点仍然稀疏。相比之下,基于虚拟/伪点(为简单起见,下文均表示为虚拟点)的方法通过在激光雷达点周围创建附加点来丰富稀疏点。例如,MVP [Multimodal virtual point 3d detection-2021]通过从最近的 3D 点完成 2D 实例点的深度来创建虚拟点。 SFD [ Sparse fuse dense-2022] 基于深度补全网络 [Penet-2021] 创建虚拟点。虚拟点完善了远处物体的几何形状,显示出高性能 3D 检测的巨大潜力。
然而,从图像生成的虚拟点通常非常密集。以 KITTI 数据集为例,一张 1242×375 的图像生成 466k 个虚拟点(比 LiDAR 扫描点多约 27 倍)。这带来了巨大的计算负担并导致严重的效率问题。之前的工作通过使用更大的体素大小 或通过对点进行随机下采样来解决密度问题。然而,将此类方法应用于虚拟点将不可避免地牺牲来自远处点的有用形状线索,并导致检测精度下降。
另一个问题是深度补全可能不准确,并且会在虚拟点中带来大量噪声。由于在3D空间中很难区分噪声和背景,因此3D检测的定位精度大大降低。此外,噪声点呈非高斯分布,无法通过常规去噪算法过滤[Bilateral mesh denoising-2003, A review of algorithms for filtering the 3d point cloud-2017]。尽管最近的语义分割网络[Cnn-based lidar point cloud de-noising in adverse weather-2020]显示出有希望的结果,但它们通常需要额外的注释。
为了解决这些问题,本文提出了一种基于新的虚拟稀疏卷积(VirConv)算子的 VirConvNet pipeline。本文的设计基于两个主要观察结果。 (1) 首先,激光雷达扫描中附近物体的几何形状通常相对完整。因此,附近物体的大多数虚拟点仅带来很少性能增益,但显著增加了计算成本。 (2) 其次,由不准确的深度估计引入的噪声点主要分布在实例边界上,它们被投影到图像平面后可以在 2D 图像中被识别。
基于这两个观察,设计了StVD(随机体素丢弃)方案,通过基于bin的采样保留那些最重要的虚拟点,即丢弃大量附近的体素,同时保留远处的体素。这可以大大加快网络计算速度。还设计了一个 NRConv(抗噪子流形卷积)层来编码 3D 空间和 2D 图像空间中体素的几何特征。 2D 空间中扩展的感受野使 NRConv 能够区分 2D 图像空间中实例边界上的噪声模式。因此,可以抑制噪声的负面影响。
本文开发了三种多模态检测器来证明 VirConv 的优越性:(1)由 Voxel-RCNN 构建的轻量级 VirConv-L;(2)基于多阶段[Casa-2022]和多变换[Learning transformation-equivariant features for 3d object detection-2023]设计的高精度VirConv-T;(3)基于伪标签[3dioumatch-2021]框架的半监督VirConvS。本文设计的有效性通过广泛使用的 KITTI 数据集 和 nuScenes 数据集上的大量实验得到验证。
贡献:

  • 提出了一种 VirConv 算子,它通过 StVD 和 NRConv 有效地编码虚拟点的体素特征。 StVD 丢弃了大量冗余体素,显着加快了 3D 检测速度。 NRConv 将 3D 稀疏卷积的感受野扩展到 2D 图像空间,并显着减少噪声点的影响。
  • 基于 VirConv,提出了三种新型多模态检测器:VirConv-L、VirConv-T 和半监督 VirConv-S,分别用于高效、高精度和半监督 3D 检测。
  • 大量的实验证明了本文设计的有效性。在 KITTI 排行榜上,VirConv-T 和 VirConv-S 目前分别排名第二和第一。VirConv-L 运行速度为 56 毫秒,精度具有竞争力。

相关工作

LiDAR-based 3D object detection. : 近年来,基于 LiDAR 的 3D 物体检测得到了广泛的研究。早期的方法将点云投影到 2D 鸟瞰图 (BEV) 或范围视图图像 [Birdnet-2018, Multi-view 3d object detection network for autonomous driving-2017] 中以进行 3D 检测。最近,基于体素的稀疏卷积[Voxel r-cnn-2021, Structure aware single-stage 3d object detection from point cloud-2020, Pointpillars-2019, Second-2018]和基于点的集合抽象[Pv-rcnn-2020, PointRCNN-2019, 3dssd-2020, Std-2019]在设计有效的检测框架中变得流行。然而,激光雷达对于远处物体的扫描分辨率通常很低。仅使用激光雷达的探测器通常会遭受这种稀疏性的困扰。本文通过引入虚拟点形式的 RGB 图像数据来解决这个问题。
Multimodal 3D object detection. : RGB 图像和 LiDAR 数据可以相互补充,通常可以提高 3D 检测性能。早期的方法利用图像特征扩展 LiDAR 点的特征 [MVX-Net-2019, Pointpainting-2020, Pointaugmenting-2021]。一些工作独立编码两种模态的特征,并将这两种特征融合在局部感兴趣区域(RoI)[Futr3d-2020, Joint 3d proposal generation and object detection from view aggregation-2018]或BEV平面[Bevfusion-2022]中。本文遵循最近通过虚拟点融合两个数据的工作[Sparse fuse dense-2022, Multimodal virtual point 3d detection-2021]。虚拟点通过深度估计明确地完成了远处物体的几何形状,显示出高性能 3D 检测的巨大潜力。但虚拟点非常密集,而且常常充满噪音。本文分别通过 StVD 和 NRConv 两种新方案解决了这些问题。
3D object detection with re-sampled point clouds. : 激光雷达捕获的点普遍密集且分布不均匀。之前的工作通过使用更大的体素大小或通过对点云进行随机下采样来加速网络。然而,将这些方法应用于虚拟点将显着减少有用的几何线索,特别是对于远处的物体。与此不同的是,本文的 StVD 保留了所有有用的远处体素,并通过丢弃附近的冗余体素来加速网络。
Noise handling in 3D vision. : 传统方法通过滤波算法处理噪声。最近,基于评分的[Score-based point cloud denoising-2021]和语义分割网络[Cnn-based lidar point cloud de-noising in adverse weather-2020]被开发用于点云噪声去除。与随机分布在 3D 空间中的传统噪声不同,深度补全不准确带来的噪声大多分布在 2D 实例边界上。虽然可以通过一些二维边缘检测方法[Bi-directional cascade network for perceptual edge detection-2019]粗略地去除噪声,但这会牺牲目标的有用边界点。本文设计了一种新方案 NRConv,它将 3D 稀疏卷积的感受野扩展到 2D 图像空间,在不丢失有用边界点的情况下区分噪声模式。
Semi-supervised 3D object detection. : 最近的半监督方法通过大量未标记的数据增强了 3D 目标检测。受到基于伪标签的框架 [3dioumatch-2021, Semi-supervised 3d object detection via adaptive pseudo-labeling-2021, Sess-2020] 的启发,本文还构建了一个 VirConv-S pipeline来执行半监督多模态 3D 对象检测。

VirConv for Multimodal 3D Detection

本文提出了基于新 VirConv 算子的 VirConvNet,用于基于虚拟点的多模态 3D 目标检测。如图 3 所示,VirConvNet 首先将点转换为体素,然后通过一系列具有 1×、2×、4× 和 8× 下采样步长的 VirConv 块逐渐将体素编码为特征体。 VirConv 模块由三部分组成(见图 3(a)):(1)StVD 层,用于加速网络并提高密度鲁棒性; (2)多个NRConv层用于编码特征并减少噪声的影响; (3) 3D SpConv 层,用于对特征图进行下采样。基于 VirConv 算子,本文构建了三个检测器,分别用于高效、准确和半监督的多模态 3D 检测。
VirConv

Virtual Points for Data Fusion

最近的许多 3D 检测器使用深度补全算法从图像生成的虚拟点 [Multimodal virtual point 3d detection-2021](伪点 [Sparse fuse dense-2022])来融合 RGB 和 LiDAR 数据。本文将 LiDAR 点和虚拟点分别表示为 P 和 V。最近,两种流行的融合方案已应用于 3D 物体检测:(1)早期融合 [Multimodal virtual point 3d detection-2021],将 P 和 V 融合成单个点云 P* 并使用现有检测器执行 3D 目标检测,以及(2)后期融合[Sparse fuse dense-2022],它通过不同的骨干网络对P和V的特征进行编码,并在BEV平面或本地RoI中融合这两类特征。然而,这两种融合方法都受到密集虚拟点和噪声的影响。

  1. Density problem. 正如第 1 节中所述,虚拟点通常非常密集。它们引入了巨大的计算负担,从而显着降低了检测速度。现有的工作通过使用更大的体素大小 [Pointpillars] 或通过对点进行随机下采样 [Randla-net-2020] 来解决密度问题。但这些方法不可避免地会牺牲虚拟点的形状线索,特别是对于远处的物体。基于使用带有后期融合的 Voxel-RCNN 对 KITTI 数据集进行的试点实验,本文观察到为附近物体引入的大量虚拟点是多余的。具体来说,来自附近物体的97%的虚拟点仅带来0.18%的性能提升,而来自远处物体的3%的虚拟点带来2.2%的性能提升。原因是激光雷达点附近物体的几何形状相对完整。此类虚拟点通常会带来很少性能增益,但会增加不必要的计算。受此观察的启发,本文设计了 StVD(随机体素丢弃)方案,该方案通过丢弃附近的冗余体素来缓解计算问题。此外,远处物体的点比附近物体的点稀疏得多。 StVD可以模拟稀疏的训练样本以提高检测的鲁棒性。
  2. Noise problem. 深度补全网络生成的虚拟点通常是有噪声的。噪声主要是由不准确的深度补全引入的,并且在 3D 空间中很难区分。与仅使用 LiDAR 的检测器相比,仅使用虚拟点,检测性能下降约 9% AP。此外,噪声点是非高斯分布的,无法通过传统的去噪算法进行过滤。本文观察到噪声主要分布在实例边界上,并且在2D图像中更容易识别。虽然这里可以应用边缘检测[Bi-directional cascade network for perceptual edge detection-2019]来粗略地去除噪声,但这会牺牲有利于物体形状和位置估计的有用边界点。本文的想法是将稀疏卷积的感受野扩展到2D图像空间,并在不丢失形状线索的情况下区分噪声。

Stochastic Voxel Discard

为了缓解计算问题并提高基于虚拟点的检测器的密度鲁棒性,本文开发了 StVD。它由两部分组成:(1)input StVD,通过在训练和推理过程中丢弃虚拟点的输入体素来加速网络; (2) layer StVD ,仅在训练过程中丢弃每个 VirConv 块处虚拟点的体素,从而提高密度鲁棒性。
Input StVD. : 有两种简单的方法可以保留较少的输入体素:(1)随机采样或(2)最远点采样(FPS)。然而,随机采样通常会在不同距离处保持不平衡的体素,并且不可避免地会牺牲一些有用的形状线索。此外,由于计算复杂度较高(O(n2)),FPS 在对大量虚拟点进行下采样时需要大量额外计算。为了解决这个问题,本文引入了基于bin的采样策略来执行高效且平衡的采样。具体来说,我们根据不同的距离将输入体素分为 Nb 个 bin(本文采用 Nb = 10)。对于附近的 bin,随机保留固定数量(∼ 1K)的体素。对于远处的distant bins,保留所有内部体素。在基于 bin 的采样之后,丢弃了大约 90%(这实现了最佳的精度-效率权衡)的冗余体素,并且它使网络速度提高了大约 2 倍。
Layer StVD. : 为了提高稀疏点检测的鲁棒性,还开发了一个应用于训练过程的 StVD 层。具体来说,丢弃每个 VirConv 块处的体素以模拟稀疏的训练样本。本文采用15%的丢弃率。 StVD 层用作数据增强策略,帮助增强 3D 检测器的训练。

Noise-Resistant Submanifold Convolution

由不准确的深度补全引入的噪声在 3D 空间中很难识别,但可以从 2D 图像中轻松识别。本文从广泛使用的子流形稀疏卷积[3d semantic segmentation with submanifold sparse convolutional networks-2018]中开发了一个NRConv来解决噪声问题。具体来说,给定由 3D 索引向量 H ∈ R(N×3) 和特征向量 X ∈ R(N×Cin) 表示的 N 个输入体素,本文在 3D 和 2D 图像空间中对抗噪声几何特征 Y ∈ R(N×Cout) 进行编码,其中 Cin Cout 分别表示输入和输出特征通道的数量。
Encoding geometry features in 3D space. : 对于X中的每个体素特征Xi,首先通过3D子流形卷积核K3D(·)对几何特征进行编码。具体来说,几何特征 Xˆ i ∈ RCout/2 是根据相应的 3D 索引从 3 × 3 × 3 邻域内的非空体素计算得出的:
在这里插入图片描述
其中 Xi(f1), …,Xi(fj)表示 H 生成的邻居特征,R 表示非线性激活函数。
Encoding noise-aware features in 2D image space. : 不准确的深度补全带来的噪声显着降低了检测性能。由于噪声主要分布在 2D 实例边界上,因此本文将卷积感受野扩展到 2D 图像空间,并使用 2D 邻近体素对噪声感知特征进行编码。具体来说,首先根据体素化参数将 3D 索引转换为一组网格点(转换表示为 G(·))。由于最先进的检测器[Voxel r-cnn, Sparse fuse dense]也采用旋转和缩放等变换增强(增强表示为T(·)),因此网格点通常与相应图像不对齐。因此,根据数据增强参数将网格点向后变换到原始坐标系。然后根据LiDAR-Camera标定参数将网格点投影到2D图像平面上(投影表示为P(·))。总体预测可以总结为:
在这里插入图片描述
其中 ˆH ∈ R(N×2) 表示 2D 索引向量。对于每个体素特征 Xi ∈ R(Cin) ,然后根据相应的 2D 索引从 3×3 邻域内的非空体素计算噪声感知特征 X~i ∈ R(Cout/2) 。
在这里插入图片描述
其中 Xi(fi) 表示由 ^H 生成的邻近体素特征,K2D(·) 表示 2D 子流形卷积核。如果单个 2D 相邻体素中有多个特征,会执行最大池化并在每个体素中保留一个特征来执行 2D 卷积。
在 3D 和 2D 特征编码之后,采用简单的串联来隐式学习抗噪声特征。具体来说,最终连接 Xˆ i 和 X~i 以获得抗噪声特征向量 Y ∈ R(N×Cout) 为:
在这里插入图片描述
与相关的噪声分割和去除方法不同,本文的NRConv通过将感受野扩展到2D图像空间来隐式地区分噪声模式。因此,噪声的影响被抑制而不会丢失形状线索。

Detection Frameworks with VirConv

为了证明 VirConv 的优越性,本文从广泛使用的 Voxel-RCNN 构建了 VirConv-L、VirConv-T 和 VirConv-S,分别用于快速、准确和半监督 3D 对象检测。
VirConv-L. : 首先构建轻量级 VirConvL(图 3 ©)用于快速多模态 3D 检测。 VirConv-L 采用了早期的融合方案,并用 VirConvNet 取代了 Voxel-RCNN 的主干。具体来说,将LiDAR点表示为P = {p},p = [x,y,z,α],其中x,y,z表示坐标,α表示强度。将虚拟点表示为 V = {v}, v = [x, y, z]。将它们融合成一个点云 P* = {p*}k, p* = [x, y, z, α, β],其中 β 是表示点来自哪里的指示符。虚拟点的强度用零填充。本文的 VirConvNet 将融合点编码成特征体积以进行 3D 检测。
VirConv-T. : 然后,基于Tranformed Refinement Scheme(TRS)和后期融合方案构建了高精度 VirConv-T(见图 5)。 Casa和TED分别基于三阶段细化和多重变换设计实现了高检测性能。然而,它们都需要大量的计算。本文将两个高计算检测器融合到一个高效的pipeline中。具体来说,首先用不同的旋转和反射来变换 P 和 V。然后采用VoxelNet 和VirConvNet分别对P和V的特征进行编码。与 TED 类似,不同变换之间的卷积权重是共享的。之后,RoI 由区域提议网络(RPN)生成,并在第一次转换下通过主干特征(通过简单串联融合的 P 和 V 的 RoI 特征)进行细化。细化后的 RoI 通过其他变换下的主干特征进一步细化。接下来,来自不同细化阶段的细化 RoI 通过框投票进行融合,如 CasA 所做的那样。最终对融合的 RoIs 执行非极大值抑制(NMS)以获得检测结果。
VirConv-T
VirConv-S. : 本文还使用广泛使用的伪标签方法设计了一个半监督管道 VirConv-S。具体来说,首先,使用标记的训练数据预训练模型。然后,使用此预训练模型在更大规模的未注释数据集上生成伪标签。采用高分阈值(经验上为0.9)来过滤掉低质量标签。最后,使用真实标签和伪标签训练 VirConv-T 模型。

结论

本文提出了一种新的 VirConv 算子,用于基于虚拟点的多模态 3D 物体检测。 VirConv通过新设计的随机体素丢弃和抗噪声子流形卷积机制解决了虚拟点的密度和噪声问题。基于 VirConv,推出了 VirConv-L、VirConv-T 和 VirConv-S,分别用于高效、准确和半监督 3D 检测。本文的 VirConvNet 在 KITTI 汽车 3D 目标检测和 BEV 检测排行榜上均处于领先地位,证明了本文方法的有效性。

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一朵小红花HH

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

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

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

打赏作者

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

抵扣说明:

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

余额充值