详解KITTI视觉3D检测模型CMKD: Cross-Modality Knowledge Distillation Network for Monocular 3D Object Detection

这篇具有很好参考价值的文章主要介绍了详解KITTI视觉3D检测模型CMKD: Cross-Modality Knowledge Distillation Network for Monocular 3D Object Detection。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD
本文介绍一篇激光雷达监督视觉传感器的3D检测模型:CMKD,论文收录于 ECCV2022

  • 在本文中,作者提出了用于单目3D检测的 跨模态知识蒸馏 (CMKD) 网络,使用激光雷达模型作为教师模型,监督图像模型(图像模型为CaDDN)。
  • 此外,作者通过从大规模未标注的数据中提取知识,进一步将CMKD扩展为半监督训练框架,大幅度的提高模型性能。在github上作者提供了三种不同的激光雷达教师模型(SECOND、CenterPoint、PointPillar)。可以看到使用大量未标注的原始数据(kitti train + eigen clean),单目图像检测性能取得了显著提高。
    cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD

论文链接:https://arxiv.org/abs/2211.07171

项目链接:https://github.com/Cc-Hy/CMKD


Method

Framework Overview

论文的引言和相关工作部分这里不介绍了,直接介绍论文方法。如下图所示,方法简单明了,关键是从 LiDAR 和单目图像中提取对应的特征和响应表示,并在两种模态之间执行知识蒸馏。 整个框架包括一个预训练的激光雷达3D检测器作为教师模型,在训练阶段从LiDAR中提取信息作为指导信息,学生模型为可训练的单目3D检测器,在特征和响应中进行跨模态知识蒸馏。

在训练阶段,单目图像和对应的LiDAR点云作为模型输入对。预训练的教师模型仅从输入 LiDAR 进行推理,提供 BEV 特征图作为特征指导,并使用预测的 3D 框、对象类别及其对应的置信度分数作为响应指导。学生模型用于从单目图像生成BEV特征图和3D目标检测结果,并使用教师模型的特征和响应表示作为软指导进行有用的知识蒸馏。在推理阶段,学生模型仅使用单目图像作为输入执行 3D 目标检测。

cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD

BEV Feature Learning

BEV特征学习,对于激光雷达模型本文使用SECOND检测模型作为教师模型,从LiDAR中提取BEV特征。首先将输入点云划分为相等的 3D 体素,然后这些体素被输入到体素主干网提取体素特征 F L v ∈ R X × Y × Z × C F^{v}_L \in R^{X\times Y \times \Z \times C} FLvRX×Y×Z×C ,其中 X 、 Y 、 Z X、Y、Z XYZ 是体素特征的宽、长、高, C C C 是特征通道数量。然后,将体素特征 F L v F^{v}_L FLv 沿着高度进行堆叠,压缩得到BEV特征 F L b e v ∈ R X × Y × Z ∗ C F^{bev}_L \in R^{X\times Y \times Z*C} FLbevRX×Y×ZC

对于图像模型,本文使用CaDDN模型获得图像BEV特征。首先使用图像骨干网络从单目图像 I ∈ R W × H × C I \in R^{W\times H \times C} IRW×H×C 提取图像特征, F I ∈ R W I × H I × C F_I \in R^{W_I\times H_I \times C} FIRWI×HI×C F I o u t ∈ R W I o u t × H I o u t × C F^{out}_I \in R^{W^{out}_I\times H^{out}_I \times C} FIoutRWIout×HIout×C。对特征 F I F_I FI 使用一个通道减少网络得到特征 F I ^ ∈ R W I × H I × C ′ \hat{F_I} \in R^{W_I\times H_I \times C^{'}} FI^RWI×HI×C。对于特征 F I o u t F^{out}_I FIout 使用深度估计网络预测特征图上每个像素的深度分布 D d e p t h ∈ R W I × H I × D D_{depth} \in R^{W_I\times H_I \times D} DdepthRWI×HI×D,然后将图像特征 F I ^ ∈ R W I × H I × C ′ \hat{F_I} \in R^{W_I\times H_I \times C^{'}} FI^RWI×HI×C和深度特征图进行外积运算得到图像视锥网格张量 F G ∈ R W I × H I × D × C ′ F_G \in R^{W_I\times H_I \times D \times C^{'}} FGRWI×HI×D×C。然后,通过已知外参进行插值操作,将图像视锥网格转换到LiDAR坐标,得到体素特征 F I v ∈ R X I × Y I × Z I × C ′ F^{v}_I \in R^{X_I\times Y_I \times Z_I \times C^{'}} FIvRXI×YI×ZI×C。然后对体素特征进行压缩得到BEV特征 F ~ I bev  ∈ R X I × Y I × Z I ∗ C ′ \tilde{F}_I^{\text {bev }} \in \mathbb{R}^{X_I \times Y_I \times Z_I * C^{\prime}} F~Ibev RXI×YI×ZIC,最后再使用一个图像压缩网络得到最终的BEV特征 F I bev  ∈ R X I × Y I × C ′ F_I^{\text {bev }} \in \mathbb{R}^{X_I \times Y_I \times C^{\prime}} FIbev RXI×YI×C

关于图像BEV特征生成的细节,大家可以看CaDDN模型的源码。

cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD

Domain Adaptation via Self-Calibration

图像BEV特征和LiDAR BEV特征在空间和通道特征分布上是不同的,因为它们来自不同的模态和主干网。本文采用域自适应 (DA) 模块将图像BEV特征分布与LiDAR BEV特征分布进行对齐同时增强图像BEV特征。具体实现上,作者在得到图像BEV特征之后又使用了卷积网络进行特征对齐:

F ^ I b e v = D A ( F I b e v ) \hat{F}_I^{b e v}=D A\left(F_I^{b e v}\right) F^Ibev=DA(FIbev)

其中, F I b e v ^ ∈ R X I × Y I × C ′ \hat{F^{bev}_I} \in R^{X_I\times Y_I \times C^{'}} FIbev^RXI×YI×C为域自适应模块处理后的图像BEV特征。

Feature-based Knowledge Distillation

对于特征蒸馏,本文使用均方误差MSE计算特征蒸馏损失:
L feat  = M S E ( F ^ I bev  , F L b e v ) \mathcal{L}_{\text {feat }}=M S E\left(\hat{F}_I^{\text {bev }}, F_L^{b e v}\right) Lfeat =MSE(F^Ibev ,FLbev)

由于以下几个方面,本文的单目3D检测器受益于基于特征的知识蒸馏。首先, F L b e v F^{bev}_L FLbev包含直接从 LiDAR 中提取的准确 3D 信息,例如深度和几何形状。LiDAR BEV特征可以很好地用于训练 3D 目标检测器,同时对于低光照条件具有良好的鲁棒性,可以从LiDAR BEV特征中提取这种模式转移到图像BEV特征上。

如下图5所示,在使用所提出的DA模块以及进行特征知识蒸馏后,图像BEV特征的模式接近LiDAR BEV特征,这是检测3D目标的关键信息。此外,中间特征引导可以缓解高维信息过拟合,作为整体损失函数中的正则化项。

cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD

Response-based Knowledge Distillation

本文使用教师模型的预测作为学生模型的响应指导。与真值标签相比,软标签包含更多的信息。此外,教师模型可以作为训练样本的样本过滤器,例如,对于教师模型来说很难检测到的样本往往被消除或分配低置信度分数,并且稳定样本会被分配高置信度分数。

基于响应蒸馏的损失包括 3D 边界框的回归损失和目标分类损失:
L res  = L reg  + L cls  \mathcal{L}_{\text {res }}=\mathcal{L}_{\text {reg }}+\mathcal{L}_{\text {cls }} Lres =Lreg +Lcls 

在对教师模型进行预训练时,我们使用IoU以及Quality Focal Loss作为连续质量标签,而不是分类头中的原始 one-hot 标签。因此,预测的置信度分数更具 IoU 意识,用于表示预测的“质量”。对于第i个anchor,使用Smooth L1作为损失函数,同时使用软标签的置信度来作为惩罚系数,具体公式为:
L reg  =  Smooth L  1 ( a i soft  , a i pred  ) × s i \mathcal{L}_{\text {reg }}=\text { Smooth L } 1\left(a_i^{\text {soft }}, a_i^{\text {pred }}\right) \times s_i Lreg = Smooth L 1(aisoft ,aipred )×si

其中, a i soft  , a i pred  a_i^{\text {soft }}, a_i^{\text {pred }} aisoft ,aipred  为软标签和预测框参数。对于分类损失,公式为:
L c l s = Q F L ( C i soft  , C i pred  ) × s i \mathcal{L}_{c l s}=Q F L\left(C_i^{\text {soft }}, C_i^{\text {pred }}\right) \times s_i Lcls=QFL(Cisoft ,Cipred )×si

其中, C i soft  , C i pred  C_i^{\text {soft }}, C_i^{\text {pred }} Cisoft ,Cipred  为软标签和预测分类参数。 如下图所示,训练软标签的置信度分数与其真值框的 IoU大小正相关,用于对学生模型的每个预测产生的损失进行加权。
cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD

Extension: Distilling Unlabeled Data

在用标记样本对教师模型进行预训练后,学生模型的损失函数中的每个损失项不使用任何来自真值标签的信息。因此,我们可以很容易地将 CMKD 扩展为具有大规模未标记数据的半监督训练框架。通过教师模型提取有益信息并将其转移到学生模型作为软指导,我们可以使用部分标记样本并使用整个未标记集训练模型。

CMKD 处理未标记数据的扩展能力显着减少了注释成本并带来了性能改进, 可以泛华CMKD在现实场景中的应用。请注意,未标记数据的利用对于单目3D检测任务并不新鲜,尤其是对于Pseudo-LiDAR方法。本文的贡献是使用跨模态知识蒸馏网络提高未标记数据的利用率。主要区别在于其他方法仅使用未标记的数据进行深度预训练,但我们进一步使用它来进行知识蒸馏,网络的所有组件联合优化。


Experiments

Results on KITTI test set

下面介绍本文的实验,本文做的实验比较多。首先是在KITTI测试集上的实验,可以看到,使用更多无标签的数据进行训练,可以有效地从海量未标记数据中提取有益信息并提高性能。 然而,行人的性能随着额外的未标记数据变得更糟,本文进行了额外的实验来探索这一原因。这是因为教师模型为行人提供的软标签质量不足,无法为学生模型提供良好的指导。

cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD
cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD

Ablation Studies

下面是消融实验:

  • Effectiveness of both distillation。当使用深度预训练网络作为图像主干网时,性能与基线相比有了显着提高,这表明 LiDAR 点提供的准确深度信息有助于该任务。并且当应用本文的每个蒸馏模块时,性能进一步提高,这表明整流模块利用可以更充分利用激光雷达数据的潜力,进一步提高单目3D检测器的性能。
    cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD
  • Effectiveness of distilling unlabeled data。当将未标记数据添加到蒸馏模块中,CMKD 的性能进一步提高(表4最后一行所示),这表明本文的方法在从大量未标记数据中提取有益信息并提高性能方面是有效的。具体来说,本文使用18k个样本进行训练,标记样本约 3.7k,本文降低了大约 80% 的注释成本。
  • Effectiveness of components in feature distillation。从下表可以看到,在特征蒸馏中,这两个组件对性能的提高都是有帮助的。
    cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD
  • Effectiveness of components in response distillation。从下表可以看到,性能随着响应蒸馏损失的增加而提高,并通过对软标签质量的惩罚(即具有自适应监督)实现了进一步的改进。
    cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD
Depth Supervision vs. Feature Distillation

这里比较深度监督与特征蒸馏对性能的影响,CMKD在训练阶段直接将显式深度监督添加到模型中,而不是使用深度预训练。深度监督在动机方面类似于特征蒸馏,这两种监督都旨在使图像模型从激光雷达数据中学习准确的3D信息,如深度和几何形状。本文在这两个监督上进行了实验以进行比较。具体来说,本文从CMKD中的单目检测器中删除了特征蒸馏模块,然后将深度损失添加到整体损失函数中。

如下表所示,在不同的训练集上训练模型时,得到了相反的结果。 具体来说,在KITTI train上训练模型(约3.7k个样本),使用深度监督明显优于特征蒸馏。在特征蒸馏之上添加深度监督可以带来显着的改进。在 KITTI train 和 Eigen clean 上训练模型时(使用 18k 个样本),其中训练数据更充分,特征蒸馏的力量被开发,使用特征蒸馏明显优于深度监督。在特征蒸馏之上添加深度监督只能带来有限的改进。

这一观察结果在预期范围内。与明确监督 3D 信息的深度监督相比,特征蒸馏以隐式方式监督深度、几何和对象特征表示,其中所有丰富且有意义的信息都融合在一层 BEV 特征中。

  • 当训练样本有限时,模型很难正确理解这些隐式模式,模型往往会出现过拟合,因此在这种情况下添加具有显式物理意义的直接深度监督可以帮助模型更好地理解由 BEV 特征表示的隐式模式,并带来显着的性能提升。
  • 当训练样本变得更加充分时,模型很好地学习了特征蒸馏提供的丰富而有意义的信息,在这种情况下,揭示了特征蒸馏在深度监督方面的优势。同时,模型很好地学习了特征蒸馏中已经隐式包含的深度信息,因此添加额外的深度监督只能提供有限的新信息,并对性能带来有限的改进。
  • 基于上述实验和讨论,当训练集较小时,建议使用深度预训练或直接深度监督以及特征蒸馏。当训练样本充足时,特征蒸馏本身效果很好。

cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD

Generalization Study with Different Backbones

在这一部分中,本文使用不同的学生模型对CMKD的泛化能力进行了实验。具体来说,选择具有不同权重和不同结构的图像主干网,并比较了 CMKD 的性能,包括运行速度、运行内存和 3D AP。

一方面,本文希望使用具有不同结构的图像主干网来展示 CMKD 的性能,另一方面,也希望展示速度和准确性的综合比较。运行速度和内存在单个 NVIDIA 3090 GPU 上进行了测试,批量大小为 1,3D AP 在 KITTI val 上进行了测试。

从表中可以看出,对于 Easy 类别,不同模型之间的性能差距不大,一些轻量级模型甚至比大的模型表现更好。对于moderate和hard类,大的模型的性能优于轻量级模型,但轻量级模型的性能并不算很差。一方面,上述实验证明本文的框架具有良好的泛化性能,可以与具有不同结构和权重的各种主干网合作,以满足不同应用场景的需求。另一方面,它还突出了本文在这项工作中的主要观点,即本文强调的是跨模态知识蒸馏 (CMKD) 框架的想法,而不是框架中使用的特定模型。

cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD

Potential Limitation of CMKD: Soft Label Quality Matters

为了使本文的工作更加全面和完整,这里探索 CMKD 的局限性并提供对应的解决方案。注意到 CMKD 可能存在以下限制,即软标注质量很重要。

从表9可以看到,CMKD*(约42k个训练样本)在Car和Cyclist上的性能比CMKD要好得多(训练样本约7.5k),而行人上的性能正好相反,即训练样本越多,结果越差。 这是因为汽车、骑自行车和行人的软标签质量之间存在很大差距。在中等水平的KITTI排行榜上,基于激光雷达的汽车、自行车和行人检测器的性能约为80、70和40,行人的预测质量与汽车和骑自行车的水平十分不同。 也就是说,教师模型为行人自己提供的软标签质量非常低,不能作为学生模型的良好指导。本文的框架在未标记数据上的训练假设教师模型提供的软标注质量足够, 对于汽车和骑自行车的人是足够但行人是不够的。

cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD
为了验证上述讨论,本文进行了额外的实验。具体来说,选择了 Car 和 Pestrian 两类,并使用 KITTI train 中的真值和软标注分别监督它们,并报告 KITTI val 的性能以进行比较实验。对于软标签,我们选择在KITTI val上的性能接近KITTI测试集上的模型(Car为3D AP≈80%,行人为3D AP≈40%),以模拟教师模型在未标记数据上提供的软标注质量。

从表中可以看出。对于 Car,足够质量的软标签可以提供有用的信息,使用软标注的结果优于使用硬标注。但是对于行人来说,质量不足的软标注不能提供有效的指导,因此结果远不如使用真值。当我们在未标记数据上训练 CMKD 时,教师模型可以从海量未标记数据中提取 Car 的有益信息并将其转移到学生模型中,从而提高学生模型的性能。但是对于行人来说,教师模型本身提供的软标注质量不足,不能作为学生模型的良好指导,而是降低了学生模型的性能。当软标注的质量很差时,本文提供的解决方案是在不改变整体框架的情况下将软标注更改为真值。
cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD

Impact of Different Amounts of Unlabeled Data

在本节中,通过实验来探索不同数量的未标记数据对性能的影响。基线是在 KITTI 训练集上训练的 CMKD,样本量约为 3.7k,逐渐将 Eigen clean split 的未标记样本添加到训练集中。计算Car在KITTI val上的3D AP和BEV AP。

从下图可以看出,随着未标记样本数量的增加,CMKD的性能有所提高。

  • 具体来说,当训练样本有限时(例如只有3.7k 个样本,这对于像 CMKD 这样的深度网络训练非常少),少量未标记样本(1.3k)可以带来显着的性能提升。
  • 当未标记样本的数量变大时(分别为 +4.3k、+8.3k、+14.3k),性能改进的幅度趋于平和。这与在其他任务中使用额外的未标记数据进行预训练的性能提升趋势是一致的。请注意,这里额外的未标记数据的数量及其提供的信息不是线性的。如前所述,KITTI 3D 是 KITTI Raw 的子集,KITTI Raw 是连续序列形式,因此存在大量相似、重复的样本,只能提供有限的新信息。

cmkd,论文笔记,KITTI,3D检测,图像,特征蒸馏,CMKD文章来源地址https://www.toymoban.com/news/detail-820980.html

到了这里,关于详解KITTI视觉3D检测模型CMKD: Cross-Modality Knowledge Distillation Network for Monocular 3D Object Detection的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 3D目标检测数据集 KITTI(标签格式解析、点云转图像、点云转BEV)

    本文介绍在3D目标检测中,理解和使用KITTI 数据集,包括KITTI 的基本情况、下载数据集、标签格式解析、3D框可视化、点云转图像、画BEV鸟瞰图等,并配有实现代码。 目录  1、KITTI数据集3D框可视化 2、KITTI 3D数据集 3、下载数据集 4、标签格式 5、标定参数解析 6、点云数据--投

    2024年02月09日
    浏览(44)
  • 3D目标检测数据集 KITTI(标签格式解析、3D框可视化、点云转图像、BEV鸟瞰图)

    本文介绍在3D目标检测中,理解和使用KITTI 数据集,包括KITTI 的基本情况、下载数据集、标签格式解析、3D框可视化、点云转图像、画BEV鸟瞰图等,并配有实现代码。 目录  1、KITTI数据集3D框可视化 2、KITTI 3D数据集 3、下载数据集 4、标签格式 5、标定参数解析 6、点云数据--投

    2024年02月08日
    浏览(43)
  • 3D检测数据集 DAIR-V2X-V 转为Kitti格式 | 可视化

    本文分享在DAIR-V2X-V数据集中,将标签转为Kitti格式,并可视化3D检测效果。 DAIR-V2X包括不同类型的数据集: DAIR-V2X-I DAIR-V2X-V DAIR-V2X-C V2X-Seq-SPD V2X-Seq-TFD DAIR-V2X-C-Example: google_drive_link V2X-Seq-SPD-Example: google_drive_link V2X-Seq-TFD-Example: google_drive_link 本文选择DAIR-V2X-V作为示例。 1、下

    2024年02月03日
    浏览(45)
  • 详解3D物体检测模型:Focal Sparse Convolutional Networks for 3D Object Detection

    用于3D目标检测的焦点稀疏卷积神经网络【CVPR2022】【3D检测】 本文介绍一篇新的 3D 物体检测模型: Focals Conv ,论文收录于 CVPR2022 。在 3D 检测任务中,点云或体素数据 不均匀地 分布在3维空间中, 不同位置的数据对物体检测的贡献是不同的 。然而目前主流的 3D 检测网络(

    2023年04月08日
    浏览(41)
  • 基于Kitti数据集的智能驾驶目标检测系统(PyTorch+Pyside6+YOLOv5模型)

    摘要:基于Kitti数据集的智能驾驶目标检测系统可用于日常生活中检测与定位行人(Pedestrian)、面包车(Van)、坐着的人(Person Sitting)、汽车(Car)、卡车(Truck)、骑自行车的人(Cyclist)、有轨电车(Tram)以及其他目标(Misc),利用深度学习算法可实现图片、视频、摄像

    2024年02月16日
    浏览(49)
  • 计算机视觉的应用14-目标检测经典算法之YOLOv1-YOLOv5的模型架构与改进过程详解,便于记忆

    大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用14-目标检测经典算法之YOLOv1-YOLOv5的模型架构与改进过程详解,便于记忆。YOLO(You Only Look Once)是一种目标检测深度学习模型。想象一下,传统的目标检测方法就像侦探一样,需要仔细观察整个场景,逐个研究每个细

    2024年02月07日
    浏览(56)
  • SNK施努卡:3D缺陷视觉检测

    摘要:3D缺陷视觉检测是一种利用计算机视觉技术和3D成像技术来检测产品表面缺陷的方法。本文将介绍3D缺陷视觉检测的原理、流程和应用领域,并探讨其中的挑战和发展方向。 一、引言 在制造业中,产品表面缺陷的检测对于保证产品质量十分重要。传统的2D视觉检测方法往

    2024年02月17日
    浏览(45)
  • 视觉与激光雷达融合3D检测(一)AVOD

    AVOD(Aggregate View Object Detection)和MV3D类似,是一种融合3维点云和相机RGB图像的三维目标检测算法. 不同的是: MV3D中融合了相机RGB图像,点云BEV映射和FrontView映射,而AVOD则只融合相机RGB图像和点云BEV映射.         从网络结果来看,AVOD采用了基于两阶的检测网络,这让我们很容易想到

    2024年02月07日
    浏览(103)
  • 关于视觉3d目标检测学习像素深度的一点理解

    在真实世界的一个物体,可以通过相机矩阵将其投影到像素坐标系上 但是,在像素坐标系上的像素,由于相机的原理,导致它的深度信息已经没有了,所以原理上是没法得到其真实深度的(即3d位置) 那么现在的深度学习方法又为什么能预测出物体的深度呢? 个人理解: 大概

    2024年01月25日
    浏览(54)
  • 【Transformer论文】CMKD:用于音频分类的基于 CNN/Transformer 的跨模型知识蒸馏

    文献题目:CMKD: CNN/Transformer-Based Cross-Model Knowledge Distillation for Audio Classification 文献时间:2022 音频分类是一个活跃的研究领域,具有广泛的应用。 在过去十年中,卷积神经网络 (CNN) 已成为端到端音频分类模型的事实上的标准构建块。 最近,仅基于自注意力机制(如音频频谱

    2023年04月17日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包