Stable Diffusion经典应用场景

news2024/11/21 10:50:03

🌺系列文章推荐🌺

扩散模型系列文章正在持续的更新,更新节奏如下,先更新SD模型讲解,再更新相关的微调方法文章,敬请期待!!!(本文及其之前的文章均已更新

 SD模型原理:

  1. Stable Diffusion概要讲解
  2. Stable diffusion详细讲解
  3. Stable Diffusion的加噪和去噪详解
  4. Diffusion Model
  5. Stable Diffusion核心网络结构——VAE
  6. Stable Diffusion核心网络结构——CLIP Text Encoder
  7. Stable Diffusion核心网络结构——U-Net
  8. Stable Diffusion中U-Net的前世今生与核心知识
  9. SD模型性能测评
  10. Stable Diffusion经典应用场景
  11. SDXL的优化工作

微调方法原理:

  1. DreamBooth
  2. LoRA
  3. LORA及其变种介绍
  4. ControlNet
  5. ControlNet文章解读
  6. Textual Inversion 和 Embedding fine-tuning

​​​ 目录

文本生成图像(txt2img)

【一】生成图片的尺寸(width和height)

【二】推理步数(steps、num_inference_steps或者Sampling steps)

【三】guidance_scale(guidance_scale或者CFG Scale)

【四】Negative Prompt

图像生成图像(img2img)

图像重绘(Inpainting)

图像的可控生成(使用ControlNet辅助生成)

图像超分辨率重建


摘录来源:https://zhuanlan.zhihu.com/p/632809634

在本章节中,将详细介绍Stable Diffusion的五大经典应用,并梳理各个经典应用场景的完整工作流(Workflow),清晰直观的展示SD应用场景的每个细节流程,让大家对SD经典应用场景有更深的理解。【这里主要介绍其中两种:文生图和图生图】

文本生成图像(txt2img)

文本生成图像是SD系列模型最基础也是最核心的应用功能,下面是SD系列模型进行文本生成图像的完整流程:

​​
SD系列模型文本生图像的完整流程

根据上面的完整流程图,我们
结构化分析一下SD系列模型进行文本生成图像的脉络:

  • 输入:将输入的文本(prompt)通过Text Encoder提取出Text Embeddings特征(77x768);同时初始化一个Latent空间的随机高斯噪声矩阵(维度为64x64x4,对应512x512分辨率图像)。
  • 生成过程:将Text Embeddings特征和随机高斯噪声矩阵通过CrossAttention机制送入U-Net中,结合Scheduler algorithm(调度算法)【和采样算法】迭代去噪,经过N次迭代后生成去噪后的Latent特征。
  • 输出:将去噪后的Latent特征送入VAE的Decoder模块,重建出像素级图像(512x512分辨率)。

节点式结构图展示一下SD模型进行文本生成图像的全部流程:

​​
SD模型进行文生图的节点式结构图

其中Load Checkpoint模块代表对SD系列模型的主要结构的权重进行加载初始化(VAE、U-Net、Text Encoder),CLIP Text Encode表示文本编码器,可以输入Prompt和Negative Prompt,来控制图像的生成,Empty Latent Image表示初始化的高斯噪声,KSampler表示调度算法以及SD相关生成参数,VAE Decode表示使用VAE的解码器将Latent特征转换成像素级图像。

SD在推理过程中的几个重要参数:

  • 生成图片的尺寸(width和height)
  • 推理步数(steps、num_inference_steps或者Sampling steps)
  • guidance_scale(guidance_scale或者CFG Scale)
  • Negative Prompt
【一】生成图片的尺寸(width和height)

之前我们已经讲过,SD模型是在512x512分辨率的数据上进行训练的,所以在默认情况下生成512x512分辨率的图片效果最好

SD本身的模型结构也是支持任意尺寸的图像生成的,因为SD模型中的VAE支持任意尺寸图像的编码和解码,U-Net部分(只有卷积结构和Attention机制,没有全连接层)也是支持任意尺寸的Latent特征的生成

然而,由于原生SD模型在训练时输入尺寸是固定的,这就导致了实际使用时生成512x512分辨率以外的图像会出现问题。在生成低分辨率(比如256x256)图像时,图像的质量会大幅度下降;在生成高分辨率(比如768x512、512x768、768x768、1024x1024)的图像时,图像质量虽然没问题,但是可能会出现物体特征重复、物体被拉长、主体结构崩坏等问题。

解决这个问题的一个直观有效的方法是进行多尺度训练。在传统深度学习时代,这是YOLO系列模型的一个必备训练方法,终于跨过周期在AIGC时代重新繁荣,并由NovelAI优化后变成了适合于SD系列模型的Aspect Ratio Bucketing策略。

【二】推理步数(steps、num_inference_steps或者Sampling steps)

num_inference_steps表示SD系列模型在推理过程中的去噪次数或者采样步数。一般来说,我们可以设置num_inference_steps在20-50之间,其中设置的采样步数越大,图像的生成效果越好,但同时生成所需的时间就越长

到这里大家可能会有疑问,为什么SD系列模型在训练时设置1000的noise scheduler,在推理时却只用设置20-50的noise scheduler?

这是因为,虽然SD模型在训练时参照DDPM采样方法,但推理时可以使用DDIM这个采样方法,DDIM通过去马尔可夫化,让SD模型在推理时可以进行“跳步”,抽取短的子序列作为noise scheduler,大大减少了推理步数

当然的,除了使用DDIM采样方法,我们也可以使用其他的采样方法,目前主流的采样方法有DPM系列、DPM++系列、Euler系列、LMS系列、Heun、UniPC、Restart等。

【三】guidance_scale(guidance_scale或者CFG Scale)

guidance_scale代表CFG(无分类指引,Classifier-free guidance,guidance_scale)的权重,当设置的guidance_scale越大时,文本的控制力会越强,SD模型生成的图像会和输入文本更一致。通常guidance_scale可以设置在7-8.5之间,就会有不错的生成效果。如果使用非常大的guidance_scale值(比如11-12),生成的图像可能会过饱和,同时多样性会降低

当我们使用CFG之后,SD模型在去噪过程会同时依赖条件扩散模型和无条件扩散模型:

​其中w代表guidance_scale,当w越大时,输入文本起的作用越大,即生成的图像更和输入文本一致,当w被设置为0时,图像的生成是无条件的,输入文本会被忽略。

【四】Negative Prompt

我们可以使用Negative Prompt来避免生成我们不想要的内容,从而改善图像生成效果。

Negative Prompt和CFG有关,下面的公式中包含了条件扩散模型和无条件扩散模型:

Negative Prompt就是无条件扩散模型的文本输入,只是SD模型的训练过程中我们将文本设置为空字符串来实现无条件扩散模型,即negative_prompt = ""。当推理阶段我们开始使用Negative Prompt时,这部分的文本不再为空,并且从上述公式可以看出无条件扩散模型是我们想远离的分布。

图像生成图像(img2img)

SD模型的图生图功能是以文生图功能为基础的一个拓展功能,和文生图相比,图生图的初始Latent特征不再是一个随机噪声,而是初始输入图像通过VAE编码之后加上一定高斯噪声(扩散过程)的Latent特征。然后使用SD模型进行去噪操作,此时去噪的步数要和加噪的步数保持一致,这样才能生成整体布局与初始图像一致的无噪声图像。

​​
SD模型的图生图过程

与此同时,我们【通过调度器】设置一个去噪强度(Denoising strength)来控制加入多少噪声。如果设置Denoising strength = 0,就不添加噪声。如果设置Denoising strength = 1,则添加噪声原始图像成为一个随机噪声矩阵,此时就相当于进行文生图的流程了。

​​
去噪强度(Denoising strength)控制噪音的加入量

讲完了图生图的完整流程,我们在结构化分析一下SD系列模型进行图生图的脉络:

  • 输入:将输入的文本(prompt)通过Text Encoder提取出Text Embeddings特征(77x768);同时将初始图像通过VAE编码成一个Latent特征(维度为64x64x4,对应512x512分辨率图像)。
  • 生成过程:通过扩散过程往Latent特征中加入N次迭代的噪声,再将Text Embeddings特征和随机高斯噪声矩阵通过CrossAttention机制送入U-Net中,结合Scheduler algorithm(调度算法)【和采样算法】迭代去噪,经过N次迭代后生成去噪后的Latent特征。
  • 输出:将去噪后的Latent特征送入VAE的Decoder模块,重建出像素级图像(512x512分辨率)。

下面Rocky再用节点式结构图展示一下SD模型进行图生图的全部流程:

​​
SD模型进行图生图的节点式结构图

其中Load Checkpoint模块代表对SD模型的主要结构进行初始化(VAE、U-Net、Text Encoder),CLIP Text Encode表示文本编码器,可以输入Prompt和Negative Prompt,来控制图像的生成,Load Image表示输入的初始图像,KSampler表示调度算法以及SD相关生成参数,VAE Encode表示使用VAE的编码器将初始图像转换成Latent特征,VAE Decode表示使用VAE的解码器将Latent特征转换成像素级图像。

图像重绘(Inpainting)

图像inpainting最初用在图像修复上,是一种图像修复技术,可以将图像中的水印、噪声、标志等瑕疵去除。

传统的图像inpainting过程可以分为两步:

  1. 找到图像中的瑕疵部分
  2. 对瑕疵部分进行重绘去除,并填充图像内容使得图像语义完整自然。

在AIGC时代,图像inpainting再次繁荣,成为Stable Diffusion的经典应用场景,在图像编辑上重新焕发生机。

那么什么是图像编辑呢?

图像编辑是指对图像进行修改、调整和优化的过程。它可以包括对图像的颜色、对比度、亮度、饱和度等进行调整,以及修复图像中的缺陷、删除不需要的元素、添加新的图像内容等操作。

在SD中,主要是通过给定一个想要编辑的区域mask,并在这个区域mask圈定的范围内进行文本生成图像的操作,从而编辑mask区域的图像内容

SD中的图像inpainting流程如下所示:

SD中的图像inpainting流程
SD中的图像inpainting流程

从上图可以看出,图像inpainting整体上和图生图流程一致,不过为了保证mask以外的图像区域不发生改变,在去噪过程的每一步,我们利用mask将Latent特征中不需要重建的部分都替换成原图最初的特征只在mask部分进行特征的重建与优化

在加入了mask后,SD模型的输入通道数也发生了变化,文生图和图生图任务中,SD的输入是64x64x4,而在图像inpainting任务中,增加了mask(64x64x1),所以此时SD的输入为64x64x5。

讲完了图像inpainting的完整流程,我们在结构化分析一下SD系列模型进行图像inpainting的脉络:

  • 输入:输入的文本(prompt)通过Text Encoder提取出Text Embeddings特征(77x768);同时将初始图像Mask通过VAE分别编码成两个Latent特征(维度分别为64x64x4和64x64x1,对应512x512分辨率图像)。
  • 生成过程:通过扩散过程往Latent特征中加入N次迭代的噪声,但只影响Mask涵盖的区域,再将Text Embeddings特征和随机高斯噪声矩阵通过CrossAttention机制送入U-Net中,结合Scheduler algorithm(调度算法)迭代去噪,经过N次迭代后生成去噪后的Latent特征。
  • 输出:将去噪后的Latent特征送入VAE的Decoder模块,重建出像素级图像(512x512分辨率)。

下面Rocky再用节点式结构图展示一下SD模型进行图像inpainting的全部流程:

SD模型进行图像inpainting的节点式结构图

其中Load Checkpoint模块代表对SD模型的主要结构进行加载(VAE、U-Net、Text Encoder)。CLIP Text Encode表示SD模型的文本编码器,可以输入Prompt和Negative Prompt,来引导图像的生成。Load Image表示输入的图像和mask。KSampler表示调度算法以及SD相关生成参数。VAE Encode表示使用VAE的Encoder将输入图像和mask转换成Latent特征,VAE Decode表示使用VAE的Decoder将Latent特征重建成像素级图像。

下面就是进行图像inpainting的直观过程:

由于图像inpainting和图生图的操作一样,只是在SD模型原有的基础上扩展了它的能力,并没有去微调SD模型,所以如何调整各种参数成为了生成优质图片的关键。

当然的,也有专门用于图像inpainting的SD模型,比如说Stable Diffusion Inpainting模型,是以SD 1.2为基底模型微调而来,同时在输入端增加了经过mask处理的图像的Latent特征(64x64x4)和mask(64x64x1),所以此时SD的输入为64x64x9,同时新增的部分设置权重全零初始化。Stable Diffusion Inpainting模型由于经过专门的inpainting训练,在生成细节上比起常规SD模型会更好,但是相应的常规文生图的能力会有一定的减弱。

图像的可控生成(使用ControlNet辅助生成)

SD系列模型的可控生成主要依赖于ControlNet等控制模型,可以与文生图、图生图以及图像Inpainting等任务结合使用。

ControlNet的核心基础知识:

  1. ControlNet
  2. ControlNet文章解读

下面Rocky用节点式结构图展示一下SD模型使用ControlNet辅助生成的全部流程:

SD模型使用ControlNet辅助生成的节点式结构图

其中Load Checkpoint模块代表对SD模型的主要结构进行初始化(VAE、U-Net、Text Encoder),CLIP Text Encode表示文本编码器,可以输入Prompt和Negative Prompt,来控制图像的生成,Load Image表示输入的ControlNet需要的预处理图Empty Latent Image表示初始化的高斯噪声Load ControlNet Model表示对ControlNet进行初始化,KSampler表示调度算法以及SD相关生成参数,VAE Decode表示使用VAE的解码器将Latent特征转换成像素级图像。

使用ControlNet辅助生成图片

图像超分辨率重建

图像超分辨率重建可以说是图像生成任务的一个后处理功能,用于获得高分辨率的高质量图像。

目前主流的超分模型主要分两类,一类是基于传统深度学习时代的GAN模型(R-ESRGAN、ESRGAN、ScuNET GAN等),另外一类是基于AIGC时代的扩散模型(LDSR、stable-diffusion-x4-upscaler等)。

下面Rocky用节点式结构图展示一下SD模型进行图像超分辨率重建的全部流程:

图像超分辨率重建的节点式结构图

在结构图中可以看到,整体流程与文生图和图生图一致,在此基础上增加了Upscale Image表示对生成的图片进行超分操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

linux 常用命令指南(存储分区、存储挂载、docker迁移)

前言:由于目前机器存储空间不够,所以‘斥巨资’加了一块2T的机械硬盘,下面是对linux扩容的一系列操作,包含了磁盘空间的创建、删除;存储挂载;docker迁移;anaconda3迁移等。 一、存储分区 1.1 …

AI时代,百度的三大主义

现实主义、长期主义、理想主义。 定焦One(dingjiaoone)原创 作者 | 苏琦 郑浩钧 编辑 | 魏佳 “人工智能很像是一次新的工业革命,这意味着它不会三五年就结束,也不会一两年就出现‘超级应用’,它更像是三五十年对于整…

服务器Docker OOM RSS高问题排查思路

优质博文:IT-BLOG-CN 防走弯路为防止走弯路,强烈建议先仔细阅读以下加粗内容: 如果你的应用是因为公司最近降成本调小实例物理内存才出现docker oom,而之前从来没有出现过,那么大概率是堆内存太大导致,这种…

Ubuntu Linux使用前准备动作_使用root登录图形化界面

Ubuntu默认是不允许使用 root 登录图形化界面的。这是出于安全考虑的设置。但如果有需要,可以通过以下步骤来实现使用 root 登录: 1、设置 root 密码 打开终端,使用当前的管理员账户登录系统。在终端中输入命令sudo passwd root&#xff0c…

core 不可变类型 线程安全 record

当一个类型的对象在创建时被指定状态后,就不会再变化的对象,我们称之为不可变类型。这种类型是线程安全的,不需要进行线程同步,非常适合并行计算的数据共享。它减少了更新对象会引起各种bug的风险,更为安全。 System.D…

Python-简单病毒程序合集(一)

前言:简单又有趣的Python恶搞代码,往往能给我们枯燥无味的生活带来一点乐趣,激发我们对编程的最原始的热爱。那么话不多说,我们直接开始今天的编程之路。 编程思路:本次我们将会用到os,paltform,threading,ctypes,sys,…

ForEach刷新UI机制

官网地址:ForEach 在ArkUI中,提供了ForEach循环语句,用来初始化一个列表数据,我们知道,当ForEach中的数组发生变化时,会引起UI的刷新,但是究竟如何变化,会引起UI怎样的刷新&#xf…

如何解决pdf.js跨域从url动态加载pdf文档

摘要 当我们想用PDF.js从URL加载文档时,将会因遇到跨域问题而中断,且是因为会触发了PDF.js和浏览器的双重CORS block,这篇文章将会介绍:①如何禁用pdf.js的跨域?②如何绕过浏览器的CORS加载URL文件?②如何使…

Three.js 相机控制器Controls

在 3D 场景中,摄像机的控制尤为重要,因为它决定了用户如何观察和与场景互动。Three.js 提供了多种相机控制器,最常用的有 OrbitControls、TrackballControls、FlyControls 和 FirstPersonControls。OrbitControls 适合用于查看和检查 3D 模型…

C++小白实习日记——Day 5 gitee怎么删文件,测试文件怎么写循环

昨晚一直内耗,一个程序写了三天写不出来,主要是耗时太多了,老板一直不满意。想在VScode上跑一下,昨晚一直报错。今天来公司重新搞了一下, 主要工作有: 1,读取当前时间用tscns 2,输…

【从零开始的LeetCode-算法】3301. 高度互不相同的最大塔高和

给你一个数组 maximumHeight ,其中 maximumHeight[i] 表示第 i 座塔可以达到的 最大 高度。 你的任务是给每一座塔分别设置一个高度,使得: 第 i 座塔的高度是一个正整数,且不超过 maximumHeight[i] 。所有塔的高度互不相同。 请…

利用uniapp开发鸿蒙:运行到鸿蒙模拟器—踩坑合集

从uniapp运行到鸿蒙模拟器上这一步,就有非常多的坑,一些常见的坑,官网都有介绍,就不再拿出来了,这里记录一下官网未记录的大坑 1.运行路径从hbuilderx启动鸿蒙模拟器 解决方法: Windows系统,官…

基于UDP和TCP实现回显服务器

目录 一. UDP 回显服务器 1. UDP Echo Server 2. UDP Echo Client 二. TCP 回显服务器 1. TCP Echo Server 2. TCP Echo Client 回显服务器 (Echo Server) 就是客户端发送什么样的请求, 服务器就返回什么样的响应, 没有任何的计算和处理逻辑. 一. UDP 回显服务器 1. UD…

游戏引擎学习第17天

视频参考:https://www.bilibili.com/video/BV1LPUpYJEXE/ 回顾上一天的内容 1. 整体目标: 处理键盘输入:将键盘输入的处理逻辑从平台特定的代码中分离出来,放入更独立的函数中以便管理。优化消息循环:确保消息循环能够有效处理 …

Ubuntu常见命令

关于export LD_LIBRARY_PATHcmake默认地址CMakelists.txt知识扩充/home:挂载新磁盘到 /home 子目录 关于export LD_LIBRARY_PATH 程序运行时默认的依赖库的位置包括lib, /usr/lib ,/usr/local/lib 通过命令export LD_LIBRARY_PATHdesired_path:$LD_LIBRARY_PATH追加…

Linux驱动开发快速入门——字符设备驱动(直接操作寄存器设备树版)

Linux驱动开发快速入门——字符设备驱动 前言 笔者使用开发板型号:正点原子的IMX6ULL-alpha开发板。ubuntu版本为:20.04。写此文也是以备忘为目的。 字符设备驱动 本小结将以直接操作寄存器的方式控制一个LED灯,可以通过read系统调用可以…

论文阅读 SeedEdit: Align Image Re-Generation to Image Editing

目录 摘要 1 INTRODUCTION 2 SEEDEDIT 2.1 T2I MODEL FOR EDITING DATA GENERATION 2.2 CAUSAL DIFFUSION MODEL WITH IMAGE INPUT 2.3 ITERATIVE ALIGNMENT 3 EXPERIMENTS 3.1 BENCHMARK AND METRICS 3.2 IMAGE EDITING COMPARISON 4 CONCLUSION 摘要 SeedEdit&…

代码随想录算法训练营day41|动态规划04

最后一块石头的重量|| 返回剩余最后一块石头石头最小的可能重量,那么就应该最后剩余的两块石头尽量都等于或接近总重量的一半,这样剩下的就是一半的质量 目标和 给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有…

【C++】绘制内存管理的地图

生活是属于每个人自己的感受,不属于任何人的看法。 前言 这是我自己学习C的第二篇博客总结。后期我会继续把C学习笔记开源至博客上。 上一期笔记是关于C的类与对象础知识,没看的同学可以过去看看: 【C】面向对象编程的艺术之旅-CSDN博客https…

【AI大模型引领变革】探索AI如何重塑软件开发流程与未来趋势

文章目录 每日一句正能量前言流程与模式介绍【传统软件开发 VS AI参与的软件开发】一、传统软件开发流程与模式二、AI参与的软件开发流程与模式三、AI带来的不同之处 结论 AI在软件开发流程中的优势、挑战及应对策略AI在软件开发流程中的优势面临的挑战及应对策略 结论 后记 每…