Stable Diffusion入门分享

一、Stable Diffusion 基础原理

图像生成领域有多种机器学习架构,例如生成对抗模型 GAN、Transformer架构、Diffusion Transformer等。Stable Diffusion是最近几年比较热门的一种。

1.1 Stable Diffusion 主要架构

Stable Diffusion 本身并不是一个模型,而是一个由多个模块和模型组成的系统架构。是由 Stability AI 公司于2022年8月由 CompVis、Stability AI 和 LAION 的研究人员在 Latent Diffusion Model 的基础上创建并推出的。

它由三大核心部件组成,每个组件都是一个神经网络系统: 一、文本编码器Text Encoder(CLIPText):用于文本编码:

  • Input:输入文本(提示词 Prompt,左图例子中提示词paradise cosmic beach);
  • Output:77 token embeddings vectors,每个 token 向量有 768 个维度;

二、图像生成器Image Infomation Creator(U-Net + Scheduler ):用于逐步处理/扩散被转化到潜空间中的信息:

  • Input:文本嵌入和由噪点组成的起始多维矩阵;
  • Output:处理后的信息矩阵;

三、图像解码器Image Decoder(AutoEncoder Decoder,主要是一个VAE:Variational AutoEncoder):使用处理后的信息矩阵解码绘制出最终图像,把潜空间的运算结果解码成实际图片维度:

  • Input:处理后的信息矩阵,维度:4, 64, 64;
  • Output:生成的图像,维度:3, 512, 512 即 RGB三个通道、和两维像素尺寸。

其他概念:

  • 潜在空间 Latent Space :解决了原始 Diffusion 模型效率低下的问题,极大地降低了内存消耗和计算的复杂度。
  • VAE编码器 :将 512x512 像素的图像压缩成更小的潜在空间64x64 。
  • VAE解码器 :将潜在空间恢复为 512x512 像素的图像。

1.2 详细流程

Stable Diffusion 的数据会在像素空间(Pixel Space )、潜在空间(Latent Space )、条件(Conditioning )三部分之间流转,其算法逻辑大概分这几步:

  1. 根据用户输入的prompt,用Text Encoder提取text embeddings,作为后续迭代的条件。
  2. 初始化一个潜在空间高斯噪音Latent Seed(512x512图像对应的潜在空间维度是64x64)。
  3. 扩散模型UNet以text embeddings为条件(Conditioning ),迭代地对噪音图像表示进行去噪。 (注意,噪点并不是直接在像素维度加到图片上的,而是在潜空间中加到图片的潜空间数据矩阵中的。这里的噪点图只是为了方便大家理解。)
  4. 迭代完成后,潜在空间图像就由variational Autoencoder的图片解码器解码,将图像从潜在空间转换回像素空间,得到生成的图片。

参考文档:huggingface.co/blog/stable...

二、扩散Diffusion模型

2.1 核心功能

以上流程中,Stable Diffusion的核心是扩散模型的迭代运行。扩散模型有两个主要功能:(1)前向扩散,(2)反向扩散。

模型训练过程-前向扩散 训练过程&结果 文生图过程-反向扩散
说明 前向扩散就是将图片转化为噪点图的过程。假设我们有了一张照片(下图中1),并额外生成了一些随机噪点(下图中2),然后在若干噪点强度中选择其中某一个强度级别(下图中3),然后将这个特定强度级别的噪点加到图片中(下图中4)。 在如此巨大的数据集上训练出的强大的噪点预测器 U-Net ,便有"能力"在 Diffusion 的反向生图过程中,将噪点图逐步迭代去噪,转化为一张完美的图像。U-Net 的训练过程:①从庞大的数据集中选择一个训练样本,通常为某一个噪点强度级别下的图像样本。②通过 U-Net 预测该噪点和噪点级别。③与实际图片中的噪点做对比。④反馈给 U-Net 第三步中的噪点对比差异。以便让 U-Net 调整参数后提高预测能力。这是一种典型的"监督学习"过程。 反向扩散是前向扩散的逆过程。它从一个完全随机的噪点图开始,通过神经网络来预测并去除噪点,迭代多次最终恢复为一张清晰的图片。这个过程中的神经网络在Stable Diffusion中被称为噪点预测器(noise predictor),其本质是一个U-Net模型。
图示 不同噪点强度的图片(最后,数据集中有大量不同噪点强度的图片) 训练过程:训练结果:

2.2 Stable Diffusion基础模型

Stable Diffusion基础模型Foundation Model,就是指将大量数据导入具有数亿甚至万亿级参数的模型中,通过人工智能算法进行训练。Stable Diffusion v1.x、FLUX 1.x等模型都属于基础模型,这类大模型普遍的特点是参数多,训练时间长,具备泛化性、通用性、实用性,适用于各种场景的绘图。常见的基础模型一般在2GB以上,有两种文件类型:

文件格式 说明
.ckpt文件 即checkpoint,是TensorFlow/pytorch中用于保存模型参数的格式,记录了训练过程中在所有中间节点上保存的模型的名称,通常与 .meta 文件一起使用,以便恢复训练过程并继续优化。
.safetensors文件 huggingface 推出的新的模型存储格式,专门为Stable Diffusion模型设计。这种格式的文件只保存模型的权重,而不包含优化器状态或其他信息,这也就意味着它通常用于模型的最终版本。

基础模型及微调模型都可以去Hugging Face下载:huggingface.co/models?pipe...

2.3 微调技术

(1)Stable Diffusion基础模型的使用上有一定局限性,直接使用预训练模型可能无法满足特定任务的需求,例如无法满足对细节控制或特定人物特定绘图风格的绘图需要。

(2)训练一个Stable Diffusion基础模型需要强大的计算资源及高昂的成本(例如Stable DiffusionV1.5 模型是在几百个英伟达 Nvidia A100 GPU 上,用了23亿张图片耗时几十万个 GPU 小时训练出来)。

于是,针对这些大模型的微调技术应运而生。为了达到绘制特定人物或特定风格,我们不需要重新训练大模型,只需要提供训练数据集训练出微调模型(几个小时就可以实现,也是个人开发者常训练的模型),将微调模型和基础模型结合使用。常见的微调技术有Embedding、Hypernetwork、Dreambooth、Lora、ControINet等。

模型类型 详细说明
Embedding模型 Embedding模型也称为textual inversion,即文本反转。在Stable Diffusion中,Embedding模型使用了嵌入技术以将一系列输入提示词打包成一个向量,从而提高图片生成的稳定性和准确性。Embedding对于复杂的词汇的调整结果并不太好,定义人物需要的关键词少,所以适用于对人物的训练。
VAE模型 VAE全称Variational auto enconder,变分自编码器。Stable Diffusion在训练时会有一个编码(Encoder)和解码(Dncoder)的过程,我们将编码和解码模型称为VAE模型。预训练的模型,如官网下载的Stable Diffusion模型,一般都是内置了训练好的VAE模型的,不用我们再额外挂载。但有些大模型并不内置VAE模型,或者VAE模型经过多次训练融合不能使用了,就需要额外下载,并在Stable Diffusion Web UI 中添加设置。如果不添加,出图的色彩饱和度可能会出问题,发灰或变得不清晰。
Lora模型 LoRA(Low-Rank Adaptation of large Language Models)是由微软研究员开发的一种用于微调大模型的技术。该技术建议冻结预训练模型的权重,并在每个 Transformer 块中注入可训练层,从而在保持大部分参数不变的情况下,调整局部的一些模型参数。由于不需要重新计算模型的权重参数的梯度,这大大减少了需要训练的计算量,并降低了 GPU 的内存要求。 使用 LoRA 模型进行微调可以为我们提供更自由、更便捷的微调模型的方式。例如,它使我们能够在基本模型的基础上进一步指定整体风格、指定人脸等等。此外,LoRA 模型本身非常小,即插即用,非常方便易用。
Hypernetwork模型 Hypernetwork是作用在UNET网络上的,UNET神经网络相当于一个函数,内部有非常多的参数, Hypernetwork 通过新建一个神经网络,称之为超网络。超网络的输出的结果是UNET网络的参数。超网络不像UNET,它的参数少,所以训练速度比较快,因此Hypernetwork能达到以较小时间空间成本微调模型的目的。Hypernetwork 会影响整个UNET的参数生成,理论上更适合风格的训练。
Controlnet模型 Controlnet模型是一种神经网络结构,通过添加额外的条件来控制基础扩散模型,从而实现对图像构图或人物姿势的精细控制。结合文生图的操作,它还能实现线稿转全彩图的功能。

2.4 模型迭代历史

Stable Diffusion稳定扩散模型在短短两年内已经发布了多个版本。其中最著名的版本是1.5和SDXL。

模型名 发布日期 发布者 说明 连接
Latent Diffusion 2022/7/1 CompVis 最初的模型称为 Latent Diffusion,由 CompVis 开发,包含文本到图像和inpainting功能。 github.com/CompVis/lat...
Stable Diffusion 1.1 2022/8/1 CompVis 2022 年 8 月,CompVis 相继发布了四个版本的稳定扩散软件。随后的每个版本都增加了训练步骤,从而提高了输出质量。 huggingface.co/CompVis/sta...
Stable Diffusion 1.2 2022/8/1 CompVis huggingface.co/CompVis/sta...
Stable Diffusion 1.3 2022/8/1 CompVis huggingface.co/CompVis/sta...
Stable Diffusion 1.4 2022/8/1 CompVis huggingface.co/CompVis/sta...
Stable Diffusion 1.5 2022/10/1 RunwayML RunwayML 于 2022 年 10 月发布了稳定版 Diffusion 1.5,该版本成为最广泛使用的微调版本。 huggingface.co/runwayml/st...
Stable Diffusion 1.6 2023/11/1 Stability AI Stable Diffusion 1.6 是一个相对陌生的版本,因为它不是一个开源模型。它于 2023 年 11 月在 Stability AI 开发者平台发布。它只能通过 Stability AI 开发者平台的 v1 API 使用(最新的 API 版本为 v2)。 platform.stability.ai/docs/api-re...
Stable Diffusion 2.0 2022/11/1 Stability AI Stability AI 发布了 Stable Diffusion 2.0,12 月又发布了 2.1。尽管规模更大,但这些模型的受欢迎程度不如 1.5,而且扩展支持有限。 huggingface.co/stabilityai...
Stable Diffusion 2.1 2022/11/1 Stability AI huggingface.co/stabilityai...
Stable Diffusion XL 0.9 2023/6/1 Stability AI SDXL 擅长生成高达 1024x1024 像素的图像,并支持 LoRA 和 ControlNet。 huggingface.co/stabilityai...
Stable Diffusion XL 1.0 2023/7/1 Stability AI huggingface.co/stabilityai...
Stable Diffusion XL beta 2.2.2 2023/11/1 Stability AI platform.stability.ai/docs/api-re...
Stable Image Core 2024/3/1 Stability AI platform.stability.ai/docs/api-re...
Stable Diffusion XL Turbo 2023/11/1 Stability AI 2023 年 11 月,SDXL Turbo 推出,利用潜在一致性模型(LCM)将生成步骤从通常的 3040 步减少到 14 步。 huggingface.co/stabilityai...
Stable Diffusion Turbo 2023/11/1 Stability AI huggingface.co/stabilityai...
Stable Video Diffusion 2023/11/1 Stability AI Stability AI 公司于 2023 年 11 月推出了 SVD,可从单张图像生成短动画,且不会出现闪烁问题。 huggingface.co/stabilityai...
Stable Video Diffusion XT 2023/11/1 Stability AI huggingface.co/stabilityai...
Stable Zero123 2023/12/1 Stability AI Stable Zero 123 于 2023 年 12 月发布,主要功能是通过单张图像生成 3D 物体,并提供包括物体背面在内的多个视图。 huggingface.co/stabilityai...
Stable Diffusion Cascade 2024/2/1 Stability AI 2024 年 2 月,Stability AI 推出了 Stable Diffusion Cascade,它采用三阶段生成流程(ABC 阶段),以更高的效率生成高质量图像。 huggingface.co/stabilityai...
SDXL Lightning 2024/2/1 ByteDance huggingface.co/ByteDance/S...
Stable Diffusion 3 2024/2/1 Stability AI Stable Diffusion 3 生成的图片在质量上有了很大改进,支持多主题提示,文字书写效果更好(文字不再乱码)。采用了与 Sora 相同的 DiT(Diffusion Transformer)架构。由于文本嵌入和图像嵌入的不同,因此 SD3对两种模态使用两套不同的权重:多种模态MMDiT。 platform.stability.ai/docs/api-re...
Stable Diffusion 3 Turbo 2024/2/1 Stability AI platform.stability.ai/docs/api-re...
Stable Video 3D 2024/3/1 Stability AI huggingface.co/ByteDance/S...
Cos Stable Diffusion XL 1.0 2024/4/1 Stability AI huggingface.co/stabilityai...
Cos Stable Diffusion XL 1.0 Edit 2024/4/1 Stability AI huggingface.co/stabilityai...

以上只是Stable Diffusion系列模型的发展历史,并不是所有文生图应用都用了一样的基础模型,很多公司都有自己的基础模型,有的模型也会开源在huggingface上。

此外,FLUX系列模型最近也很热门,是由Stable Diffusion创始团队,Black Forest Labs公司推出的开源AI图像生成模型。

三、Stable Diffusion 编程

本节介绍如何使用Hugging Face推出的diffusers库(hugging-face.cn/docs/diffus...)进行编程,暂不介绍更复杂的底层实现。

Diffusers 是一个值得首选用于生成图像、音频甚至 3D 分子结构的,最先进的预训练扩散模型库。diffusers使用pipeline类封装各个模块,以及安排其中的调用顺序和输出。

3.1 安装

  1. 安装diffusers库及依赖库
python 复制代码
%pip install -qq -U diffusers datasets transformers accelerate ftfy pyarrow==9.0.0
  1. 登录huggingface,用于从huggingface中下载托管的模型文件
python 复制代码
%pip install -qq -U diffusers datasets transformers accelerate ftfy pyarrow==9.0.0
  1. 安装Git LFS,用于大文件管理(Git LFS 是Git 的扩展,它可提供用于描述提交到存储库中的大型文件的数据。 它会将二进制文件内容存储在单独的远程存储中。)。
python 复制代码
%%capture
!sudo apt -qq install git-lfs
!git config --global credential.helper store
  1. 初始化界面显示的一些函数
python 复制代码
import numpy as np
import torch
import torch.nn.functional as F
from matplotlib import pyplot as plt
from PIL import Image


def show_images(x):
    """Given a batch of images x, make a grid and convert to PIL"""
    x = x * 0.5 + 0.5  # Map from (-1, 1) back to (0, 1)
    grid = torchvision.utils.make_grid(x)
    grid_im = grid.detach().cpu().permute(1, 2, 0).clip(0, 1) * 255
    grid_im = Image.fromarray(np.array(grid_im).astype(np.uint8))
    return grid_im


def make_grid(images, size=64):
    """Given a list of PIL images, stack them together into a line for easy viewing"""
    output_im = Image.new("RGB", (size * len(images), size))
    for i, im in enumerate(images):
        output_im.paste(im.resize((size, size)), (i * size, 0))
    return output_im


# Mac users may need device = 'mps' (untested)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

3.2 下载模型并初始化

  1. 使用diffusers库中的StableDiffusionPipeline,并进行初始化:
python 复制代码
from diffusers import StableDiffusionPipeline

# Check out https://huggingface.co/sd-dreambooth-library for loads of models from the community
model_id = "sd-dreambooth-library/mr-potato-head"

# Load the pipeline
pipe = StableDiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float16).to(
    device
)

3.3 输入提示词并运行

输入提示词prompt,然后生成图片。

python 复制代码
prompt = "an abstract oil painting of sks mr potato head by picasso"
image = pipe(prompt, num_inference_steps=50, guidance_scale=7.5).images[0]
image

生成结果:

3.4 源码

上面的例子中用到了diffusers库的StableDiffusionPipeline,有兴趣可以看下源码,便于更好理解StableDiffusion的推理流程:

python 复制代码
# 1. Check inputs. Raise error if not correct 检查输入
self.check_inputs(prompt,)

# 2. Define call parameters 定义调用的batch,device以及classifier-free的监督系数
if prompt is not None and isinstance(prompt, str):
batch_size = 1
elif prompt is not None and isinstance(prompt, list):
batch_size = len(prompt)
else:
batch_size = prompt_embeds.shape[0]
device = self._execution_device

# 3. Encode input prompt 对输入的文字prompt进行encoding
lora_scale = (self.cross_attention_kwargs.get("scale", None) if self.cross_attention_kwargs is not None else None)

# 4. Prepare timesteps 准备scheduler中的时间步数
timesteps, num_inference_steps = retrieve_timesteps(self.scheduler, num_inference_steps, device, timesteps, sigmas)

# 5. Prepare latent variables 准备初始噪声图latent
num_channels_latents = self.unet.config.in_channels
latents = self.prepare_latents(batch_size * num_images_per_prompt,num_channels_latents,height,width,prompt_embeds.dtype,device,generator,latents,)

# 6. Prepare extra step kwargs. 额外的去噪参数
extra_step_kwargs = self.prepare_extra_step_kwargs(generator, eta)

# 7. Denoising loop 循环去噪
num_warmup_steps = len(timesteps) - num_inference_steps * self.scheduler.order

备注:一些其他diffusion库:github.com/openai/guid...

四、Stable Diffusion UI界面

Stable Diffusion 用户界面,指用图形化的界面展示出Stable Diffusion的工作流程,并在内部提供模型的加载及运行,不需要开发者编写python代码,可以让开发者专注于模型的效果上。 目前使用比较多的有三类:Stable-Diffusion WebUI、ComfyUI、商业化产品。

Stable-Diffusion WebUI ComfyUI 商业化产品-Sora、Midjourney等
产品形态 传统产品形态,交互为模块化输入框、按钮 新型工作流形态,交互为流程化输入框、连线 封装好的交互形态,更易上手
自由度 中,可以设定参数,但无法自由搭建 高,可以根据自己的需求搭建适合的工作流,甚至开发并改造某个节点。(comfyUI节点流程可以参照第一章的原理对照理解) 低,产品都是封装好的,只能使用所提供的功能
生图效果 用户可以自定义接入模型,依据接入模型的效果 用户可以自定义接入模型,依据接入模型的效果 取决于产品所接入的模型效果,用户无法干预
适用人群 1、对AI图像生成有一定要求2、喜欢深度研究与学习3、设计师等专业人士 1、对AI图像生成有较高要求2、喜欢新事物喜欢挑战3、设计师等专业人士 1、日常简单使用2、AI 绘画初学者

4.1 Stable-Diffusion WebUI

Stable-Diffusion WebUI和ComfyUI都可以在本地部署,也可以在云端部署。本地部署流程如下:

  1. 安装python及git
  2. 从github上下载本体:下载源码:github.com/AUTOMATIC11...
  1. 启动及运行
    • windows上通过webui-user.bat启动运行后会自动安装必备环境python库,并下载基础模型v1-5-pruned-emaonly.safetensors文件(huggingface.co/stable-diff... )到对应目录
    • 安装完成后会自动启动,打开一个127.0.0.1:xxxx本地H5页面。
    • 输入提示词,就可以生成结果了。但是效果比较差,因为我们只使用了一个基础模型。如果需要更好的效果,可以下载并切换其他基础模型,并且结合其他微调模型(即第一章提到的Embedding、Hypernetwork、Dreambooth、Lora、ControINet等模型)。
    • 生成的结果可以在本地stable-diffusion-webui的output目录下看到。
  2. 效果及优化。例如:
  3. 其他:Stable-Diffusion WebUI汉化插件:github.com/VinsonLaro/...

4.2 ComfyUI

ComfyUI的本地部署流程如下:

  1. 安装python及git
  2. 从github上下载本体:下载源码:github.com/AUTOMATIC11...
  1. 启动及运行
    • windows上通过run_nvidia_gpu.bat(建议gpu)、run_cpu.bat运行(2)安装完成后会自动启动,打开一个127.0.0.1:xxxx本地H5页面。
    • 安装完成后会自动启动,打开一个127.0.0.1:xxxx本地H5页面。
    • 输入提示词,就可以生成结果了。但是效果比较差,因为我们只使用了一个基础模型。如果需要更好的效果,可以下载并切换其他基础模型,并且结合其他微调模型(即第一章提到的Embedding、Hypernetwork、Dreambooth、Lora、ControINet等模型)。
  2. 效果及优化。例如:
    • (1)基础模型:例如替换成FLUX.1-dev(或者其他自己喜欢的模型):huggingface.co/black-fores... ,下载后放到models/unet/文件夹下。
    • (2)微调模型:例如下载VAE模型huggingface.co/black-fores... ,下载后放到models/vae/文件夹下。
    • (3)重新运行comfyUI,并在对应节点选择刚下载的模型。
  3. 其他:comfyUI汉化包:github.com/AIGODLIKE/A...

4.3 其他部署方式

Stable-Diffusion WebUI、ComfyUI本地部署都对计算机性能有一定要求(一般模型都会列出需要的gpu等条件),如果不想自己部署,也可以使用 百度AI StudioLibLib在线工作流等在线部署方式。简化了部署流程,只需要关注模型选择即可。

五、模型选择

5.1 Hugging Face

Hugging Face 是一个专注于 人工智能(AI)模型的开放平台和社区,最初以自然语言处理(NLP)著称,后来扩展到图像、音频、多模态等多个领域。Hugging Face有以下几个模块:

模块 说明
Models 各种模型,包括Text Classification、Text-to-Image、Text-to-Video、Text-to-Speech 等等 huggingface.co/models
Datasets 训练数据集,包括3D,Audio、Image、Text、Video等 huggingface.co/datasets
Spaces 1.机器学习应用程序的创建和托管,不需要自己搭建就可以在线体验到别人的模型效果。2.可以搭建托管自己的应用,不同机器根据小时收费。 例如:FLUX.1-dev的Space huggingface.co/spaces/blac...

5.2 Civitai

Civitai 是一个开放、功能强大的 AI 图像模型社区,支持模型分享、下载、在站内/本地生成艺术作品。可以查看其他用户分享的模型,提示、生成效果等,选择自己喜欢的模型下载及使用。

5.3 Liblib

LiblibAI是一个中国领先的AI创作平台,提供强大的AI创作能力,帮助创作者实现创意。

相关推荐
giaoho7 分钟前
在新闻资讯 APP 底部切换不同类型界面,部分界面可以通过 ViewPager 实现滑动切换
android
纵马踏花26 分钟前
【C语言】深入理解指针(1)
android·c语言·开发语言
_一条咸鱼_1 小时前
Android Runtime沙箱隔离与进程间通信限制原理深度剖析(78)
android·面试·android jetpack
m0_597345312 小时前
APP测试之Monkey压力测试
android·压力测试·app测试·回归测试·稳定性测试·monkey测试
iReaShare3 小时前
轻松将 Android 数据备份到 Mac:5个实用解决方法
android
龙儿筝3 小时前
鸿蒙和Android知识点
android·harmonyos
雨白4 小时前
ConstrainLayout:从上手到精通
android
夜色。4 小时前
Unity Android Logcat插件 输出日志中文乱码解决
android·unity
滴水未满4 小时前
Android平台下openssl动态库编译
android
CYRUS_STUDIO5 小时前
Android 下内联汇编开发指南:从基础语法到多架构适配全掌握
android·android studio·汇编语言