【文献阅读笔记】Disease-grading networks with ordinal regularization for medicalimaging


摘要


    关于:疾病严重程度的分级,对深度学习分类方法加入疾病严重程度阶段之间的顺序关系,从而提高了疾病分级的性能。

    可嵌入到通用分类网络;预测疾病发展进展

    实验了3个公共数据集: ①the IDRiD challenge dataset; ②LUng Nodule Analysis 2016 (LUNA16) dataset; ③ Messidor dataset

    实验表明,所提出的方法不仅优于常见分类模型的基线,而且优于深度学习方法,特别是在 IDRiD 挑战数据集上,实验的方法的联合精度为 68.0%。

代码地址:https://github.com/ahtwq/ORNet
2023 Published by Elsevier B.V.


1.介绍

1.1. 研究问题

(1)与分类模型相比,回归模型更难优化。因此,单纯的分类方法和序数回归方法并不是疾病分级的最佳选择。表1的比较结果表明分类方法比回归方法表现更好。如果分类方法利用疾病标签的顺序关系,则可以进一步提高分类方法的性能。
在这里插入图片描述

(2)交叉熵损失不适合分级任务:对于分类方法中的交叉熵(CE)损失,如果样本被错误分类,则无论该样本被识别为哪个错误类别,其损失都是固定的。由于疾病分级的有序性,最高级别患者误诊为无疾病比最高级别患者误诊为中间疾病更严重。

1.2. 解决方法

    序数正则化模块输出描述疾病等级有序性的分数,并通过自然阈值将分数映射到疾病等级。我们希望序数正则化(OR)项近似于序数性质所需的损失分布,从而体现有序性。图 1 直观地展示了实验的策略。序数正则化项帮助网络了解疾病等级的序数性。
在这里插入图片描述
图1:显示了真实等级为1的损失分布绿色标记代表 CE 损失的预测损失分布,蓝色标记代表序数性质所需的预测损失分布。根据两种曲线特点可知蓝色更适合疾病严重性的分级任务

1.3. 贡献总结

(1)提出了一个表示疾病严重程度有序性的序数正则化模块,它可以普遍嵌入到通用分类网络中。

(2)具有序数正则化模块的分类网络可以提高疾病分级性能,并额外预测有关疾病发展方向(即向严重病例进展)的准确可靠的信息。

(3)对三个公共数据集的实验表明,我们的方法在单一任务和联合任务上都比其他方法取得了更好的性能。

2. 相关工作

2.1. 单一疾病分级研究

    以往疾病分级的自动评分方法大致可以分为三类:

  • 传统机器学习方法:传统机器学习方法采用手动提取特征来表示疾病症状,这个过程复杂;并且特征表示的能力有限
  • 深度学习目标检测方法
  • 深度学习分类方法

2.2. 联合疾病分级

    糖尿病黄斑水肿(DME)是糖尿病视网膜病变(DR)引起的并发症。在临床实践中,医生会同时诊断 DR 和 DME。 DR 和 DME联合评分与多任务学习相关。
以往的出版物分为两类深度学习的方法:

  • 第一类简单地将联合分级视为多标签任务,而不考虑两种疾病之间的潜在关系。 Chen等人[38]利用多任务技术并行训练四个分类网络来检测四个特征,然后结合这些特征获得最终的疾病分级。
  • 第二类考虑两个任务之间的关系。 Tu 等人 [41] 提出了一种用于同步 DR 和 DME 分级的特征分离和关联网络,该系统模仿临床医生在患者视觉检查期间的行为。 Li等人[42]提出了一个跨疾病注意力网络,考虑疾病之间的内部关系,对DR和DME进行联合分级。Shaik 等人 [45] 提出了一种具有多个注意力阶段的深度学习模型,使用空间注意力自动编码器卷积 LSTM 进行糖尿病视网膜病变严重程度分级。

    本文提出的方法:可以自然地应用于联合评分任务。考虑到联合分级任务中疾病标签的顺序性,可以进一步提高疾病联合分级的准确性

3.方法论

    通过考虑疾病严重程度进展的先验知识来提高疾病分级性能预测疾病发展的方向性

3.1.网络架构

    图 2 说明了所提出的网络框架。该框架的主要部分是通用分类模型,在其上我们添加了序数正则化模块ORM)。 ORM遵循每个类别的非标准化分数向量,模块输出连续标量分数,可以衡量疾病的严重程度。基于这个分数,我们可以轻松地设计一个近似评估指标的损失函数。损失函数计算分数与预定义分数标签之间的距离;距离越小,顺序关系保持得越好。ORM 的详细介绍见 3.2 小节。
在这里插入图片描述
    ORM 的基线模型作为我们的模型,称为 OR-DGN(Disease-Grading Network with Ordinal Regularization)。 ORM 生成距离损失在这里插入图片描述,用作模型的正则项。 OR-DGN 的总损耗为:
在这里插入图片描述
其中在这里插入图片描述表示交叉熵损失在这里插入图片描述回归正则项,如公式(6)所示,
在这里插入图片描述
    公式(2)中:在这里插入图片描述样本属于c类的概率;y是真实标签,C是类别数。参数α为平衡参数:0 ≤ \leq α<1。当α=0时,在这里插入图片描述,即退化为没有ORM的纯分类模型损失。
    这种正则化损失有助于网络学习标签的序数性质(连续性),而传统的交叉熵损失可以快速学习类别之间的差异(离散性)。
    我们提出的方法的伪代码在算法 1 中描述,联合评分任务的算法分为两个分支,每个分支的流程与Algorithm1相同,不再重复描述。
在这里插入图片描述
    因为嵌入式 ORM 引入的参数非常少,提出的方法几乎没有增加模型的复杂性

3.2. 序数正则化模块(ORM)

    图2所示的ORM由多个全连接层激活函数阈值损失函数组成。它的输出是一个连续的标量分数,代表疾病的严重程度。需要为 ORM 确定阈值向量 t。如果有 n 个类别,则 t 是大小为 n-1 的非递减向量 ( t 1 t_1 t1 ≤ \leq t 2 t_2 t2 ≤ \leq ··· ≤ \leq t n − 1 t_{n-1} tn1)。阈值将(-∞,+∞)区间分为 n 个间隔(定义: t 0 t_0 t0=-∞, t n t_n tn=+∞):
在这里插入图片描述
    这些范围对应于 n 个疾病等级,按从最轻微的等级到最严重的顺序排列。如果输出的分数在[ t j − 1 t_{j-1} tj1, t j t_j tj),将疾病等级定义为j∈[1,n]。于是将疾病等级 j j j对应的分数标签定义为 y j y_j yj:
在这里插入图片描述
    本实验做的相关实验显示了阈值 t t t 在ORM的影响。在该项实验中设置 t = t= t={0.5, 1.5, 2.5, ···, n-1-0.5},并且默认情况下在这里插入图片描述=0.5。给定预定义分数标签 y j y_j yj输出分数 y ^ j \hat{y}_j y^j,可以通过下面公式计算距离:
在这里插入图片描述
    该公式作为优化目标。其中Dist表示由实际任务确定的回归损失函数。下面的实验表明SmoothL1损失MSE和MAE损失表现更好,SmoothL1的表达式如下:
在这里插入图片描述
    根据ORM输出 y ^ j \hat{y}_j y^j确定疾病发展的方向性。首先,我们确定 ORM 输出 y ^ j \hat{y}_j y^j属于哪个区间,将该区间表示为 I ( y ^ j ) I(\hat{y}_j) I(y^j)。利用(3, 4)计算 I ( y ^ j ) I(\hat{y}_j) I(y^j)对应的分数标签 y j y_j yj,得到距离:
在这里插入图片描述
    如果 d p d_p dp<0说明预测朝向较轻(不太严重)的水平,并且 ∣ d p ∣ |d_p| dp绝对值越大病情越轻;如果 d p d_p dp>0说明预测朝向严重的水平,并且 ∣ d p ∣ |d_p| dp绝对值越大病情越重。
因此, d p d_p dp值越小,疾病就越不可能向更严重的方向发展。由此,我们可以通过计算 d p d_p dp来获得疾病发展的方向性

3.3. 联合评分任务的网络架构

    提出的 ORM 可以平滑地嵌入到联合评分任务中
    图 3 显示了 ORM 集成到多任务网络中。两个任务共享输入图像特征,两个分支连接在特征层后面,分别对应不同的任务。在第 k k k k = 1 , 2 k=1,2 k=1,2)个任务的分支末尾连接一个ORM。利用专家对疾病的先验知识,提出的网络关注个体疾病等级之间的顺序关系
在这里插入图片描述
ORM带来的网络损失
    令 K K K 为每个样本的分类任务数,因此对于单一疾病分级K=1,对于联合疾病分级K=2。对于一个任务 k∈{1,2} ,在这里插入图片描述在这里插入图片描述分别表示分类损失正则化损失。定义第 k 个任务损失为:
在这里插入图片描述
其中 α ( k ) α^{(k)} α(k)是一个权衡参数,范围属于0 ≤ \leq α ( k ) α^{(k)} α(k)<1。网络的总损失为:
在这里插入图片描述

4. 实验和结果

这部分我只转译了数据集IDRiD相关的内容
    在本节中,从数据集实验设置的描述开始。评估指标可以在以下部分找到。最后,分析了网络设计以及单个任务和联合任务的实验结果

4.1. 数据集

    IDRiD:每张眼底图像都有 DRDME 严重程度标签。根据疾病严重程度,DR分为五个级别,DME有三个级别。该数据集包含413张分辨率为2848×4288的训练图像103张分辨率为2848×4288的测试图像。采用分层抽样的方法从训练集中抽取15%作为模型选择的验证集

4.2. 实验设置

设置IDRiD数据集的输入分辨率为896×896
    数据增强训练图像调整大小(resize)并随机裁剪为分辨率 m×m(对于IDRiD, m=896),旋转水平翻转颜色抖动剪切用于数据增强。在测试阶段,我们仅在中心调整大小和裁剪图像为 m×m 分辨率。最后,训练和测试图像被标准化为网络的输入。
    训练细节:对于 IDRiD 数据集,我们采用 ResNet50 作为主干网络。验证集用于选择最佳模型,如果数据集没有验证集,我们将从训练集中提取一部分作为验证集,IDRiD 数据集中对 15% 的训练集进行采样,形成验证集。选择具有 Nesterov 动量SGD 来优化网络。对网络进行了 180 个 epoch 的训练。初始学习率为0.0005,学习率每 60 个 epoch 降低 0.5
    整个模型使用Python 3.6和Pytorch1.4以及TITAN X Pascal GPU来实现。我们的工作中还采用了其他技术,例如 dropout微调标签平滑 [52]

4.3. 评估指标

    为了评估模型在单个评分任务上的性能,我们选择准确性(accuracy)、灵敏度(sensitivity)、特异性(specificity)、AUCquadratic weighted kappa (QWK) 作为评估指标。由于我们的方法可以提供有关疾病发展的方向性信息,因此我们定义了方向性匹配率DMR)来衡量该方法的性能。 DMR的定义如下:

在这里插入图片描述
其中, d p i d_p^i dpi是公式(7)计算出来的第 i i i个样本的预测方向性 d t i = y p i − y c i d_t^i=y_p^i-y_c^i dti=ypiyci为第 i i i个样本的真实方向性 y p i y_p^i ypi y c i y_c^i yci分别表示预测类别标签真实类别标签 N N N为总样本数, [ ] ( ⋅ ) []_{(·)} []()指示器函数
    为了衡量模型在联合评分任务上的性能,我们采用了 IDRiD 挑战赛中使用的评估指标联合精度(Joint Ac.)。对于IDRiD数据集,我们采用Joint Ac作为评估指标进行比较。

4.4. 网络设计分析

    对设计的模块关键参数进行消融实验来分析它们如何影响分级结果。所有消融实验都是针对单一疾病任务

4.4.1. 序数正则化模块(ORM)分析

    该实验部分分析了序数正则化模块的效果,并在 IDRiD 数据集和 LUNA16 数据集上使用相同的网络主干训练设置进行比较。如表2所示论文方法比基线模型高出3.88%,即验证了论文方法的有效性,而且,我们方法的QWK高于基线,这表明我们的结果与真实结果更加一致。
在这里插入图片描述

并且预测偏差较大的样本数量更少,从图5频率直方图看出:
(a)OR-DGN有更多的样本接近真实的等级。在预测错误的情况下,OR-DGN的预测结果更接近真实等级。
(b)实验结果支持有序性的优势,即 ORM 保持了疾病严重程度的顺序关系,从而提高了模型性能。

在这里插入图片描述
    实验进一步验证了论文方法在 LUNA16 数据集上的有效性。表 3 有详细的比较结果。通过添加所提出的表示序数关系的 ORM,3D ResNet18 [56] 的准确性和 AUC 分别提高了 4.61%2.65%,其他评估指标也有所提高。
    实验结果表明,我们的方法利用疾病的有序性提高了肺结节的分级性能,证明了我们方法的优势。
在这里插入图片描述

4.4.2. ORM的阈值分析

    在ORM中,需要提前指定一个固定的非递减阈值。在这一部分中,探讨不同阈值对论文方法的影响。使用较大的数据集LUNA16进行不同权重 α \alpha α下不同阈值的对比实验。
    准确率AUC作为主要评价指标,其中AUC可以综合评价模型表 4 显示我们的方法在不同阈值下优于基线模型 (α = 0.0)。四个不同阈值下AUC的标准差较小,不超过0.43%。与基线模型的性能增益相比,不同阈值带来的差异很小。这些结果表明我们采用自然阈值的方法将取得令人满意的结果。
在这里插入图片描述

4.4.3. 损失函数中的权重α分析

    权重α是一个权衡参数,它平衡交叉熵损失ORM生成的正则化项

    我们在不同权重a下做了对比实验图6(a)和(b)分别显示了IDRiD数据集上的DR分级RUNA16数据集上的结节分级的实验结果。具有 α = 0 的 OR-DGN 代表基线模型,OR-DGN 显著超过基线模型。当a很大时,正则化项占主导地位,准确性可能会下降。
在这里插入图片描述
    两个数据集的比较结果证明了我们提出的方法的有效性。

4.4.4. 回归损失函数分析

    实验使用不同的回归损失函数来计算正则化项来探索我们的方法的性能。我们比较了三种常用的损失函数:MAEMSESmoothL1。从表5可以看出,SmoothL1损失效果最好
在这里插入图片描述

    我们还在LUNA16数据集上进行了不同权重下的对比实验。表6所示的结果也表明SmoothL1的整体性能是最好的。
在这里插入图片描述
    因此,我们选择SmoothL1损失函数进行后续实验。

    SmoothL1 损失的解释:我们现在从几何角度分析 SmoothL1 相对于 MAE 和 MSE 的优势。三个函数的表达式如下:
在这里插入图片描述
    相应的函数图像如图7(a)所示。当 ∣ x ∣ |x| x很大时, d M S E d x = 2 x \frac{dMSE}{dx}=2x dxdMSE=2x也很大,这可能会导致梯度爆炸和训练不稳定。由于 d M A E d x = ± 1 \frac{dMAE}{dx}=±1 dxdMAE=±1,当 x x x很小时,MAE会在稳定值附近受到扰动,难以继续收敛到更好的解。SmoothL1 避免了 MAE 和 MSE 的这些缺陷: d S m o o t h L 1 d x \frac{dSmoothL_1}{dx} dxdSmoothL1随着 ∣ x ∣ |x| x越小而越小。当 ∣ x ∣ |x| x很大时, d S m o o t h L 1 d x = ± 1 \frac{dSmoothL_1}{dx}=±1 dxdSmoothL1=±1成立,从而避免梯度爆炸
    在 IDRiD 数据集上可视化训练损失如图 7 (b) 所示。图7(b)说明训练早期损失较大,训练后期损失较小。因此,如果使用MSE,网络在早期训练阶段可能会经历梯度爆炸,而如果使用MAE,网络可能在后期训练阶段无法收敛到更好的解决方案。 SmoothL1完美地避免了上述问题。图7(b)显示SmoothL1实现了最小的训练损失,直观地展示了SmoothL1的优势

在这里插入图片描述

4.4.5. 疾病发展方向性分析

    论文方法还提供有关疾病发展的方向信息,类似于基于回归的方法。提出方向性匹配率(DMR)来定量测量方向性。从表 2 可以看出,我们的方法在准确性和 QWK 方面优于其他方法。我们方法的DMR为93.20%,超过了回归方法;这个比率意味着我们的方法将帮助 93.20% 的患者获得适当的治疗。疾病等级预测错误但方向性预测正确的患者仍然可以根据方向信息获得正确的治疗。与其他模型相比,我们的方法提供了更全面的分级信息,帮助患者获得适当的治疗。

4.4.6. 泛化性分析

    对多个基线模型进行了比较实验,以说明我们方法的泛化性。实验结果如图8所示的直方图所示。结果表明,我们提出的方法在不同基线模型下都有明显的增益,证明了我们方法的泛化性。我们可以看到ResNet50取得了最好的结果,因此我们使用ResNet50作为骨干模型
在这里插入图片描述

4.4.7. 优化器分析

    在多个优化器下进行对比实验来分析优化器的影响。表 7 列出了使用三种不同的常见优化器针对不同任务的不同方法的结果。对于DR评分任务(单评分任务),结果表明SGD优于Adam和AdamW。在联合评分任务中,SGD 也表现最好。一些工作 [57-59] 解释了这一点,因此我们使用 SGD 作为默认优化器。此外,所提出的方法在不同优化器下的性能优于其他方法,这再次体现了我们方法的有效性
在这里插入图片描述

4.5. 单评分任务的比较

    为了显示我们提出的方法的优越性,我们将我们的方法与其他疾病分级模型进行比较。我们在 IDRiD 数据集和 LUNA16 数据集上进行单疾病分级实验。网络框架如图2所示。
我们的方法和其他方法在 IDRiD 数据集上的比较结果列于表 2。当 α = 0.125 \alpha=0.125 α=0.125 时,我们提出的 OR-DGN 达到了 0.7670 的精度0.8345 的 QWK。与其他方法相比,论文的方法在准确性和 QWK 方面都取得了最先进的结果。 IDRiD 竞赛获胜团队使用的 LzyUNCC [46] 方法是集成模型,而我们的方法是单一模型,因此我们提出的方法以更简单的方式实现了最佳精度。此外,我们的方法仍然比两种序数回归方法 OLR [7] 和 RCTO [47] 表现更好。
    表 3 突出显示了序数正则化模块在 LUNA16 数据集上获得的性能改进。我们提出的方法在 AUC 上实现了最佳性能。在分类精度方面,我们的方法优于除 MMEL-3DCNN [32] 和 Attentive 和 ensemble CNN [33] 之外的其他方法,这两种方法都是集成学习方法。我们方法的灵敏度和特异性分别为 0.8731 和 0.9066,这是非常有竞争力的结果在灵敏度和特异性方面,我们的方法的综合性能优于其他方法。上述结果充分证明了我们的方法在单一任务中的优越性。

4.6. 联合评分任务的比较

    分别在 IDRiD 和 Messidor 数据集上进行联合评分实验,以证明所提出方法的积极效果。
表8列出了我们的方法、IDRiD挑战数据集上的现场挑战方法以及其他论文中的其他非集成方法的结果。很明显,我们的方法取得了比基线模型更好的结果,联合精度为 68.0%,这证明了我们的方法的积极效果。我们提出的方法也超过了 LzyUNCC [46] 现场挑战的最佳结果,提高了 4.9%。与之前论文中的非集成方法相比,我们的方法比 HA-Net [45] 提高了 1.6%,并且也优于 PCFNet [60]、CANet [42] 和 SA-NSVM [44]。我们提出的方法在 IDRiD 数据集上的联合评分任务上实现了最先进的性能,这表明了该方法的有效性。
在这里插入图片描述

    表 9 报告了 Messidor 数据集的详细比较结果。在联合任务中,联合精度是最重要的评价指标。为了说明所提出的方法的普遍适用性,我们对这两种疾病使用共享和分离的主干网。可以看出,我们的方法明显超过了基线模型。与其他方法相比,我们的方法优于 CANet [42],在联合精度方面提高了 0.83%。值得指出的是,CANet引入了两个注意力模块,而我们的方法只引入了一个更简单的序数模块,但获得了比CANet更好的性能。我们还报告其他评估指标。我们的方法在 DR 分级的 AUC、准确率、召回率和 F1 分数方面表现最佳。对于 DME 分级,我们的方法在准确度和 AUC 方面具有最高的结果。我们的方法在 DR 评分任务上的增益高于在 DME 评分任务上的增益,因为 DR 中的等级更多,因此等级有序性的增益更明显。考虑到所有评估指标,所提出的方法在 Messidor 数据集上产生了最佳性能。我们的方法在联合评分任务中也表现良好,这再次证明了我们方法的广泛适用性。
在这里插入图片描述

4.7. 可视化分析

    图 9 显示了基线模型和我们的模型发现的显著区域。该模型主要根据这些显著区域进行预测。在预测阶段,论文的方法更多地关注重要的病变区域,而基线模型部分关注一些样本中的一些不合理的位置。
在这里插入图片描述

    对于第3列的样本,基线模型关注的是没有病变的区域,根据这些区域进行预测是不合理的;我们的方法避免了这种不合理的关注。由于考虑了先验知识,我们的方法做出了更合理的判断。该显著图为我们的方法提供了直观的解释。

5. 讨论

    尽管我们的方法表现出良好的性能,但仍然存在局限性。整个网络框架仅通过图像级监督进行训练,这使得很难找到准确的异常迹象,例如 DR 中的微动脉瘤和出血。图 9 显示了所提出的模型发现的显着区域。从图9可以看出,大部分含有病灶的区域都被找到了,但也有一些区域没有准确地找到,这限制了模型的性能。一种解决方案可能是收集具有更多注释信息的疾病数据集。病变掩模或边界框将提供这些异常迹象的位置信息,这将有助于更准确地定位异常区域并提高分级性能。如果我们有位置信息,我们就可以在训练中获得关键的局部特征,这比依赖基于注意力的方法学习的特征具有更高的准确性[20,61]。或者,病变位置信息可用于监督基于注意力的方法来识别重要的病变区域。最后,我们可以整合整个图像特征和重要的局部特征,以帮助模型专注于更准确的判别特征。
    先验知识和深度学习的整合有利于深度学习的性能。 CANet [42]利用DME是DR并发症的医学先验知识来探索两种疾病之间的关联。在我们的工作中,我们基于对疾病严重程度有序性的先验知识来提出我们的方法。如果先验知识相对复杂,则很难手动设计模块并将其集成到深度学习模型中。为了更好地利用领域知识,我们计划利用知识图谱来实现知识与深度学习的融合,这将是未来的一个重要研究方向。此外,它还可能为深度学习模型的预测带来一些解释。

6. 总结

    在这项工作中,我们提出了一个可嵌入序数正则化模块,该模块考虑疾病进展的有序性以提供更准确的诊断。该模块可以灵活地嵌入到通用深度学习分类网络中,以提高疾病分级性能。我们在公共 IDRiD 数据集上取得了最佳已发表结果,并在 LUNA16 数据集上获得了有竞争力的性能,这证明了我们提出的网络的有效性。此外,我们的方法在 Messidor 数据集上优于其他流行的方法。特别是,我们的方法可以预测疾病发展的方向性,而以前的分类模型则不能。了解疾病发展的方向性对于治疗疾病至关重要,如果方向性结果正确,即使被误诊的患者也能得到正确的治疗。此外,我们的方法具有通用性,可以应用于许多具有序数关系的任务。未来,我们计划将我们的网络与代表更丰富先验知识知识图谱集成,以提高其在疾病分级方面的性能。


附录A.其他相关方法的实验设置

    接下来,我们根据任务介绍其他实验设置。
    单一评分任务:对于IDRiD数据集,使用的骨干网络主要包括ResNet(LzyUNCC [46],SUNet [41],SKD [24],OLR [7],RCTO [47]),InceptionNet(LA-NSVM [28],MNet [ 29])和 DenseNet(Mammoth [46])。输入分辨率为 512×512(Mammoth、MNet)和 896×896(LzyUNCC、OLR、RCTO)。此外,上述工作中使用的优化器是SGD(LzyUNCC、VRT [46]、Mammoth、OLR、RCTO、MNet)和Adam(LA-NSVM)。
    联合评分任务:对于IDRiD数据集,相关骨干网络主要包括ResNet(LzyUNCC,SUNet,CANet [42]),XceptionNet(SA-NSVM [44]),DenseNet(Mammoth,PCFNet [60])和VGG(HA-Net [45]) )。输入分辨率主要为512×512(Mammoth,HA-Net)和896×896(LzyUNCC)。上述工作中使用的优化器包括SGD(LzyUNCC、VRT、Mammoth、PCFNet)和Adam(CANet、HA-Net、SA-NSVM)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cpdr

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

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

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

打赏作者

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

抵扣说明:

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

余额充值