Stable Diffusion 原理新手入门指南

什么是Stable Diffusion?

在这一波人工智能浪潮中,Stable Diffusion 作为与Transform架构下的GPT系列模型几乎齐名的双子星,可以说被很多人所熟悉,作为一个可以将文本描述作为输入生成逼真图片的开源模型。它被广泛用于各种创意领域比如建筑设计、平面设计、虚拟穿衣、视频转绘。游戏美术设计。这种创新技术利用先进的算法将简单的文本输入转换为复杂、高质量的视觉效果,使其成为艺术家、设计师和开发人员的游戏规则改变者。通过其复杂的流程,Stable Diffusion 简化了图像的创建,解放了用户对详细手动绘图的需求,让用户能够专注于创造力。该模型利用深度学习技术在大规模数据集进行预训练,了解文本描述和视觉元素之间的细微差别,生成捕捉特定细节和风格的图像。通过利用人工智能的力量,Stable Diffusion 为新的艺术可能性打开了大门,并以前所未有的方式培养创造力。

img

Stable Diffusion 3

Stable Diffusion 中的一些专业术语

  1. Diffusion Model: 扩散模型是从文本描述生成图像的基础算法。流行的 AI 艺术工具,如 DALL·E、Midjourney 和 Stable Diffusion 使用此基础算法。
  2. Latent Diffusion Model: 潜在扩散模型:扩散模型的高级版本,提供更快的图像生成以及更低的计算和显存要求。
  3. Stable Diffusion: 稳定扩散通常缩写为 SD,该模型建立在潜在扩散模型之上。它以开发它的公司 Stability AI 命名。
  4. Stable Diffusion Web UI (SD WebUI): 用于操作 Stable Diffusion 模型的用户友好型 Web 界面,无需学习代码即可使用该工具生成图像。

Stable Diffusion 稳定扩散原理

扩散模型的灵感来自非平衡热力学。他们定义了一个马尔可夫扩散步骤链,以缓慢地向数据添加随机噪声,然后学习反转扩散过程,从噪声中构建所需的数据样本。与VAE或Flow模型不同,扩散模型是通过固定程序学习的,隐变量具有高维性(与原始数据相同)

img

不同类型的生成模型

1. Latent Diffusion 潜扩散

Stable Diffusion 依赖于一种称为 Latent Diffusion 的方法,该方法将文本转换为视觉内容。首先,将文本提示词通过一个文本编码器编码为模型可以有效处理的格式。这个文本编码阶段至关重要,因为它将语言输入转换为向量。接下来,该模型将初始随机噪声引入图像,为文本提示引导的迭代优化奠定了基础。这种受控的噪声转换允许 AI 逐步塑造图像,使其与提供的文本描述保持一致。

img

img

从本质上讲,这就是一个去噪音过程,涉及三个任务:

  • 首先,训练UNet网络以可视化噪声中的图像;
  • 其次,使用注意力机制(Spatial Transformer)来引导文本的去噪过程;
  • 第三,将整个去噪过程从像素空间迁移到潜空间(通过VAE)。

因此,稳定扩散被归类为潜扩散模型(LDM)。

2. Text Encoding 文本编码

Stable Diffusion 过程的第一步是文本编码将文本输入转换为机器可读的数据形式。这种转换是 Stable Diffusion 如何从文本提示生成连贯图像的关键。神经网络可以分解输入文本并将其转换为编码的向量,从而促进文本编码。这些向量是模型构建最终视觉输出的基础。了解文本编码的效率有助于理解人工智能驱动的图像生成背后的复杂机制,弥合语言输入和视觉生成之间的差距。

img

Text Encoder

3. Noise Introduction 噪声介绍

高斯噪声引入是稳定扩散的关键阶段。此步骤相当于创建一个空白画布,AI 模型开始在其上绘制其视觉效果。最初,随机噪声被引入图像中,这个过程一开始似乎有悖常理。然而,这种随机性是必不可少的,因为它为模型提供了一个通用的起点来生成不同的图像。噪声是模型在文本提示的引导下迭代优化的基础。通过逐渐减少噪声,该算法可以将初始随机性塑造成与输入文本完美对齐的结构化图像。这种受控的混沌状态对于稳定扩散的后续阶段至关重要。它允许模型在磨练最适合上下文的视觉表示之前探索各种可能性。总体而言,噪声的引入为显着的转变奠定了基础,证明了其在此过程中的不可或缺性。

img

逐步添加噪音的过程

4. Iterative Refinement 迭代精制

迭代精制是 Stable Diffusion 过程的核心,将混乱的开始转化为引人入胜的最终结果。初始阶段:模型从先前添加的随机高斯噪声开始。指导:使用文本提示,模型以迭代方式细化噪声。中间步骤:每次迭代都使图像更接近定义的形式。最后润色:模型对图像进行润色,确保与文本描述保持一致。这种循序渐进的改进证明了该模型创建复杂视觉效果的能力。迭代确保准确描绘每个细节,从而提高生成图像的整体质量。

img

迭代生成的详细图解

构建 Stable Diffusion

构建 Stable Diffusion 是一项复杂的任务,这项工作利用神经网络 (NN) 和成对图像和文本的大型数据集来训练模型。这可以让模型能够掌握视觉元素和文本元素之间的复杂关系,成为模型能够依据输入文本描述中生成高质量图像的基础。同时构建 Stable Diffusion可以分为两步过程:一个是噪声扩散过程即前向扩散过程,另一个是去噪过程,即反向扩散过程。其工作原理是迭代地向输入信号(如图像、文本或音频)添加噪声,然后学习从噪声信号中降噪以生成新样本,接下来让我们详细了解一下这个两阶段过程。

img

两阶段的扩散过程

1.Forward diffusion process 前向(正向)扩散过程

前向扩散逐渐将高斯噪声添加到图像中,直到只剩下随机噪声。给定一个从真实数据分布 x0∼q(x) 中采样的数据点,让我们定义一个前向扩散过程,在这个过程中,我们分 步向样本中添加少量高斯噪声,产生一系列噪声样本 x1,…,xT 。步长由差异计划 {βt∈(0,1)}t=1T 控制。

q(xt|xt−1)=N(xt;1−βtxt−1,βtI)q(x1:T|x0)=∏t=1Tq(xt|xt−1)

随着步长 变大,数据样本 0 会逐渐失去其可区分的特征。最终,当 xT 等价于各向同性高斯分布时 T→∞ ,上述过程的一个很好的属性是,我们可以使用重参数化技巧在闭合形式的任意时间步 长进行采样。

img

以MNIST数据集为例的前向扩散过程(逐步添加噪声)

下面是代码实现的草稿,扩散内核(又称扩散采样公式)。

def forward_diffusion_process(self, x_0, t, eta):
    """
    This is just a skeleton of what our forward diffusion function resembled

    Args:
    x_0: original input image
    t: current timestep
    eta:gaussian noise to pertub the input image

    Return:
    Diffused samples
    """
    # extract number of samples, channel, heigh and width from input image
    n,c,h,w = x_0.shape

    #get the alpha bars at specific timestep t
    a_bar = self.alpha_bars[t]

    #generate a gaussian noise of the same shape as input image
    eta = torch.randn(n,c,h,w).to(self.device)

    #apply the sampling fomular in figure 8 below
    noisy = a_bar.sqrt().reshape(n,1,1,1) * x_0 + (1- a_bar).sqrt().reshape(n,1,1,1) * eta
    
    #we return the diffused image
    return noisy

def visualized_forward_process(ddpm, loader, device):
"""
  Args:
  ddpm: the instance of the diffusion denoising model
  loader: the training data
  device: the GPU we use for training

  Return:
  the noisy images
  """
 for batch in loader:
  images = batch[0]
  for noise_addition in [0.25,0.5,0.75,1]:
    show_images(ddpm(images.to(device), [int(noise_addition * ddpm.diff_steps) - 1 for _ in range(len(images))]), f"Noisy images {int(noise_addition * 100)}%")
  break

2.Reverse diffusion process 反向扩散过程

我们从扩散过程中获得了一个简单的分布,然后我们可以学习扩散过程的反向过程,该过程是在文本提示的引导下从随机噪声中迭代精制生成期望得到的高质量图像。整个反向扩散过程可以分为三个部分;高斯分布参数化、模型架构和模型训练。

2.1高斯分布参数化

我们只需要模型在给定噪声图像和时间步长的情况下预测分布均值和标准差。Ho 等人只预测了高斯的平均值,并固定了方差。如果我们能反转上述前向扩散的过程并从 q(xt−1|xt) 采样,我们将能够从高斯噪声输入中重新创建真实样本。 xT∼N(0,I) 请注意,如果 βt 足够小, q(xt−1|xt) 也将是高斯。不幸的是,我们不能轻易估计 q(xt−1|xt) ,因为它需要使用整个数据集,因此我们需要学习一个模型 pθ 来近似这些条件概率,以便运行反向扩散过程。

pθ(x0:T)=p(xT)∏t=1Tpθ(xt−1|xt)pθ(xt−1|xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))

我们想训练 μθ 预测 μ~t=1αt(xt−1−αt1−α¯tϵt) 因为在 xt 训练时可作为输入,我们可以重新参数化高斯噪声项,使其 ϵt 从时间步长 t 的输入 xt 进行预测:

μθ(xt,t)=1αt(xt−1−αt1−α¯tϵθ(xt,t))Thus xt−1=N(xt−1;1αt(xt−1−αt1−α¯tϵθ(xt,t)),Σθ(xt,t))

对损失项 Lt 进行参数化,以最小化以下差异 μ~ ,根据经验发现,使用忽略加权项的简化目标训练扩散模型效果更好:

Ltsimple=Et∼[1,T],x0,ϵt[‖ϵt−ϵθ(xt,t)‖2]=Et∼[1,T],x0,ϵt[‖ϵt−ϵθ(α¯tx0+1−α¯tϵt,t)‖2]

简化后的最终目标是: Lsimple=Ltsimple+C ,其中 是一个常数,不依赖于 。

img

DDPM 中的训练和采样算法(来源:Ho et al. 2020)

在前向过程中,我们选择固定 βt 为常量,而不是使它们可学习并设置 Σθ(xt,t)=σt2I ,其中 σt 不是学习的,而是设置为 βt 或 β~t=1−α¯t−11−α¯t⋅βt 。因为他们发现学习对角线方差 Σθ 会导致训练不稳定和样本质量变差。

如下面的代码所示。

def reverse_process(ddpm, n_samples=64, c=1,h=28,w=28,device=None):
  """
  The draft of our reverse process and its a more detailed outline of the 
  pseudocode in the figure 12.

  Args:
  ddpm: instance of the denoising and diffusion model
  n_samples: number of samples to be generated
  device: to be used for training
  c, h, w : number of channels, the height, and the width of the images as input

  Return:
  newly generated samples
  """

   # we create a random noise tensor with the same shape as the input image
  x = torch.randn(n_samples, c, h, w).to(device)
  
  for t in range(ddpm.diff_steps)[::-1]:
        """
        loop through all the timesteps from the noisy image towards original image
        estimate the noise to be removed using the reverse process 
        apply partially denoising formular to the image by subtracting the estimated noise
        add some noise to the image
        """
        time_tensor = (torch.ones(n_samples, 1) * t).to(device).long()
        eta_theta = # call the UNet model to predict the distribution of mean
        #we won't show the implementation of UNet in this blog.
  
        # controls the amount of noise that is removed from the image
        alpha_t = ddpm.alphas[t]
  
        # regularization that is applied to the image
        alpha_t_bar = ddpm.alpha_bars[t]
  
        # denoising the image using the formula in the pseudocode in Figure 12
        x = (1 / alpha_t.sqrt()) * (x - (1 - alpha_t) / (1 - alpha_t_bar).sqrt() * eta_theta)
  
        # adds some noise to the image if the time step is greater than 0
        if t > 0:
          z = torch.randn(n_samples, c, h, w).to(device)
  
       # sigma_t_squared = beta_t as we described in gaussian parameteration paragraph above
        beta_t = ddpm.betas[t]
        sigma_t = beta_t.sqrt()
  
        # add some more noise in langevin dynamics way
        x = x + sigma_t * z

#to visualize the generated samples, we used imageio. You can check how 
#Brian Pulfer implemented the visualization.

2.2模型架构:扩散模型有两种常见的主干架构选择:U-Net 和 Transformer。扩散模型通常使用带有 ResNet 块和自注意力层的 U-Net 架构来表示。例如,Ho 等人的论文使用了基于 Wide ResNet 的 U-Net,该 U-Net 具有四种特征图分辨率,每个分辨率级别有两个卷积残差块和自注意力块。其中包含 3 个下采样块、中间的瓶颈和 3 个带有串联的上采样块,并且还使用正弦位置嵌入进行时间表示。

U-Net

  • 下采样:每个步骤包括重复应用两个 3x3 卷积(未填充卷积),每个卷积后跟一个 ReLU 和一个 2x2 最大池化,步幅为 2。在每个下采样步骤中,特征通道的数量都会增加一倍。
  • 上采样:每个步骤都包括对特征图进行上采样,然后是 2x2 卷积,每个步骤将特征通道的数量减半。
  • 连接方式:快速连接导致与下采样堆栈的相应层串联,并为上采样过程提供必要的高分辨率功能。

img

每个蓝色方块都是一个特征图,顶部标有通道数,左下角标有高 x 宽尺寸,灰色箭头标记快速方式连接。

ControlNet

为了能够生成以更精准控制的组合信息(如 Canny、Hough lines、scribbles、openpose、seg、depth和normals)的附加图像为条件的图像生成,ControlNet ( 张吕敏等人通过将原始模型权重的可训练副本的“夹层”零卷积层添加到U-Net 的每个编码器层中来引入架构更改。准确地说,给定一个神经网络块 Fθ(.) ControlNet执行以下操作:

  1. 首先,冻结原始块的原始参数
  2. 将其复制为具有可训练参数 θc 和附加条件向量的副本 。
  3. 使用两个零卷积层(表示为 Zθz1(.;.) 和 Zθz2(.;.) 这是 1x1 的卷积层,权重和偏差都初始化为零,以连接这两个块。零卷积通过在初始训练步骤中消除作为梯度的随机噪声来保护该主干网络。
  4. 最终输出为: yc=Fθ(x)+Zθz2(Fθc(x+Zθz1©))

img

ControlNet 体系结构

Diffusion Transformer(DiT)

DiT架构的扩散建模建立在latent patches基础之上,使用与LDM(潜在扩散模型)相同的设计模式。DiT 具有以下特点:

  • 将输入 的隐变量表示作为 DiT 的输入。
  • 将潜空间中大小 I×I×C 的噪声“Patchify”为大小 的patches,,并将其转换为大小 (I/p)2 的patch序列。这里Patchify可以理解为将潜空间内特定的噪声block打包为patches,关于patches的详细解释,请参考本人的另外文章:最强文生视频模型 SORA 超详细解读 - 知乎 (zhihu.com)
  • 然后这个token序列通过 Transformer 块。他们正在探索三种不同的设计,以如何根据上下文信息(如时间步长 或类标签 )进行生成。在三种设计中,adaLN(自适应层范数)-Zero效果最好,优于上下文条件反射和交叉注意力块。scale 和 shift 参数 和 是从 和 的嵌入向量之和回归的。维度缩放参数 也会在 DiT 块内的任何残差连接之前立即回归并应用。
  • transformer的decoder输出噪声预测和对角线协方差预测。

img

DiT模型结构

Transformer 架构可以很容易进行扩展,并因此而广为人知。这是 DiT 的最大优势之一,因为它的性能会随着计算次数和数据集的规模增加而得到很好的扩展,并且根据实验,更大的 DiT 模型的计算效率更高。这一点在openAI发布sora测试视频的时候已经得到很好的体现,并且在后续陆续开源或闭源的基于DiT模型架构的t2i与t2v模型中也得到了很好的验证。目前以SD3为代表的文生图模型以及以sora和可灵、luma的Dream machine为代表的视频生成模型,全部都已经采用了DiT作为模型架构,并且使用了超大规模的数据集进行模型训练,可见的未来必然会基于DiT架构做更多的探索。

3.Variational Autoencoder(VAE自动变分编码器)

变分自编码器 (VAE) 是 Stable Diffusion 的关键组件。它由一个单独的编码器和解码器组成。编码器将 512×512 像素的图像压缩成更小的 64×64 模型,该模型位于更易于操作的潜在空间中。解码器将模型从潜在空间恢复为全尺寸的 512×512 像素图像。关于VAE部分的详细介绍与原理请参加本人的另外一篇文章:重新发现VAE(Variational Autoencoders) - 知乎 (zhihu.com) ,这里不做过多的展开与介绍了。

img

VAE的对比测试

4. Text Conditioning 文本条件

文本条件控制是使用文本提示指导模型生成目标图像的一种常见形式。CLIP 分词器分析文本提示中的每个单词,并将此数据嵌入到 768 个值的向量中。Stable Diffusion 使用文本转换器将这些提示从文本编码器馈送到 U-Net 噪声预测器。通过设置随机种子数,可以在潜空间中生成不同的图像。关于Clip模型原理以及文本条件控制与图文对齐,我后续会详细写一篇文章阐述,这里暂时先不做过多介绍。

img

通过文本控制生成图像原理

Stable Diffusion 能做什么?

Stable Diffusion 代表了文本到图像模型生成的重大改进。它广泛可用,并且比许多其他文本到图像模型需要的处理能力要低得多。其功能包括:

  • Text-to-Image 文本到图像生成,使用文本提示生成图像。通过调整随机生成器的种子编号或更改不同效果的去噪时间表来创建不同的图像。
  • Image-to-Image 根据输入图像和文本提示创建图像。例如,使用线稿图搭配相应合适的提示词来生成精细的图像。
  • Graphics, Artwork, and Logos 根据一系列提示生成各种样式的照片、艺术画作和logo等。
  • Image Editing 使用 AI 编辑器等工具编辑和修饰照片,以遮罩区域并生成所需更改的提示,例如修复旧照片或添加新元素。
  • Video Creation 创建短视频片段或动画,为影片添加不同的风格,或对照片进行动画处理生成相应视频。

拥抱AI艺术的星辰大海

Stable Diffusion 带来的图像生成以及视频生成革命只是一个开始。随着技术的不断发展,我们可以期待更多突破性的功能和改进。特别是与ComfyUI等平台的集成以及DiT架构的不断持续开发将进一步增强AI生成艺术的能力,最后,我们就以使用DiT架构的视频生成模型,来自LumaAI的Dream machine的Demo来作为本文的结尾吧!

关于AI绘画技术储备

学好 AI绘画 不论是就业还是做副业赚钱都不错,但要学会 AI绘画 还是要有一个学习规划。最后大家分享一份全套的 AI绘画 学习资料,给那些想学习 AI绘画 的小伙伴们一点帮助!

对于0基础小白入门:

如果你是零基础小白,想快速入门AI绘画是可以考虑的。

一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以找到适合自己的学习方案

包括:stable diffusion安装包、stable diffusion0基础入门全套PDF,视频学习教程。带你从零基础系统性的学好AI绘画!

需要的可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

1.stable diffusion安装包 (全套教程文末领取哈)

随着技术的迭代,目前 Stable Diffusion 已经能够生成非常艺术化的图片了,完全有赶超人类的架势,已经有不少工作被这类服务替代,比如制作一个 logo 图片,画一张虚拟老婆照片,画质堪比相机。

最新 Stable Diffusion 除了有win多个版本,就算说底端的显卡也能玩了哦!此外还带来了Mac版本,仅支持macOS 12.3或更高版本

在这里插入图片描述

2.stable diffusion视频合集

我们在学习的时候,往往书籍代码难以理解,阅读困难,这时候视频教程教程是就很适合了,生动形象加上案例实战,一步步带你入门stable diffusion,科学有趣才能更方便的学习下去。

在这里插入图片描述

3.stable diffusion模型下载

stable diffusion往往一开始使用时图片等无法达到理想的生成效果,这时则需要通过使用大量训练数据,调整模型的超参数(如学习率、训练轮数、模型大小等),可以使得模型更好地适应数据集,并生成更加真实、准确、高质量的图像。

在这里插入图片描述

4.stable diffusion提示词

提示词是构建由文本到图像模型解释和理解的单词的过程。可以把它理解为你告诉 AI 模型要画什么而需要说的语言,整个SD学习过程中都离不开这本提示词手册。

在这里插入图片描述

5.AIGC视频教程合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述
这份完整版的学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值