AI 绘画Stable Diffusion 研究(七) 一文读懂 Stable Diffusion 工作原理(1)

简介: AI 绘画Stable Diffusion 研究(七) 一文读懂 Stable Diffusion 工作原理

一、 Stable Diffusion能做什么


通过前面几篇文章关于 Stable Diffusion 整合包的安装、ControlNet插件的介绍使、sd模型的安装和使用以及文生图功能的介绍后,相信看过的朋友应该都清楚的知道 Stable Diffusion 是做什么的吧?


对于新朋友,想详细了解的话,请前往:

AI 绘画Stable Diffusion 研究(一)sd整合包v4.2 版本安装说明

AI 绘画Stable Diffusion 研究(二)sd模型ControlNet1.1 介绍与安装

AI 绘画Stable Diffusion 研究(三)sd模型种类介绍及安装使用详解

AI 绘画Stable Diffusion 研究(四)sd文生图功能详解(上)

AI 绘画Stable Diffusion 研究(五)sd文生图功能详解(下)

AI 绘画Stable Diffusion 研究(六)sd提示词插件


这里再用最直白的话说一下:SD它是一个text-to-image模型 ,通过给定的 text prompt(文本提示词),可生成一张匹配文本的图片。


二、什么是扩散模型


大家都经常听到有人说,Stable Diffusion是一种潜在扩散模型(Diffusion Models)。

那我们先弄明白什么是扩散模型?

为什么叫扩散模型呢?因为它的数学公式看起来非常像物理上的扩散现象。


1、前向扩散

假如我们训练一个模型如下:


正如上图所示,是一个前向扩散的过程,它是在训练图像上逐渐添加噪声,最后变成完全随机噪声图,并最终无法辨认噪点图对应的初始图片。


这个过程就像是一滴墨水滴在一杯清水里,会慢慢扩散最终均匀分布在清水里一样,且无法判断它最初是从水杯的中心滴入,还是从边缘滴入,扩散这个名字就是这么来的。


2、反向扩散


反向扩散的思想是:输入一张噪点图,反向扩散(Reverse Diffusion),让上述过程获得逆向从随机噪声图生成清晰图像的过程。


从反向扩散的角度来说,我们需要知道有多少“噪点”加入到了某张图片里。


那么要知道答案的方式便是:训练一个神经网络来预测添加的噪点,这在SD里称为噪点预测器(Noise Predicator),其本质是一个U-Net模型。


训练流程为:

(1)、选择一张训练图(例如一张猫的图片)

(2)、生成随机的噪点图

(3)、给这张图继续增加多轮噪点

(4)、训练Noise Predicator,预测加入了多少噪点,通过神经网络训练权重,并展示其正确答案。



反向扩散训练的重点下图中的噪声预测器(Noise Predicator),它可以通过训练得出每次需要减掉的噪声,每次需要减多少噪声是预测出来的,从而实现还原清晰图片的目的。


三、扩散模型实现原理


扩散模型(Diffusion Models)的成功,其实并非横空出世,突然出现在人们的视野中。其实早在2015年就已有人提出了类似的想法,最终在2020年提出了扩散模型的生成技术。


以下是扩散模型推导公式:




更详细的原理:

参考:扩散模型详解原理+代码


通过前面的介绍,我们大概明白了,什么是扩散模型,但这并不是 Stable Diffusion的工作原理。

这是因为:上述扩散过程是在图片空间里完成的,无论是模型训练,还是生成图片的过程,都是需要海量的算力支持和内存需求。


想象一下:一张512 x 512的图片(包含3个颜色通道:红、绿、蓝),它的空间是786432维,也就是说我们要为一张图片指定这么多的值。因此,基本无法在单个GPU上运行。


Stable Diffusion就是降低算力和内存需求的一个解决方案。它让Stable Diffusion在消费级GPU上运行成为了可能。


四、Stable Diffusion 潜扩散模型

Stable Diffusion 它是一个Latent Diffusion Model(潜扩散模型)。其方式是将图片压缩到一个“潜空间”(Latent Space)中,而不是在高维的图片空间里工作。潜空间比图片空间小了48倍,所以它可以节省大量计算,继而运行速度更快。


扩散过程会分成很多步循环,而每一步的过程如下图所示,将文本描述、隐变量、步数等数值传入UNet,生成新的隐变量,而这个过程会涉及一些模型。


在最后一步循环,将隐特征经由 Variational Autoencoder(VAE)解码成图像。


这个过程的核心思想就是:压缩图像,它通过变分自编码器 Variational Autoencoder(VAE)模型,把图像压缩到极致,我们把此类压缩方式称作降维,这种降维级别的压缩不丢失重要信息。


经过压缩后,图像被称作低维潜在(Latent)“图像”,作为U-net的输入,去潜空间(Latent Space)里一步一步降噪后,完成反向扩散的低维“图片”还得通过VAE的解码器,把图像从潜空间转换回像素空间(Pixel Space)。


VAE包含2部分:Encoder与Decoder。

  • Encoder将一张图片压缩到“潜空间”里的一个低维空间表示
  • Decoder从“潜空间”里的表示恢复为一张图片


下列代码演示了VAE模型的使用方法,其中load_vae为根据配置init_config去初始化模型,然后从预训练模型model.ckpt中读取参数,预训练模型的first_stage_model即指代VAE模型。


from ldm.models.autoencoder import AutoencoderKL
#VAE模型
def load_vae():
    #初始化模型
    init_config = {
        "embed_dim": 4,
        "monitor": "val/rec_loss",
        "ddconfig":{
          "double_z": True,
          "z_channels": 4,
          "resolution": 256,
          "in_channels": 3,
          "out_ch": 3,
          "ch": 128,
          "ch_mult":[1,2,4,4],
          "num_res_blocks": 2,
          "attn_resolutions": [],
          "dropout": 0.0,
        },
        "lossconfig":{
          "target": "torch.nn.Identity"
        }
    }
    vae = AutoencoderKL(**init_config)
    #加载预训练参数
    pl_sd = torch.load("model.ckpt", map_location="cpu")
    sd = pl_sd["state_dict"]
    model_dict = vae.state_dict()
    for k, v in model_dict.items():
        model_dict[k] = sd["first_stage_model."+k]
    vae.load_state_dict(model_dict, strict=False)
    vae.eval()
    return vae
#测试vae模型
def test_vae():
    vae = load_vae()
    img = load_image("girl_and_horse.png")  #(1,3,512,512)   
    latent = vae.encode(img).sample()       #(1,4,64,64)
    samples = vae.decode(latent)            #(1,3,512,512)
    save_image(samples,"vae.png")
test_vae()


五、Stable Diffusion 文本如何影响图片生成


在 Stable Diffusion 模型中,prompt 是通过引导向量(guidance vector)来控制 U-Net 的。具体来说,prompt 会被编码成一个文本嵌入向量(text embeddings),然后与其他输入一起传递给 U-Net。

通过这种方式,prompt 能够影响 U-Net 的输出,从而在生成过程中引导模型产生符合预期的结果,即通过 prompt 产生我们想要的图


在Stable Diffusion模型限制prompt在75个单词。


下图是文本提示词(text prompt)如何处理并输入到Noise Predictor的流程:



根据上图,我们可以看到这个流程:

首先,Tokenizer(分词器)将每个输入的单词转为一个数字,我们称为token。

然后,每个token转为一个768维的向量,称为词嵌入(embedding)。

最后,由Text Transformer处理词嵌入,并可以被Noise predictor进行消费。


1、分词器 (Tokenizer)

人类可以读懂单词,但计算机只能读懂数字。所以这也是为什么文本提示词首先要转为单词。

文本提示词(text prompt)首先由一个CLIP tokenizer做分词。

CLIP是一个深度学习模型,由Open AI开发,用于为任何图片生成文本描述。


以下是CLIP具体的实例

展示了如何将文本“苹果”通过CLIP技术转化为能输入到神经网络中训练的tokens数据。

这里使用Python和OpenAI库来实现。


(1)、安装依赖库

pip install torch openai


(2)、导入相关库

import torch import openai


(3)、加载CLIP模型

model, preprocess = openai.clip.load("ViT-B/32")


(4)、准备输入文本

text_description = "苹果"




相关文章
|
1月前
|
人工智能 Serverless
AI助理精准匹配------助力快速搭建Stable Difussion图像生成应用
【10月更文挑战第7天】过去在阿里云社区搭建Stable Diffusion图像生成应用需查阅在线实验室或官方文档,耗时且不便。现阿里云AI助理提供精准匹配服务,直接在首页询问AI助理即可获取详细部署步骤,简化了操作流程,提高了效率。用户可按AI助理提供的步骤快速完成应用创建、参数设置、应用部署及资源释放等操作,轻松体验Stable Diffusion图像生成功能。
|
1月前
|
人工智能 Serverless
AI助理精准匹配,为您推荐方案——如何添加一个Stable Difussion图像生成应用
介绍了一种利用AI助手快速获取并搭建Stable Diffusion图像生成应用的方法。用户只需在阿里云官网向AI助手提出需求,即可获得详细的实施方案。随后,按照AI助手提供的方案,通过函数计算部署应用,并进行测试。此过程显著提升了开发效率。
797 2
AI助理精准匹配,为您推荐方案——如何添加一个Stable Difussion图像生成应用
|
29天前
|
人工智能
添加一个Stable Difussion图像生成应用,通过向AI助手简单的提问,即可快速搭建Stable Diffusion应用至自己的网站中,大幅提升开发效率。
添加一个Stable Difussion图像生成应用,通过向AI助手简单的提问,即可快速搭建Stable Diffusion应用至自己的网站中,大幅提升开发效率。
|
30天前
|
人工智能
阅读了《文档智能 & RAG让AI大模型更懂业务》的解决方案后对解决方案的实践原理的理解
阅读《文档智能 & RAG让AI大模型更懂业务》后,我对文档智能处理与RAG技术结合的实践原理有了清晰理解。部署过程中,文档帮助详尽,但建议增加常见错误处理指南。体验LLM知识库后,模型在处理业务文档时效率和准确性显著提升,但在知识库自动化管理和文档适应能力方面仍有改进空间。解决方案适用于多种业务场景,但在特定场景下的集成和定制化方面仍需提升。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
探索AI技术:从基础原理到实际应用的全面剖析
本文旨在为读者提供关于人工智能(AI)技术的全面了解。从探讨AI的基本概念和关键技术入手,逐步深入到AI在不同领域的应用实例,包括医疗、金融和自动驾驶等。同时,文章也详细讨论了当前AI技术面临的伦理问题和社会影响,以及可能的解决方案。最后,本文还展望了AI技术未来的发展趋势,帮助读者更好地理解这一前沿科技的现状与未来。
52 5
|
2月前
|
人工智能
在stable diffussion中完美修复AI图片
无论您的提示和模型有多好,一次性获得完美图像的情况很少见。修复小缺陷的不可或缺的方法是图像修复(inpainting)
在stable diffussion中完美修复AI图片
|
2月前
|
人工智能 测试技术
语言图像模型大一统!Meta将Transformer和Diffusion融合,多模态AI王者登场
【9月更文挑战第20天】Meta研究人员提出了一种名为Transfusion的创新方法,通过融合Transformer和Diffusion模型,实现了能同时处理文本和图像数据的多模态模型。此模型结合了语言模型的预测能力和Diffusion模型的生成能力,能够在单一架构中处理混合模态数据,有效学习文本与图像间的复杂关系,提升跨模态理解和生成效果。经过大规模预训练,Transfusion模型在多种基准测试中表现出色,尤其在图像压缩和模态特定编码方面具有优势。然而,其训练所需的大量计算资源和数据、以及潜在的伦理和隐私问题仍需关注。
70 7
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】ChatGPT模型原理介绍(下)
【AI大模型】ChatGPT模型原理介绍(下)
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
【AI大模型】ChatGPT模型原理介绍(上)
【AI大模型】ChatGPT模型原理介绍(上)
|
2月前
|
人工智能 计算机视觉 Python
AI计算机视觉笔记八:基于mediapipe的虚拟绘画
该项目利用MediaPipe手部关键点识别技术,实现了隔空绘画功能。用户可以通过手势控制绘画工具,选择颜色或橡皮擦。环境配置基于`mediapipe_env`,在PyCharm中运行。项目包括两个文件:`AiVirtualPainter.py`负责绘画逻辑,`HandTrackingModule.py`用于手部关键点检测。此项目展示了AI技术在互动应用中的潜力,适合初学者实践与学习。
66 10