详解RT-DETR网络结构/数据集获取/环境搭建/训练/推理/验证/导出/部署

RT-DETR是一种基于Transformer的目标检测模型,与YOLO系列不同,强调高精度和实时性。本文详述其网络结构、环境搭建、数据集获取、训练方法(包括官方和YOLOv8版本)、验证、推理、导出及部署流程,适用于希望深入理解和应用RT-DETR的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论文地址:RT-DETR论文地址

代码地址:RT-DETR官方下载地址

目录

一、本文介绍

二、RT-DETR的网络结构

三、RT-DERT的环境搭建

四、免费数据集获取

五、获取RT-DERT

5.1 渠道一官方版本

5.2 渠道二YOLOv8版本

六、RT-DERT的官方版本训练方法

6.1 步骤一 

6.2 步骤二 

七、RT-DERT的YOLO版本训练方法

7.1 方式一

7.2 方式二(推荐)

7.3 方式三 

八、RT-DERT的验证方法

8.1 参数讲解 

8.2 验证方法 

九、RT-DERT的推理方法

9.1 参数讲解

9.2 推理方法 

十、RT-DERT的导出方法

10.1 官方版本导出方法

10.2 YOLO版本导出方法

十一、全文总结


一、本文介绍

RT-DETR(Real-Time DEtection TRansformer)是一种新提出的目标检测模型,它利用Transformer的自注意力机制来处理图像数据,与YOLO系列有显著不同。不同于YOLO通过连续的卷积层直接对图像区域进行分析,RT-DETR采用Transformer架构中的自注意力机制,这允许模型更有效地理解图像中不同部分之间的关系。这种方法使得RT-DETR在处理图像中的复杂场景和多对象环境时,能够展现出更高的准确性和效率。此外,RT-DETR在保持高精度的同时,也针对实时处理进行了优化,使其适合需要快速响应的应用场景。这一结构上的创新使RT-DETR在目标检测领域成为了一种具有突破性的模型,展现出与传统方法不同的优势(从文章的实验结果来看RT-DETR在实时的目标检测上确实打败了YOLO),本文给大家带来的是关于RT-DETR网络结构、数据集获取、环境搭建、训练、推理、验证、导出、部署的讲解(同时RT-DETR支持官方版本训练和YOLOv8集成版本的训练我都会分别介绍)。 

下面是关于DETR系列的发展历程->


二、RT-DETR的网络结构

本文主要讲的是如何训练部署等方法具体的网络结构讲解可以看我的另一篇博客地址如下->

RT-DERT阅读笔记: RT-DETR论文阅读笔记(包括YOLO版本训练和官方版本训练)


三、RT-DERT的环境搭建

大家如果没有搭建环境可以看我的另一篇博客,里面讲述了如何搭建pytorch环境(内容十分详细我每次重新更换系统都要看一遍)。

Win11上Pytorch的安装并在Pycharm上调用PyTorch最新超详细过程并附详细的系统变量添加过程,可解决pycharm中pip不好使的问题

在我们配置好环境之后,在之后模型获取完成之后,我们可以进行配置的安装我们可以在命令行下输入如下命令进行环境的配置。

pip install -r requirements.txt

输入如上命令之后我们就可以看到命令行在安装模型所需的库了。 


四、免费数据集获取

在我们开始训练之前,我们需要一份数据集,如何获取一个COCO的数据集大家可以看我的另一篇博客从YOLO官方指定的数据集网站Roboflow下载数据模型训练。

(这里需要注意的是RT-DETR官方的版本Pytorch下的只支持COCO数据集训练目前,所以你没有COCO版本的数据集可以用以下教程下载一个非常的快)

超详细教程YoloV8官方推荐免费数据集网站Roboflow一键导出Voc、COCO、Yolo、Csv等格式

我在上面随便下载了一个 数据集用它导出yolov8的数据集,以及自动给转换成txt的格式yaml文件也已经配置好了,我们直接用就可以。 

8673527d34eb42348770158c69de678f.png


五、获取RT-DERT

RT-DERT有两个获取的方式一个就是官方的版本(但是官方版本不如YOLO系列这么发展的成熟开源的版本里面还有许多存在的bug和功能存在限制),另一个版本就是集成在YOLOv8最新的ultralytics库里面的RT-DERT(我看网上的教程和改进基本上都是基于这个方式)

两个方式我都会讲具体选哪一个根据你个人的实际情况来定。 

5.1 渠道一官方版本

这里提供官方版本的RT-DETR下载的渠道,另一种方式就是通过Git进行克隆具体怎么选择看大家了。

方式一:

官方的RT-DERT下载地址:官方下载地址

方式二:  

通过Git的方式进行下载->

git clone https://github.com/lyuwenyu/RT-DETR.git

5.2 渠道二YOLOv8版本

这个版本的下载方式就是下载YOLOv8方式如下->

方式一:

官方YOLOv8下载地址:官方下载地址

方式二: 

(这里需要注意Git完或者下载完压缩包之后一定要进行用pip install -e . 否则会报识别不了YOLO的错误)

git clone https://github.com/ultralytics/ultralytics
cd ultralytics
pip install -e .


六、RT-DERT的官方版本训练方法

官方版本的训练方式又分两种,下面图片中使用两种不同的框架下实现的RT-DETR,我会拿PyTorch版本来进行举例另一种操作相同。

(前面提到过RT-DETR的Pytorch版本只支持COCO的数据集训练所以开始之前大家需要有一个COCO的数据集)

6.1 步骤一 

我们找到如下文件“rtdetr_pytorch/configs/dataset/coco_detection.yml”,内容如下->

6.2 步骤二 

我们找到下面的这个文件"RT-DETR-main/rtdetr_pytorch/tools/train.py" 

"RT-DETR-main/rtdetr_pytorch/tools/train.py" 文件得末尾如下图的右面所示我们找到左边的配置文件填写到右边 的config参数下。

之后我们运行整个文件即可开始训练 

PS:首次训练需要下载权重

训练过程如下-> 

 训练结果会保存在以下的文件的地址(后面我们导出需要这个文件)->

PS:这里只讲了Pytorch版本的训练方式, Paddle版本的训练方式一样就不重复了。


七、RT-DERT的YOLO版本训练方法 

这里讲的是YOLO版本的RT-DETR训练方法,一种方法是通过命令行另一种方法是通过创建文件来训练,共有参数如下->

RT-DETR的训练可以采用命令行的模型,下面是RT-DETR集成在ultralytics官方给定的训练/预测/验证/导出方式: 

yolo task=detect    mode=train    model=RT-DETR的权重或者yaml文件     args...
          classify       predict                                     args...
          segment        val                                         args...
                         export                                      format=onnx  args...

7.1 方式一

我们可以通过命令直接进行训练在其中指定参数,但是这样的方式,我们每个参数都要在其中打出来。命令如下:

yolo task=detect mode=train model=ResNet18_vd_pretrained_from_paddle.pth data=data.yaml batch=16 epochs=100 imgsz=640 workers=0 device=0

需要注意的是如果你是Windows系统的电脑其中的Workers最好设置成0否则容易报线程的错误。

7.2 方式二(推荐)

通过指定cfg直接进行训练,我们配置好ultralytics/cfg/default.yaml这个文件之后,可以直接执行这个文件进行训练,这样就不用在命令行输入其它的参数了。

yolo cfg=ultralytics/cfg/default.yaml

7.3 方式三 

 我们可以通过创建py文件来进行训练,这样的好处就是不用在终端上打命令,这也能省去一些工作量,我们在根目录下创建一个名字为run.py的文件,在其中输入代码

from ultralytics import RTDETR

# Load a model
model = RTDETR("ultralytics/cfg/models/rt-detr/rtdetr-l.yaml")  # build a new model from scratch

# Use the model
model.train(data="fire.v1i.yolov8/data.yaml", cfg="ultralytics/cfg/default.yaml", epochs=100)  # train the model

训练截图如下->

 


7.4 训练结果图

下面的图片为用我复的ResNet18经过训练了72个epochs图片的结果图!


八、RT-DERT的验证方法

8.1 参数讲解 

验证的参数如下->

参数名类型参数讲解
1valbool用于控制是否在训练过程中进行验证/测试。
2splitstr用于指定用于验证/测试的数据集划分。可以选择 'val'、'test' 或 'train' 中的一个作为验证/测试数据集
3save_jsonbool用于控制是否将结果保存为 JSON 文件
4save_hybirdbool用于控制是否保存标签和附加预测结果的混合版本
5conffloat/optional用于设置检测时的目标置信度阈值
6ioufloat用于设置非极大值抑制(NMS)的交并比(IoU)阈值。
7max_detint用于设置每张图像的最大检测数。
8halfbool用于控制是否使用半精度(FP16)进行推断。
9dnnbool,用于控制是否使用 OpenCV DNN 进行 ONNX 推断。
10plotsbool用于控制在训练/验证过程中是否保存绘图结果。

8.2 验证方法 

 验证我们划分的验证集/测试集的情况,也就是评估我们训练出来的best.pt模型好与坏

yolo task=detect mode=val model=best.pt data=data.yaml device=0


九、RT-DERT的推理方法

我们训练好自己的模型之后,都会生成一个模型文件,保存在你设置的目录下,当我们再次想要实验该模型的效果之后就可以调用该模型进行推理了,我们也可以用官方的预训练权重来进行推理。

推理的方式和训练一样我们这里就选一种来进行举例其它的两种方式都是一样的操作只是需要改一下其中的一些参数即可:

9.1 参数讲解

参数名类型参数讲解
0sourcestr/optinal用于指定图像或视频的目录
1showbool用于控制是否在可能的情况下显示结果
2save_txtbool用于控制是否将结果保存为 .txt 文件
3save_confbool用于控制是否在保存结果时包含置信度分数
4save_cropbool用于控制是否将带有结果的裁剪图像保存下来
5show_labelsbool用于控制在绘图结果中是否显示目标标签
6show_confbool用于控制在绘图结果中是否显示目标置信度分数
7vid_strideint/optional用于设置视频的帧率步长
8stream_bufferbool用于控制是否缓冲所有流式帧(True)或返回最新的帧(False)
9line_widthint/list[int]/optional用于设置边界框的线宽度,如果缺失则自动设置
10visualizebool用于控制是否可视化模型的特征
11augmentbool用于控制是否对预测源应用图像增强
12agnostic_nmsbool用于控制是否使用无关类别的非极大值抑制(NMS)
13classesint/list[int]/optional用于按类别筛选结果
14retina_masksbool用于控制是否使用高分辨率分割掩码
15boxesbool用于控制是否在分割预测中显示边界框。

9.2 推理方法 

yolo task=detect mode=predict model=best.pt source=images device=0

 这里需要需要注意的是我们用模型进行推理的时候可以选择照片也可以选择一个视频的格式都可以。支持的视频格式有 

  • MP4(.mp4):这是一种常见的视频文件格式,通常具有较高的压缩率和良好的视频质量

  • AVI(.avi):这是一种较旧但仍广泛使用的视频文件格式。它通常具有较大的文件大小

  • MOV(.mov):这是一种常见的视频文件格式,通常与苹果设备和QuickTime播放器相关

  • MKV(.mkv):这是一种开放的多媒体容器格式,可以容纳多个视频、音频和字幕轨道

  • FLV(.flv):这是一种用于在线视频传输的流式视频文件格式


十、RT-DERT的导出方法

10.1 官方版本导出方法

官方版本目前只支持导出ONNX格式, 方法如下->

我们找到如下文件“RT-DETR-main/rtdetr_pytorch/tools/export_onnx.py”。

我们将我们训练完的权重文件输入到resume里,然后运行整个文件就会在同级目录下导出onnx文件如下->

10.2 YOLO版本导出方法

 当我们进行部署的时候可以进行文件导出,然后在进行部署。

YOLOv8支持的输出格式有如下

1. ONNX(Open Neural Network Exchange):ONNX 是一个开放的深度学习模型表示和转换的标准。它允许在不同的深度学习框架之间共享模型,并支持跨平台部署。导出为 ONNX 格式的模型可以在支持 ONNX 的推理引擎中进行部署和推理。

2. TensorFlow SavedModel:TensorFlow SavedModel 是 TensorFlow 框架的标准模型保存格式。它包含了模型的网络结构和参数,可以方便地在 TensorFlow 的推理环境中加载和使用。

3. PyTorch JIT(Just-In-Time):PyTorch JIT 是 PyTorch 的即时编译器,可以将 PyTorch 模型导出为优化的 Torch 脚本或 Torch 脚本模型。这种格式可以在没有 PyTorch 环境的情况下进行推理,并且具有更高的性能。

4. Caffe Model:Caffe 是一个流行的深度学习框架,它使用自己的模型表示格式。导出为 Caffe 模型的文件可以在 Caffe 框架中进行部署和推理。

5. TFLite(TensorFlow Lite):TFLite 是 TensorFlow 的移动和嵌入式设备推理框架,支持在资源受限的设备上进行高效推理。模型可以导出为 TFLite 格式,以便在移动设备或嵌入式系统中进行部署。

6. Core ML(Core Machine Learning):Core ML 是苹果的机器学习框架,用于在 iOS 和 macOS 上进行推理。模型可以导出为 Core ML 格式,以便在苹果设备上进行部署。

这些格式都提供了不同的优势和适用场景。选择合适的导出格式应该考虑到目标平台和部署环境的要求,以及所使用的深度学习框架的支持情况。

模型输出的参数有如下

参数名类型参数解释
0formatstr导出模型的格式
1kerasbool表示是否使用Keras
2optimizebool用于在导出TorchScript模型时进行优化,以便在移动设备上获得更好的性能
3int8bool用于在导出CoreML或TensorFlow模型时进行INT8量化
4dynamicbool用于在导出CoreML或TensorFlow模型时进行INT8量化
5simplifybool用于在导出ONNX模型时进行模型简化
6opsetint/optional用于指定导出ONNX模型时的opset版本
7workspaceint用于指定TensorRT模型的工作空间大小,以GB为单位
8nmsbool用于在导出CoreML模型时添加非极大值抑制(NMS)

命令行命令如下: 

yolo task=detect mode=export model=best.pt format=onnx  


十一、全文总结

到此本文的正式分享内容就结束了,在这里给大家推荐我的RT-DETR改进有效涨点专栏,本专栏目前为新开的平均质量分98分,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,目前本专栏免费阅读(暂时,大家尽早关注不迷路~),如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

专栏回顾RT-DETR改进专栏——论文收割机——持续复现各种顶会改进机制

import plotly.express as px import plotly.graph_objects as go import pandas as pd # ========== 模块1:区域市场热力图谱 ========== # 模拟数据 region_data = pd.DataFrame({ '省份': ['广东','江苏','浙江','上海','福建','其他'], '门店密度': [95,88,92,85,76,40], '物流节点数': [28,24,26,20,18,5] }) # 热力地图 fig1 = px.choropleth( region_data, locations='省份', locationmode='country names', color='门店密度', color_continuous_scale='YlOrRd', scope='asia' ) # 溢价能力环形图 fig2 = go.Figure(data=[go.Pie( labels=['网红空间','联名营销','数字系统','季节限定'], values=[35,28,22,15], hole=0.5, marker_colors=['#FFB6C1','#FFD700','#87CEEB','#FFA07A'] )]) fig2.update_layout(showlegend=False) # ========== 模块2:城市分级对比 ========== # 柱状雷达组合图 city_levels = ['超一线','新一线','三四线'] metrics = ['消费频次','价格敏感度','新品接受度','夜间消费率','停留时长'] fig3 = go.Figure() # 柱状图 fig3.add_trace(go.Bar( x=city_levels, y=[58,73,81], name='核心指标', marker_color='#FFA07A' )) # 雷达图 fig3.add_trace(go.Scatterpolar( r=[4,3,5,4,2], theta=metrics, fill='toself', name='超一线', line_color='#87CEEB' )) # ========== 模块3:品牌竞争沙盘 ========== brands = pd.DataFrame({ '品牌': ['蜜雪冰城','喜茶','奈雪','古茗'], '均价': [8,25,28,15], '门店数': [20000,800,1000,6000], '市场份额': [35,12,8,18] }) # 气泡矩阵 fig4 = px.scatter( brands, x='均价', y='门店数', size='市场份额', color='品牌', color_discrete_sequence=['#FF6347','#FFD700','#32CD32','#6A5ACD'], log_y=True, text='品牌' ) # ========== 可视化组合 ========== from plotly.subplots import make_subplots final_fig = make_subplots( rows=3, cols=1, specs=[[{"type": "choropleth"}], [{"type": "xy", "secondary_y": True}], [{"type": "scatter"}]], subplot_titles=("区域市场热力图谱", "城市分级对比矩阵", "品牌竞争沙盘") ) # 添加各模块图表 final_fig.add_trace(fig1.data[0], row=1, col=1) final_fig.add_trace(fig3.data[0], row=2, col=1) final_fig.add_trace(fig3.data[1], row=2, col=1) final_fig.add_trace(fig4.data[0], row=3, col=1) # 样式优化 final_fig.update_layout( template='g
03-29
<think>好的,用户想用Plotly和Pandas创建一个包含区域热力图、柱状雷达组合图和气泡矩阵的复杂可视化仪表板。我需要先拆解每个图表的实现步骤,然后整合到仪表板中。首先,区域热力图可能需要使用Plotly的Heatmap或Heatmapgl,不过用户提到的是“区域”热力图,可能是指地理热图?需要确认,但假设是普通的二维热力。柱状雷达组合图可能需要结合柱状图和雷达图,这在Plotly中可以通过添加多个trace实现。气泡矩阵可能是指气泡图,或者是一个散点图矩阵,但更可能是指用气泡的大小表示第三个变量的矩阵式图表,可能需要用Scatter图,设置不同标记大小。 接下来,每个图的数据处理部分需要用Pandas,比如生成示例数据或加载用户的数据。然后,每个子图的创建需要分别处理,最后用Plotly的FigureWidget或make_subplots来组合。仪表板的布局可能需要使用Dash,但用户只提到Plotly和Pandas,所以可能希望用纯Plotly的subplots。但Plotly的subplots对于复杂布局可能不够,可能需要使用Dash的布局组件。不过用户没有提到Dash,可能需要用Plotly的FigureWidget结合行和列来布局。或者,是否可以将多个图表放在一个Figure中作为子图?例如使用make_subplots,设置不同的行和列,每个子图类型不同。 步骤大致如下: 1. 准备数据:生成或加载数据集,可能需要处理成适合每个图表的形式。 2. 创建每个图表: - 区域热力图:使用go.Heatmap。 - 柱状雷达组合图:可能需要先创建雷达坐标系,添加柱状和线型的trace。 - 气泡矩阵:可能用go.Scatter,设置x和y为矩阵式的位置,size参数表示气泡大小。 3. 组合图表到仪表板:使用make_subplots创建多行多列的布局,将每个图表作为subplot添加进去。 4. 调整布局:设置标题、尺寸、边距等,确保图表显示美观。 需要注意的问题: - 雷达图在Plotly中的实现可能需要极坐标的设置,使用go.Scatterpolar。 - 气泡矩阵如果是矩阵式排列,可能需要自定义x和y的坐标来模拟矩阵布局,比如每个点的位置对应行和列。 - 热力图的数据可能需要二维数组,用Pandas处理数据后传入。 另外,用户提到的引用中有关于条形图的应用,可能需要考虑图表的选择是否符合数据展示的需求,但用户已经明确要求三种图表类型,所以重点放在技术实现上。 现在需要具体编写代码示例,确保每个步骤正确。例如,生成示例数据,创建每个图表,然后组合。同时,可能需要使用Plotly的FigureWidget或Figure来显示,如果是静态的仪表板,用Figure和subplots即可,如果希望交互式,可能需要结合Dash。 不过用户的问题是如何用Plotly和Pandas创建,所以可能不需要涉及Dash,而是用Plotly本身的subplots功能。例如: 使用plotly.subplots.make_subplots创建多个子图,每个子图添加不同的trace。例如,区域热力放在第一行,雷达在第二行左侧,气泡矩阵在右侧。然后设置整体布局。 编写代码时需要注意数据结构的适配,比如热力图的z数据,雷达图的r和theta,气泡图的x、y、size等。 另外,可能需要处理颜色、标签、标题等细节,确保图表可读性。同时,引用中的建议如简化参考线,删除不必要的网格线,可以应用在这些图表中,提升视觉效果。 总结,步骤是数据准备、创建各图表对象、组合到subplots、调整布局。需要分步解释,并提供完整代码示例,方便用户复制和调整。</think>以下是通过Plotly和Pandas创建复杂可视化仪表板的完整实现流程,包含三个核心组件:区域热力图、柱状雷达组合图和气泡矩阵。我们将使用纽约市空气质量数据集进行演示。 $$ \text{PM2.5} = \frac{\sum_{i=1}^{n} w_i \cdot c_i}{\sum_{i=1}^{n} w_i} $$ 其中$c_i$表示传感器读数,$w_i$为校准权重[^2] **步骤1:环境准备** ```python import pandas as pd import numpy as np import plotly.graph_objs as go from plotly.subplots import make_subplots ``` **步骤2:生成示例数据** ```python # 生成时间序列数据 date_rng = pd.date_range(start='2023-01-01', end='2023-12-31', freq='D') df = pd.DataFrame({ 'date': date_rng, 'temperature': np.sin(np.linspace(0, 8*np.pi, len(date_rng))) * 10 + 25, 'pm25': np.random.gamma(3, 2, len(date_rng)), 'district': np.random.choice(['Manhattan', 'Brooklyn', 'Queens'], len(date_rng)) }) # 创建矩阵数据 matrix_data = pd.DataFrame(np.random.rand(10,10), columns=[f'Feature_{i}' for i in range(10)], index=[f'Sample_{i}' for i in range(10)]) ``` **步骤3:构建仪表板框架** ```python fig = make_subplots( rows=2, cols=2, specs=[[{"type": "heatmap"}, {"type": "polar"}], [{"type": "xy", "colspan": 2}, None]], subplot_titles=('区域热力图 - 空气质量变化', '污染物分布雷达图', '多维特征气泡矩阵'), vertical_spacing=0.15, horizontal_spacing=0.1 ) ``` **步骤4:添加区域热力图** ```python heatmap = go.Heatmap( z=df.groupby([df.date.dt.month, df.date.dt.day]).pm25.mean().unstack(), colorscale='Viridis', colorbar=dict(title='PM2.5浓度') ) fig.add_trace(heatmap, row=1, col=1) ``` **步骤5:创建柱状雷达组合图** ```python radar_data = df.groupby('district').agg({ 'pm25': 'mean', 'temperature': 'mean' }).reset_index() radar_chart = go.Scatterpolar( r=radar_data.pm25, theta=radar_data.district, fill='toself', name='PM2.5', line=dict(color='#FFA15A') ) bar_radar = go.Barpolar( r=radar_data.temperature, theta=radar_data.district, name='温度', marker=dict(color='#636EFA') ) fig.add_trace(radar_chart, row=1, col=2) fig.add_trace(bar_radar, row=1, col=2) ``` **步骤6:构建气泡矩阵** ```python bubble_matrix = go.Scatter( x=matrix_data.columns.repeat(len(matrix_data)), y=np.tile(matrix_data.index, len(matrix_data.columns)), marker=dict( size=matrix_data.values.flatten()*50, color=matrix_data.values.flatten(), colorscale='Bluered', showscale=True ), mode='markers', hovertext=[f"Value: {v:.2f}" for v in matrix_data.values.flatten()] ) fig.add_trace(bubble_matrix, row=2, col=1) ``` **步骤7:优化布局配置** ```python fig.update_layout( height=900, title_text='纽约市空气质量分析仪表板', polar=dict( radialaxis=dict(visible=True, range=[0, max(radar_data.pm25.max(), radar_data.temperature.max())*1.2]), angularaxis=dict(showticklabels=True) ), hoverlabel=dict(bgcolor="white", font_size=12), margin=dict(l=50, r=50, b=100, t=100) ) # 应用格式塔视觉原则简化界面 fig.update_xaxes(showgrid=False) fig.update_yaxes(showgrid=False) fig.update_layout(plot_bgcolor='rgba(0,0,0,0)') ``` **步骤8:交互功能增强** ```python fig.update_layout( updatemenus=[{ "buttons": [ {"method": "relayout", "args": ["colorscale", "Viridis"], "label": "Viridis"}, {"method": "relayout", "args": ["colorscale", "Plasma"], "label": "Plasma"} ], "direction": "down", "showactive": True, "x": 0.1, "y": 1.15 }] ) ```
评论 213
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Snu77

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

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

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

打赏作者

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

抵扣说明:

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

余额充值