stable diffusion工作原理

8 篇文章 1 订阅
6 篇文章 0 订阅

序言

只是为了记录;英文原文,反反复复看了很多遍,特此记录下。这个原理将有助于在未来AI绘画领域的深耕。

stable diffusion能做什么

简单来说,就是能根据你输入的一段文字,来生成根这段文字匹配的一张图片。(文生图)

在这里插入图片描述

如上面这张图,左边是一段文字,通过stable diffusion就可以生成右边的图片。

扩散模型

我们今天讲的stable diffusion属于一类称为扩散模型的深度学习模型。它们是生成模型。这意味着它们旨在生成与训练中看到的类似的新数据。在stable diffusion的情况下,数据是图像。

为什么叫扩散模型呢?因为它的数学公式看起来非常类似于物理学中的扩散现象。让我们来探讨这个概念。

  • 这里的数学公式看起来 是指扩展模型在数学描述上和物理学中扩散现象的数学描述有类似之处。在物理学中,扩散是指物质由高浓度区域向低浓度区域的自然运动过程,这一过程通常可以用偏微分方程,比如扩散方程,来描述。
  • 在深度学习中的扩散模型(如生成模型),模型的训练过程涉及到数据分布的变化,从而生成新的数据点。这个生成过程在某些方面可以被视为“扩散”。
  • 扩散模型在训练过程中添加噪声,使得数据分布逐渐趋向简单分布(比如高斯分布),这部分是类似于物理扩散。(添加噪声的过程,就是类似物理学中的扩散过程,数学上也会用到扩散方程)。但在生成新样本时,模型进行的是一个去噪过程,逐步从简单的噪声分布恢复出复杂的数据分布,与物理扩散过程相反,这是一种有控制的、目标导向的“扩散”(逆向扩散)。

正向扩散

正向图片

正向扩散将照片变成噪声。 (图由 本文修改)

正向扩散过程会向训练图像添加噪声,逐渐将其变成一个没有特征的噪声图像。这个正向过程会将任何猫或狗的图像变成一个噪声图像。最终,你将无法辨别它们最初是狗还是猫。(这一点很重要)

这就像一滴墨水掉进了一杯水中。墨水滴在水中扩散。几分钟后,它会随机地分散到整个水中。你再也无法分辨它最初是掉在中心还是靠近边缘。

以下是一张图像经历正向扩散的例子。猫的图像变成了随机噪声。

在这里插入图片描述

猫图像的前向扩散。

逆向扩散

现在是激动人心的部分。如果我们能够逆转扩散过程会怎样呢?就像倒放一段视频一样。向时间的逆流而动。我们将能够看到墨水滴最初是在哪里加入的。

在这里插入图片描述

从嘈杂、无意义的图像开始,逆向扩散恢复猫或狗的图像。这是主要思想。

从技术上讲,每个扩散过程都有两个部分:(1)漂移(drift)和(2)随机运动(random motion)。逆向扩散会向猫或狗的图像漂移,但不会是介于两者之间的状态。这就是为什么结果要么是猫要么是狗的原因。

如何训练

逆向扩散的理念无疑是巧妙和优雅的。但是价值百万美元的问题是,“这怎么能做到呢?”

为了逆向扩散过程,我们需要知道有多少噪声被添加到图像中。答案是训练一个神经网络模型来预测被添加的噪声。在稳定扩散(Stable Diffusion)中,这被称为噪声预测器。它是一个U-Net模型。训练过程如下:

  1. 选择一张训练图像,比如一张猫的照片。
  2. 生成一张随机噪声图像。
  3. 将这张噪声图像通过一定数量的步数添加到训练图像中,已达到破坏训练图像的效果。
  4. 教导噪声预测器告诉我们添加了多少噪声。这是通过调整它的权重并向它展示正确答案来完成的。

在这里插入图片描述

在每个步骤中依次添加噪声。噪声预测器估计每一步添加的总噪声。

训练完毕后,我们拥有了一个能够估计图像中添加噪声量的噪声预测器。

逆向扩散

现在我们有了噪声预测器。如何使用它呢?

首先,我们生成一张完全随机的图像,并要求噪声预测器告诉我们噪声的信息。接着,我们从原始图像中减去这个估计出来的噪声。重复这个过程几次。你将会得到一张猫或狗的图像。

在这里插入图片描述

                                   逆向扩散的工作原理是从图像中连续减去预测出的噪声。

你可能会注意到我们无法控制生成猫或狗的图像。当我们讨论条件化(conditioning)时,我们会解决这个问题。目前,图像生成是无条件的。

您可以在本文中阅读有关反向扩散采样和采样器的更多信息。

Stable Diffusion模型

现在我需要告诉你一些坏消息:我们刚才谈论的并不是稳定扩散(Stable Diffusion)的工作原理!原因在于上述的扩散过程是在图像空间(image space)中进行的。这种方法在计算上非常非常慢。你不可能在任何单个的GPU上运行它,更不用说你笔记本上的糟糕GPU了。

图像空间是巨大的。想象一下:一个有三个颜色通道(红色、绿色和蓝色)的512×512图像就是一个786,432维的空间!(你需要为一张图像指定这么多的值。)

像谷歌的Imagen和OpenAI的DALL-E这样的扩散模型是在像素空间中运作的。它们使用了一些技巧来加快模型的速度,但仍然不够快。

潜在扩散模型

稳定扩散旨在解决速度问题。以下是解决方法。

**稳定扩散是一种潜在扩散模型。**它不是在高维的图像空间中操作,而是首先将图像压缩到潜在空间中。潜在空间的维度比原来小了48倍,因此它获得了处理更少数字的好处。这就是为什么它运行得更快的原因。

变分自动编码器

这是通过一种叫做变分自动编码器的技术完成的。没错,它正是 VAE 文件,但我稍后会讲得更清楚。

变分自动编码器(VAE)神经网络有两个部分:(1)编码器和(2)解码器。编码器将图像压缩到潜在空间中,变成低维的形式。解码器从潜在空间恢复图像。

在这里插入图片描述

                                 变分自编码器将图像转换到潜在空间,并从潜在空间转换回来。

稳定扩散模型的潜在空间是 4x64x64,比图像像素空间小48倍。我们谈论的所有正向和逆向扩散实际上都是在潜在空间中进行的。

所以在训练过程中,模型不是生成一个带噪声的图像,而是在潜在空间生成一个随机张量(潜在噪声)。模型不是通过给图像添加噪声来破坏图像,而是通过在潜在空间用潜在噪声破坏图像的表示。这样做的原因是因为潜在空间更小,所以速度会快很多。

图像分辨率

图像分辨率体现在潜在图像张量的大小上。仅对于 512×512 图像,潜在图像的大小是 4x64x64。对于 768×512 的肖像图像,它是 4x96x64。这就是为什么生成较大图像需要更长的时间和更多的显存。

由于 Stable Diffusion v1 在 512×512 图像上进行了微调,生成大于 512×512 的图像可能会导致重复的对象,例如,臭名昭著的两个头

图像放大

为了生成一张大幅打印,至少保持图像的一边是512像素。使用 AI 放大器或图像到图像功能进行图像放大。

或者,使用 SDXL 模型。它有更大的默认尺寸:为 1,024 x 1,024 像素。

为什么潜在空间可能存在?

你可能会好奇为什么变分自编码器(VAE)能够将图像压缩到一个小得多的潜在空间中而不丢失信息。原因并不令人意外,那就是自然图像并非随机的。它们具有很高的规律性:一张脸遵循着眼睛、鼻子、脸颊和嘴巴之间特定的空间关系。一只狗有4条腿,并且是特定的形状。

换句话说,图像的高维度是人为的。自然图像可以轻易地被压缩到小得多的潜在空间中而不丢失任何信息。这在机器学习中被称为流形假设

  • 流形假设(Manifold Hypothesis)是机器学习和模式识别中的一个概念,它指出尽管数据(如图像、文本、声音等)可能存在于高维空间中,但实际上它们通常会聚集在低维的流形(Manifold)上。在这个假设下,数据点不是均匀分散在整个高维空间中,而是集中在某些低维结构(即流形)周围,这些结构反映了内在的规律性或数据的本质特征。

    流形是一个数学概念,指的是在局部具有欧几里得空间性质的一个空间。例如,地球表面是一个三维空间中的二维流形,因为地球表面上的任何局部区域都可以用二维平面来近似,尽管整个地球是三维的。

在潜在空间中的逆向扩散

以下是稳定扩散中潜在反向扩散的工作原理:

  1. 生成一个随机潜在空间矩阵。
  2. 噪声预测器估计潜在矩阵的噪声。
  3. 然后从潜在矩阵中减去估计的噪声。
  4. 重复步骤 2 和 3 直至达到特定的采样步骤。
  5. 变分自编码器(VAE)的解码器将潜在矩阵转换为最终图像。

什么是 VAE 文件?

VAE文件在Stable Diffusion v1中被用来改善眼睛和面部。它们是我们刚刚讨论的自编码器的解码器。通过进一步微调解码器,模型能够绘制更精细的细节。

您可能意识到我之前提到的并不完全正确。将图像压缩到潜在空间确实会丢失信息,因为原始的VAE无法恢复细微的细节。相反,VAE解码器负责绘制精细的细节。

条件化(conditioning)

我们的理解还不完整:文本提示在何处发挥作用?没有它,Stable Diffusion就不是一个文本到图像的模型。你将会得到一张猫或狗的图片,但没有任何办法来控制它。

这就是条件化发挥作用的地方。条件化的目的是引导噪声预测器,使得预测出的噪声在从图像中减去后能够得到我们想要的结果。

文本条件化(文本到图像)

下面是文本提示如何被处理并输入到噪声预测器的概述。首先,分词器将提示中的每个词转换为一个称为令牌的数字。然后,每个令牌都会转换为 768 个值的向量,这个过程称为嵌入。(是的,这就是你在AUTOMATIC1111中使用的那个嵌入)这些嵌入随后被文本变换器处理,并准备好被噪声预测器使用。

  • 嵌入是能够捕捉词汇语义和上下文信息的连续向量表示。

在这里插入图片描述

                                  如何处理文本提示并将其输入噪声预测器以指导图像生成。

现在让我们更仔细地看看每个部分。如果上述高级概述对您来说已经足够了,您可以跳到下一部分。

使用这个链接检查任何提示的令牌和嵌入。

分词器

  • 在许多现代NLP模型中,如BERT、GPT或Stable Diffusion中使用的文本编码器,分词器首先将输入文本分解成单词或子词单元,然后将这些单词或子词映射到唯一的数字ID,这些数字ID被称为令牌(token)。接着,这些令牌被转换成嵌入(embeddings),嵌入是能够捕捉词汇语义和上下文信息的连续向量表示。(自己搜索的大模型给的解释)

在这里插入图片描述

                                                   分词器

文本提示首先由CLIP分词器进行分词处理。CLIP是OpenAI开发的一个深度学习模型,用于生成任何图像的文本描述。Stable Diffusion v1使用了CLIP的分词器。

分词是计算机理解单词的方式。我们人类可以阅读单词,但计算机只能阅读数字。这就是为什么在文本提示中的单词首先被转换成数字。

分词器只能分词它在训练期间见过的单词。例如,在CLIP模型中有“dream”和“beach”,但没有“dreambeach”。分词器会将“dreambeach”这个词分解成两个令牌:“dream”和“beach”。所以一个词并不总是对应一个令牌!

另一个需要注意的细节是空格字符也是令牌的一部分。在上述情况中,“dream beach”这个短语产生两个令牌“dream”和“[space]beach”。这些令牌与“dreambeach”生成的令牌不同,后者是“dream”和“beach”(beach之前没有空格)。

Stable Diffusion模型在一个提示中的使用限制为75个令牌。(现在你知道了,这并不等同于75个单词!)

嵌入

在这里插入图片描述

                                                       嵌入

Stable Diffusion v1使用的是OpenAI的ViT-L/14 CLIP模型。嵌入是一个有768个值的向量。每个令牌都有自己独特的嵌入向量。嵌入是由CLIP模型固定的,这是在训练过程中学习到的。

**为什么我们需要嵌入?**这是因为有些单词彼此之间关系密切。我们希望利用这些信息。例如,“man”(男人)、 “gentleman”(绅士)和“guy”(家伙)的嵌入几乎是相同的,因为它们可以互换使用。莫奈(Monet)、马奈(Manet)和德加(Degas)都是以印象派风格绘画,但各有不同。这些名字的嵌入向量是接近的,但不完全相同。

这就是我们讨论过的,用关键词触发特定风格的嵌入。嵌入可以发挥魔法。科学家们已经表明,找到合适的嵌入可以触发任意对象和风格,这种微调技术被称为文本反转

将嵌入向量输入噪声预测器

在这里插入图片描述

                                             从嵌入向量到噪声预测器。

嵌入向量在输入噪声预测器之前需要通过文本转换器进行进一步处理。转换器就像一个通用的条件适配器。在这种情况下,它的输入是文本嵌入向量,但同样也可以是其他东西,比如类标签、图像和深度图。转换器不仅进一步处理数据,还提供了一种包含不同条件模态的机制。

交叉注意力 (Cross-attention)

文本转换器的输出在整个U-Net结构的噪声预测器中被多次使用。U-Net通过交叉注意力机制来消费这些输出。这就是提示与图像的结合处。

以“一个有蓝眼睛的男人”(A man with blue eyes)为例。Stable Diffusion将“蓝色”(blue)和“眼睛”(eyes)这两个词结对在一起(提示内部的自注意力),以便生成一个有蓝眼睛的男人,而不是一个穿蓝色衬衫的男人。然后它使用这些信息来指导逆向扩散过程,朝着包含蓝眼睛的图像生成。(提示与图像之间的交叉注意力)

附注:超网络(Hypernetwork)是一种用于微调Stable Diffusion模型的技术,它劫持了交叉注意力网络来插入风格。LoRA模型修改了交叉注意力模块的权重来改变风格。仅仅修改这个模块就能微调一个Stable Diffusion模型的事实告诉我们这个模块有多重要。

其他条件化

文本提示并不是Stable Diffusion模型唯一的条件化方式。

文本提示和深度图像都被用来对深度到图像模型进行条件化。

ControlNet通过检测到的轮廓、人体姿势等对噪声预测器进行条件控制,并在图像生成过程中实现了出色的控制。

逐步理解Stable Diffusion

现在你已经了解了Stable Diffusion的所有内部机制,让我们通过一些例子来看看在幕后发生了什么。

文本到图像

在文本到图像中,你给Stable Diffusion一个文本提示,它会返回一张图片。

步骤1. Stable Diffusion在潜在空间生成一个随机张量。你可以通过设置随机数生成器的种子来控制这个张量。如果你将种子设置为某个特定值,你将总是得到相同的随机张量。这就是你在潜在空间中的图像。但现在它全部是噪声。

在这里插入图片描述

                                            在潜在空间中生成了一个随机张量。

步骤2. 噪声预测器U-Net将潜在噪声图像和文本提示作为输入,并在潜在空间中预测噪声(一个4x64x64的张量)。

在这里插入图片描述

步骤3. 从潜在图像中减去潜在噪声。这将成为你的新潜在图像。

在这里插入图片描述

步骤2步骤3会重复执行特定数量的采样步骤,例如,重复20次。

步骤4. 最终,变分自编码器(VAE)的解码器将潜在图像转换回像素空间。这是在运行Stable Diffusion之后得到的图像。

在这里插入图片描述

以下是图像在每个采样步骤中的演变方式。

https://stable-diffusion-art.com/wp-content/uploads/2022/12/cat_euler_15.gif

                                                         每个采样步骤中的图像。

噪音表

图片从嘈杂变得清晰。你是否想知道噪声预测器在最初的步骤中是否工作得不好?实际上,这只是部分正确的。真正的原因是我们试图在每个采样步骤中达到预期的噪声水平。这被称为噪声时间表。以下是一个例子。

在这里插入图片描述

                                                  15 个采样步骤的噪声表。

噪声时间表是我们自己定义的。我们可以选择在每个步骤中减去相同数量的噪声。或者我们可以像上面那样在开始时减去更多的噪声。采样器在每个步骤中减去恰到好处的噪声量,以达到下一步骤的预期噪声水平。这就是你在逐步图片中看到的。

图像到图像

图像到图像是通过稳定扩散(Stable Diffusion)将一张图片转换成另一张图片。这最初是在SDEdit方法中提出的。SDEdit可以应用于任何扩散模型。因此,我们有了针对稳定扩散(一个潜在扩散模型)的图像到图像转换。

在图像到图像转换中,输入包括一张输入图像和一段文本提示。生成的图像将同时受到输入图像和文本提示的条件限制。例如,使用这张业余绘画和文本提示“带茎、水滴、戏剧性光照的完美绿苹果照片”作为输入,图像到图像转换可以将其变成一张专业的绘画:

在这里插入图片描述

                                                   图像到图像

现在来看一下逐步过程。

步骤1. 将输入图像编码到潜在空间。

在这里插入图片描述

步骤2. 向潜在图像添加噪声。去噪强度控制添加了多少噪声。如果为0,则不添加噪声。如果为1,则添加最大量的噪声,使得潜在图像变成一个完全随机的张量。

在这里插入图片描述

步骤3. 噪声预测器 U-Net 将潜在噪声图像和文本提示作为输入,并预测潜在空间(4x64x64 张量)中的噪声。

在这里插入图片描述

步骤4. 从潜在图像中减去潜在噪声。这成为你的新潜在图像。

在这里插入图片描述

步骤3和步骤4会重复执行特定数量的采样步骤,例如,重复20次。

步骤5. 最后,VAE(变分自编码器)的解码器将潜在图像转换回像素空间。这就是在运行图像到图像转换后你获得的图像。

在这里插入图片描述

所以现在你知道什么是图像到图像转换了:它所做的就是用一点噪声和输入图像设置初始的潜在图像。将去噪强度设置为1相当于文本到图像转换,因为初始的潜在图像是完全随机的。

局部修复

局部修复实际上只是图像到图像的一种特殊情况。噪点会添加到你想要修复图像的局部区域。噪声的数量同样由去噪强度控制。

深度到图像

深度到图像是图像到图像转换的一种增强;它使用深度图进行额外条件控制来生成新图像。

步骤1. 输入图像被编码成潜在状态

在这里插入图片描述

步骤2. MiDaS(一个人工智能深度模型)从输入图像中估计深度图。

在这里插入图片描述

步骤3. 向潜在图像添加噪声。去噪强度控制添加了多少噪声。如果去噪强度为0,则不添加噪声。如果去噪强度为1,则添加最大噪声,以便潜在图像变成一个随机张量。

在这里插入图片描述

步骤4. 噪声预测器根据文本提示和深度图估计潜在空间的噪声。

在这里插入图片描述

步骤5. 从潜在图像中减去潜在噪声。这样就变成了新的潜在图像。

在这里插入图片描述

步骤4和步骤5将重复进行若干次,次数取决于抽样步骤的数量。

步骤6. 变分自编码器(VAE)的解码器对潜在图像进行解码。现在,您从深度到图像得到了最终图像。

在这里插入图片描述

CFG值是什么?

CFG值是“Classifier Free Guidance”(无分类器引导)的缩写,这是一个在生成模型,特别是在文本到图像的生成模型中使用的参数,用于控制模型生成结果时文本提示的影响强度。简单来说,CFG值越高,生成的图像越可能遵循文本提示的细节;CFG值越低,文本提示对生成结果的影响就越小。

如果不解释“无分类器引导”(Classifier-Free Guidance, CFG),这篇文章将不会完整,这是一个人工智能艺术家每天都在调整的值。要理解它是什么,我们首先需要简要了解它的前身——分类器引导……

分类器指导

分类器引导是一种在扩散模型中结合图像标签的方法。您可以使用一个标签来指导扩散过程。例如,标签“猫”会引导逆向扩散过程生成猫的照片。

分类器引导尺度是一个参数,用于控制扩散过程应该多么紧密地遵循标签。

以下是我从这篇论文中摘录的一个例子。假设有3组带有标签的图像:“猫”、“狗”和“人类”。如果扩散过程没有引导,模型将从每个组的总体中抽取样本,但有时它可能会绘制适合两个标签的图像,例如,一个抚摸狗的男孩。

在这里插入图片描述

                              分类器引导。左图:无引导。中图:小引导尺度。右图:大引导尺度。

在高分类器引导下,扩散模型生成的图像将倾向于极端或明确无误的例子。如果你让模型生成一只猫的图像,它将返回一张毫无疑问只是猫而没有其他元素的图像。

分类器引导尺度控制着引导的遵循程度。在上面的图中,右边样本的分类器引导尺度比中间的要高。实际上,这个尺度值就是具有该标签的数据漂移项的乘数。

无分类器指导

尽管分类器引导取得了破纪录的性能,但它需要一个额外的模型来提供这种引导。这在训练过程中带来了一些困难。

用作者的话来说,“无分类器引导”是一种“不使用分类器实现分类器引导”的方法。他们没有使用类别标签和一个单独的模型进行引导,而是使用图像标题并训练一个条件扩散模型,就像我们在文本到图像中讨论的模型一样。

他们将分类器部分作为噪声预测器U-Net的条件化处理,实现了图像生成中所谓的“无分类器”(即不使用单独的图像分类器)。

文本提示提供了文本到图像的指导。

##无分类器引导尺度

现在,我们有了一个使用条件化的无分类器扩散过程。我们如何控制AI生成的图像应该多大程度上遵循这个引导呢?

无分类器引导尺度(CFG比例)是一个控制文本提示指导扩散过程程度的值。当CFG比例设置为0时,AI图像生成是无条件的(即忽略提示)。较高的 CFG 比例会引导扩散朝向提示。

稳定扩散 v1.5 与 v2

这已经是一篇很长的文章了,但如果不比较 v1.5 和 v2 模型之间的差异,它就不完整。

模型差异

Stable Diffusion v2使用OpenClip进行文本嵌入。Stable Diffusion v1使用Open AI的CLIP ViT-L/14进行文本嵌入。这一变化的原因是:

  • OpenClip的模型尺寸大约是原来的五倍。更大的文本编码模型提高了图像质量。
  • 尽管 Open AI 的 CLIP 模型是开源的,但这些模型是使用专有数据进行训练的。切换到 OpenClip 模型使研究人员在研究和优化模型时更加透明。这样更有利于长远发展。

v2 模型有两个优点。

  • 512版本生成512×512图像

  • 768版本生成768×768图像

  • 还有训练数据上的差异,这里就不说了,随着时间的推移,这些东西也就过时了,没啥意义。

其他差异

用户通常发现使用Stable Diffusion v2来控制风格和生成名人形象更困难。尽管Stability AI并没有明确过滤掉艺术家和名人的名称,但在v2中,这些名称的效果要弱得多。这可能是由于训练数据的差异造成的。Open AI的专有数据可能包含更多的艺术作品和名人照片。他们的数据可能经过高度过滤,以便一切和每个人都看起来细致美观。

而且v2 和 v2.1 模型并不流行。人们只使用经过微调的 v1.5 和 SDXL 模型。

SDXL 模型

SDXL模型是对v1和v2模型的官方升级。该模型以开源软件的形式发布。

它是一个更大的模型。在人工智能领域,我们可以预期它会更好。SDXL模型的总参数数量是66亿,相比之下,v1.5模型的参数数量是9.8亿。

在这里插入图片描述

                                     SDXL管道由一个基础模型和一个精炼模型 组成。

在实践中,SDXL模型是两个模型。你先运行基础模型,然后是精炼模型。基础模型设定全局构图,而精炼模型添加更精细的细节。

你可以单独运行基础模型,而不需要精炼模型。

SDXL基础模型的变化包括:

  • 文本编码器结合了最大的OpenClip模型(ViT-G/14)和OpenAI的专有CLIP ViT-L。这是一个明智的选择,因为它使得SDXL易于提示,同时保持了强大且可训练的OpenClip特性。
  • 新的图像尺寸条件化旨在使用小于256×256像素的训练图像。通过不丢弃 39% 的图像,显著增加了训练数据。
  • U-Net的大小是v1.5的三倍。
  • 默认的图像尺寸是1024×1024。这是v1.5模型512×512尺寸的四倍。(参见与SDXL模型一起使用的图像尺寸

参考地址:

https://stable-diffusion-art.com/how-stable-diffusion-work

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

山鬼谣me

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

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

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

打赏作者

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

抵扣说明:

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

余额充值