第二十五章 BEV感知系列二(车道线感知)

前言

近期参与到了手写AI的车道线检测的学习中去,以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新,力求完整精炼,引人启示。所需前期知识,可以结合手写AI进行系统的学习。

BEV感知系列是对论文Delving into the Devils of Bird’s-eye-viewPerception: A Review, Evaluation and Recipe的翻译整理,有多处瑕疵,敬请谅解。

经验评估与策略

​ 在本节中,我们总结了在各种基准点上取得最佳成绩的技巧和最有用的做法。这是基于我们2022 Waymo Open Challenge的参赛作品,即建立在BEV Former[4]之上的BEVFormer++,用于仅相机检测,以及源自SPVCNN[83]的Voxel SPVCNN,用于激光雷达分割。这些实践经验可以作为无缝集成到其他纯电动汽车感知模型中并评估疗效的参考。我们在以下内容中介绍了与数据扩充、BEV编码器、损耗选择相关的实践经验,并在附录的第E节中介绍了检测头设计、模型集成和后处理方面的额外实践经验。

数据增强

数据增强在增强感知模型的鲁棒性和泛化能力方面发挥着至关重要的作用通过综合扩展训练数据集的多样性,我们可以提高模型处理真实世界场景中变化的能力。某些非仿射变换在应用于图像或BEV空间的数据挖掘方面具有挑战性。例如,像复制粘贴和Mosaic这样的方法是有问题的,因为它们可能导致图像语义和3D空间信息之间的错位。

BEV摄像头(仅限摄像头)检测

​ 检测2D识别任务的图像通用数据增强适用于基于摄像头的纯电动汽车感知任务。通常,我们可以将增强划分为单独涉及颜色变化的静态增强移动像素的空间变换。基于颜色变化的增强是直接适用的。对于涉及空间变换的增广,除了对地面实况进行相应变换外,还需要对凸轮时代的参数进行校准。在最近的仅限相机的方法中采用的常见增强是颜色抖动、翻转、调整大小、旋转、裁剪和网格遮罩。

​ 在BEVFormer++中,使用了颜色抖动、翻转、多尺度调整大小和网格掩码。输入图像按0.5和1.2之间的因子缩放,按0.5的比率翻转;用正方形掩模随机掩模总面积的最大30%。值得注意的是,在BEV感知中有两种翻转图像的方式,我们称之为图像级翻转和BEV级翻转。在图像级别翻转过程中,我们翻转图像并调整相机内部参数,而相机外部参数和GT框保持不变。这样可以保留三维到二维的投影关系。注意,图像级别翻转仅增强2D特征提取,而不对与BEV相关联的后续模块施加任何影响。在BEV级别翻转过程中,我们翻转图像并对称地重新排列多视图图像,例如将左前摄像头切换到右前重叠区域的一致性得以保留相机内部参数保持不变,外部参数进行调整,BEV平面上的GT框进行翻转。纯电动汽车水平翻转提升了整个纯电动汽车感知模型。BEVFormer++采用BEV水平翻转。表4 ID 6实验描述了相关消融研究,表明数据增强在提高3D模型性能方面发挥着至关重要的作用。由于BEVFormer[4]采用序列输入,因此它确保了在输入扩充之后,序列的每个帧的变换是一致的。

激光雷达

​ 与检测任务不同,重数据增强可以应用于分割任务,包括随机旋转、缩放、翻转和点平移。对于随机旋转,从[0,2π的范围内选取一个角度),旋转应用于x-y平面上的每个点。比例因子是从[0.9,1.1]的范围中选择的,然后乘以点云坐标。随机翻转沿X轴、Y轴或X轴和Y轴执行。对于随机平移,每个轴的偏移量与平均值为0、标准偏差为0.1的正态分布分开采样。除了坐标和反射率之外,还可以利用额外的信息来提高模型性能。绘制[73124]是利用图像信息增强点云数据的常用技术对于未标记的图像数据,通过将点云标签投影到相应的图像上并加密稀疏注释,从注释的点云数据中获得图像上的语义标签训练图像模型以提供2D语义分割结果然后,预测的语义标签被绘制为一个热点向量,以点云数据作为额外的通道来表示来自图像的语义信息。此外,时间信息也可以被使用,因为au tonomous驾驶中的数据集通常是按顺序收集的。过去的连续帧与当前帧连接。附加了一个附加信道来表示不同帧的相对时间信息。为了减少点的数量,应用了一个小型体素化网络。然后,作为点处理的体素被用作我们的模型的输入。如表5 ID 1所示,大量数据扩充带来了0.4的mIoU改进。通过引入来自图像和先前帧的信息,模型性能的增益分别为0.5和0.8 mIoU(表5 ID 5&6) 。这表明额外的信息,特别是时间信息,有利于每点分类任务

BEV编码

BEV Camera: BEVFormer++

ljLouB.png

表4:BEV摄像头检测轨迹。对val集进行消融研究,对BEVFormer[4]进行改进,即BEVFormer++。一些结果仅报告为iou≥0.5的汽车类别的L1/mAPH。DeD(可变形DETR头)。
FrA(自由锚头)。CeP(中心点封头)。ConvO(时间自注意(TSA)中的Conv偏移)。DE(可变形视图编码器)。CoP(角池)。DA(2D辅助损耗)。GR(全球位置回归)。MS(多标度)、FL(filt)、SL(Smoooth L1损失)、EMA(指数移动平均值)、SB(Sync BN)、2BS(2x BEV等级)、LLW(可倾斜损失权重)、LS(标签平滑)、LE(基于LET-IoU的分配)和TTA(测试时间增强)。DS(数据集)。迷你数据集包含1/5的训练数据*表示用24个时期训练模型,否则用12个时期训练。

lj09Dt.png

表5:BEV激光雷达分割轨迹。对val集进行消融研究,并对SPVCNN进行改进[83],即Voxel SPVCNN。Aug(大量数据扩充)。Arch(对模型架构进行调整)。TTA(测试时间增加)。
绘画(一幅来自图像语义分割的热门绘画)。时态(多帧输入)。V-SPV(Voxel SPVCNN)。
专家(与更多专家模型集成)。后置(后处理技术,包括对象级细化和跟踪分割)。

​ BEVFormer++有多个编码器层,每个编码器层都遵循Transformer[99]的传统结构,除了三种定制设计,即BEV查询、空间交叉注意和时间自注意明确地BEV查询是网格形状的可学习参数,旨在通过注意力机制从多摄像机视图中查询BEV空间中的特征。空间交叉注意和时间自注意是处理BEV查询的注意层,用于查找和聚合来自多摄像机图像的空间特征以及来自历史BEV特征的时间特征。
​ 在推断过程中,在时间戳t处,我们将多摄像机图像馈送到骨干网络(例如,ResNet-101[117]),并获得特征Ft={F i t}不同相机视图的Nview i=1,其中F i t是第i个视图的特征,Nview是相机视图的总数。同时,我们在先前的时间戳t−1处保留了BEV特征Bt−1。在每个编码器层中,我们首先使用BEV查询Q通过时间自注意来查询来自先前BEV特征Bt-1的时间信息。然后,我们使用BEV查询Q来通过空间交叉关注来查询来自多摄像机特征Ft的空间信息在前馈网络[99]之后,编码器层生成细化的BEV特征,从而成为下一编码器层的输入。在六个堆叠编码器层之后,生成当前时间戳t处的统一BEV特征Bt。3D检测头和地图分割头以BEV特征Bt为输入,预测3D边界框和语义图等感知结果。

在这段描述中,提到的是一个多摄像机的3D对象检测和地图分割系统。系统处理流程的关键点如下:

  1. 多摄像机特征提取:

    • 在时间戳t,系统使用多个摄像头的图像作为输入。
    • 这些图像被馈入一个骨干网络(如ResNet-101)来提取特征。
    • 每个摄像机视图提取得到的特征记为F_i^t,其中i表示第i个视图,N_view表示总共有多少视图。
  2. 时空特征融合:

    • 系统保留了先前时间戳t-1的BEV(鸟瞰图)特征B^t-1
    • 在每个编码器层,系统执行两个关键步骤:
      • 时间自注意(Temporal Self-Attention):
        • 通过时间自注意机制,系统使用BEV查询Q来从B^t-1中提取时间信息。
        • 这有助于捕捉随时间变化的特征。
      • 空间交叉关注(Spatial Cross-Attention):
        • 接着使用BEV查询Q通过空间交叉关注机制来从多摄像机特征F^t中提取空间信息。
        • 这有助于捕捉当前时刻各摄像机视图中的空间信息。
  3. 特征细化和传递:

    • 经过前馈网络,编码器层会细化BEV特征。
    • 这些细化后的BEV特征将成为下一个编码器层的输入。
  4. 特征叠加和最终输出:

    • 经过六个这样的堆叠编码器层后,系统生成了当前时间戳t处的统一BEV特征B^t
    • 3D检测头和地图分割头以这个BEV特征B^t为输入,进行后续的3D边界框预测和语义地图分割任务,输出感知结果。

总结来说,这是一个结合了时空信息的多视角融合过程,通过对历史和当前数据的融合分析来增强检测和分割的性能。这个过程可以理解为在不同时间和空间视角的特征上应用自注意和交叉关注机制,进而生成一个全面的BEV特征,用于3D对象检测和地图分割。

​ 为了提高BEV编码器的特征质量,将讨论以下三个主要方面。
(a) 二维特征提取器。在2D感知任务中用于提高背部骨骼表示质量的技术是最多的可能也提高BEV任务的呈现质量。为了方便起见,在图像主干中,我们采用了在大多数2D感知任务中广泛使用的特征金字塔。如表4所示,2D特征提取器的结构设计,例如最先进的图像特征提取器[136]、全局信息交互[137]、多层次特征融合[132138]等,都有助于更好地表示BEV感知的特征。除了结构设计之外,监督骨干的辅助任务对BEV感知的性能也很重要,这将在第4.3.1节中讨论。
(b) 视图转换。变换吸收图像特征,并将它们重新组织到BEV空间中。超参数,包括图像特征的采样范围和频率,以及BEV分辨率,对BEV感知性能至关重要采样范围决定了图像后面的视锥体有多少将被采样到BEV空间中。默认情况下,该范围等于激光雷达的有效范围。当效率具有更高的优先级时,视锥体的z轴上部可能会受到损害,因为在大多数情况下,它只包含诸如天空之类的不重要信息。采样频率决定了图像特征的效用。更高的频率确保了模型以更高的计算成本准确地对每个BEV位置的相应图像特征进行采样BEV分辨率决定了BEV特征的表示粒度,其中每个特征都可以准确地追溯到世界坐标中的网格。为了更好地表示交通灯和行人等小规模物体,需要高分辨率。相关实验如表4 ID 2和3所示。在视图变换中,特征提取操作,例如卷积块或Transformer块,也存在于许多BEV感知网络中。在纯电动汽车空间中添加更好的特征提取子网络也可以提高纯电动汽车的感知性能。
(c) 时间BEV融合。考虑到纯电动汽车特征的结构,纯电动汽车空间中的时间融合通常利用自我-汽车姿态信息来对齐时间纯电动汽车的特征。然而,在这个对齐过程中,其他代理的运动并没有明确建模,这需要模型进行额外的学习。因此,为了增强对其他运动主体特征的融合,在进行时间融合时增加交叉注意力的感知范围是合理的。例如,**我们可以在可变形注意力模块中放大注意力偏移的内核大小,或者使用全局注意力。**相关改进可参见表4 ID 1。

在这句话中,谈论的是如何提高可变形注意力模块的性能,具体来说,是通过增加注意力偏移的范围。这里提到的两种方法是:

  1. 放大注意力偏移的内核大小:

    • 这意味着在注意力机制中,偏移量的计算将基于一个更大的区域。
    • 通常,可变形注意力模块(例如可变形卷积网络)会学习在标准的注意力窗口内部的偏移量,以便更好地捕获局部特征。
    • 通过增加内核(或窗口)的大小,网络可以捕获到更宽范围内的特征,这可以提高特征的表征能力,尤其是对于更复杂的场景。
  2. 使用全局注意力:

    • 全局注意力意味着网络不仅仅是在局部窗口内学习特征之间的关系,而是在整个输入域上进行学习。
    • 这样可以让网络捕捉到长距离的依赖关系,有助于理解整体的上下文信息。
    • 全局注意力通常需要更多的计算资源,因为它需要考虑所有的特征点,但它可以提供更为全面的信息,有时这对于复杂任务是必需的。

总结来说,通过放大内核大小或使用全局注意力,可以在可变形注意力模块中捕获到更广泛的特征关系,从而增强模型对全局上下文的理解和特征表示的能力。这对于需要精细特征调整的复杂视觉任务可能特别有用。

BEV激光雷达体素SPVCNN

​ 由于体素化粗糙和聚集性下采样,现有的3D感知模型不适合识别小实例。SPVCNN[83]在基于体素的分支中利用Minkowski U-Net[119]。为了保持点云的分辨率,使用了一个没有向下采样的额外的基于点的分支。基于点和基于体素的分支的特征将在网络的不同阶段相互传播。

​ 我们通过对原始SPVCNN[83]进行两次有效的修改,提出了Voxel SPVCNN。与简单地对原始输入特征执行体素化相比,应用轻量级的3层MLP来提取点特征,然后应用体素化过程。此外,基于点的分支的输入被作为点分支的体素代替。该分支机构的网络结构仍然是MLP;但是输入被替换为体素。体素SPVCNN更有效,因为基于点的分支上的计算大大减少,特别是在输入是多扫描点云的情况下。模型架构的变化带来了1.1 mIoU的改进(见表5 ID 7)。

Voxel SPVCNN 是对原始的 SPVCNN 方法的一个改进版本。这种改进包括了两个关键的修改,目的是提高模型处理点云数据的效率和效果。下面是对这两个修改的总结:

  1. 引入3层MLP以提取点特征:

    • 在原始的 SPVCNN 中,点云数据直接进行体素化处理,即将连续的空间划分为离散的网格单元(体素)并提取特征。
    • 在 Voxel SPVCNN 中,在体素化之前,先通过一个轻量级的多层感知器(MLP)对每个点的原始特征进行处理。这种预处理步骤可以更好地捕捉每个点的局部结构信息,从而为体素化过程提供更丰富的特征表示。
  2. 点分支输入的替换为体素:

    • 原始的 SPVCNN 架构包含一个基于点的分支,该分支直接处理点云数据。
    • 在 Voxel SPVCNN 中,这个点分支的输入不再是原始的点云,而是被替换为由上述MLP处理后的体素表示。这意味着在点分支中的操作是基于体素化后的数据而非原始点云数据。
    • 这种变化减少了基于点的分支上的计算量,尤其是当处理的是多次扫描合并的点云数据时,因为体素化后的数据通常比原始的点云要稠密。

这些修改提高了模型的效率,尤其是在处理大规模点云数据时。同时,模型的性能也得到了提升,如在某项评测(表5 ID 7)中显示的1.1%的平均交并比(mIoU)提高。简言之,Voxel SPVCNN 通过在体素化之前引入MLP来提取点特征,并将点分支的输入改为体素化的数据,有效提升了模型的性能和效率。

损失

纯电动汽车摄像头

​ 检测纯电动汽车特征表示的多功能好处之一是使模型能够在2D和3D物体检测中进行损失训练。如表4 ID 16-20所示,当利用不同的水头设计时,我们得出结论,可以通过最小的修改来转移相应的损失,例如调整损失重量。“损失重量”的调整指的是改变损失函数中各部分的相对重要性。
​ 除了3D目标的训练损失外,辅助损失在纯相机BEV检测中也起着重要作用。一种类型的辅助损失是在2D特征提取器之上添加2D检测损失。这种监督增强了2D图像特征的局部化,这反过来又有助于BEV感知中的视图转换提供的3D表示。利用这种辅助损失的一个例子可以在表4 ID 4中观察到。另一种类型的辅助损失是深度监督[49]。当利用激光雷达系统产生的地面实况深度时,可以提高BEV感知的隐含深度估计能力,以获得准确的3D目标定位。这两项辅助任务都可以在训练中应用,以提高表现。顺便说一句,2D检测或深度预训练主干通常被用作初始化权重[4,85]。

辅助损失是深度学习中的一种常见技术,它能够在训练期间提供额外的梯度信号,帮助网络更好地学习某些特征。在这种情况下,辅助损失被用于增强2D图像特征提取器的性能。

具体来说,这句话描述的是在一个旨在处理3D数据的网络中,一个2D检测损失被加在2D特征提取阶段。这做了几件事情:

  1. 增强局部化:2D检测损失会强迫网络学习识别图像中的物体位置,这就是所谓的“局部化”。在这个阶段,网络需要确定物体的边界框等2D属性。因此,这个辅助损失确保了网络在特征层面上可以有效地定位物体。

  2. 有助于3D表示的生成:由于最终的目标是在BEV(鸟瞰图)中进行3D表示,那么网络需要将2D图像中学到的特征转换为一个3D上下文中的表示。2D检测的局部化特征对于这种转换是有益的。如果一个网络可以准确地在2D图像中定位物体,那么它更有可能能够将这些物体映射到3D空间中的正确位置。

  3. 视图转换:在BEV感知任务中,2D图像特征必须被转换成一个不同的视角,即从鸟瞰图的角度表示3D空间。有了良好的局部化能力,这个转换过程可以更加精确,因为模型可以更确切地知道每个物体在3D空间中的位置应该是什么。

简单来说,通过在2D特征提取阶段加入辅助损失,你强化了网络在2D图像中识别和定位物体的能力,这在后续将这些特征转换为3D表示时是非常有用的。这种技术可以提高网络在3D任务中的整体性能,尤其是在需要从2D图像中推断3D信息时。

深度监督是在神经网络的训练中使用的另一种辅助损失机制,它专注于改善网络的深度估计能力。在这种情况下,深度监督使用真实的深度信息,通常来源于激光雷达(LIDAR)系统提供的高精度测量,作为额外的训练信号。

在BEV(鸟瞰视图)感知任务中,理解和估计深度是至关重要的,因为这直接影响了对三维空间的理解。以下是深度监督如何提升这一能力的:

  1. 利用真实深度数据:LIDAR系统可以提供非常精确的深度信息,这些信息被用来作为标签,指导神经网络的深度估计。网络被训练为预测与这些真实深度测量值相匹配的深度,从而学会生成类似精度的深度估计。

  2. 隐含深度估计:在没有LIDAR数据可用的情况下,网络需要依赖于从2D图像中推断出的深度信息。通过深度监督,网络被训练得知道如何从图像特征中提取深度线索,即使在未来没有直接的深度信息可用时也能估计深度。

  3. 准确的3D目标定位:准确的深度信息对于在BEV中定位3D对象是必不可少的。如果网络对于深度估计更加精确,那么它在转换和定位物体在三维空间中的位置时也会更加准确。这种精度直接影响到了对象检测和跟踪的性能。

深度监督通过提供一种机制来确保网络能够准确理解和复现深度信息,提高了BEV感知任务的整体性能。这使得模型能够更好地预测3D空间中的对象位置,即使在那些未来可能没有LIDAR作为输入的应用中也是如此。这种方法最终导致了更加可靠和准确的3D目标定位,这在自动驾驶和其他需要精确三维感知的应用中非常宝贵。

激光雷达分割

​ 利用Geo损失[139]和Lovasz损失[´140]来训练所有模型,而不是传统的交叉熵损失。为了更好地划分不同类别的边界,Geo loss对具有丰富细节的体素具有强烈的响应。Lovasz´损失作为一个可微分的交集(IoU)损失来缓解类不平衡问题。它将模型性能提高了0.6 mIoU,如表5 ID 2所示。

在深度学习的上下文中,交叉熵损失通常用于多类分类问题,它测量预测概率分布与目标真实分布之间的差异。然而,当涉及到像体素分割这样的任务时,特别是在目标类别的边界划分必须非常精确的情况下,交叉熵损失可能不是最佳选择。在这种情况下,文中提到的Geo损失和Lovasz损失变得尤为重要。

Geo损失的设计目的是对具有丰富细节的体素给予更强的响应,**从而有助于更好地划分不同类别的边界。**这对于那些在其表面细节上有细微变化的类别来说特别有用,传统损失函数可能不足以捕捉到这些细节。

Lovasz损失是为了处理类别不平衡问题而设计的。在许多真实世界的数据集中,一些类别的样本数量远远超过其他类别。这可能导致模型偏向于频繁出现的类别,从而忽略那些较少见的类别。在深度学习的上下文中,交叉熵损失通常用于多类分类问题,它测量预测概率分布与目标真实分布之间的差异。然而,当涉及到像体素分割这样的任务时,特别是在目标类别的边界划分必须非常精确的情况下,交叉熵损失可能不是最佳选择。在这种情况下,文中提到的Geo损失和Lovasz损失变得尤为重要。

Geo损失的设计目的是对具有丰富细节的体素给予更强的响应,从而有助于更好地划分不同类别的边界。这对于那些在其表面细节上有细微变化的类别来说特别有用,传统损失函数可能不足以捕捉到这些细节。

Lovasz损失是为了处理类别不平衡问题而设计的。在许多真实世界的数据集中,一些类别的样本数量远远超过其他类别。这可能导致模型偏向于频繁出现的类别,从而忽略那些较少见的类别。Lovasz损失通过直接优化非平衡数据集中的交集覆盖(Intersection over Union, IoU)来解决这个问题。IoU是一种常用的度量,特别是在分割任务中,它衡量预测与真实标签之间的重叠程度。Lovasz损失将这个概念转化为一个可微分的损失函数,从而可以在标准的梯度下降框架中使用。

在使用这些特定损失函数训练模型时,可以观察到性能的提升(在文中以0.6 mIoU的提高为例)。这表明,在处理特定类型的预测任务时,选择与问题对应的损失函数对于实现更高的性能至关重要。简而言之,通过将标准的损失函数如交叉熵替换为Geo损失和Lovasz损失,研究人员能够更好地解决边界划分的问题并缓解类别不平衡的影响,最终提高了模型的整体分割性能。IoU是一种常用的度量,特别是在分割任务中,它衡量预测与真实标签之间的重叠程度。Lovasz损失将这个概念转化为一个可微分的损失函数,从而可以在标准的梯度下降框架中使用。

在使用这些特定损失函数训练模型时,可以观察到性能的提升(在文中以0.6 mIoU的提高为例)。这表明,在处理特定类型的预测任务时,选择与问题对应的损失函数对于实现更高的性能至关重要。简而言之,通过将标准的损失函数如交叉熵替换为Geo损失和Lovasz损失,研究人员能够更好地解决边界划分的问题并缓解类别不平衡的影响,最终提高了模型的整体分割性能。

结论

​ 在这项调查中,我们对近年来的纯电动汽车感知进行了全面的回顾,并根据我们在纯电动汽车设计管道中的分析提供了一个实用的配方。巨大的挑战和未来的努力可能是:(a)如何设计更准确的深度估计器;(b) 如何在一种新颖的视觉机制中更好地对齐来自多个传感器的特征表示;(c) 如何设计一个无参数网络,使算法性能不受姿态变化或传感器位置的影响,从而在各种场景中实现更好的泛化能力;以及(d)如何结合基础模型的成功知识,以促进BEV感知。更详细的讨论见附录。我们希望这项调查能对公众有益,并为以后的3D感知研究提供一本有见地的指南。

这段文字总结了针对纯电动汽车(可能是指利用纯视觉技术的自动驾驶汽车)感知系统的研究现状,并指出了未来可能的研究方向。这些方向集中在改进深度估计、特征表示、网络设计以及知识转移方面。以下是每个挑战的专业化理解:

  1. 设计更准确的深度估计器

    • 这涉及到利用机器学习,特别是深度学习方法,来提升从2D图像中估计3D信息的准确性。深度估计是自动驾驶中3D感知的基础,因为它关系到对物体的位置和形状的理解。更准确的估计可以提高避碰和路径规划等关键功能的安全性和可靠性。
  2. 在新颖的视觉机制中更好地对齐多传感器特征表示

    • 多传感器融合是自动驾驶中的一个核心问题。不同的传感器(如相机、雷达和激光雷达)提供不同类型的数据。有效地融合这些数据,确保特征在多维度上正确对齐,可以提高感知系统的准确性和鲁棒性。
  3. 设计一个无参数网络,以提高泛化能力

    • 无参数网络设计意味着创建一个不过度依赖于特定场景的先验知识或参数设置的模型。这类网络可以更好地泛化到新场景或条件,例如不同的光照、天气状况或城市环境,这对于自动驾驶汽车来说是至关重要的。
  4. 结合基础模型的成功知识,促进BEV感知

    • 这可能意味着将在其他任务(如图像识别、自然语言处理等)中取得成功的模型或其部分(如预训练的网络层或结构)应用到鸟瞰图(Bird’s Eye View, BEV)感知任务中。BEV是指从顶部视角对场景的理解,这在规划和导航中非常重要。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小酒馆燃着灯

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

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

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

打赏作者

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

抵扣说明:

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

余额充值