自动驾驶中的“ImageNet”?CVPR2024新作OccFeat:BEV 自监督预训练

论文标题:

OccFeat: Self-supervised Occupancy Feature Prediction for Pretraining BEV Segmentation Networks

论文作者:

Sophia Sirko-Galouchenko, Alexandre Boulch, Spyros Gidaris, Andrei Bursuc, Antonin Vobecky, Patrick Pérez, Renaud Marlet

导读:

本文将为大家介绍CVPR2024自动驾驶最新论文–OccFeat,一种用于纯相机BEV分割网络的自监督预训练方法,它能同时加强对3D场景的几何和语义理解。OccFeat利用三种模式进行预训练:图像、激光雷达和DINOv2特征。在nuScenes上对OccFeat进行了评估,以对车辆和地图布局进行BEV语义分割。结果显示了OccFeat的预训练方法优势。©️【深蓝AI】编译

1. 摘要

作者介绍了一种自监督预训练方法----OccFeat,针对纯视觉的BEV分割网络。使用OccFeat,作者可以借助占据预测和特征蒸馏预训练一个BEV网络。占据预测可以给模型提供对于场景3D几何信息的理解。但是,几何信息学习的类别是不确定的。因此,作者从一个自监督预训练图像基础模型中,通过蒸馏给其他模型添加3D语义信息。使用作者预训练方法的模型,可以显著提高BEV语义分割性能,尤其是在数据稀少的场景下。此外,实验结果表明作者提出的预训练方法是十分有效的。

在这里插入图片描述
▲图1|数据稀少领域性能对比示意图©️【深蓝AI】编译

2. 引言

近年来,纯视觉BEV网络在自动驾驶感知领域产生了巨大影响。BEV的吸引力在于,它为各种传感器(包括环视摄像头、激光雷达和雷达)提供了一个统一的空间,可用于标注和运行时感知目的,并可作为驾驶系统中后续任务(如预测和规划)的输入。一般在BEV特征空间的任务分为语义分割和目标监测。本文工作任务领域为纯视觉BEV语义分割任务。

至今,对于BEV空间中的纯视觉语义分割的训练网络主要依赖于全监督策略,也就是需要针对每个场景的详细标注。这一标注过程耗时耗力——输入的图像需要转化到“合成”的BEV空间。例如,一般有雷达数据生成的标注数据,经过可见性和目标类别的检查之后,才能投射到BEV分割图像中。为减少标注损耗,作者探索了自监督预训练纯视觉BEV分割网络的潜力。

在自监督预训练中,BEV网络首先在无标注数据的任务中进行训练,然后迁移到下游任务中。这一过程的目的是指导网络在预训练阶段学习有用的数据表示,可以提高网络在下游任务上的性能,能够让网络在少量标注数据情况下,依然获得不错的性能。预训练已被证明在图像到激光雷达等多模型数据上的有效性,借助不同的策略,例如:对比学习、教师学生架构和重建任务,预训练可以获得较好的效果。

在自动驾驶领域,针对纯视觉BEV网络的自动监督训练具有很重要的作用,但是没有引起很大的热度。近来也涌现出了一批相关方法,但是它们主要聚焦于3D几何预测任务的预训练。例如,ViDAR利用激光雷达点云预测实施预训练,UniPAD使用3D表面和RGB像素重建,以及UniScene则使用3D占据预测。虽然这些方法帮助BEV网络获得3D几何信息理解,但是无法让网络捕获3D场景的语义感知信息,这一信息对基于BEV的语义分割任务来说尤为重要。

本文所提出的占据特征预测方法(OccFeat),通过提出一个预训练目标----也就是对3D场景更加全面的理解,同时提供几何和语义信息,从而解决了上述问题。在本方法中,纯视觉BEV网络是以预测一个3D体素网格表示为任务:

a. 体素占据的表示;

b. 高级自监督图像特征表征被占据的体素。

为了创建这一体素网格表示,作者利用了自动驾驶中对齐的激光雷达和图像数据,以及一个自监督图像基础模型(如:DINOv2)。 具体来说,本方法是利用激光雷达数据确定每个体素的占用率,如果一个体素包含至少一个激光雷达点,则认为该体素已被占用。同时,自监督图像基础模型使用高级图像特征填充占据的体素。这一过程会将每个占据体素单元中心坐标投射到2D图像特征空间。

不同于仅仅关注3D几何预测的方法,本文方法通过预测一个更加丰富、更多语义表示的3D场景,且利用预训练的图像基础模型来解放双手进行自动标注。实验证明这一3D场景语言增强策略可以给下游BEV语义分割结果带来巨大的性能提升,尤其是在少量数据的场景下。

3. 相关工作

纯视觉BEV感知。BEV感知为自动驾驶提供车辆周边环境的全面表示,已成为多相机系统的主流范式。它包括三个部分:图像编码器提取2D特征,视觉投影模块将2D特征转换为3D空间的BEV特征,以及执行诸如语义分割、地图预测和3D监测等任务的解码器。视图投影技术多样,包括基于几何的方法和完全基于数据学习的方法。

目前,广泛使用的是Nvidia提出的“推”方法,通过深度不确定性估计将特征投影到BEV空间,以及不依赖深度估计、直接映射3D位置信息到图像空间的方法。近年来,BEV方法预测性能虽提高,但高效标注学习方法开始超越传统数据增强策略。精确3D标注成本高,劳动密集。作者提出提高BEV模型标注效率的策略,并展示在SimpleBEV和BEVFormer两种视图投影上的应用。

在这里插入图片描述
图2|OccFeat自监督BEV预训练方法示意图©️【深蓝AI】编译

自监督表示学习(SSL)是一种使用未标注数据来学习数据表示的方法,它通过无标注代理任务提取数据中的有用模式。SSL常使用预训练模型,在有限标签的任务上进行微调,以此提高性能。诸如图像扰动预测、对比学习、聚类、自蒸馏和掩码图像建模等代理任务已被广泛探索,后者尤其适合于视觉Transformer架构。

虽然SSL在通用图像数据集上效果显著,但用于驾驶数据的SSL预训练面临挑战,如数据冗余和类别不平衡。不过,多传感器数据和视觉基础模型为获取三维和/或语义知识提供了新机会,如无监督语义分割或检测。环视相机与激光雷达的数据同步也用于激光雷达网络的预训练,并通过无标签蒸馏策略在低标签环境中取得进步。

BEV预训练和蒸馏在自动驾驶感知任务中用于提升性能和解决数据标注难题。通常,单目3D目标检测的基线预训练被用作起点。通过教师-学生架构,激光雷达的3D推理能力被蒸馏到相机图像,以补充视觉投影模块中的几何信息损失。然而,激光雷达的3D标注数据获取困难。还有基于摄像头的BEV预训练方法采用自监督学习(SSL)范式,如占用率估计和激光雷达点云预测,但这些方法可能限制图像编码器获取语义知识。作者提出在体素空间中提炼DINOv2预训练图像特征,以生成兼具几何和语义感知能力的BEV特征。这与POP-3D不同,后者将CLIP特征用于开放词汇感知而非预训练。

4. 方法

本文目标是以自监督方式来预训练一个纯视觉BEV分割网络。为此,作者试图在学习到的BEV表示上进一步扩展编码场景3D几何信息和语义相关信息的能力,这一能力对于BEV空间的下游任务(比如:语义分割)尤为重要。为实现这一目标,作者借助当前的可用资源:

1)对齐自动驾驶场景下的激光雷达和图像数据;

2)一个能够提取高级2D图像特征的自监督预训练图像编码器(例如:DINOv2)。

本文提出的自监督BEV预训练方法OccFeat,具体如图2所示,包含两个训练目标:

1)占据重建( L o c c L_{occ} Locc):这一目标关注于通过占据重建任务中的BEV网络捕获场景的3D几何信息;

2)占据指导的特征蒸馏( L f e a t L_{feat} Lfeat):这一目标使得BEV网络能够重建高级语义特征。基于预测占据体素位置,来训练对应的网络模型。

本文自监督预训练方法的整体的目标为:

L = L o c c + λ ⋅ L f e a t L=L_{occ}+\lambda \cdot L_{feat} L=Locc+λLfeat

其中是权重系数,用来平衡两个损失项。除非特殊情况,本文使用 λ = 0.01 \lambda = 0.01 λ=0.01

4.1 BEV网络

BEV网络旨在从标定图像数据中构建一个BEV特征图。本文中,BEV特征图主要用来语义分割。这些BEV网络共享一个基本结构,其中包含:

1)一个图像编码器;

2)一个投射模块;

3)一个解码器。

图像编码器 E 1 E_1 E1针对每一张图像 I c I_c Ic产生一个特征图 F c F_c Fc c c c的范围是从1到 C C C,其中 C C C是车辆上环视相机的数量。一般而言,这些编码器来自于ResNet或者EfficientNet相关模型。

投射模块 P B P_B PB主要是负责改变特征表示空间,从传感器坐标系(特征 F e F_e Fe)到BEV空间。 P B P_B PB以图像特征 { F c } c = 1 C \{F_c\}^C_{c=1} {Fc}c=1C和相机标定信息为输入,将图像特征投射到BEV空间。投射模型的不同工作原理导致模块架构的差异,从沿着垂直轴聚合全图像特征卷(SimpleBEV)或者根据估计深度分布填充稀疏特征卷(LSS)到CVT或者BEVFormer中的基于注意力的投射实现。

解码器 D B D_B DB是以 P B P_B PB模块生成的BEV空间的图像特征为输入,进一步使用2D卷积进行处理,附加一些上采样操作,生成想要的图像分割分辨率。所产生的BEV特征 F B ∈ R N B × H B × W B F_B \in R^{N_B \times H_B \times W_B} FBRNB×HB×WB,其中 H B × W B H_B \times W_B HB×WB是BEV特征的空间分辨率,而 N B N_B NB则是特征的通道数量。

架构无关BEV表示预训练。本文所采用的自监督预训练方法被应用在由 D B D_B DB产生的这些BEV特征 F B F_B FB上。因此,可以通过插入预训练头将这种预训练方法插入到任何BEV模型中,正如作者所描述,在BEV网络结尾和下游任务头之前的位置插入。

在这里插入图片描述
图3|占据网格示意图©️【深蓝AI】编译

4.2 占据重建

之前的研究强调了重构作为图像和激光雷达点云等不同模态的重要先验的有效性,基于这些研究的见解,作者为BEV网络设计了简单的占据重构预训练任务。作者的目标是引导BEV网络学习编码场景三维几何信息的BEV特征。

V V V表示形状为 Z B × H B × W B Z_B \times H_B \times W_B ZB×HB×WB的体素网格,其中 Z B Z_B ZB是高度。为了创建占据目标 O ∈ { 0 , 1 } Z B × H B × W B O \in \{0, 1\}^{Z_B \times H_B \times W_B} O{0,1}ZB×HB×WB,本文采用一般设定,其中一个体素 v ∈ V v \in V vV被认为是占据的,如果存在至少一个激光雷达点落在其中,如图3所示。

为估计占据网格 O ^ \hat{O} O^,作者有用一个“反溅射”解码器网络 D v D_v Dv,它以来自于 D B D_B DB产生的2D BEV特征图 F B ∈ R N B × H B × W B F_B \in R^{N_B \times H_B \times W_B} FBRNB×HB×WB作为输入,然后生成一个3D特征卷 F V ∈ R N B × Z B × H B × W B F_V \in R^{N_B \times Z_B \times H_B \times W_B} FVRNB×ZB×HB×WB

反溅射解码器 D v D_v Dv以两个2D卷积层为开始。第一层,使用3x3卷积核, N B N_B NB表示输出通道,后接实例正则化和ReLU单元。第二层卷积具有1x1卷积核, N B Z B N_BZ_B NBZB作为输出通道。这些层产生形状为 ( N B Z B ) × H B × W B (N_BZ_B) \times H_B \times W_B NBZB×HB×WB的2D BEV特征图,然后转为一个形状为 N B × Z B × H B × W B N_B \times Z_B \times H_B \times W_B NB×ZB×HB×WB的3D特征卷。

之后,解码器 D v D_v Dv使用两个3D卷积层处理这些3D特征。第一层,使用1x1x1卷积核以及 2 N B 2N_B 2NB作为输出通道,后接一个Softplus非线性激活。第二层采用1x1x1卷积核以及 N B N_B NB作为输出通道,产生最终的3D特征卷 F V ∈ R N B × Z B × H B × W B F_V \in R^{N_B \times Z_B \times H_B \times W_B} FVRNB×ZB×HB×WB

最终,为生成占据预测 O ^ \hat{O} O^,一个简单的3D卷积层,带有1x1x1卷积核,用来处理 F V F_V FV,最后接一个sigmoid激活函数。

损失函数使用的是体素占据上的一个二分类交叉熵损失函数:

L o c c = 1 ∣ V ∣ ∑ v ∈ V BCE ( O ^ v , O v ) L_occ = \frac{1}{|V|} \sum_{v \in V} \text{BCE}(\hat{O}_v, O_v) Locc=V1vVBCE(O^v,Ov)

4.3 占据指导特征蒸馏

作者通过指导BEV网络编码高级语义信息,从而引入一个自监督目标弥补占据重建。具体流程为:使用一个自监督预训练图像网络 E I Y E^Y_I EIY,以图像为输入然后产生 N y N_y Ny特征通道维度的高级2D特征图。本文的OccFeat方法涉及一个特征蒸馏目标,也就是用 E I Y E^Y_I EIY提出的图像特征在 V V V中填充占据体素,然后训练BEV网络来预测体素特征。

V O c c V_{Occ} VOcc表示占据体素的集合,定义为 V O c c − { ∀ v ∈ V ∣ O V = 1 } V_{Occ} - \{ \forall v \in V| O_V=1 \} VOcc{vVOV=1},本文特征蒸馏目标是在这些占据体素上实施的。为了创建针对每一个占据体素 v ∈ V O c c v \in V_{Occ} vVOcc的目标图像特征 T v ∈ R N y T_v \in R^{N_y} TvRNy,作者将体素中心3D坐标投射到使用目标图像编码器 E I Y E^Y_I EIY提取环视图像 { I c } c = 1 C \{I_c\}_{c=1}^C {Ic}c=1C得到的图像特征中。给定这些从3D点到2D图像的投射,作者接着使用双线性采样图像特征 I c I_c Ic从而获得 N y N_y Ny维特征向量。然后,在投射后的图像特征中计算出目标特征 Y v Y_v Yv,作为双线性采样特征向量的平均值。为了预测占据体素的目标特征,作者使用 D v D_v Dv解码器生成3D特征卷 F V ∈ R N B × Z B × H B × W B F_V \in R^{N_B \times Z_B \times H_B \times W_B} FVRNB×ZB×HB×WB。接着,一个卷积核为1x1x1且输出通道维度为 N y N_y Ny的3D卷积层应用在 F v F_v Fv上,生成对应的3D特征卷 Y ^ ∈ R N B × Z B × H B × W B \hat{Y} \in R^{N_B \times Z_B \times H_B \times W_B} Y^RNB×ZB×HB×WB。然后,针对每个占据体素 v ∈ V O c c v \in V_{Occ} vVOcc,作者从 Y ^ \hat{Y} Y^中提取它的对应特征 Y ^ ∈ R N y \hat{Y} \in R^{N_y} Y^RNy

特征拯救损失用来最小化占据体素 v ∈ V O c c v \in V_{Occ} vVOcc对应的预测和目标特征之间的平均非负余弦相似度,定义为:

L f e a t = − 1 ∣ V O c c ∣ ∑ v ∈ V O c c cos ( Y ^ v , Y v ) L_{feat} = - \frac{1}{|V_{Occ}|} \sum_{v \in V_{Occ}} \text{cos}(\hat{Y}_v, Y_v) Lfeat=VOcc1vVOcccos(Y^v,Yv)

需要注意一点:有少量被占据的体素缺乏对任何图像 { I c } c = 1 C \{I_c\}_{c=1}^C {Ic}c=1C的有效投影。虽然为了简化符号而没有在上述公式中明确显示,但这些体素实际上被排除在特征损失的计算之外。

5. 实验

5.1 实验设定

· 数据集:

为了对这项方法进行评估,本次研究使用了nuScenes数据集对纯相机BEV网络进行预训练,并在基于BEV语义分割的下游任务中对其进行微调。该数据集由在波士顿和新加坡录制的1000个序列组成。数据分为训练(700个序列)、验证(100个序列)和测试(200个序列)三个部分。每一帧都包含用 32 层激光雷达获取的点云和6幅覆盖自我车辆周围环境的图像。

· BEV分割任务:

作者考虑了与BEV细分相关的两个不同任务。首先,作者在车辆分割任务中验证他们的方法,通过映射车辆的锚点框到BEV平面构建目标BEV分割全局真值。本文采用通用的设定,也就是本体车辆周围50米的范围,且BEV真值大小为200x200像素。其次,作者在地图分割上验证。这里,作者验证他们微调之后的BEV网络的能力,实现对背景类别的分割:道路、人行道、十字路、泊车区域以及道路分割线。

· 架构:

采用BEV网络。作者采用两个BEV架构的网络进行实验:SimpleBEV和BEVFormer。

· 图像编码器:

作为BEV分割网络的图像基干,作者采用EfficientNet-B0(EN-B0)或者ResNet-50(RN-50)。遵循纯视觉BEV分割的一般操作,这些图像基干都在 ImageNet 上经过了预训练,训练方式可以是监督式训练(针对 EN-B0),也可以是使用MoCov2进行自我监督式训练(针对RN-50)。

· 教师模型:

自监督基础模型用作教师,针对特征蒸馏实施占据指导,具体是采用DINOv2的变种ViT-S/14。

· OccFeat预训练:

作者在4张V100上使用批次为16对BEV分割网络进行预训练,且采用Adam优化器,权重衰减为1e-7,固定学习率为1e-3,默认训练50个周期。除非特殊情况,采用的图像帧分辨率为224x400。

· 微调:

作者分别采用1%,10%和100%的微调比例进行实验。采用AdamW优化器,以及采用1e-7权重衰减大小的一个周期调度器。如果正在进行微调的BEV分割网络尚未使用OccFeat进行预训练,作者将按照 OccFeat 预训练前使用的相同初始化过程,即使用在 ImageNet 上预训练的权重初始化其图像骨干。这是纯视觉 BEV 分割的常见做法。

5.2 预训练基线

为验证作者OccFeat方法的有效性,也就是将3D几何预测和特征蒸馏的效果,作者实现一个仅关注3D几何重建的预训练基线。为实现这一基线----Img-ALSO,作者将激光雷达预训练方法ALSO修改实现纯视觉BEV网络的预训练。ALSO作为自监督预训练激光雷达网络,是解决重建的最佳方法。它的代理任务是学习一个隐式函数,划分空闲和占据空间,监督信号直接由输入的激光雷达数据产生。这就需要完成几何重建任务,其中每一对三维点/输出特征都必须重建一个局部邻域。为了实现文中的Img-ALSO基线,作者从ALSO 体开始,该变体专为激光雷达检测网络(如SECOND网络)的预训练而定制,在该网络中,输入三维点云的特征被投射到一个俯视平面上。这样的设定下,作者用预训练的图像BEV网络取代3D基干网络。由于Img-ALSO中的监督信号仍来自激光雷达点(与ALSO中相同),因此作者使用了与ALSO相同的超参数,即10厘米的抽取网格、10厘米的最大查询距离和1米的重构半径。

在这里插入图片描述
表1|分割结果示意图©️【深蓝AI】编译

5.3 结果

· 和基线对比:

在表1中展示了SimpleBEV结果,作者的OccFeat自监督BEV预训练方法和基线方法Img-ALSO进行对比,没有采用任何BEV预训练。作者提供了利用1%、10%和100%的注释训练数据进行车辆和地图分割的结果。对于SimpleBEV网络,作者使用EN-B0或RN-50图像基干和224×400图像分辨率来处理输入图像帧。

作者观察到,与不进行BEV预训练相比,他们的OccFeat几乎可以在所有情况下提高分割结果。唯一的例外是使用带有RN-50的SimpleBEV进行 100%注释的车辆分割。在仅有1%或10%注释数据的情况下,这种改进尤为明显,显示了我们的方法在低镜头设置中的有效性。与所研究的基线(Img-ALSO)相比,我们的OccFeat几乎在所有情况下都优于它们。一个有趣的现象是,Img-ALSO仅在1%注释的情况下提高了分割性能,而在10% 和100%注释的情况下效果较差。

· 利用更长的BEV预训练时间进行缩放:

在表1中,不同于50个预训练周期的结果,作者同样包含了针对OccFeat方法并且对SimpleBEV(使用EN-B0或者RN-50)使用一个扩展到100个预训练周期的策略。作者观察到,随着预训练时间的延长,分割结果也在不断改善。这一观察结果凸显了本文方法的可扩展性,表明它有能力从更长的预训练时间中获得更多益处。

· 适用于各种BEV网络架构:

如之前内容所述,本文的BEV预训练方法可用于任何BEV网络结构。在表1中,除了SimpleBEV网络的结果外,作者还介绍了他们的BEV预训练方法,除了SimpleBEV网络的结果,还列出了使用BEVFormer分割网络在1%、10%和100%标注设定下的结果。此外,作者将OccFeat方法的性能与未进行BEV预训练的情况进行了比较。可以发现,即使采用BEVFormer 网络架构,作者的OccFeat预训练方法也能在所有评估设置中提高分割性能。

在这里插入图片描述
表2|图像分辨率的影响分析©️【深蓝AI】编译

· 利用更高分辨率的图像:

在表2中,作者展示了使用224×400或448×800分辨率对输入SimpleBEV网络的图像帧进行分割的结果。在全部情况下,作者的OccFeat预训练方法都能持续增强分割结果。值得注意的是,使用较低的224×400分辨率进行预训练,然后使用较高的448×800分辨率进行微调,也能改善结果,几乎与直接使用较高分辨率进行预训练的效果一样。

在这里插入图片描述
图4|鲁棒性的研究分析©️【深蓝AI】编译

· 鲁棒性研究:

作者通过nuScenes-C基准上对OccFeat进行评估,研究其鲁棒性。该基准包括八种不同的数据损坏,每种损坏有三个强度级别,并应用于nuScenes验证集。图4展示了在nuScenes-C上使用BEVFormer和EN-B0主干微调对100%注释数据进行车辆分割的结果。对于每种损坏类型,作者报告了三种严重程度的平均值。作者将OccFeat与未进行BEV预训练的情况进行了对比,结果表明OccFeat预训练提高了最终BEV模型的鲁棒性。

在这里插入图片描述
表3|损失函数的消融实验分析©️【深蓝AI】编译

5.4 消融研究

在表3中,作者在两个预训练目标上进行消融实验,叫做 L o c c L_{occ} Locc L f e a t L_{feat} Lfeat。评估的重点是使用SimpleBEV和BEVFormer网络对1%注释训练数据进行车辆和地图分割的结果比对。针对SimpleBEV, L o c c L_{occ} Locc(一个3D几何预测目标)和 L f e a t L_{feat} Lfeat(一个占据指导特征蒸馏目标)与没有进行BEV预培训的情况相比,展示了性能提升。将这两种预训练目标结合起来,形成作者的OccFeat方法,产生了最理想的分割结果。这凸显了本文的OccFeat预训练方法的功效,使其有别于之前仅依赖3D几何预测的自监督BEV预训练工作。使用特征蒸馏( L f e a t L_{feat} Lfeat)增强3D几何预测( L o c c L_{occ} Locc)的优势在BEVFormer上得到进一步验证。

在这里插入图片描述
表4|损失权重的消融实验分析©️【深蓝AI】编译

· 损失权重的影像:

在表4中,作者研究了损失权重的影像,损失权重负责平衡OccFeat中两个损失项。最优的分割结果来自于从0.001到0.01的范围中,并且为0.01是最优选择。

在这里插入图片描述
图6|校正图©️【深蓝AI】编译

5.5 定性分析结果

在图5和图6中,作者评估了重建特征的语义质量,具体使用从PCA中获得的颜色图(图5)和校正图(图6)。可以看到,DINOv2的语义信息得到了保留,重建特征中汽车等语义类别也很容易分离。此外,不同场景中的表征也是一致的,例如,在图5(右图)中,将在左侧场景中计算出的PCA映射应用到新的场景中。

6. 总结

本文提出的方法结合了两个预训练目标:

· 使用原始激光雷达数据的3D占据预测任务;

· 基于自监督预训练图像基础模型DINOv2的占据指导特征蒸馏任务。

前者提升3D几何相关的BEV特征的学习,后者主要关注于语义相关BEV特征。本文的实验结果表面,两个预训练目标相较于没有任何操作的BEV预训练在性能上取得巨大提升。

编译|匡吉

审核|Los

移步公众号【深蓝AI】,第一时间获取自动驾驶、人工智能与机器人行业最新最前沿论文和科技动态。

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值