Deep Hash Distillation for Image Retrieval

文章提出了一种新的自蒸馏哈希方案,用于解决图像检索中的数据增强导致的性能下降问题。通过最小化不同变换视图的哈希码之间的差异,提高汉明空间和实值空间的一致性,增强哈希码的转换弹性。此外,利用基于代理的相似性学习和二元交叉熵量化损失来优化哈希码。实验表明,这种方法在多个数据集上提高了深度哈希方法的性能,增强了对图像变换的鲁棒性。
摘要由CSDN通过智能技术生成

Deep Hash Distillation for Image Retrieval【ECCV 2022】

图像检索的深度哈希蒸馏



Abstract

提出动机/现有方法存在问题:
在基于哈希的图像检索系统中,图像退化(衰减)或变换 (degraded or transformed) 通常会产生与原始图像不同的编码,从而降低检索精度。

为了缓解上述问题,可以在训练期间应用 数据增强(data augmentation)

然而,即使图像的增强样本在真实特征空间中是相似的,量化(quantization) 也会使它们在汉明空间中分散的很远。这将导致表示差异,从而阻碍训练并降低性能。

本文提出:
一种新的 自蒸馏哈希方案self-distilled hashing scheme
以最大限度地减少差异,同时利用数据增强的潜力。

通过将 弱变换样本weakly-transformed samples 的哈希知识传递给 强变换样本strongly-transformed samples,我们使哈希码对各种变换不敏感。

还引入基于哈希代理的相似性学习【hash proxy-based similarity learning】基于二元交叉熵的量化损失【binary cross entropy-based quantization loss】 来提供高质量的哈希码。

最终,构建了一个深度哈希框架。



1 Introduction

近年来,通过深度学习,哈希学习技术得到了显著进步,称为深度哈希。
通过将哈希函数集成到深度学习框架中,同时学习图像编码器和哈希函数以生成图像哈希码。

关于深度哈希的训练,领先的技术是:

  • 使用相似或不相似的图像对的集合的 成对相似性方法
  • 与使用图像分类标签的分类方法相结合的 全局相似性方法

由于基于哈希的检索系统需要计算图像与二值码之间的距离,因此对应的码需要通过 s g i n sgin sgin 运算进行量化,从连续实空间{-1,1} 的离散汉明空间

存在问题:图像增强变换导致性能下降

在这个过程中,不断优化的图像表示 被改变,并产生量化误差,从而降低了哈希码的判别能力。当输入图像被 变换并偏离原始分布 时,这个问题就更大了。


为了避免由于变换而导致的性能下降,最常见的解决方案是通过 使用具有各种变换的增强数据进行训练来泛化深度模型。然而,将这种增强策略应用于深度哈希是具有挑战性的,因为可能会出现表示上的差异。

在这里插入图片描述

  • 问题1:哈希码的符号可以通过微小的改变而移位。
    弱变换图像哈希码的最后一个元素与原始元素相差0.2(-0.1 → \to 0.1),但它会导致汉明空间中-1到1的移位。

  • 问题2:即使哈希码的变化很大,量化后的哈希码的符号也不会改变。
    强变换图像的哈希码的最后一个元素与原始值相差1.0(-0.1 → \to -1.1),然而在汉明空间中却没有移位。

也就是说,在深度哈希中使用增强,增加了汉明空间和实值空间之间的差异,这阻碍了找到最优的二值码

解决方案:自蒸馏哈希self-distilled hashing

为了解决上述问题,引入了一个名为自蒸馏哈希的新概念,该概念自定义自蒸馏,来防止深度哈希训练中的严重差异。

具体来说,基于对余弦距离汉明一致性之间关系的理解,最小化图像的两个不同视图(变换结果)的哈希码之间的余弦距离,以最大化其二值结果之间的汉明一致性

为了进一步稳定学习,将变换的难度分为简单和困难,并将哈希知识从简单转移到困难。


此外,还提出了两个额外的训练目标来优化哈希码:

  • 基于哈希代理的相似性学习hash proxy-based similarity learning
    • 允许深度哈希模型学习带有温度尺度余弦相似度的全局(类间)判别哈希码
  • 基于二元交叉熵的量化损失binary cross entropy-based quantization loss
    • 有助于使哈希码以似然估计器的分类方式自然地远离二进制阈值

综上,我们构建了一个深度哈希蒸馏框架(DHD),该框架产生具有判别性和转换弹性性的哈希码,用于快速图像检索。

Contributions

  • 据我们所知,这是第一个解决由深度哈希中的数据增强引起的真实空间和汉明空间之间差异的工作
  • 通过引入自蒸馏哈希方案和训练损失函数,成功地将增强的能力嵌入到哈希码中。
  • 广泛的实验证明了我们工作的好处,改进了以前的深度哈希方法并实现了最先进的性能。


2 Related Works

Deep hashing methods

Hash center-based methods

类级哈希表示(中心)
使用预定义的正交二值哈希目标

Self-distillation

Siamese architecture 暹罗结构(孪生网络)



3 Method

深度哈希蒸馏的深度哈希模型 H H H 的目标是:将输入图像 x x x 映射到汉明空间中的 K K K 维二值码 b ∈ { − 1 , 1 } K b \in \{-1,1\}^K b{1,1}K.

为此,我们对 H H H 进行优化,找到一个高质量的实值哈希码 h h h,然后利用 s i g n sign sign 运算将 H H H 量化为 b b b

我们没有在模型训练中包含不可微的量化过程,而是在实空间中学习 H H H,在充分利用数据增强的能力的同时,不断松弛 H H H 来估计最优 b b b

利用 θ \theta θ 作为下标来表示可训练分量。

在这里插入图片描述


3.1 Self-distilled Hashing

一般情况下, H H H 在实空间中训练得到可判别的 h h h,即使量化为 b b b,也应该在汉明空间中保持其性质。

因此,在训练时将 h h h b b b 对齐,使其具有相似的表示是很重要的。

然而,当对训练输入进行数据增强时, h h h发生如图1所示的变化, h h h b b b 之间可能会出现不对齐的情况。

因此,直接使用增强可能会导致 h h h b b b 之间表示的不一致,这降低了检索性能。


Hamming distances as cosine distance 汉明距离作为余弦距离

值得注意的是,二值码之间的汉明距离可以解释为余弦距离。也就是说,可以利用哈希码 h i h_i hi h j h_j hj 之间的余弦相似度来近似二值码 b i b_i bi b j b_j bj 之间的汉明距离:

在这里插入图片描述

  • b i = s i g n ( h i ) b_i = sign(h_i) bi=sign(hi)
  • b j = s i g n ( h j ) b_j = sign(h_j) bj=sign(hj)
  • D H ( ⋅ , ⋅ ) D_H(\cdot, \cdot) DH(,) 表示汉明距离
  • S ( ⋅ , ⋅ ) S(\cdot,\cdot) S(,) 表示余弦相似度

也就是说,最小化哈希码之间的余弦距离可以使二值码之间的汉明距离最小。


Easy-teacher and difficult-student

如图2(a)所示,提出了一种自蒸馏哈希方案,该方案支持带增强的深度哈希模型的训练。

我们采用 权重共享Siamese structure(暹罗结构、孪生网络) 来同时对比两个图像的不同视图(增强结果)的哈希码。

根据自蒸馏工作的观察,保持一个分支的输出稳定表示对性能增益有重大影响。

因此,我们配置了两个独立的增强组,以提供具有不同变换难度的输入视图:

  • weakly-transformed easy teacher T T T_T TT 弱变换简单教师
  • strongly-transformed difficult student T S T_S TS 强变换困难学生

在这里我们以 随机抽样 的方式控制难度:对组中的所有变换使用相同的超参数 s T s_T sT,并通过缩放它们自身的发生概率使它们发生的更少(弱)或更多(强)。

【虽然这种方式使教师表示稳定,但它的优点是不会完全排除产生不稳定结果的少数极端例子,并有助于学习。】

此外,我们停止了教师视图对应哈希码的梯度,以避免崩溃为平凡解。


Loss computation 损失计算

对于给定的图像 x x x,自蒸馏是通过如下图像视图进行的: x ~ T = t T ( x ) \tilde x_T = t_T(x) x~T=tT(x) x ~ S = t S ( x ) \tilde x_S = t_S(x) x~S=tS(x)

  • t T t_T tT t S t_S tS 分别是从 T T T_T TT T S T_S TS 的随机采样的变换

深度编码器 E θ E_\theta Eθ 和哈希函数 H θ H_\theta Hθ x ~ T \tilde x_T x~T x ~ S \tilde x_S x~S 作为输入,并产生相应的哈希码 h T h_T hT h S h_S hS.

然后,提出的 自蒸馏哈希SdH 损失 计算为:

在这里插入图片描述

L S d H L_{SdH} LSdH 优化 H H H 可以使 h T h_T hT h S h_S hS 对齐,从而使 b T b_T bT b S b_S bS 如 Eq. (1) 所示,从而减少了两个不同变换输出二值码之间的表示差异。


Flexibility 灵活性

自蒸馏哈希也适用于其他常见的深度哈希模型,在训练过程中利用数据增强。

此外,各种骨干网络可以用作深度编码器,并且任何哈希函数 H θ H_\theta Hθ 配置都是兼容的。

为了简单起见,使用单个FC层来获得所需位的哈希码,并在最后应用 t a n h tanh tanh 操作将其绑定在 [ − 1 , 1 ] [-1,1] [1,1] 中。



3.2 For Better Tearcher 得到一个更好的教师

除了自蒸馏哈希外,还需要额外的训练信号,例如监督学习损失和量化损失来获得判别哈希码。

我们只使用教师哈希码来计算损失,以便将学习到的哈希知识转移到学生的代码中。

Proxy-based similarity learning 基于代理的相似性学习

预先定义的正交二元哈希目标 在监督哈希相似性学习中展示出很好的性能,但是也具有一定局限性:

  • 需要复杂的初始化过程
  • 在中心之间分配相同的汉明距离,因此无法根据语义相似度量学习详细的距离。

因此,如图2(b)所示,我们通过使用一组可训练的哈希代理 P θ P_\theta Pθ
在深度哈希中引入了基于代理的表示学习

它的优点是代理可以被简单地随机初始化,并且能够学习到代理的语义相似性

在这里插入图片描述

在训练方面,我们首先使用 P θ P_\theta Pθ h T h_T hT 来计算 类级分类预测class-wise prediction p T p_T pT

在这里插入图片描述

  • p θ i p_{\theta_i} pθi 是分配给第 i i i 个类的哈希代理
  • N c l s N_{cls} Ncls 表示要区分的类的数量

然后,再使用 p T p_T pT 通过计算 哈希代理(Hash Proxy)损失 来学习与 类标签 y y y 的相似度:

在这里插入图片描述

  • τ \tau τ 是温度标度超参数
  • H ( u , v ) = − ∑ k u k l o g v k H(u, v) = - \sum_k u_k log v_k H(u,v)=kuklogvk 是交叉熵
  • s o f t m a x softmax softmax 运算沿着 p T p_T pT 的维度应用

和Eq. (1) 相同, L H P L_{HP} LHP 被设计为学习 带有温度标度的汉明一致性。


Reducing quantization error 减少量化误差

为了使连续的哈希码元素能够像二进制位一样工作,深度哈希方法旨在通过以回归方式 最小化哈希码位 与 其最近的二进制目标(+1 或 -1)之间的距离(例如欧几里得距离) 来减少量化误差。

然而,由于哈希的目标是对每个比特的符号进行分类,因此一个更自然的选择是将其视为 二进制分类最大似然问题 maximum likelihood problem

因此,我们使用预定义的均值为 m m m、标准差为 σ \sigma σ高斯分布估计器 g ( h ) g(h) g(h) 来估计哈希码元素 h h h 的二值似然:

在这里插入图片描述

使用两个估计器:

  • g + g^+ g+ m = 1 m=1 m=1 σ \sigma σ
  • g − g^- g m = − 1 m=-1 m=1 σ \sigma σ

我们计算 似然值基于二进制交叉熵(Binary Cross Entropy-based,BCE)的量化损失

在这里插入图片描述

  • H b ( u , v ) = − u l o g v + ( 1 − u ) l o g ( 1 − v ) H_b(u, v) = -ulog v + (1-u)log(1-v) Hb(u,v)=ulogv+(1u)log(1v) 是二值交叉熵
  • g k + g_k^+ gk+ g k − g_k^- gk 表示第 k k k 个哈希码元素的 估计似然值estimate likelihood
    • g k + = g + ( h k ) g_k^+ = g^+(h_k) gk+=g+(hk)
    • g k − = g − ( h k ) g_k^- = g^-(h_k) gk=g(hk)
  • b k + b_k^+ bk+ b k − b_k^- bk 表示 二值似然标签binary likelihood labels
    • b k + = 1 2 ( s i g n ( h k ) + 1 ) b_k^+ = \frac{1}{2} (sign(h_k)+1) bk+=21(sign(hk)+1)
    • b k − = 1 − b k + b_k^- = 1 - b_k^+ bk=1bk+

因此,量化误差 通过 给定估计器的 二进制分类损失 来减少。

注意, L b c e − Q L_{bce-Q} LbceQ 也应用于哈希代理,使其充当连续松弛的二值码。


3.3 Training 训练

Total training loss 总的训练损失

给定一个具有 N B N_B NB 个数据点的训练 mini-batch: X B = { ( x 1 , y 1 ) , … , ( x N B , y N B ) } X_B = \{(x_1,y_1), \dots, (x_{N_B},y_{N_B})\} XB={(x1,y1),,(xNB,yNB)},其中每个图像 x i x_i xi 被分配一个标签 y i ∈ { 0 , 1 } N c l s y_i \in \{0,1\}^{N_{cls}} yi{0,1}Ncls.

所有数据点的训练视图都是通过以下方式获得的:

  • x ~ T i = t T i ( x i ) \tilde x_{Ti} = t_{Ti}(x_i) x~Ti=tTi(xi)
    • t T i ∼ T T t_{Ti} \sim T_T tTiTT
  • x ~ S i = t S i ( x i ) \tilde x_{Si} = t_{Si}(x_i) x~Si=tSi(xi)
    • t S i ∼ T S t_{Si} \sim T_S tSiTS

DHD总的损失 L T L_T LT X B X_B XB 来计算为:

在这里插入图片描述

  • λ 1 \lambda_1 λ1 λ 2 \lambda_2 λ2 是用来平衡训练目标影响的超参数。

整个DHD框架是以端到端的方式进行训练的。


Multi-label case 多标签情况

在确定 multi-hot标签 图像之间的语义相似性时,之前的工作只是检查图像是否共享至少一个 positive 标签

然而,通过上述相似性学习具有局限性,因为其忽略了标签依赖性。

因此,我们的目标是通过利用 S o f t m a x Softmax Softmax 交叉熵和归一化的 multi-hot 标签 y y y 来捕捉标签依赖性。

具体来说, y = y / ∥ y ∥ 1 y = y / \parallel y \parallel_1 y=y/y1 来平衡每个标签的贡献,并计算相同的 L H P L_{HP} LHP 来优化用于 multi-label 图像检索的深度哈希模型。



4 Experiments

4.1 Setup

Datasets 数据集

本文讨论了三种最流行的基于哈希的检索基准数据集,并在表1中给出了每个数据集的组成。

在这里插入图片描述

Evaluation metrics 评价指标

具体来说,使用了三个评价指标:

1)mean average precision(mAP) 平均精度

  • 我们从检索排序列表结果中选择top-M的图像。无论一个或多个类标签是否相同,返回的图像和查询图像都被认为是相关的。

2)precision-recall curves(PR curves) 精度-召回率曲线

3)precision with respect to top-M returned image(P@Top-M) 相对于top-M返回图像的精度

二值码的长度:维度 K K K 设置为16、32和64。



4.2 Implementation Details

Data augmentation 数据增强

选择了五种图像变换的 T T T 族:
1)resized crop 调整大小裁剪
2)horizontal flip 水平翻转
3)color jitter 颜色抖动
4)grayscale 灰度
5)blur 模糊

其中每种变换都以给定的概率均匀采样,并且依次应用于输入。
保持每个变换的内部参数和【6】一样。

对于自蒸馏哈希,用 T T T 配置两个组:

  • 困难学生组 T S = T T_S = T TS=T
  • 简单教师组 T T T_T TT 通过将所有的变换出现次数用 s T s_T sT 缩放来配置, s T s_T sT 的取值为 ( 0 , 1 ] (0, 1] (0,1] .
    • T T T_T TT 设置为未经SdH训练的方法的默认值。
Experiments

骨干backbones:

  • Non-deep
  • AlexNet
  • ResNet(ResNet50)
  • vision Transformers

利用 Pytorch框架kornia库 的图像变换功能进行增强,建立了相同的训练环境。

使用Adam优化器,并使用cosine scheduling衰减学习率来训练深度哈希方法。


DHD 的超参数设置

s T s_T sT设置:

  • AlexNet :0.2
  • others :0.5

τ \tau τ 设置:考虑到 N c l s N_{cls} Ncls

  • ImageNet :0.2
  • NUS-WIDE :0.6
  • MS COCO :0.4

λ 1 \lambda_1 λ1 = λ 2 \lambda_2 λ2 = 0.5
L b c e − Q L_{bce-Q} LbceQ 中的 σ \sigma σ 被默认设置为0.5.



4.3 Results and Analysis

Comparison with others 与其他方法比较

mAP分数是通过改变每个数据集的top-M来计算的:ImageNet@1000、NUS-WIDE@5000、MS COCO@5000.

在这里插入图片描述

我们的DHD在每个深度骨干架构的的每个比特长度的所有数据集上显示了最好的mAP分数,特别是对于AlexNet骨干哈希方法。

根据其他计算机视觉任务的最新趋势,我们首先将基于Transformer的图像表示学习架构:ViT、DeiT、SwinT引入哈希并进行检索实验。


为了进一步研究DHD的检索质量,对检索到的前1000张64位图像进行了PR曲线图和精度分析,如图3和图4所示:

在这里插入图片描述

在这两个评估指标下,DHD明显优于所有比较的哈希方法。特别是,DHD显示出理想的检索结果,在较低的召回水平下获得更高的精度,并且比所有比较的方法检索到更多的顶部样本。这些方法都证明了DHD在现实世界检索案例中的实用性。


Self-distilled Hashing with other methods and ablations 自蒸馏哈希与其他方法及消融

为了证明SdH也可以应用于其他深度哈希基线,我们使用AlexNet骨干进行检索实验,结果如报表3所示。

在这里插入图片描述

有SdH设置时,使用 T T T_T TT T S T_S TS 组来生成输入视图;
没有SdH设置时,只使用 T S T_S TS 来生成输入视图。

通过对比表2和表3中不含SdH的结果可以看出,使用 T S T_S TS 学习的深度哈希模型不如使用 T T T_T TT 学习的模型。这是因为 T S T_S TS 的使用增加了汉明空间和真实空间之间呈现差异的可能性。否则,如果模型采用SdH训练同时利用 T T T_T TT T S T_S TS,则可以提高检索性能,因为SdH减轻了差异,适当地利用了数据增强的能力。

我们还比较了 L H P L_{HP} LHP 与其他方法的检索结果,发现哈希中心的可训练设置提高了搜索质量。

此外,通过将 L H P L_{HP} LHP L b c e − Q L_{bce-Q} LbceQ 相结合,在所有比特长度下都获得了性能增益,显示了基于二值交叉熵的量化的强大功能。

L H P L_{HP} LHP L b c e − Q L_{bce-Q} LbceQ 与 SdH训练相结合时,mAP得分最高,证实了DHD的有效性。


Trainable Hash Proxies 可训练的哈希代理

在DHD中,我们使用可训练的哈希代理,而不是使用预定义的正交哈希目标,目的是将详细的类语义相似性嵌入到哈希表示中。

我们使用ResNet骨干和64位代码可视化两两之间的余弦相似性,以观察哈希代理之间的实际对齐,如图5所示。

在这里插入图片描述

由于哈希目标是由Hadamard矩阵生成的,因此它们是正交的,如图5a所示。因此,不同哈希目标之间的余弦相似度(汉明距离)相等,忽略了不同类的哈希表示之间的语义相关性。此外,对于多标签情况,无论内容是否同时出现在图像中,标签依赖关系也被忽略。

另一方面,可训练的哈希代理被设计为在训练过程中自己嵌入语义相似性
因此,当我们计算如图5b到图5d所示的两两余弦相似度时,可以显示类相关性。特别是对于ImageNet,语义相关类的哈希代码具有更高的相似性,例如 Norfolk terrier-Australian terrier 和 purse-wallet。

此外,对于多标签数据集,经常在图像中一起出现的类的哈希代理具有更高的相似性,例如 NUS-WIDE中的 sky-clouds 和 buildings-window-vehicle,MS COCO中的 bowl-cup-dining table。

总而言之,我们可以确认监督语义信号被很好地引导来表示哈希代理之间的详细相似性,从而产生更高质量的搜索结果。


Insensitivity to transformations 对变换不敏感

为了研究对变换的敏感性,我们通过使用ImageNet查询集,研究了当变换后的图像被送到ResNet骨干网络时,二值码是如何变化的。

我们度量未变换( s T = 0 s_T=0 sT=0)图像输出二值码 与 变换后( s T s_T sT in ( 0 , 1 ] (0,1] (0,1] )图像输出二值码之间的平均汉明距离,如图6所示。

在这里插入图片描述

在这里,CSQ、DPH和用 L H P L_{HP} LHP 学习的模型都是用弱变换 T T T_T TT 进行训练的,由于几乎没有使用增强,结果显示出对变换的敏感性。

当使用增强( L H P + T S L_{HP} + T_S LHP+TS)时,模型对变换具有更强的鲁棒性,但是在训练过程中,由于Hamming空间与实空间的表示不一致,mAP分数下降。

另外, L H P + L S d H L_{HP} + L_{SdH} LHP+LSdH(蓝线)的组合在获得最佳mAP分数的同时表示出了最高的鲁棒性,通过在训练过程中最小化表征差异并成功地探索了强增强的潜力。


Robustness to unseen deformations 对没有见过的变换的鲁棒性

为了进一步检验DHD的泛化能力,对输入进行了未见过的(在训练过程中看不到)的变换的实验,结果如表4所示。

在这里插入图片描述

具有SdH的深度哈希模型在所有变换下都显著优于没有SdH的模型。

特别地,尽管SdH没有包括任何像素级变换,但SdH使深度哈希模型对每像素变形(例如丢弃和高斯噪声)具有鲁棒性。


Quantization 量化

L b c e − Q L_{bce-Q} LbceQ 的影响如图7所示。

在这里插入图片描述

可以看到,二进制位分布得更均匀,与7b中得二进制位类似。

这意味着,当应用 L b c e − Q L_{bce-Q} LbceQ 时,比特分布得熵要高得多,它可以通过表示不同的二值码来显示更好的检索精度。



5 Conclusion

在本文中,我们提出了一种新的 自蒸馏哈希(SdH)方案,该方案适用于训练过程中的深度哈希模型。

通过 最大化图像的不同视图哈希码之间的余弦相似性,SdH 最小化了由于增强而导致的表示中的差异 ,并提高了检索系统的鲁棒性。

此外,我们的目标是 通过基于代理的学习将复杂的语义相似性嵌入到哈希码中,并进一步施加 基于交叉熵的量化损失

通过所有上述提议,我们配置了深度哈希蒸馏框架,该框架在流行的深度哈希基准上产生了最先进的性能。

node image-hash 是一个基于Node.js环境的图像哈希库。它提供了计算图像哈希值的功能,可以用于图像相似性比较、图像搜索和鉴黄等应用领域。 通过使用node image-hash,我们可以轻松地对图像进行处理和分析。它支持各种图像格式,包括JPEG、PNG、GIF等。我们可以通过调用相关的API来计算图像的哈希值,这些API包括计算平均哈希值、差异哈希值和感知哈希值等。 对于计算图像哈希值,node image-hash采用了一些常用的算法,例如平均哈希算法、差异哈希算法和感知哈希算法。这些算法能够将图像转化为固定长度的哈希值,从而实现图像的唯一性表示。 通过计算图像的哈希值,我们可以比较不同图像之间的相似性。如果两个图像的哈希值非常接近,那么它们在视觉上可能具有很高的相似度。这对于图像搜索和鉴黄等应用来说非常有用。 同时,在实际的应用中,我们也可以使用node image-hash来进行鉴黄。通过计算图像的哈希值,我们可以将可疑的图像与已知的不良图像进行比较,以实现简单的鉴黄功能。 综上所述,node image-hash 是一个功能强大的图像哈希库,它可以方便地进行图像的处理和分析。无论是图像相似性比较、图像搜索还是鉴黄,都可以借助它来实现。它在Node.js环境下的使用也非常简便,适合各种图像处理应用的开发和实践。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值