2024不可不会的StableDiffusion之扩散模型(四)

1. 引言

这是我关于StableDiffusion学习系列的第四篇文章,如果之前的文章你还没有阅读,强烈推荐大家翻看前篇内容。在本文中,我们将学习构成StableDiffusion的第三个基础组件基于Unet的扩散模型,并针该组件的功能进行详细的阐述。

闲话少说,我们直接开始吧!

2. 概览

通常来说一个U-Net包含两个输入:
Noisy latent/Noise : 该Noisy latent主要是由VAE编码器产生并在其基础上添加了噪声;或者如果我们想仅根据文本描述来创建随机的新图像,则可以采用纯噪声作为输入。
Text embeddings: 基于CLIP的将文本输入提示转化为文本语义嵌入(embedding)
在这里插入图片描述

U-Net模型的输出是从包含输入噪声的Noisy Latents中预测其所包含的噪声。换句话说,它预测输出的为Noisy Latents减去de-noised latents后的结果。

3. 导入所需的库

让我们接着通过代码来了解 U-Net。我们将首先导入所需的库并加载我们的U-Net模型。

from diffusers import UNet2DConditionModel,LMSDiscreteScheduler## Initializing a scheduler
scheduler = LMSDiscreteScheduler(beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear", num_train_timesteps=1000)
## Initializing the U-Net model
sd_path = r'/media/stable_diffusion/stable-diffusion-v1-4'
unet = UNet2DConditionModel.from_pretrained(sd_path,subfolder="unet",local_files_only=True,torch_dtype=torch.float16).to("cuda")

4. 可视化Scheduler

正如大家从上面的代码中观察到的那样,我们不仅导入了 unet,还导入了一个scheduler库。scheduler的目的是确定在扩散过程中的给定的步骤中向latent 添加多少噪声。我们使用以下代码来可视化 scheduler 函数:

## Setting number of sampling steps
scheduler.set_timesteps(51)
plt.plot(scheduler.sigmas)
plt.xlabel("Sampling step")
plt.ylabel("sigma")
plt.title("Schedular routine")
plt.show()

得到结果如下:
在这里插入图片描述

可以看到,随着sample step的增大,我们添加噪声的权重在逐渐减小。

5. 可视化扩散过程

扩散过程遵循上述采样Scheduler,我们从高噪声开始,然后逐渐按照schedulerlatent_img添加对应权重的噪声。让我们可视化一下这个过程:

img_path = r'/home/VAEs/Scarlet-Macaw-2.jpg'
img = Image.open(img_path).convert("RGB").resize((512, 512))
latent_img = pil_to_latents(img, vae)
# Random noise
noise = torch.randn_like(latent_img) 
fig, axs = plt.subplots(2, 3, figsize=(16, 12))
for c, sampling_step in enumerate(range(0,51,10)):encoded_and_noised = scheduler.add_noise(latent_img, noise, timesteps=torch.tensor([scheduler.timesteps[sampling_step]]))axs[c//3][c%3].imshow(latents_to_pil(encoded_and_noised,vae)[0])axs[c//3][c%3].set_title(f"Step - {sampling_step}")
plt.show()

得到结果如下:
在这里插入图片描述

6. 生成Unet输入

接着我们需要对latent_img, 随机添加一些噪声,用以作为我们Unet输入的Noisy Latent , 代码如下:

encoded_and_noised = scheduler.add_noise(latent_img, noise, timesteps=torch.tensor([scheduler.timesteps[40]])) 
latents_to_pil(encoded_and_noised,vae)[0]

得到结果如下:

在这里插入图片描述

7. 调用Unet去噪

接着我们就可以使用Unet对其进行去噪了,相应的调用代码如下:

prompt = [""]
text_input = tokenizer(prompt, padding="max_length",max_length=tokenizer.model_max_length,truncation=True,return_tensors="pt")
with torch.no_grad():text_embeddings = text_encoder(text_input.input_ids.to("cuda"))[0]latent_model_input = torch.cat( [encoded_and_noised.to("cuda").float()]).half()
with torch.no_grad():noise_pred = unet(latent_model_input,40,encoder_hidden_states=text_embeddings)["sample"]
out_images = latent_to_pil((encoded_and_noised - noise_pred),vae)
plt.imshow(out_images[0])
plt.show()

得到去噪后结果如下:

在这里插入图片描述

我们也可以使用以下代码来将Unet预测出来的噪声进行可视化,代码如下:

out_noises = latent_to_pil( noise_pred,vae)
plt.imshow(out_noises[0])
plt.show()

得到结果如下:
在这里插入图片描述

8. Unet 在SD中的用途

潜在扩散模型使用U-Net分几个步骤通过逐渐减去潜伏空间中的噪声,来达到所需要的输出。在每一步中,添加到latents中的噪声量都会减少,直到我们达到最终的去噪输出。

我们知道,在深度学习领域U-Nets最先被引入用于生物医学图像分割任务。U-Net 有一个编码器和解码器,它们由 ResNet blocks组成。在stable diffusion中的U-Net还具有交叉注意力层,使它们能够根据提供的文本描述来控制调整输出。交叉注意力层通常添加到U-Net的编码器和解码器之间。可以在此处了解有关此 U-Net 架构的更多信息。

9. 总结

本文重点介绍了SD模型中的Unet组件的相关功能和具体工作原理,并详细介绍了其去噪过程;至此,我们完成了稳定扩散模型的三个关键组件,即 CLIP 文本编码器、VAE U-Net。在下一篇文章中,我们将研究使用这些组件的扩散过程。

您学废了嘛!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/439432.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hbase-2.4.11_hadoop-3.1.3集群_大数据集群_SSH修改默认端口22为其他端口---记录025_大数据工作笔记0185

其实修改起来非常简单,但是在大数据集群中,使用到了很多的脚步,也需要修改, 这里把,大数据集群,整体如何修改SSH端口,为22022,进行总结一下: 0.hbase-2.4.11的话,hbase集群修改默认SSH端口22,修改成22022,需要修改 需要修改/opt/module/hbase-2.4.11/conf/hbase-env.sh 这里…

【Linux操作系统】:Linux开发工具编辑器vim

目录 Linux 软件包管理器 yum 什么是软件包 注意事项 查看软件包 如何安装软件 如何卸载软件 Linux 开发工具 Linux编辑器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 插入模式 插入模式切换为命令模式 移动光标 删除文字 复制 替换 撤销 跳至指…

操作系统(8)---进程的同步与互斥以及信号量机制

目录 一.进程的同步与互斥 1.进程的异步和同步 2.进程互斥 3.进程互斥的软件实现方法 (1)单标志法 (2)双标志法 (3)双标志后检查 (4)Peterson算法 4.进程互斥的硬件实现方法…

计算机网络-数据交换方式(电路交换 报文交换 分组交换及其两种方式 )

文章目录 为什么要数据交换?总览电路交换电路交换的各个阶段建立连接数据传输释放连接 电路交换的特点电路交换的优缺点 报文交换报文交换流程报文交换的优缺点 分组交换分组交换流程分组交换的优缺点 数据交换方式的选择分组交换的两种方式数据报方式数据报方式的特…

【超详细教程】GPT-SoVITs从零开始训练声音克隆教程(主要以云端AutoDL部署为例)

目录 一、前言 二、GPT-SoVITs使用教程 2.1、Windows一键启动 2.2、AutoDL云端部署 2.3、人声伴奏分离 2.4、语音切割 2.5、打标训练数据 2.6、数据集预处理 2.7、训练音频数据 2.8、推理模型 三、总结 一、前言 近日,RVC变声器的创始人(GitH…

回显服务器(基于UDP)

目录 基本概念 API学习 DatagramSocket DatagramPacket InetSocketAddress 回显服务器实现 服务端 思路分析 具体实现 完整代码 客户端 思路分析 具体实现 完整代码 运行测试 基本概念 发送端和接收端 在一次网络数据传输时: 发送端:…

还在担心报表不好做?不用怕,试试这个方法

前言 在各种业务场景中,我们经常需要生成各种报表,例如学校中的学生成绩表、商业场景中的销售单和发票单、测量检测场景中的检测报告等等。这些报表对于组织和管理数据非常重要,因为它们提供了直观、清晰的方式来展示和分析数据。 一般情况…

【习题】保存应用数据

判断题 1. 首选项是关系型数据库。 错误(False) 2. 应用中涉及到Student信息,如包含姓名,性别,年龄,身高等信息可以用首选项来存储。 错误(False) 3. 同一应用或进程中每个文件仅存在一个Preferences实例。 正确(True) 单选题 …

西瓜书学习笔记——密度聚类(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 密度聚类是一种无监督学习的聚类方法,其目标是根据数据点的密度分布将它们分组成不同的簇。与传统的基于距离的聚类方法(如K均值)不同,密度聚类方法不需要预先指定簇的数量,而是通…

【-快速录用】2024年大数据经济与社会文化国际学术会议(ICBDESC 2024)

【-快速录用】2024年大数据经济与社会文化国际学术会议(ICBDESC 2024) 2024 International Conference Big Data Economy and Social Culture 一、【会议简介】 随着大数据技术的飞速发展,全球范围内对大数据经济与社会文化的研究愈发深入。为了促进国际间学术交流…

【学网攻】 第(15)节 -- 标准ACL访问控制列表

系列文章目录 目录 系列文章目录 文章目录 前言 一、ACL(访问控制列表)是什么? 二、实验 1.引入 实验拓扑图 实验配置 测试PC2能否Ping通PC3 配置ACL访问控制 实验验证 PC1 Ping PC3 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认…

java OA办公自动化系统

java OA办公自动化系统,java项目,springboot项目。eclipse和idea都能打开运行。 前端技术:Bootstrap,Jquery,My97 DatePicker,kindeditor,freemarker 后端技术:SpringBoot&#xf…