Uninformed Students: Student–Teacher Anomaly Detection with Discriminative Latent Embeddings(翻译)

未知学生:学生-教师异常检测与鉴别潜在嵌入
原文:https://export.arxiv.org/pdf/1911.02357
Uninformed Students: Student–Teacher Anomaly Detection with Discriminative Latent Embeddings
摘要
针对高分辨率图像中无监督异常检测和像素精确异常分割的难题,我们引入了一个强大的师生框架。学生网络被训练为回归描述教师网络的输出,该网络是在一个大的自然图像的补丁数据集上预训练。这避免了对先前数据注释的需要。当学生网络的输出与教师网络的输出不同时,会检测到异常情况。当他们不能在不规则训练数据的集合之外推广时,就会发生这种情况。学生网络中的内在不确定性被用作表示异常的附加评分函数。我们将该方法与大量现有的基于深度学习的非监督异常检测方法进行了比较。我们的实验证明了对一些现实世界数据集的最新方法的改进,包括最近引入的MVTec异常检测数据集,该数据集专门设计用于基准异常分割算法。
1介绍
在计算机视觉的许多领域中,对机器学习模型中异常或新奇的区域进行无监督的像素精确分割是一项重要而富有挑战性的任务。在自动化工业检测场景中,通常只需要在一类无异常图像上训练模型,就可以在推理过程中分割出缺陷区域。在主动学习设置中,可以将当前模型检测为以前未知的区域包含在训练集中,以提高模型的性能。
最近,人们致力于改进一类或多类分类的异常检测[2,3,10,11,21,28,29]。然而,这些算法假设异常以完全不同类别的图像的形式表现出来,并且必须做出一个简单的二值图像级别的决定,即图像是否异常。很少有人致力于开发能够分割异常区域的方法,这些异常区域只与训练数据存在非常微妙的差异。Bergmann等人[7]为一些最先进的算法提供了基准,并确定了一个很大的改进空间。
现有的工作主要集中在生成算法,如生成对抗网络(GANs)[31,32]或变分自动编码器(VAEs)[5,36]。这些检测异常使用每像素重建误差或通过评估从模型的概率分布获得的密度。这已被证明是有问题的,因为不准确的重建或校准不当的可能性[8,22]。
许多有监督的计算机视觉算法[16,34]的性能是通过转移学习来提高的,即通过使用来自预训练网络的有区别的嵌入。对于无监督异常检测,这种方法到目前为止还没有得到充分的研究。最近的研究表明,这些特征空间可以很好地用于异常检测,即使是简单的基线也比生成式深度学习方法要好[10,26]。然而,现有方法在大型高分辨率图像数据集上的性能受到浅层机器学习管道的限制,这需要对所使用的特征空间进行降维。此外,它们依赖于大量的训练数据子采样,因为它们的容量不足以用大量的训练样本来模拟高度复杂的数据分布。
我们建议通过采用学生-教师的方法对训练特征的分布进行隐式建模来规避浅层模型的这些局限性。这充分利用了深度神经网络的高容量,并将异常检测作为一个特征回归问题。给出了一个基于自然图像的大规模补丁(patch)数据集的描述性特征抽取器(教师),我们在无异常的训练数据上训练一组学生网络来模拟教师的输出。在推理过程中,将学生的预测不确定性和他们对教师的回归误差结合起来,得到每个输入像素的密集异常分数。我们的直觉是,学生在没有异常的训练数据的纷繁复杂的情况下,归纳能力会很差,并开始做出错误的预测。图1显示了我们的方法应用于从MVTec异常检测数据集选择的图像时的定性结果[7]。整个异常检测过程的示意图如图2所示。我们的主要贡献是:
•我们提出了一种基于学生-教师学习的无监督异常检测框架。来自预先训练的教师网络的局部描述符作为学生集合的代理标签。我们的模型可以在大的未标记图像数据集上进行端到端的训练,并利用所有可用的训练数据。
•我们引入基于学生预测方差和回归误差的评分函数,以获得密集异常图,用于自然图像中异常区域的分割。我们描述了如何通过调整学生和教师的感受野,将我们的方法扩展到多尺度的分段异常。
•我们在三个真实世界的计算机视觉数据集上展示了最先进的性能。我们将我们的方法与一些直接适合教师特征分布的浅层机器学习分类器和深层生成模型进行了比较。我们还将其与最近提出的基于深度学习的无监督异常分割方法进行了比较。
在这里插入图片描述
图1:MVTec异常检测数据集上我们的异常检测方法的定性结果。顶行:输入包含缺陷的图像。中间行:红色缺陷的地面真值区域。底行:我们的算法预测的每个图像像素的异常分数。
在这里插入图片描述
图2:我们方法的示意性概述。输入图像通过教师网络输入,教师网络密集地提取局部图像区域的特征。一个由M个学生网络组成的集合被训练来回归在无异常数据上老师的输出。在推理过程中,学生将在包含异常区域的感受野的像素中产生增加的回归误差e和预测不确定性v。利用不同感受野生成的异常图可以进行多尺度的异常分割。
2相关工作
关于异常检测有大量的文献[27]。基于深度学习的异常分割方法主要集中在生成模型上,如自动编码器[1,8]或GANs[32]。这些尝试从零开始学习表示,利用没有关于自然图像性质的先验知识,并通过将输入图像与像素空间中的重建进行比较来分割异常。这可能会由于简单的每像素比较或不完美的重建而导致较差的异常检测性能[8]。
2.1. 基于预训练网络的异常检测
通过将浅层机器学习模型与无异常训练数据的特征相匹配,将预训练网络的判别性嵌入向量转移到异常检测任务中,取得了很好的效果。Andrews等人[3]使用预训练VGG网络不同层的激活,并用νSVM对无异常训练分布进行建模。然而,这些方法仅适用于图像分类,没有考虑异常区域的分割。Burlina等人也进行了类似的实验。与从生成模型中获得的特征空间相比,它们报告了优异的鉴别嵌入性能。
Nazare等人[24]研究了不同现成的特征提取器在图像分类任务中的性能,以分割监控视频中的异常。他们的方法是在从大量无异常训练块中提取的嵌入向量上训练一个1-近邻(1-NN)分类器。在训练浅层分类器之前,利用主成分分析(PCA)降低网络激活的维数。为了在推理过程中获得空间异常图,分类器必须对大量的重叠块进行评估,这很快成为性能瓶颈,导致异常图相当粗糙。类似地,Napoletano等人[23]从预训练的ResNet-18中提取大量裁剪训练斑块的激活,并在使用PCA进行先验降维后,使用K-均值聚类对其分布进行建模。在推理过程中,他们还会对测试图像进行快速评估。这两种方法都从输入图像中提取训练补丁,因此没有利用所有可能的训练特征。这是必要的,因为在他们的框架中,由于使用非常深的网络,每个面片只输出一个描述符,所以特征提取在计算上是昂贵的。此外,由于采用浅层模型来学习无异常斑块的特征分布,因此必须大大减少可用的训练信息。
为了避免裁剪补丁的需要并加速特征提取,Sabokrou等人[30]以完全卷积的方式从预训练AlexNet的早期特征图中提取描述符,并将单峰高斯分布拟合到所有可用的无异常图像的训练向量。即使特征提取在他们的框架中更有效地实现,池层也会导致输入图像的下采样。这大大降低了最终异常图的分辨率,特别是当使用具有较大感受野的较深网络层的描述特征时。此外,随着问题复杂度的提高,单峰高斯分布无法对训练特征分布进行建模。
2.2. 具有不确定性估计的开集识别
我们的工作从最近在有监督的环境中成功地进行开放集识别(如图像分类或语义分割)中获得了一些启示,其中利用了深度神经网络的不确定性估计,利用MC Dropout[14]或deep ensembles[19]检测出分布外输入。Seebeck等人[33]证明,MC Dropout训练的分割网络的不确定性可以用来检测视网膜OCT图像中的异常。Beluch等人[6]表明,在图像分类任务上训练的网络组合的方差是主动学习的有效获取函数。将当前模型中出现异常的输入添加到训练集中,以快速提高其性能。
然而,这样的算法要求领域专家为监督任务预先标记图像,这并不总是可行或可取的。在我们的工作中,我们利用预训练网络的特征向量作为代理标签来训练学生网络的集合。然后利用预测方差和集合输出混合分布的回归误差作为评分函数,对测试图像中的异常区域进行分割。
3.师生异常检测
本节描述了我们提出的方法的核心原则。给定一个训练数据集D={I1, I2, …, IN}对于无异常图像,我们的目标是创建一个学生网络Si的集成,该集成可以在测试图像J中检测异常。这意味着他们可以为每个像素分配一个分数,指示它偏离训练数据歧管的程度。为此,学生模型根据回归目标进行训练,回归目标是在一个大的自然图像数据集上预先训练的描述性教师网络获得的。训练结束后,根据学生的回归误差和预测方差,得到每个图像像素的异常分数。给定输入图像I∈Rw×h×C,宽w,高h,通道数C,集合中每个学生Si输出一个特征图Si(I)∈Rw×h×d,其中r行和C列的每个输入图像像素包含维数d的描述符y(r,C)∈Rd。通过设计,我们限制学生的感受野,使y(r,c)描述了一个正方形的局部图像区域p(r,c), I的中心在(r,c),边长p。教师T具有与学生网络相同的网络结构。但是,它保持不变,并对输入图像I的每个像素提取描述性嵌入向量,作为学生训练时的确定性回归目标。
3.1. 学习局部补丁描述符
本文首先介绍了如何利用度量学习和知识蒸馏技术有效构建描述性教师网络T。在现有的使用预训练网络进行异常检测的工作中,特征提取器只输出单个特征向量,用于补丁大小的输入或大量空间下采样的特征映射[23,30]。相反,我们的教师网络T有效地输出了输入图像中每一个可能的边长p平方的描述符。T首先通过训练网络Tˆ,将patch大小的图像p∈R p×p×C嵌入到维数d的度量空间中,只使用卷积和最大池化层。然后,可以通过确定的Tˆ到T的网络变换,实现整个输入图像的快速密集局部特征提取,如[4]所述。与以前引入的方法相比,这将产生显著的加速,这些方法执行基于补丁的跨步评估。为了使Tˆ输出语义强描述符,我们研究了自监督度量学习技术以及从描述性但计算效率低下的预处理网络中提取知识。从任意图像数据库中随机获得大量的训练patch p。这里,我们使用ImageNet[18]。
当使用浅层机器学习模型对其分布进行建模时,从接受图像分类任务训练的CNN深层获得的知识提取patch描述符在异常检测方面表现良好[23,24]。然而,这种cnn的体系结构通常非常复杂,并且对于局部补丁描述符的提取计算效率很低。因此,我们将一个强大的预训练网络P的知识提取到Tˆ,将P的输出与Tˆ获得的描述符的解码版本进行匹配:
在这里插入图片描述
D表示一个完全连通的网络,它将Tˆ的D维输出解码为预训练网络描述符的输出维。
度量学习如果由于某种原因预训练的网络不可用,人们还可以以完全自我监督的方式学习局部图像描述符[12]。在这里,我们研究了使用三重态学习获得的区别嵌入的性能。对于每个随机裁剪的patch p,一个三重patch(p,p+,p-)被增强。正patch p+是通过围绕p的小的随机平移、图像亮度的变化和高斯噪声的加入获得的。负patch p−是从随机选择的不同图像中随机裁剪而成的。在三重态中,使用锚交换的硬负挖掘[37]被用作一个损失函数,用于学习对ℓ2度量敏感的嵌入
在这里插入图片描述
其中δ>0表示余量参数,三重态距离δ+和δ−定义为:
在这里插入图片描述
描述符紧密度正如Vassileios等人[35]所提出的,我们在一小批输入p中最小化描述符之间的相关性,以增加描述符的紧致性并消除不必要的冗余:
在这里插入图片描述
其中cij表示在当前小批量中的所有描述符Tˆ(p)上计算的相关矩阵的条目。
Tˆ的最终训练损失如下所示:
在这里插入图片描述
其中λk、λm、λc≥0是单个损失项的加权因子。图3总结了教师辨别嵌入的整个学习过程。
在这里插入图片描述
图3:对教师网络Tˆ进行预训练,为patch大小的输入输出描述性嵌入向量。通过解码潜在向量来匹配P的描述符,我们将功能强大但计算效率低下的网络P的知识提炼为Tˆ。我们还对使用基于三重组学习的自监督度量学习技术获得的嵌入进行了实验。每个特征维内的信息通过对小批内的特征维进行去关联来最大化。
3.2. 学生网络集成在深异常检测中的应用
接下来,我们描述了如何训练学生网络,以便在无异常的训练数据上预测教师的输出。然后,我们根据学生在推理过程中的预测不确定性和回归误差得出异常分数。首先,计算所有训练描述子的分量均值µ∈Rd和标准差σ∈Rd的向量进行数据归一化。对数据集D中的每幅图像应用T提取描述符,然后训练M≥1个随机初始化的学生网络Si,i∈{1。,M}具有与教师T相同的网络结构。对于输入图像I,每个学生在每个局部图像区域p(r,c) 以r行和c列为中心。请注意,学生的体系结构具有大小为p的有限感受野,允许我们仅通过一次向前传递就可以获得每个图像像素的密集预测,而不必实际裁剪patch p(r,c)。学生的输出向量被建模为高斯分布pr(y|P(r,c))=N(y|µSi(r,c), s),协方差s∈r不变,其中µSi(r, c)表示Si对(r, c)处像素的预测。让yT(r, c)表示教师各自的描述符,由学生预测。然后,每个学生网络的对数似然训练准则L(Si)简化为特征空间中的平方ℓ2距离:
在这里插入图片描述
其中diag(σ)−1表示填充σ值的对角矩阵的逆矩阵。
异常检测的评分函数训练每个学生收敛,通过对集合的预测分布进行平均加权,可以在每个图像像素处获得高斯混合。由此,可以通过两种方式获得异常度量:首先,我们建议计算混合物的平均µ~(r, c)相对于教师的替代标签的回归误差:
在这里插入图片描述
这一分数背后的直觉是,学生网络在推理过程中无法在异常区域内回归教师的输出,因为在训练过程中没有观察到相应的描述符。注意,即使M=1,e~(r, c)~也不是常数,其中仅训练一个学生,并且仅通过学生和教师网络的一次向前传递即可有效地获得异常分数。
作为异常的第二个度量,我们为每个像素计算Kendall等人[14]定义的高斯混合的预测不确定性,假设学生网络对无异常区域的概括类似,对包含训练期间未看到的新信息的区域的概括不同:
在这里插入图片描述
为了合并这两个分数,我们分别计算了无异常图像验证集上所有e~(r, c)和v(r, c)~的平均值eµ,vµ和标准偏差eσ,vσ。然后,归一化分数相加得出最终异常分数:
在这里插入图片描述
图4说明了MNIST数据集上异常检测方法的基本原理,其中标签为0的图像被视为正常类,所有其他类被视为异常类。由于这个数据集的图像非常小,我们使用Tˆ为每个图像提取一个单一的特征向量,并训练一组M=5个补丁大小的学生对教师的输出进行回归。这将为每个输入图像生成一个异常分数。特征描述符嵌入到二维使用多维缩放[9],以保持其相对距离。
在这里插入图片描述
图4:MNIST数据集十个样本的可视化嵌入向量。围绕学生平均预测的较大圆圈表明预测方差增加。由于只对一个训练图像类进行了训练,因此学生能够准确地回归该类的特征(绿色)。它们产生了较大的回归误差和其他类别(红色)图像的预测不确定性。整个数据集的异常分数显示在底部直方图中。
3.3. 多尺度异常分割
如果一个异常只覆盖了p大小的教师感受野的一小部分,则提取的特征向量主要描述了局部图像区域的无异常特征。因此,学生可以很好地预测描述符,异常检测性能会下降。可以通过对输入图像进行降采样来解决这个问题。然而,这将导致输出异常图分辨率的不希望的损失。
我们的框架允许对学生和教师的接受场p的大小进行显式控制,因此,我们可以通过训练多个学生-教师组合对,在不同的尺度上检测出不同尺度的异常。在每个尺度上,计算出与输入图像大小相同的异常图。给定L个学生-具有不同接收域的教师集合对,每个L刻度的归一化异常分数e~ (l)~(r, c)和v (l)~(r, c)~可通过简单平均来组合:
在这里插入图片描述
4实验
为了证明我们的方法的有效性,对一些数据集进行了广泛的评估。我们测量了我们的学生-教师框架相对于现有管道的性能,这些管道使用浅层机器学习算法来模拟预训练网络的特征分布。为此,我们比较了一个K-均值分类器,一类支持向量机(OC-SVM)和一个1-NN分类器。利用主成分分析(PCA)进行先验降维后,拟合到教师描述符的分布。我们还实验了确定性和变分自动编码器作为教师区分嵌入的深度分布模型。分别用l2重建误差[13]和重建概率[2]作为异常评分。我们进一步将我们的方法与最近引入的基于生成和区分的深度学习的异常检测模型进行了比较,并报告了比现有技术更好的性能。我们想强调的是,教师在训练前没有观察到评估数据集的图像,以避免不公平的偏见。
作为第一个实验,我们进行了烧蚀研究,以找到合适的超参数。我们的算法应用于MNIST[20]和CIFAR-10[17]数据集上的一类分类设置。然后,我们对更具挑战性的MVTec异常检测(MVTec-AD)数据集进行了评估,该数据集是专门为异常区域分割的基准算法而设计的。它提供了5000多个高分辨率图像,分为10个对象和5个纹理类别。为了突出我们的多尺度方法的优点,我们在MVTec-AD上进行了一项额外的消融研究,研究了不同感受野对异常检测性能的影响。
在我们的实验中,我们对学生和教师网络使用相同的网络结构,感受野大小为p∈{17,33,65}。所有结构都是简单的cnn,只有卷积层和最大池层,使用斜率为5×10−3的泄漏校正线性单元作为激活函数。表4显示了用于p=65的特定体系结构。对于p=17和p=33,我们的补充材料中给出了类似的结构。
对于教师网络Tˆ的预训练,使用了从ImageNet数据集扩充的三元组。从{4p,4p+1, …,16p}采样的图像被放大到等宽和等高,并在随机位置裁剪边长为p的小块。然后在间隔{-(p−1)/4, …, (p−1)/4}内随机平移作物位置,为每个三元组构建一个正patch p+。将标准偏差为0.1的高斯噪声添加到p+。三元组中的所有图像都随机转换为灰度,概率为0.1。对于知识提取,我们从一个ResNet-18的全连通层中提取512维特征向量,这个ResNet-18在ImageNet数据集上进行了分类预训练。对于网络优化,我们使用Adam优化器[15],初始学习率为2×10−4,权重衰减为10−5,批大小为64。每个教师网络输出d=128维的描述符,训练5×104次迭代。
4.1. MNIST和CIFAR-10
在考虑异常分割问题之前,我们在MNIST和CIFAR10数据集上评估了我们的方法,适用于一类分类。五个学生只在数据集的一个类上训练,而在推理过程中,其他类的图像必须被检测为异常。每个图像被缩放到学生和教师的输入大小p,通过patch大小的网络Tˆ和Sˆi提取单个特征向量。我们通过改变教师损失函数L(Tˆ)中的权重λk、λm和λc来检查不同的教师网络。本小节中实验的补丁大小设置为p=33。作为异常检测性能的一个度量,ROC曲线下的面积被评估。浅分布和深分布模型都是根据教师对所有分布样本的描述来训练的。我们还报告了OCGAN[25]的数字,这是最近提出的直接在输入图像上训练的生成模型。有关此数据集上所有方法的训练参数的详细信息,请参阅我们的补充资料。
表2显示了我们的结果。对于各种超参数设置,我们的方法优于其他方法。将预先训练好的ResNet-18的知识提取到教师的描述词中,比使用三重学习的完全自我监督的方式训练教师的效果要好一些。通过最小化相关矩阵来减少描述符冗余可以得到更好的结果。平均而言,浅层模型和自动编码器适合我们的教师的特征分布优于OCGAN,但没有达到我们的方法的性能。因为对于1-NN,每个训练向量都可以存储,所以它在这些小数据集上表现得非常好。然而,平均而言,我们的方法仍然优于所有评估的方法。
在这里插入图片描述
表2:MNIST和CIFAR-10的结果。对于每种方法,ROC曲线下的平均面积都是给定的,并在每个数据集类别中进行计算。对于我们的算法,我们评估教师网络训练不同的损失函数。✓对应于将相应的失重设置为1,否则设置为0。
4.2. MVTec异常检测数据集
对于我们在MVTec AD上的所有实验,输入图像被缩放到w=h=256像素。我们对100个时期的无异常图像进行训练,批量大小为1。由于网络接收域的大小有限,这相当于在每批中训练大量的补丁。我们使用Adam,初始学习率为10-4,权重衰减为10-5。教师网络以λk=λc=1和λm=0进行训练,因为这种配置在MNIST和CIFAR-10上表现最好。集合包含M=3个学生。
为了在教师的输出描述符上训练浅层分类器,从教师的特征图中随机抽取向量子集。然后用主成分分析法对其进行降维,保留95%的方差。可变的和确定性的自动编码器是使用一个简单的完全连接的体系结构来实现的,并且在所有可用的描述符上进行训练。除了将模型直接拟合到教师的特征分布之外,我们还将我们的方法与Bergmann等人[7]在此数据集上提出的基于深度学习的最佳表现方法进行了对比。这些方法包括CNN特征字典[23]、SSIM自动编码器[8]和AnoGAN[32]。我们的补充资料中详细列出了所有超参数。
我们计算了一个基于每个区域重叠(PRO)的与阈值无关的评价指标,该指标对不同大小的地面真值区域进行平均加权。这与简单的每像素度量(如ROC)形成对比,对于ROC,正确分割的单个大区域可以弥补许多错误分割的小区域。Bergmann等人在[7]中也使用了它。为了计算PRO-metric,首先对异常分数进行阈值化,以对每个像素进行二值化决策,判断是否存在异常。对于地面真值内的每个连通分量,计算与阈值异常区域的相对重叠。我们评估大量增加阈值的PRO值,直到整个数据集的平均每像素假阳性率达到30%,并使用PRO曲线下的面积作为异常检测性能的度量。请注意,对于高假阳性率,输入图像的大部分将被错误地标记为异常,甚至完美的PRO值也不再有意义。我们将积分面积标准化为最大可实现值1。
表1显示了我们用p=65的感受野训练每种算法的结果,以便于比较。对于几乎所有的数据集类别,我们的方法始终优于所有其他评估算法。在应用PCA后,直接适合于教师描述词的浅层机器学习算法在大多数数据集类别中都不能令人满意地执行。这表明它们的能力不足以精确地模拟大量可用的训练样本。CNN特征词典也是如此。与我们先前在MNIST和CIFAR-10上的实验一样,1-NN在浅层模型中产生了最好的结果。利用大量的训练特征和确定性的自动编码器可以提高性能,但仍然不符合我们方法的性能。目前用于异常分割的生成方法,如anogan和SSIM自动编码器,其性能类似于适合于教师区分性嵌入的浅层方法。这表明,从零开始学习异常检测表示的方法和利用区分性嵌入作为先验知识的方法之间确实存在差距。
在这里插入图片描述
表1:MVTec异常检测数据集的结果。对于每个数据集类别,给出PRO曲线下的标准化区域,每个像素的平均假阳性率为30%。它测量每个地面真值区域与多个阈值的预测异常区域的平均重叠。每个数据集类别的最佳执行方法以黑体字突出显示。

表3显示了我们的算法在不同感受野大小p∈{17,33,65}和组合多尺度时的性能。对于一些物体,如瓶子和电缆,较大的感受野产生更好的结果。对于其他的,如木头和牙刷,可以观察到相反的行为。组合多个尺度可以提高许多数据集类别的性能。图5显示了一个定性的例子,突出了我们的多尺度异常分割的好处。
在这里插入图片描述
表3:MVTec AD数据集上不同感受野大小的算法性能p.将多个感受野的异常得分结合起来,显示数据集的许多类别的性能都有所提高。我们报告PRO曲线下的标准化区域,平均假阳性率为30%。
在这里插入图片描述
图5:多尺度下的异常检测:具有大小为p=17的感受野的结构设法准确地分割囊(顶行)上的小划痕。然而,在更大范围内的缺陷,如缺少印记(底行)成为问题。随着感受野的增大,较大异常的分割性能提高,而较小异常的分割性能降低。我们的多尺度架构通过结合多个感受野来缓解这个问题。
5结论
针对自然图像中的无监督异常分割问题,提出了一种新的框架。异常分数来自学生网络集合的预测方差和回归误差,根据描述性教师网络的嵌入向量进行训练。集成训练可以执行端到端和纯粹的异常无训练数据,而不需要事先的数据注释。我们的方法可以很容易地扩展到多尺度的异常检测。我们在许多真实世界的计算机视觉数据集上展示了对当前最先进的方法的改进,用于一类分类和异常分割。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值