BEVCar:用于BEV地图和目标分割的相机-雷达融合

这篇具有很好参考价值的文章主要介绍了BEVCar:用于BEV地图和目标分割的相机-雷达融合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


BEVCar: Camera-Radar Fusion for BEV Map and Object Segmentation

摘要

鸟瞰视角下的语义场景分割对于移动机器人的规划和决策至关重要。虽然最近的仅依靠视觉的方法在性能方面取得了显著进展,但它们通常在恶劣的光照条件下(如雨天或夜间)表现不佳。虽然主动传感器提供了解决这一挑战的方案,但激光雷达的 prohibitively 高成本仍然是一个限制因素。将摄像机数据与汽车雷达融合提供了一种更廉价的替代方案,但在先前的研究中受到了较少关注。在这项工作中,我们旨在通过引入 BEVCar,一种新颖的联合 BEV 对象和地图分割方法,推进这一有前途的途径。我们方法的核心创新在于首先学习原始雷达数据的基于点的编码,然后利用该编码有效地将图像特征提升到 BEV 空间。我们在 nuScenes 数据集上进行了大量实验,并展示了 BEVCar 超越了当前的技术水平。此外,我们表明,将雷达信息纳入显著提高了在具有挑战性的环境条件下的鲁棒性,并改善了对远距离对象的分割性能。为了促进未来的研究,我们提供了我们实验中使用的 nuScenes 数据集的天气分割,以及我们的代码和训练模型,网址为 http://bevcar.cs.uni-freiburg.de。

Introduction

移动机器人,如自动驾驶车辆,严重依赖于对其环境的准确和健壮的感知。因此,机器人平台通常配备有各种传感器[1, 2, 3],每种传感器提供互补的信息。例如,环视摄像头提供密集的RGB图像,而激光雷达或雷达系统提供稀疏的深度测量。然而,由于这些不同模态的数据结构本质上的不同,融合这些数据提出了一个重大挑战。解决这一挑战的常用方法是采用鸟瞰视图(BEV)表示作为共享参考框架[4, 5, 6, 7, 8, 9]。

虽然激光雷达和雷达数据可以直接转换成鸟瞰图(BEV)空间,基于摄像头的信息需要从图像平面转换成俯视图。因此,已经提出了各种提升策略[4、10、11],这些策略极大地提高了仅基于视觉方法的性能,其中一些策略已扩展到融合激光雷达数据[5、7]。尽管激光雷达能够生成高度精确的3D点云,但由于其成本相较于汽车雷达要高得多,其适用于大规模部署的适用性仍然存在争议。然而,摄像头-雷达融合在研究社区中受到的关注相对较少,通常仅在添加了激光雷达输入的情况下进行研究[12、8]。相比之下,雷达被批评太稀疏,无法在独立使用中有效利用[12]。

在这项工作中,作者强调了雷达在提高机器人感知鲁棒性中的关键作用。具体来说,作者关注于鸟瞰图(BEV)中的目标和地图分割,突出了雷达在视觉受损环境条件下的独特优势。虽然先前的研究已经探索了用于BEV分割的相机-雷达融合,但有些方法在训练过程中需要额外的激光雷达监督[9],或者依赖于特定雷达元数据[8, 6],而这些可能无法跨不同制造商的模型获取。为了解决这些限制,作者提出了一种新颖的方法,该方法独立于这些约束运作。作者提出的BEVCar架构包括两个特定传感器的编码器以及两个基于注意力的模块,分别用于图像提升和BEV相机-雷达融合。随后,作者将融合后的特征输入到多任务头中,以生成地图和目标分割图。作者在nuScenes[1]数据集上广泛评估了作者的方法,并证明了它在具有挑战性的光照条件下,在相机-雷达融合方面达到了最先进的表现。

主要贡献如下:

作者引入了全新的BEVCar,用于从摄像头和雷达数据中进行BEV地图和目标分割。

作者提出了一种新的基于注意力的图像提升方案,该方案利用稀疏雷达点进行 Query 初始化。

作者展示了基于学习的雷达编码优于使用原始元数据。

作者在具有挑战性的环境条件下广泛地将BEVCar与之前的 Baseline 进行了比较,并展示了利用雷达测量的优势。

作者将nuScenes [1] 上使用的日/夜/雨天数据分割公开,并发布了代码和训练模型。

Related Work

在本节中,作者概述了仅基于视觉的鸟瞰图(BEV)方法,并回顾了基于雷达的感知的先前方法。

基于相机的BEV感知: 当前在基于相机的BEV感知领域的研究旨在处理图像空间与BEV空间之间的视图差异。现有方法通常采用编码器-解码器架构,并融入一个独特的视图转换模块来处理图像与BEV平面之间的空间变化。早期工作利用变分自编码器将特征直接解码为2D俯视图笛卡尔坐标系[13]。相比之下,VPN[14]使用多层感知机(MLP)来建模图像和BEV特征图之间空间位置的依赖关系,确保在视图转换中的全局覆盖。Roddick等人[15]通过引入更明确的几何建模改进了这些工作。特别是,他们提出了一种金字塔占用网络,并配备了一个每级密集变换模块来学习图像视图中的列与BEV图中的射线之间的映射。PoBEV[16]通过分别用不同的变换模块处理平坦和垂直特征,从而扩展了这一概念,并进一步提高了性能。

近期的方法可以分为提升(lifting)基于机制和注意力基于机制。提升方法采用要么是隐式的深度分布模块[10]将特征投影到潜在空间,要么是显式的深度估计模块生成中间3D输出,例如用于目标检测[17]或场景补全[18]任务。注意力基于方法将视图变换公式化为从图像空间到鸟瞰图(BEV)的序列到序列的翻译。TIIM[19]在BEV空间中的极坐标光线与图像中的垂直列之间应用平面间注意力,并结合在每个相应极坐标光线上的自注意力,与基于深度的方法如LSS[10]相比,性能有显著提升。

近期的发展包括全环绕视角的BEV感知方法,例如CVT [20],它使用带有学习位置嵌入的跨视角 Transformer 来避免显式几何建模。相比之下,BEVFormer [4] 和 BEVSegFormer [21] 明确使用相机校准参数建模几何,并提出了基于可变形注意力[22]的空间跨注意力模块进行视角逆投影。BEVFormer [4] 还采用时间注意力模块,通过车辆自身运动在时间上聚合BEV地图,这代表了3D目标检测的最新技术。时间聚合也在BEVerse [11]中得到应用,它通过增加运动预测 Head 扩展了现有方法,并展示了所提出的多任务网络优于单任务网络,表明任务之间存在正向迁移。

上述方法通常与新颖的数据增强技术[23]结合使用,这些技术通过在各个中间嵌入之间保持空间一致性来解决图像与BEV之间的视角差异。最后,SkyEye [24]提出了一种限制较少的方法,通过在时间上重建语义图像,从标记的正面视角图像学习语义BEV地图。作者的工作利用了单目BEV感知方面的最新进展,并利用雷达模态进行更几何可行的视角投影。这是通过使用雷达 Query 的基于注意力的新颖图像提升方案实现的。此外,作者还 Proposal 利用已通过对比学习进行预训练的现有图像骨架来进一步规范化模态特定分支。

雷达感知基础: 雷达通过发射无线电波和接收其反射之间的时间差来测量到目标的距离。公开发布的用于机器人应用的雷达数据集包括不同类型的雷达,如旋转雷达[2],汽车雷达[1],或4D成像雷达[3]。在这项工作中,作者专注于汽车雷达。由于雷达是一种相对低成本的直接测量距离的技术,因此它已被用于提高基于视觉的3D目标检测。尽管ClusterFusion [27]仅在图像空间融合雷达和相机数据,但SparseFusion3D [28]在图像空间和鸟瞰图(BEV)空间都进行了传感器融合。

在分割领域,最初的工作研究了雷达点云的语义分割[29],并未涉及额外的视觉输入。近期,多模态鸟瞰图(BEV)和目标分割的研究受到了越来越多的关注。《FISHING Net》[12]这篇开创性工作的作者们提出了基于MLP的提升策略用于相机特征。为了将这些特征与由类似UNet的网络编码的雷达数据相结合,FISHING Net采用了基于类别的优先级池化。相比之下,Simple-BEV[6]以栅格化的BEV格式处理原始雷达数据,并将其与通过双线性采样提升的图像特征进行拼接。尽管Simple-BEV的目标是对车辆进行与目标无关的分割,但其训练依赖于额外的实例信息。

由于纯粹基于拼接的融合可能会受到空间对齐不良的影响,CRN[9]采用了可变形注意力[22]来聚合图像和雷达特征。然而,该方法使用LSS[10]来提升图像特征,并且在训练过程中需要激光雷达(LiDAR)来监督深度分布网络。最后,BEVGuide[8]在部署期间除了利用现有的知识外,没有进一步利用其他知识。通过基于单应性投影的方法,将来自EfficientNet[30]图像 Backbone 网络的特征转换成了一种比例不明确的自上而下表示。雷达数据被转换到BEV空间,然后由两个卷积层进行编码。与之前的工作不同,BEVGuide提出了一种自下而上的提升方法,通过从统一的BEV空间 Query 传感器特征来获取传感器特定的嵌入,然后将它们进行拼接。在这项工作中,作者进一步发展了这些想法,并使用了一种受到激光雷达处理[26]启发的更为精细的雷达编码器。此外,作者还提出了一种新的提升方案,该方案明确利用雷达点作为强有力的先验知识。

Technical Approach

在这一部分,作者提出了BEVCar方法,用于从环视摄像头和汽车雷达进行鸟瞰视角(BEV)的目标和地图分割。如图2所示,BEVCar包括两个特定于传感器的编码器,分别用于图像和雷达数据。作者通过可变形注意力将图像特征提升到BEV空间,在此过程中利用雷达数据来初始化 Query 。采用中间融合策略后,作者接着使用交叉注意力模块将提升的图像表征与学习的雷达特征相结合。最后,作者在瓶颈操作中降低空间分辨率,并使用单一多类 Head 同时对车辆和地图进行BEV分割。在接下来的小节中,作者将提供每个步骤的进一步细节。
BEVCar:用于BEV地图和目标分割的相机-雷达融合,数码相机,人工智能
BEVCar:用于BEV地图和目标分割的相机-雷达融合,数码相机,人工智能

相机:为了编码相机数据,作者采用了一个冻结的DINov2 ViT-B/14[25],其图像表示捕获的语义信息比基于ResNet的骨架网络[31]更多。遵循常见的方法[32,33],作者使用了一个具有可学习权重的ViT Adapter [34]。为了覆盖环视视觉,作者在每个时间戳将来自 N N N个相机的图像进行ConCat,形成一个维度为 N × H × W N \times H \times W N×H×W的输入,其中 H H H W W W分别表示图像的高度和宽度。对于下游处理,ViT Adapter输出具有 F F F个通道的多尺度特征图,这些特征图对应于图像尺寸的KaTeX parse error: Undefined control sequence: \nicefrac at position 1: \̲n̲i̲c̲e̲f̲r̲a̲c̲{1}{4}KaTeX parse error: Undefined control sequence: \nicefrac at position 1: \̲n̲i̲c̲e̲f̲r̲a̲c̲{1}{8}KaTeX parse error: Undefined control sequence: \nicefrac at position 1: \̲n̲i̲c̲e̲f̲r̲a̲c̲{1}{8}KaTeX parse error: Undefined control sequence: \nicefrac at position 1: \̲n̲i̲c̲e̲f̲r̲a̲c̲{1}{2}比例。

雷达:雷达数据由一个点云表示,每个点都具有多种特征。与先前的作品[6,8]不同,作者强调依赖于特定雷达模型的内置后处理会降低方法的通用性。因此,类似于SparseFusion3D[28],作者只利用雷达点的 D D D个基本特征: 3D位置 ( x , y , z ) (x,y,z) (x,y,z),未补偿的速度 ( z , v g ) (z, v_g) (z,vg),以及雷达散射截面 RCS \text{RCS} RCS,它捕捉了表面的可检测性。与利用原始数据[6]不同,作者提出学习一个由编码LiDAR点云[26]启发的雷达表示。首先,作者根据雷达点在尺寸为 X × Y × Z X \times Y \times Z X×Y×Z的Voxel 网格中的空间位置将它们分组,该Voxel 网格对应于BEV空间的分辨率和高度的离散化。为了限制内存需求和减轻对高密度Voxel的偏见,作者在包含超过 P P P个雷达点的Voxel中进行随机采样。每个点及其元数据随后通过图3所示的点特征编码输入,其中FCN指的是全连接层。请注意,点特征编码不积累来自多个Voxel 的信息。随后,作者对每个Voxel应用最大池化以获得大小为 F F F的单个特征向量。最后,作者将Voxel特征通过基于CNN的 Voxel空间编码器,沿着高度维度压缩特征,得到整体的雷达BEV编码 F r a d F_{rad} Frad
BEVCar:用于BEV地图和目标分割的相机-雷达融合,数码相机,人工智能

Image Feature Lifting

作者采用基于学习的方法,将编码的视觉特征从2D图像平面提升到BEV空间。受到BEVFormer [4]的启发,作者使用了可变形注意力[22],但提出了一种新颖的 Query 初始化方案,该方案利用了稀疏的雷达点。
根据CSDN的规则,我会将公式环境中的斜杠 “/” 替换为 “ " ,而公式单独一行显示时,则替换为 " ",而公式单独一行显示时,则替换为 " ",而公式单独一行显示时,则替换为"$”。下面是修复后的内容:

Query初始化:作者提出的Query初始化方案的核心动机是利用雷达测量中的3D信息,将2D图像特征初步提升到BEV空间。如图4所示,作者首先创建一个大小为 X × Y × Z X \times Y \times Z X×Y×Z的Voxel空间,该空间由BEV分辨率 X × Y X \times Y X×Y、附加的高度离散化 Z Z Z以及朝向前方的摄像机中心确定。其次,作者根据摄像机的视场将每个Voxel分配给一个或两个摄像机。第三,作者通过射线投影将视觉特征从2D图像平面推送到3D Voxel空间,即沿着射线锥体内的每个Voxel包含相同的图像特征。特别是,作者使用了尺度为KaTeX parse error: Undefined control sequence: \nicefrac at position 1: \̲n̲i̲c̲e̲f̲r̲a̲c̲{1}{8}的图像特征。如果两个摄像机的视场重叠,作者将在受影响的Voxel内平均特征。随后,作者使用1×1卷积层去除高度分量,得到具有 F F F个特征通道的 X × Y X \times Y X×Y Voxel网格。请注意,在这个阶段,图像特征仍然是均匀分布的,没有深度的概念。因此,作者使用由稀疏雷达点云引导的可变形注意力[22]来过滤特征图,从而得到初始化 Query Q m Q_m Qm,其大小为 F × X × Y F \times X \times Y F×X×Y
BEVCar:用于BEV地图和目标分割的相机-雷达融合,数码相机,人工智能

提升:在下一步中,作者将数据驱动的初始Query Q m g Q_{mg} Qmg 与可学习位置嵌入 Q p o s Q_{pos} Qpos 结合起来,以实现排列不变性,并学习可学习的鸟瞰图(BEV) Query Q b e v Q_{bev} Qbev
l = Q m g + Q p o s + Q b e v l = Q_{mg} + Q_{pos} + Q_{bev} l=Qmg+Qpos+Qbev
采用可变形注意力机制[22],作者构建了一个尺寸为 X × Y × Z X \times Y \times Z X×Y×Z的3D Voxel空间,以从图像中提取视觉编码。与Query初始化相比,作者现在在图像平面上而不是BEV空间上采样偏移量。经过六个级联的Transformer模块后,作者得到了最终的特征图 f i m g , b e v f_{img,bev} fimg,bev,其维度与编码后的雷达数据相同,即 F × X × Y F \times X \times Y F×X×Y

BEV Segmentation Head

根据CSDN的规则,我会将公式环境中的斜杠 “/” 替换为 “ " ,而公式单独一行显示时,则替换为 " ",而公式单独一行显示时,则替换为 " ",而公式单独一行显示时,则替换为"$”。下面是修复后的内容:

作者采用单个Head进行多类鸟瞰图(BEV)分割。具体来说,作者使用两个带有ReLU激活函数的卷积层,然后是一个最终的1×1卷积层来输出一个目标类别和 M M M个地图类别。考虑到BEV空间的分辨率,分割Head产生的输出大小为 M + 1 × X × Y M+1 \times X \times Y M+1×X×Y。因此,一个像素不仅可以同时捕捉到车辆和地图类别预测,还可以被分配到多个地图类别中。

目标分割:在分割目标时,作者考虑所有类似车辆的实体,例如乘用车和卡车。与先前的作品[6]不同,作者强调在训练过程中,目标无关的分割不应依赖于实例感知信息,因为这将使得方法的应用灵活性降低。因此,作者仅通过二进制交叉熵损失来监督分割头中的目标通道:
L B C E = − 1 N ∑ i = 1 N log ⁡ ( P i , t ) , \mathcal{L}_{BCE} = -\frac{1}{N} \sum_{i=1}^{N} \log(P_{i,t}), LBCE=N1i=1Nlog(Pi,t),
在公式中, P i , t P_{i,t} Pi,t是针对每个像素 i ∈ [ 1 , N ] i \in [1,N] i[1,N]定义为:
P i , t = { p i if  y i = 1 1 − p i otherwise . P_{i,t} = \begin{cases} p_i & \text{if } y_i = 1 \\ 1 - p_i & \text{otherwise}. \end{cases} Pi,t={pi1piif yi=1otherwise.
二进制真值标签 y i ∈ { 0 , 1 } y_i \in \{0,1\} yi{0,1}指定了像素 i i i是否属于车辆类别。对于 y i = 1 y_i=1 yi=1的相应预测概率用 p i p_i pi表示。

地图分割: 尽管大多数先前的方法[4,8,9]仅预测道路,有时也包括车道分隔线,但作者进一步包含了如人行横道和人行道等地图类别。详尽的列表请参见第IV-A节。为了在训练过程中监督分割Head 的地图通道,作者采用了α-平衡焦损失的多类别变体[35]:
L F o c a l = − 1 N ∑ i = 1 N ( 1 − p i , t ) α ⋅ log ⁡ ( p i , t ) , \mathcal{L}_{Focal} = -\frac{1}{N} \sum_{i=1}^{N} (1 - p_{i,t})^\alpha \cdot \log(p_{i,t}), LFocal=N1i=1N(1pi,t)αlog(pi,t),

根据CSDN的规则,我会将公式环境中的斜杠 “/” 替换为 “ " ,而公式单独一行显示时,则替换为 " ",而公式单独一行显示时,则替换为 " ",而公式单独一行显示时,则替换为"$”。下面是修复后的内容:

在这段文本中, c ∈ [ 1 , C ] c \in [1,C] c[1,C]指的是语义类别,而 y y y是一个聚焦参数,用于区分简单/困难样本。另外, α i , t \alpha_{i,t} αi,t是按照方程式(4)类似定义的:
BEVCar:用于BEV地图和目标分割的相机-雷达融合,数码相机,人工智能
具有可调参数 α \alpha α以解决前景与背景的不平衡问题。文章来源地址https://www.toymoban.com/news/detail-857006.html

到了这里,关于BEVCar:用于BEV地图和目标分割的相机-雷达融合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度相机和激光雷达的融合标定(Autoware)

    深度相机和激光雷达是智能汽车上常用的传感器。但深度相机具有特征难以提取,容易受到视角影响。激光雷达存在数据不够直观且容易被吸收,从而丢失信息。因此在自动驾驶领域,需要对于不同传感器做数据的融合和传感器的标定。 内参标定的原理和方法比较简单,由于

    2024年02月10日
    浏览(40)
  • 消除 BEV 空间中的跨模态冲突,实现 LiDAR 相机 3D 目标检测

    Eliminating Cross-modal Conflicts in BEV Space for LiDAR-Camera 3D Object Detection 近期,3D目标检测器通常利用多传感器数据和在共享的鸟瞰图(BEV)表示空间中统一多模态特征。然而,我们的实证研究发现,以前的方法在生成无跨模态冲突的融合BEV特征方面存在局限性。这些冲突包括由BEV特

    2024年04月15日
    浏览(38)
  • 多传感器融合 | CenterFusion:毫米波雷达和相机后融合3D检测算法

    点击下方 卡片 ,关注“ 自动驾驶之心 ”公众号 ADAS巨卷干货,即可获取 今天自动驾驶之心很荣幸邀请到寒风分享RV后融合算法CenterFusion,如果您有相关工作需要分享,请在文末联系我们! 点击进入→ 自动驾驶之心【多传感器融合】技术交流群 后台回复 【多传感器融合综述

    2024年01月19日
    浏览(35)
  • 【佳佳怪文献分享】MVFusion: 利用语义对齐的多视角 3D 物体检测雷达和相机融合

    标题:MVFusion: Multi-View 3D Object Detection with Semantic-aligned Radar and Camera Fusion 作者:Zizhang Wu , Guilian Chen , Yuanzhu Gan , Lei Wang , Jian Pu 来源:2023 IEEE International Conference on Robotics and Automation (ICRA 2023) 这是佳佳怪分享的第2篇文章 多视角雷达-摄像头融合三维物体检测为自动驾驶提供了更

    2024年02月12日
    浏览(33)
  • ​CVPR2023 | MSMDFusion: 激光雷达-相机融合的3D多模态检测新思路(Nuscenes SOTA!)...

    点击下方 卡片 ,关注“ 自动驾驶之心 ”公众号 ADAS巨卷干货,即可获取 点击进入→ 自动驾驶之心【3D目标检测】技术交流群 后台回复 【3D检测综述】 获取最新基于点云/BEV/图像的3D检测综述! 融合激光雷达和相机信息对于在自动驾驶系统中实现准确可靠的3D目标检测至关重

    2023年04月21日
    浏览(34)
  • 论文阅读笔记——A2FSeg:用于医学图像分割自适应多模态融合网络

    论文地址: https://www.semanticscholar.org/paper/A2FSeg%3A-Adaptive-Multi-modal-Fusion-Network-for-Wang-Hong/330f94e291a9b881ad14ca500f8d96e185d43b15 代码仓库: https://github.com/Zirui0623/A2FSeg/tree/main?tab=readme-ov-file 磁共振成像(MRI)在多模式脑肿瘤分割中发挥着重要作用。然而,缺失模态在临床诊断中非常常

    2024年03月13日
    浏览(49)
  • CutLER:一种用于无监督目标检测和实例分割的方法

    本文分享自华为云社区《CutLER:一种用于无监督目标检测和实例分割的方法》,作者:Hint。 目标检测是计算机视觉中的一种重要任务,使AI系统感知、推理、理解目标。训练定位模型需要特别的标注,比如目标的框、掩膜、定位点等。本文的工作研究了无监督的目标检测和实

    2024年02月12日
    浏览(30)
  • 前端vue地图定位并测算当前定位离目标位置距离可用于签到打卡

    前端vue地图定位并测算当前定位离目标位置距离可用于签到打卡, 阅读全文下载完整代码请关注微信公众号: 前端组件开发 效果图如下:       # #### 使用方法 ```使用方法 !-- // 腾讯地图key注册地址(针对H5端,manifest.json中web配置,配置定位与地图 若是微信小程序只需配置微

    2024年02月08日
    浏览(48)
  • YOLOv5改进 | Neck篇 | 利用ASF-YOLO改进特征融合层(适用于分割和目标检测)

    本文给大家带来的改进机制是 ASF-YOLO(发布于2023.12月份的最新机制) ,其是特别设计用于细胞实例分割。这个模型通过结合空间和尺度特征,提高了在处理细胞图像时的准确性和速度。在实验中, ASF-YOLO在2018年数据科学竞赛 数据集上取得了卓越的分割准确性和速度,达到了

    2024年01月15日
    浏览(32)
  • 三. LiDAR和Camera融合的BEV感知算法-融合算法的基本介绍

    自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》,链接。记录下个人学习笔记, 仅供自己参考 本次课程我们来学习下课程第三章——LiDAR和Camera融合的BEV感知算法,先来了解下融合的基本概念 课程大纲可以看下面的思维导图 从第三章开始我们会针对详细的算法来

    2024年04月26日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包