稳定扩散的技术介绍
原文:
machinelearningmastery.com/a-technical-introduction-to-stable-diffusion/
GPT-3 的出现,特别是其聊天机器人形式,即 ChatGPT,已被证明是 AI 领域的一个重要时刻,标志着生成性 AI(GenAI)革命的开始。尽管在图像生成领域之前已经存在模型,但正是 GenAI 浪潮引起了所有人的关注。
稳定扩散是用于图像生成的 GenAI 家族的一员。它因其定制可能性、自由可在自己的硬件上运行和积极改进而闻名。它并不是唯一的。例如,OpenAI 发布了 DALLE-3,作为其 ChatGPTPlus 订阅的一部分,用于图像生成。但是,稳定扩散在从文本以及其他现有图像生成图像方面表现出了显著的成功。最近将视频生成能力集成到扩散模型中的发展,为研究这一前沿技术提供了令人信服的案例。
在这篇文章中,你将学习一些关于稳定扩散的技术细节以及如何在自己的硬件上进行设置。
启动你的项目,请参考我的书籍《掌握稳定扩散的数字艺术》。它提供了自学教程和有效代码。
让我们开始吧。
稳定扩散的技术介绍
照片由Denis Oliveira提供。版权所有。
概述
本文分为四部分;它们是:
-
扩散模型如何工作
-
扩散模型的数学
-
为什么稳定扩散特别
-
如何安装稳定扩散 WebUI
扩散模型如何工作
为了理解扩散模型,我们首先回顾一下在稳定扩散或其今天的同类出现之前,图像生成是如何通过机器进行的。一切始于 GANs(生成对抗网络),其中两个神经网络通过竞争和合作的学习过程进行交互。
第一个是生成器网络,它制造合成数据,在这种情况下,是无法与真实数据区分的图像。它生成随机噪声,并通过多个层逐步精炼,从而生成越来越逼真的图像。
第二个网络,即判别器网络,作为对手,审查生成的图像,以区分真实和合成图像。其目标是准确地将图像分类为真实或虚假。
U-Net GAN 架构。来自 Schonfeld 等(2020)
扩散模型假设噪声图像或纯噪声是将噪声(或高斯噪声)重复叠加在原始图像上的结果。这一噪声叠加过程称为正向扩散。与此完全相反的是反向扩散,它涉及从噪声图像一步步转变为较少噪声的图像。
以下是从右到左的正向扩散过程的示意图,即从清晰到噪声图像。
扩散过程。图源自 Ho 等人(2020 年)
扩散模型的数学
正向和反向扩散过程都遵循马尔可夫链,这意味着在任何时间步 t t t,图像中的像素值或噪声仅依赖于前一个图像。
正向扩散
从数学上讲,正向扩散过程中的每一步可以使用以下方程表示:
q ( x t ∣ x t − 1 ) = N ( x t ; μ t = 1 − β t x t − 1 , Σ t = β t I ) q(\mathbf{x}_t\mid \mathbf{x}_{t-1}) = \mathcal{N}(\mathbf{x}_t;\mu_t = \sqrt{1-\beta_t}\mathbf{x}_{t-1}, \Sigma_t = \beta_t \mathbb{I}) q(xt∣xt−1)=N(xt;μt=1−βtxt−1,Σt=βtI)
其中 q ( x t ∣ x t − 1 ) q(x_t\mid x_{t-1}) q(xt∣xt−1)是均值为 μ t = 1 − β t x t − 1 \mu_t = \sqrt{1-\beta_t}x_{t-1} μt=1−βtxt−1、方差为 Σ t = β t I \Sigma_t = \beta_t \mathbb{I} Σt=βtI的正态分布, I \mathbf{I} I是单位矩阵,每一步的图像(作为潜在变量) x t \mathbf{x}_t xt是一个向量,均值和方差由标量值 β t \beta_t βt参数化。
正向扩散 q ( x t ∣ x t − 1 ) q(\mathbf{x}_t\mid\mathbf{x}_{t-1}) q(xt∣xt−1)和反向扩散 p θ ( x t − 1 ∣ x t ) p_\theta(\mathbf{x}_{t-1}\mid\mathbf{x}_t) pθ(xt−1∣xt)。图源自 Ho 等人(2020 年)
因此,正向扩散过程中的所有步骤的后验概率定义如下:
q ( x 1 : T ∣ x 0 ) = ∏ t = 1 T q ( x t ∣ x t − 1 ) q(\mathbf{x}_{1:T}\mid \mathbf{x}_0) = \prod_{t=1}^T q(\mathbf{x}_t\mid\mathbf{x}_{t-1}) q(x1:T∣x0)=t=1∏Tq(xt∣xt−1)
在这里,我们从时间步 1 应用到 T T T。
反向扩散
反向扩散,即正向扩散过程的相反过程,工作原理类似。正向过程根据先验概率映射后验概率,而反向过程则相反,即根据后验概率映射先验概率。
p θ ( x t − 1 ∣ x t ) = N ( x t − 1 ; μ θ ( x t , t ) , Σ θ ( x t , t ) ) p_\theta(\mathbf{x}_{t-1}\mid\mathbf{x}_t) = \mathcal{N}(\mathbf{x}_{t-1};\mu_\theta(\mathbf{x}_t,t),\Sigma_\theta(\mathbf{x}_t,t)) pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))
其中 p θ p_\theta pθ应用反向扩散,也称为轨迹。
当时间步 t t t趋近于无穷大时,潜在变量 x T \mathbf{x}_T xT趋向于几乎各向同性的高斯分布(即纯噪声没有图像内容)。目标是学习 q ( x t − 1 ∣ x t ) q(\mathbf{x}_{t-1}\mid \mathbf{x}_t) q(xt−1∣xt),其中过程从称为 x T \mathbf{x}_T xT的 N ( 0 , I ) \mathcal{N}(0,\mathbf{I}) N(0,I)样本开始。我们逐步执行完整的反向过程,逐步达到从 q ( x 0 ) q(\mathbf{x}_0) q(x0)中提取样本,即从实际数据分布中生成的数据。通俗地说,反向扩散就是通过许多小步骤从随机噪声中创建图像。
为什么稳定扩散特别?
稳定扩散不直接将扩散过程应用于高维输入,而是使用编码器网络将输入投影到降维的潜在空间中(这是扩散过程发生的地方)。采用这种方法的理由是通过在较低维空间内处理输入来减少训练扩散模型所涉及的计算负载。随后,使用传统的扩散模型(如 U-Net)生成新数据,并使用解码器网络进行上采样。
如何安装稳定扩散 WebUI?
您可以通过订阅将稳定扩散作为服务使用,也可以将其下载并在您的计算机上运行。在计算机上使用它有两种主要方式:WebUI 和 CompfyUI。这里将向您展示如何安装 WebUI。
注意: 稳定扩散需要大量计算资源。为了获得合理的性能,您可能需要一台配备支持的 GPU 的良好硬件。
Python 编程语言的稳定扩散 WebUI 软件包可从其 GitHub 页面 免费下载和使用。以下是在 Apple Silicon 芯片上安装该库的步骤,其他平台大部分也是相同的:
-
-
先决条件。 完成此过程的先决条件之一是设置能够运行 WebUI 的环境。这是一个基于 Python 的 Web 服务器,其 UI 使用 Gradio 构建。设置大多是自动完成的,但您应确保某些基本组件可用,如
git
和wget
。运行 WebUI 时,将创建一个 Python 虚拟环境。在 macOS 中,您可能希望使用 Homebrew 安装 Python 系统,因为某些依赖项可能需要比 macOS 默认提供的版本更新的 Python 版本。参见 Homebrew 安装指南。然后,您可以使用以下命令在 Homebrew 中安装 Python:
brew install cmake protobuf rust python@3.10 git wget
-
下载。 WebUI 是 GitHub 上的一个存储库。要将 WebUI 的副本复制到您的计算机上,可以运行以下命令:
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
这将创建一个名为
stable-diffusion-webui
的文件夹,接下来的步骤应在此文件夹中进行。 -
检查点。 WebUI 用于运行流程,但稳定的扩散模型未包含在内。您需要下载模型(也称为检查点),并且有多个版本可供选择。这些可以从各种来源下载,最常见的是从 HuggingFace。接下来的部分将详细介绍这一步骤。所有稳定的扩散模型/检查点应放置在目录
stable-diffusion-webui/models/Stable-diffusion
中。 -
首次运行。 使用命令行导航到
stable-diffusion-webui
目录,并运行./webui.sh
来启动 Web UI。此操作将使用venv
创建并激活 Python 虚拟环境,自动获取和安装任何剩余的必需依赖项。首次运行 WebUI 时安装的 Python 模块
-
后续运行。 要访问 Web UI,请在 WebUI 目录中重新运行
./webui.sh
。请注意,WebUI 不会自动更新;要更新它,您必须在运行命令之前执行git pull
以确保使用最新版本。webui.sh
脚本的作用是启动一个 web 服务器,您可以通过浏览器访问稳定扩散。所有交互都应通过浏览器进行,您可以通过关闭 web 服务器(例如,按下运行webui.sh
的终端上的 Control-C)来关闭 WebUI。
-
对于其他操作系统,官方自述文件提供了最佳指导。
如何下载模型?
您可以通过 Hugging Face 下载稳定扩散模型,选择感兴趣的模型并进入“Files and versions”部分。查找以“.ckpt
”或“.safetensors
”扩展名标记的文件,并点击文件大小旁边的右箭头以开始下载。SafeTensor 是 Python 的 pickle 序列化库的替代格式;它们的区别由 WebUI 自动处理,因此您可以将它们视为等效。
如果您通过模型名称“stable-diffusion”在 Hugging Face 上搜索,会有几个模型。
我们可能会在接下来的章节中使用几个官方的稳定扩散模型,包括:
-
稳定扩散 1.4 (
sd-v1-4.ckpt
) -
稳定扩散 1.5 (
v1-5-pruned-emaonly.ckpt
) -
稳定扩散 1.5 修复 (
sd-v1-5-inpainting.ckpt
)
对于稳定扩散版本 2.0 和 2.1,模型和配置文件是必需的。此外,在生成图像时,请确保图像的宽度和高度设置为 768 或更高:
-
稳定扩散 2.0 (
768-v-ema.ckpt
) -
稳定扩散 2.1 (
v2-1_768-ema-pruned.ckpt
)
配置文件可以在 GitHub 的以下位置找到:
下载了上述的 v2-inference-v.yaml
后,您应将其放置在与模型文件名匹配的同一文件夹中(例如,如果您下载了 768-v-ema.ckpt
模型,则应将此配置文件重命名为 768-v-ema.yaml
并与模型一起存储在 stable-diffusion-webui/models/Stable-diffusion
文件夹中)。
也有一个稳定扩散 2.0 深度模型 (512-depth-ema.ckpt
)。在这种情况下,您应从以下地址下载 v2-midas-inference.yaml
配置文件:
并将其保存到模型文件夹中,命名为stable-diffusion-webui/models/Stable-diffusion/512-depth-ema.yaml
。该模型在 512 像素宽/高或更高的图像尺寸下能够实现最佳功能。
另一个可以找到 Stable Diffusion 模型检查点的位置是civitai.com/
,您也可以在这里查看样本。
进一步阅读
以下是上述引用的几篇论文:
-
“基于 U-Net 的生成对抗网络鉴别器”,作者为 Schonfeld,Schiele 和 Khoreva。在 CVPR 2020 年会议论文中,第 8207-8216 页。
-
“去噪扩散概率模型”,作者为 Ho,Jain 和 Abbeel(2020 年)。arXiv 2006.11239
概要
在本文中,我们学习了扩散模型的基础知识及其在各个领域的广泛应用。除了详细阐述它们在图像和视频生成上的最新成功案例之外,我们还讨论了前向和反向扩散过程以及建模后验概率。
Stable Diffusion 的独特方法涉及将高维输入投影到降维的潜在空间中,通过编码器和解码器网络减少计算需求。
接下来,我们将学习使用 Stable Diffusion WebUI 生成图像的实际方面。我们的探索将涵盖模型下载和利用 Web 界面进行图像生成。
图像生成扩散模型简介
原文:
machinelearningmastery.com/brief-introduction-to-diffusion-models-for-image-generation/
生成式机器学习模型的进步使得计算机能够进行创造性工作。在绘画范围内,有几个显著的模型允许您将文本描述转换为像素数组。如今最强大的模型之一属于扩散模型家族。在本文中,您将了解这种模型的工作原理以及如何控制其输出。
使用我的书《稳定扩散的数字艺术》,启动您的项目。它提供了带有工作代码的自学教程。
让我们开始吧。
图像生成扩散模型简介
图片由Dhruvin Pandya提供。部分权利保留。
概述
本文分为三部分,它们是:
-
扩散模型工作流程
-
输出的变化
-
它是如何训练的
扩散模型工作流程
考虑将图片描述文本转换为像素数组的目标,机器学习模型的输出应该是一组 RGB 值。但是您应该如何向模型提供文本输入,以及如何进行转换呢?
由于文本输入描述了输出,模型需要理解文本的含义。对这种描述理解得越好,您的模型生成输出就越精确。因此,将文本视为字符串的琐碎解决方案效果不佳。您需要一个能理解自然语言的模块,而当今的最先进解决方案是将输入表示为嵌入向量。
嵌入表示的输入文本不仅允许您提取文本的含义,还提供了输入的统一形状,因为可以将各种长度的文本转换为张量的标准大小。
有多种方法可以将嵌入表示的张量转换为像素。回想一下生成对抗网络(GAN)的工作原理;您应该注意到这是类似的结构,即输入(文本)被转换为潜在结构(嵌入),然后转换为输出(像素)。
扩散模型是一类神经网络模型,考虑到嵌入是从随机像素恢复图片的提示。下面是来自 Rombach 等人论文的图示,以说明这一工作流程:
稳定扩散架构。Rombach 等人(2021)的图。
在这个图中,工作流程是从右到左。左侧的输出是将张量转换为像素空间,使用标记为 D \mathcal{D} D 的 解码器 网络。右侧的输入转换为嵌入 τ θ \tau_\theta τθ,用于作为 条件张量。关键结构位于中间的潜在空间。生成部分位于绿色框的下半部分,它使用 去噪网络 ϵ θ \epsilon_\theta ϵθ 将 z T z_T zT 转换为 z T − 1 z_{T-1} zT−1。
去噪网络接受输入张量 z T z_T zT 和嵌入 τ θ \tau_\theta τθ,输出张量 z T − 1 z_{T-1} zT−1。输出的张量在某种意义上“比”输入更好,因为它与嵌入的匹配度更高。在最简单的形式下,解码器 D \mathcal{D} D 只是简单地从潜在空间复制输出。去噪网络的输入和输出张量 z T z_T zT 和 z T − 1 z_{T-1} zT−1 是 RGB 像素的数组,网络使其 减少噪声。
它被称为去噪网络,因为它假设嵌入可以完美描述输出,但输入和输出不同,因为一些像素被随机值替代。网络模型旨在去除这些随机值并恢复原始像素。这是一个困难的任务,但模型假设噪声像素是均匀添加的,噪声遵循高斯模型。因此,该模型可以多次重复使用,每次都能改善输入。以下是 Ho 等人论文中的一个概念插图:
去噪图像。图来自 Ho 等人(2020)
因为这种结构,去噪网络假设输入 z T z_T zT 和输出 z T − 1 z_{T-1} zT−1 具有相同的形状,使得网络可以重复使用,直到生成最终输出 z z z。前面的图中的去噪 U-net 块保持输入和输出的形状相同。去噪块在概念上是执行以下操作:
$$
\begin{aligned}
w_t &= \textrm{NoisePredictor}(z_t, \tau_\theta, t) \
z_{t-1} &= z_t – w_t
\end{aligned}
$$
即,噪声成分 w t w_t wt 从噪声图像 z t z_t zt、条件张量 τ θ \tau_\theta τθ 和步骤计数 t t t 中预测。噪声预测器根据 t t t 来估计 z t z_t zt 中的噪声水平,这一水平以最终图像 z = z 0 z=z_0 z=z0 应该是什么由张量 τ θ \tau_\theta τθ 描述。 t t t 的值对预测器有帮助,因为值越大, z t z_t zt 中的噪声越多。
从 z t z_t zt 中减去噪声将得到去噪图像 z t − 1 z_{t-1} zt−1,可以再次输入去噪网络,直到生成 z = z 0 z=z_0 z=z0。网络处理张量的次数 T T T 是整个扩散模型的设计参数。因为在这个模型中,噪声被建模为高斯噪声,解码器 D \mathcal{D} D 的一部分是将潜在空间张量 z z z 转换为三通道张量,并将浮点值量化为 RGB。
输出的变化
一旦神经网络训练完成,每一层的权重将固定,只要输入是确定的,输出也是确定的。然而,在这个扩散模型工作流程中,输入是将被转换为嵌入向量的文本。去噪模型需要额外的输入,即潜在空间中的初始 z T z_T zT张量。这通常是随机生成的,例如通过采样高斯分布并填充去噪网络预期形状的张量。不同的起始张量会产生不同的输出。这就是如何通过相同的输入文本生成不同的输出。
确实,现实要复杂得多。请记住,去噪网络在多个步骤中运行,每一步旨在改善输出,直到产生完美的最终输出。网络可以获得额外的提示,指示它处于哪个步骤(例如,总共 10 步中的第 5 步)。高斯噪声由其均值和方差参数化,你可以提供一个函数来计算。你能够更好地建模每一步预期的噪声,去噪网络就能更好地去除噪声。在稳定扩散模型中,去噪网络需要一个反映该步骤噪声强度的随机噪声样本,以预测来自加噪图像的噪声部分。下图中的算法 2 显示了这一点,这种随机性被引入为 σ t z \sigma_t\mathbf{z} σtz。你可以选择采样器来实现这一目的。一些采样器比其他的收敛更快(即,你使用的步骤更少)。你还可以将潜在空间模型视为变分自编码器,其中引入的变异也会影响输出。
训练过程
以稳定扩散模型为例,你可以看到工作流程中最重要的组件是潜在空间中的去噪模型。确实,输入模型并未经过训练,而是采用现有的文本嵌入模型,例如 BERT 或 T5。输出模型也可以是现成的模型,例如将 256×256 像素图像转换为 512×512 像素图像的超分辨率模型。
对去噪网络模型的概念性训练过程如下:你选择一张图像并添加一些噪声。然后,你创建一个由三部分组成的元组:图像、噪声和加噪图像。网络随后被训练以估计加噪图像中的噪声部分。噪声部分可以通过不同的像素噪声权重以及生成噪声的高斯参数来变化。训练算法如算法 1 所示:
训练和采样算法。图自 Ho 等人(2020)
由于去噪网络假设噪声是附加的,可以从输入中减去预测的噪声以产生输出。如上所述,去噪网络不仅以图像作为输入,还以反映文本输入的嵌入作为输入。嵌入在于,用于检测的噪声被条件化于嵌入中,这意味着输出应该与嵌入相关,而检测的噪声应适合条件概率分布。技术上讲,图像和嵌入在潜在模型中通过交叉注意力机制相互遇到,这在上述算法的骨架中未显示。
描述图片的词汇很多,想象一下让网络模型学习如何将一个词与图片相关联并不容易。例如,报道称,稳定扩散模型是通过 23 亿张图片进行训练的,并消耗了 15 万个 GPU 小时,使用了LAION-5B 数据集(该数据集拥有 58.5 亿张带文本描述的图片)。然而,一旦模型训练完成,您可以在像您的笔记本电脑这样的商品计算机上使用它。
进一步阅读
下面是几篇创建了今天我们所知的扩散模型图像生成的论文:
-
“高分辨率图像合成与潜在扩散模型” by Rombach, Blattmann, Lorenz, Esser, and Ommer (2021)
-
“去噪扩散概率模型” by Ho, Jain, and Abbeel (2020)
-
“扩散模型在图像合成上击败了 GANs” by Dhariwal and Nichol (2021)
-
“改进的去噪扩散概率模型” by Nichol and Dhariwal (2021)
总结
在本文中,您看到了扩散模型如何工作的概述。特别是,您学到了
-
图像生成工作流程具有多个步骤,扩散模型在潜在空间中作为去噪神经网络工作。
-
图像生成是通过从噪声图像开始实现的,这是一个由随机生成的像素数组组成的图像。
-
在潜在空间的每个步骤中,去噪网络消除一些噪声,条件是最终图像的输入文本描述的嵌入向量形式。
-
输出图像通过解码从潜在空间输出来获取。
使用 ControlNet 与 Stable Diffusion
原文:
machinelearningmastery.com/control-net-with-stable-diffusion/
ControlNet 是一个神经网络,通过添加额外条件来改善 Stable Diffusion 中的图像生成。这使用户可以更好地控制生成的图像。与其尝试不同的提示,ControlNet 模型使用户能够通过仅一个提示生成一致的图像。
在这篇文章中,你将学习如何通过 ControlNet 精确控制由 Stable Diffusion 生成的图像。具体而言,我们将涵盖:
-
什么是 ControlNet,以及它是如何工作的
-
如何在 Hugging Face Spaces 中使用 ControlNet
-
使用 ControlNet 与 Stable Diffusion WebUI
通过我的书籍 《掌握 Stable Diffusion 的数字艺术》 启动你的项目。它提供了自学教程和可用代码。
让我们开始吧。
使用 ControlNet 与 Stable Diffusion
照片由 Nadine Shaabana 拍摄。保留所有权利。
概述
本文分为四部分,它们是:
-
什么是 ControlNet?
-
Hugging Face Space 中的 ControlNet
-
Scribble Interactive
-
Stable Diffusion Web UI 中的 ControlNet
什么是 ControlNet?
ControlNet 是一种神经网络架构,可用于控制扩散模型。除了通常提供的生成输出图像的提示外,它还通过将额外的条件与输入图像作为附加约束来指导扩散过程。
有许多类型的条件输入(如 Canny 边缘、用户草图、人体姿势、深度等),可以为扩散模型提供更多的图像生成控制。
ControlNet 如何控制扩散模型的一些示例:
-
通过提供特定的人体姿势,生成模仿相同姿势的图像。
-
使输出遵循另一图像的风格。
-
将涂鸦转换为高质量图像。
-
使用参考图像生成类似的图像。
-
修补图像的缺失部分。
ControlNet 修改扩散过程的框图。图来自 Zhang 等人 (2023)
ControlNet 通过将权重从原始扩散模型复制到两个集合中来工作:
-
一个“锁定”的集合,保留原始模型
-
一个“可训练”的集合,学习新的条件。
ControlNet 模型本质上在潜在空间中生成一个差异向量,这个向量修改了扩散模型本应生成的图像。用公式表示,如果原始模型通过函数 y = F ( x ; Θ ) y=F(x;\Theta) y=F(x;Θ) 从提示 x x x 生成输出图像 y y y,在 ControlNet 的情况下则为
y c = F ( x ; Θ ) + Z ( F ( x + Z ( c ; Θ z 1 ) ; Θ c ) ; Θ z 2 ) y_c = F(x;\Theta) + Z(F(x+Z(c;\Theta_{z1}); \Theta_c); \Theta_{z2}) yc=F(x;Θ)+Z(F(x+Z(c;Θz1);Θc);Θz2)
其中函数 Z ( ⋅ ; Θ z ) Z(\cdot;\Theta_z) Z(⋅;Θz) 是零卷积层,参数 Θ c , Θ z 1 , Θ z 2 \Theta_c, \Theta_{z1}, \Theta_{z2} Θc,Θz1,Θz2 是来自 ControlNet 模型的参数。零卷积层的权重和偏置初始化为零,因此初始时不会造成扭曲。随着训练的进行,这些层学会满足条件约束。这种结构允许在小型设备上训练 ControlNet。请注意,相同的扩散架构(例如 Stable Diffusion 1.x)被使用两次,但使用不同的模型参数 Θ \Theta Θ 和 Θ c \Theta_c Θc。现在,您需要提供两个输入, x x x 和 c c c,以创建输出 y y y。
将 ControlNet 和原始扩散模型分开设计允许在小数据集上进行精细调整,而不破坏原始扩散模型。它还允许相同的 ControlNet 与不同的扩散模型一起使用,只要架构兼容。ControlNet 的模块化和快速适应性使其成为一种灵活的方法,可以更精确地控制图像生成,而无需进行大量的重新训练。
Hugging Face Spaces 中的 ControlNet
让我们看看 ControlNet 如何在扩散模型中发挥魔力。在这一部分,我们将使用 Hugging Face Spaces 上可用的在线 ControlNet 演示生成使用 ControlNet Canny 模型的人体姿势图像。
我们将从 Pexels.com 上传Yogendra Singh 的照片到 ControlNet Spaces,并添加一个简单的提示。我们将生成一个在夜总会跳舞的女性图像,而不是男孩。让我们使用标签“Canny”。将提示设置为:
一个在夜总会跳舞的女孩
点击运行,你将看到以下输出:
在 Hugging Face Space 上运行 ControlNet
这太神奇了!“Canny”是一种图像处理算法,用于检测边缘。因此,您可以将您上传的图像的边缘作为轮廓草图提供。然后,将其作为附加输入 c c c 与您提供的文本提示 x x x 一起提供给 ControlNet,您将获得输出图像 y y y。简言之,您可以使用原始图像上的 Canny 边缘生成类似姿势的图像。
让我们看另一个例子。我们将上传Gleb Krasnoborov 的照片,并应用一个新的提示,该提示将改变拳击手的背景、效果和族裔为亚洲人。我们使用的提示是:
一个男人在东京街头进行影子拳击。
这是输出结果:
在 ControlNet 中使用 Canny 模型的另一个示例
再次,结果非常出色。我们生成了一个拳击手在东京街头以类似姿势进行影子拳击的图像。
Scribble Interactive
ControlNet 的架构可以接受多种不同类型的输入。使用 Canny 边缘作为轮廓仅是 ControlNet 的一个模型。还有许多其他模型,每个模型都经过不同的图像扩散条件训练。
在同一个 Hugging Face Spaces 页面上,可以通过顶部标签访问 ControlNet 的不同版本。让我们看看使用 Scribbles 模型的另一个例子。为了使用 Scribbles 生成图像,只需转到 Scribble Interactive 选项卡,用鼠标画一个涂鸦,并写一个简单的提示生成图像,例如
河边的房子
如下所示:
使用 Scribble ControlNet:绘制一幅房子并提供文本提示
然后,通过设置其他参数并按“运行”按钮,您可能会获得如下输出:
Scribble ControlNet 的输出
生成的图像看起来不错,但可以更好。您可以再次尝试,加入更多细节的涂鸦和文本提示,以获得改进的结果。
使用涂鸦和文本提示生成图像是一种生成图像的简单方法,特别是当您无法想出非常准确的图像描述时。下面是使用涂鸦创建热气球图片的另一个例子。
使用涂鸦创建热气球图片。
稳定扩散 Web UI 中的 ControlNet
如您在之前的帖子中学习过使用稳定扩散 Web UI,您可以预期 ControlNet 也可以在 Web UI 上使用。这是一个扩展。如果您尚未安装,您需要启动稳定扩散 Web UI。然后,转到“扩展”选项卡,点击“从 URL 安装”,输入 ControlNet 存储库的链接:https://github.com/Mikubill/sd-webui-controlnet 来安装。
在稳定扩散 Web UI 上安装 ControlNet 扩展
您安装的扩展仅包含代码。例如,在使用 ControlNet Canny 版本之前,您必须下载并设置 Canny 模型。
-
将模型文件放置在
stable-diffusion-webui/extensions/sd-webui-controlnet/models
或stable-diffusion-webui/models/ControlNet
目录中
注意: 您可以使用git clone
命令从上述存储库下载所有模型(注意每个模型的大小均为数 GB)。此外,该存储库收集了更多 ControlNet 模型,hf.co/lllyasviel/sd_control_collection
现在,您已经准备好使用该模型了。
让我们尝试使用 Canny ControlNet。你进入“txt2img”标签页,向下滚动找到 ControlNet 部分以打开它。然后,按照以下步骤操作:
-
更改控制类型为 Canny。
在 Web UI 中从 ControlNet 框中选择“Canny”。
-
上传参考图像。
在 Web UI 中将图像上传到 ControlNet 小部件
-
处理 txt2img 标签中的其他部分:编写正面提示,负面提示,并更改其他高级设置。例如,
正面提示: “详细,杰作,最佳质量,令人惊叹,迷人,夺目,男人,自然光,海滩,海滩背景,阳光明媚,丛林,背景中的植物,海滩背景,海滩,热带海滩,水,清晰的皮肤,完美的光线,完美的阴影”
负面提示: “最差质量,低质量,低分辨率,单色,灰度,多视角,漫画,素描,糟糕的解剖学,变形,毁容,水印,多视角,变异手,水印”
以及生成参数:
-
采样步骤: 30
-
采样器: DDIM
-
CFG 比例: 7
-
输出可能是:
使用 ControlNet 在 Web UI 中生成图像的输出
如你所见,我们获得了高质量且相似的图像。我们可以通过使用不同的 ControlNet 模型和应用各种提示工程技术来改进照片,但这已是我们目前得到的最佳效果。
这是使用 Canny 版本的 ControlNet 生成的完整图像。
使用 ControlNet 和图像扩散模型生成的图像
进一步阅读
本节提供了更多关于此主题的资源,适合你深入了解。
-
将条件控制添加到文本到图像扩散模型,作者 Zhang 等(2023)
-
ControlNet 在 GitHub 上
-
ControlNet v1.1 在 GitHub 上
-
模型下载 从 ControlNet Wiki
总结
在这篇文章中,我们了解了 ControlNet,它是如何工作的,以及如何使用它生成用户选择的精确控制图像。具体来说,我们涵盖了:
-
在 Hugging Face 上的 ControlNet 在线演示,使用各种参考图像生成图像。
-
使用不同版本的 ControlNet 并通过涂鸦生成图像。
-
在 Stable Diffusion WebUI 上设置 ControlNet 并使用它生成高质量的拳击手图像。
使用 LoRA 微调稳定扩散
原文:
machinelearningmastery.com/fine-tuning-stable-diffusion-with-lora/
稳定扩散可以根据你的输入生成图像。有许多模型在架构和流程上类似,但它们的输出可能差别很大。有许多方法可以调整它们的行为,例如,当你给出一个提示时,输出默认会呈现某种风格。LoRA 是一种不需要重新创建大型模型的技术。在这篇文章中,你将看到如何自己创建一个 LoRA。
完成本文后,你将学习到
-
如何准备和训练 LoRA 模型
-
如何在 Python 中使用训练好的 LoRA
启动你的项目,可以参考我的书籍 《掌握稳定扩散数字艺术》。它提供了 自学教程 和 可运行的代码。
让我们开始吧。
使用 LoRA 微调稳定扩散
图片来源 Thimo Pedersen。部分权利保留。
概述
本文分为三个部分;它们是
-
训练 LoRA 的准备工作
-
使用 Diffusers 库训练 LoRA
-
使用你训练好的 LoRA
训练 LoRA 的准备工作
我们在 上一篇文章 中介绍了在 Web UI 中使用 LoRA 的概念。如果你想创建自己的 LoRA,Web UI 插件允许你这样做,或者你可以使用自己的程序来创建一个。由于所有训练将是计算密集型的,请确保你有一台配备 GPU 的机器继续进行。
我们将使用来自 diffusers 库示例目录的训练脚本。在开始之前,你需要通过安装所需的 Python 库来设置环境,使用以下命令:
pip install git+https://github.com/huggingface/diffusers
pip install accelerate wand
pip install -r https://raw.githubusercontent.com/huggingface/diffusers/main/examples/text_to_image/requirements.txt
accelerate config default
# accelerate configuration saved at $HOME/.cache/huggingface/accelerate/default_config.yaml
第一个命令是从 GitHub 安装 diffusers
库,这是开发版本。这样做是因为你将使用来自 GitHub 的训练脚本,因此需要使用匹配的版本。
上述最后一个命令确认你已经安装了 accelerate
库,并检测了你计算机上的 GPU。你已经下载并安装了许多库。你可以尝试运行下面的 Python 语句来确认所有库已正确安装,并且没有导入错误:
import wandb
import torch
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler, AutoPipelineForText2Image
from huggingface_hub import model_info
你将使用来自 diffusers 示例的 LoRA 训练脚本。首先下载脚本:
wget -q https://raw.githubusercontent.com/huggingface/diffusers/main/examples/text_to_image/train_text_to_image_lora.py
使用 Diffusers 库训练 LoRA
对于微调,你将使用 Pokémon BLIP captions with English and Chinese dataset 在基础模型 runwayml/stable-diffusion-v1-5
(官方 Stable Diffusion v1.5 模型)上。你可以调整超参数以适应你的具体用例,但你可以从以下 Linux shell 命令开始。
export MODEL_NAME="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="./finetune_lora/pokemon"
export HUB_MODEL_ID="pokemon-lora"
export DATASET_NAME="svjack/pokemon-blip-captions-en-zh"
mkdir -p $OUTPUT_DIR
accelerate launch --mixed_precision="bf16" train_text_to_image_lora.py \
--pretrained_model_name_or_path=$MODEL_NAME \
--dataset_name=$DATASET_NAME \
--dataloader_num_workers=8 \
--resolution=512 \
--center_crop \
--random_flip \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--max_train_steps=15000 \
--learning_rate=1e-04 \
--max_grad_norm=1 \
--lr_scheduler="cosine" \
--lr_warmup_steps=0 \
--output_dir=${OUTPUT_DIR} \
--checkpointing_steps=500 \
--caption_column="en_text" \
--validation_prompt="A pokemon with blue eyes." \
--seed=1337
运行此命令将需要几个小时才能完成,即使使用高端 GPU。但让我们更详细地了解一下它的作用。
accelerate 命令帮助你在多个 GPU 上启动训练。如果你只有一个 GPU,也不会有害。许多现代 GPU 支持 Google Brain 项目引入的“Brain Float 16”浮点数。如果支持,选项 --mixed_precision="bf16"
将节省内存并运行更快。
该命令脚本从 Hugging Face Hub 下载数据集,并使用它来训练 LoRA 模型。批量大小、训练步骤、学习率等是训练的超参数。训练好的模型会在每 500 步时将检查点保存到输出目录。
训练 LoRA 需要一个包含图像(像素)和对应标题(文本)的数据集。标题文本描述了图像,而训练好的 LoRA 将理解这些标题应代表那些图像。如果你查看 Hugging Face Hub 上的数据集,你会看到标题名称是 en_text
,如上所述设置为 --caption_column
。
如果你提供自己的数据集(例如,手动为你收集的图像创建标题),你应该创建一个 CSV 文件 metadata.csv
,第一列命名为 file_name
,第二列为你的文本标题,如下所示:
file_name,caption
image_0.png,a drawing of a green pokemon with red eyes
image_1.png,a green and yellow toy with a red nose
image_2.png,a red and white ball with an angry look on its face
...
并将此 CSV 文件与所有图像(匹配 file_name
列)放在同一目录中,并使用目录名作为你的数据集名称。
在上述脚本中指定为 OUTPUT_DIR
的目录下将创建许多子目录和文件。每个检查点将包含完整的稳定扩散模型权重和提取的 LoRA safetensors。一旦你完成训练,你可以删除除了最终 LoRA 文件 pytorch_lora_weights.safetensors
之外的所有文件。
使用你的训练好的 LoRA
运行一个稳定扩散(Stable Diffusion)管道与 LoRA 只需要对你的 Python 代码做一个小修改。一个例子如下:
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
from huggingface_hub import model_info
import torch
# LoRA weights ~3 MB
model_path = "pcuenq/pokemon-lora"
info = model_info(model_path)
model_base = info.cardData["base_model"]
pipe = StableDiffusionPipeline.from_pretrained(model_base, torch_dtype=torch.float16)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
pipe.unet.load_attn_procs(model_path)
pipe.to("cuda")
image = pipe("Green pokemon with menacing face", num_inference_steps=25).images[0]
image.save("green_pokemon.png")
上述代码从 Hugging Face Hub 存储库 pcuenq/pokemon-lora
下载了一个 LoRA 并使用 pipe.unet.load_attn_procs(model_path)
将其附加到管道中。其余的与平常一样。生成的图像可能如下所示:
生成的绿色宝可梦
这是使用 LoRA 的一种更详细的方法,因为你需要知道这个特定的 LoRA 应该被加载到管道的 unet
部分的注意力过程(attention process)中。这些细节应该在存储库的模型卡中找到。
使用 LoRA 的更简单方法是使用自动流水线,从中推断出模型架构从模型文件中:
from diffusers import AutoPipelineForText2Image
import torch
pipeline = AutoPipelineForText2Image.from_pretrained("runwayml/stable-diffusion-v1-5",
torch_dtype=torch.float16
).to("cuda")
pipeline.load_lora_weights("finetune_lora/pokemon",
weight_name="pytorch_lora_weights.safetensors")
image = pipeline("A pokemon with blue eyes").images[0]
load_lora_weights()
函数的参数是您训练的 LoRA 文件的目录名称和文件名称。这也适用于其他 LoRA 文件,比如您从 Civitai 下载的文件。
进一步阅读
如果您希望更深入地了解该主题,本节提供了更多资源。
总结
在这篇文章中,您看到如何根据一组图像和描述文本创建自己的 LoRA 模型。这是一个耗时的过程,但结果是您拥有一个可以修改扩散模型行为的小权重文件。您学会了如何使用diffusers
库运行 LoRA 的训练。您还看到了如何在您的稳定扩散流水线代码中使用 LoRA 权重。
更深入的 Stable Diffusion 管道与 Diffusers
原文:
machinelearningmastery.com/further-stable-diffusion-pipeline-with-diffusers/
有许多方法可以访问 Stable Diffusion 模型并生成高质量图像。一种流行的方法是使用 Diffusers Python 库。它提供了一个简单的接口来使用 Stable Diffusion,使得利用这些强大的 AI 图像生成模型变得更加容易。diffusers
降低了使用前沿生成 AI 的门槛,使得快速实验和开发成为可能。这个库非常强大。不仅可以用来根据文本提示生成图片,还可以利用 LoRA 和 ControlNet 创建更好的图像。
在这篇文章中,你将学习关于 Hugging Face 的 Diffusers、如何生成图像以及如何应用类似于 Stable Diffusion WebUI 的各种图像生成技术。具体来说,你将学习如何:
-
构建一个 Diffusers 管道,并通过提示生成一个简单的图像。
-
加载微调模型的 LoRA 权重并生成 IKEA 风格的图像。
-
构建 ControlNet OpenPose 管道,使用参考图像生成图像。
通过我的书 《掌握稳定扩散的数字艺术》 来启动你的项目。它提供了自学教程和可运行的代码。
让我们开始吧。
更深入的 Stable Diffusion 管道与 Diffusers
照片由 Felicia Buitenwerf 提供。保留所有权利。
概览
本文分为三个部分;它们是:
-
在 Google Colab 上使用 Diffusers
-
加载 LoRA 权重
-
ControlNet OpenPose
在 Google Colab 上使用 Diffusers
Hugging Face 的 diffusers 是一个 Python 库,允许你访问用于生成真实图像、音频和 3D 分子结构的预训练扩散模型。你可以用它进行简单推断或训练自己的扩散模型。这个库的特别之处在于,只需几行代码,你就可以从 Hugging Face Hub 下载模型并用其生成图像,类似于 Stable Diffusion WebUI。
不需要在本地设置,你可以使用 Google Colab 的免费 GPU 基础笔记本。为此,请访问 colab.research.google.com/
并创建一个新的笔记本。要访问 GPU,你必须前往“运行时” → “更改运行时类型”并选择“T4 GPU”选项。
在 Google Colab 上选择 GPU
使用 Colab 可以让你避免拥有 GPU 设备以高效运行 Stable Diffusion 的负担。由于 Jupyter 笔记本的特性,你只需要将所有以下代码保存在各自的单元格中运行。这将方便你进行实验。
之后,安装所有必要的 Python 库来运行diffusers
管道。您需要创建一个笔记本单元,包含以下行:
!pip install diffusers transformers scipy ftfy peft accelerate -q
在 colab 笔记本中,行首的!
表示这是一个系统命令,而不是 Python 代码。
要使用提示生成图像,必须首先创建一个 Diffusion 管道。接下来,您将下载并使用“float 16”类型的 Stable Diffusion XL 以节省内存。然后,您将设置一个使用 GPU 作为加速器的管道。
from diffusers import DiffusionPipeline
import torch
pipe_id = "stabilityai/stable-diffusion-xl-base-1.0"
pipe = DiffusionPipeline.from_pretrained(pipe_id, torch_dtype=torch.float16)
pipe.to("cuda");
要生成一个年轻女性的图像,您将为管道提供相同的通用提示。
prompt = "photo of young woman, sitting outside restaurant, color, wearing dress, " \
"rim lighting, studio lighting, looking at the camera, up close, perfect eyes"
image = pipe(prompt).images[0]
image
如您所见,您用几行代码就获得了异常的结果:
使用 Stable Diffusion XL 管道生成的 diffusers 库图像
类似于 Stable Diffusion WebUI,您可以提供正向提示、负向提示、推理步骤、设置随机种子、更改大小和指导比例来生成您想要的图像:
prompt = "Astronaut in space, realistic, detailed, 8k"
neg_prompt = "ugly, deformed, disfigured, poor details, bad anatomy"
generator = torch.Generator("cuda").manual_seed(127)
image = pipe(
prompt,
num_inference_steps=50,
generator=generator,
negative_prompt=neg_prompt,
height=512,
width=912,
guidance_scale=6,
).images[0]
image
图片完美无缺,看起来像是一位数字艺术家花费了将近 200 小时创作:
使用 Stable Diffusion XL 管道生成的另一张图片
加载 LoRA 权重
您不仅可以直接调用管道,还可以将 LoRA 权重加载到您的管道中。LoRA 权重是针对特定类型图像进行微调的模型适配器。它们可以附加到基础模型以生成定制结果。接下来,您将使用 LoRA 权重生成 IKEA 说明图像风格的图像。
您将通过提供 Hugging Face 链接、适配器在存储库中的位置和适配器名称来下载和加载 LoRA 适配器ostris/ikea-instructions-lora-sdxl
。
pipe.load_lora_weights(
"ostris/ikea-instructions-lora-sdxl",
weight_name="ikea_instructions_xl_v1_5.safetensors",
adapter_name="ikea",
)
要生成 IKEA 风格的图像,您将为管道提供一个简单的提示、推理步骤、规模参数和手动种子。
prompt = "super villan"
image = pipe(
prompt,
num_inference_steps=30,
cross_attention_kwargs={"scale": 0.9},
generator=torch.manual_seed(125),
).images[0]
image
您创建了一个带有说明书的超级反派。虽然不完美,但可以用来为您的工作生成定制图像:
使用 LoRA 生成的 IKEA 风格图片
ControlNet OpenPose
让我们再看一个扩展。现在,您将使用 ControlNet OpenPose 模型来生成一个控制图像,使用参考图像。ControlNet 是一种神经网络架构,通过添加额外条件来控制扩散模型。
您将安装controlnet_aux
来检测图像中身体的姿势。
!pip install controlnet_aux -q
然后,您将通过从 Hugging Face Hub 加载 fp16 类型的模型来构建 ControlNet 管道。之后,您将使用来自 Pexels.com 的免费图像链接到我们的环境中。
from diffusers import ControlNetModel, AutoPipelineForText2Image
from diffusers.utils import load_image
import torch
controlnet = ControlNetModel.from_pretrained(
"lllyasviel/control_v11p_sd15_OpenPose",
torch_dtype=torch.float16,
variant="fp16",
).to("cuda")
original_image = load_image(
"https://images.pexels.com/photos/1701194/pexels-photo-1701194.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=2"
)
要显示图像网格,您将创建一个 Python 函数,该函数接受图像列表并在 Colab 笔记本中以网格形式显示它们。
from PIL import Image
def image_grid(imgs, rows, cols, resize=256):
assert len(imgs) == rows * cols
if resize is not None:
imgs = [img.resize((resize, resize)) for img in imgs]
w, h = imgs[0].size
grid_w, grid_h = cols * w, rows * h
grid = Image.new("RGB", size=(grid_w, grid_h))
for i, img in enumerate(imgs):
x = i % cols * w
y = i // cols * h
grid.paste(img, box=(x, y))
return grid
在下一步中,您将构建 OpenPose 检测器管道并将其馈送到加载的图像中。为了将原始图像和 OpenPose 图像并排显示,您将使用 image_grid
函数。
from controlnet_aux import OpenPoseDetector
model = OpenPoseDetector.from_pretrained("lllyasviel/ControlNet")
pose_image = model(original_image)
image_grid([original_image,pose_image], 1, 2)
检测器成功生成了人体姿势的结构。
原始图像和检测到的姿势。请注意,这两张图片都是 1:1 的长宽比,以匹配 Stable Diffusion 的默认设置。
现在,您将把所有内容结合起来。您将创建 Stable Diffusion 1.5 文本到图像管道,并提供 ControlNet OpenPose 模型。您正在使用 fp16 变体进行内存优化。
controlnet_pipe = AutoPipelineForText2Image.from_pretrained(
"runwayml/stable-diffusion-v1-5",
controlnet=controlnet,
torch_dtype=torch.float16,
variant="fp16",
).to("cuda")
您将使用相同的正面和负面提示生成四张图像,并在网格中显示它们。请注意,您提供的是姿势图像而不是原始图像。
prompt = "a woman dancing in the rain, masterpiece, best quality, enchanting, " \
"striking, beach background"
neg_prompt = "worst quality, low quality, lowres, monochrome, greyscale, " \
"multiple views, comic, sketch, bad anatomy, deformed, disfigured, " \
"watermark, multiple_views, mutation hands, watermark, bad facial"
image = controlnet_pipe(
prompt,
negative_prompt=neg_prompt,
num_images_per_prompt = 4,
image=pose_image,
).images
image_grid(image, 1, 4)
结果非常出色。所有女性都在同一个姿势中跳舞。有一些畸变,但从 Stable Diffusion 1.5 中不能期望太多。
使用 ControlNet 管道生成了四张图像
进一步阅读
如果你想深入了解这个主题,本节提供了更多资源。
总结
在本文中,您了解了 Hugging Face Diffuser 库及其如何生成高质量和定制图像的用法。具体来说,您涵盖了:
-
Diffusers 是什么,它是如何工作的?
-
如何应用高级设置和负面提示来生成一致的图像。
-
如何加载 LoRA 权重以生成 IKEA 风格的图像。
-
如何使用 ControlNet OpenPose 模型控制 Stable Diffusion 的输出。
在 Stable Diffusion 中生成逼真的人脸
Stable Diffusion 最新模型在生成超现实图像方面表现优异,但在准确生成人脸时可能会遇到困难。我们可以尝试不同的提示,但要获得无缝、逼真的人脸效果,可能需要尝试新的方法和模型。
在这篇文章中,我们将探讨使用 Stable Diffusion 生成高度逼真的人脸的各种技术和模型。具体来说,我们将学习如何:
-
使用 WebUI 和高级设置生成真实图像。
-
使用 Stable Diffusion XL 以获得逼真的效果。
-
下载并使用在高质量图像上训练的微调模型。
开启你的项目,阅读我的书 《精通数字艺术与 Stable Diffusion》。它提供了自学教程和有效的代码。
让我们开始吧。
在 Stable Diffusion 中生成逼真的人脸
图片由 Amanda Dalbjörn 提供。部分权利保留。
概述
本文分为三个部分;它们是:
-
使用 Web UI 创建肖像
-
使用 Stable Diffusion XL 创建肖像
-
使用 CivitAI 模型检查点
使用 Web UI 创建肖像
让我们从简单的提示工程开始,使用本地的 Stable Diffusion WebUI 进行 Stable Diffusion 1.5。你需要在积极提示、负面提示和高级设置上进行工作,以获得更好的结果。例如,
-
积极提示:“年轻女性的照片,突出头发,坐在餐厅外,穿着裙子,边缘光照,工作室灯光,注视镜头,近距离,完美的眼睛”
-
负面提示:“畸形、丑陋、差劲、不成熟、卡通、动漫、3d、绘画、黑白、双重图像”
-
采样器:DPM++ 2M Karras
-
步骤:30
-
CFG 比例:7
-
尺寸:912×512(宽)
创建负面提示时,你需要专注于描述“畸形面孔”和“看到双重图像”。这在 Stable Diffusion 1.5 模型中尤其重要。如果你注意到反复出现的模式,例如眼睛不对齐,可以添加额外的关键词,例如“完美的眼睛”到你的积极提示中,以及“畸形的眼睛”到你的负面提示中。
使用 Stable Diffusion 1.5 模型创建的肖像
如我们所见,第一次尝试时得到了非常好的结果。如果出现扭曲或双重图像,请尝试重新生成图像。这个模型并不完美,偶尔可能会生成不正确的图像。如果发生这种情况,只需生成新的图像。你也可以尝试调整参数,如采样方法、步骤和随机种子。作为最终的解决方案,改变模型检查点也有帮助。
通过调整 Stable Diffusion 的输入生成的不同肖像
在修改各种关键词以生成多样化的逼真图像后,我们即使使用基础模型也取得了令人满意的结果。
使用 Stable Diffusion XL 创建肖像
最常见的 Stable Diffusion 模型是 2022 年 10 月发布的 1.5 版本。接着是 2022 年 11 月发布的 2.0 版本,它是一种类似的架构,但从头重新训练。2023 年 7 月发布的 Stable Diffusion XL (SDXL)是一个不同的架构,规模更大。这三个版本有不同的传承,并对你的提示做出不同的反应。普遍认为 SDXL 生成的图片更好。
让我们使用最新的模型 Stable Diffusion XL (SDXL)来获得更好的图像生成结果。这可以简单到下载模型检查点文件并将其保存到你的stable-diffusion-webui/models/Stable-diffusion
文件夹中,重启 Web UI,然后重复上一部分的步骤。运行完整模型在本地可能需要大量的 GPU 内存。如果你无法满足其技术要求,使用 Hugging Face Spaces 上提供的免费在线演示是一个不错的选择。
你可以访问这些应用程序,通过访问 hf.co/spaces
并搜索“SDXL”。
在 Hugging Face 空间中搜索“SDXL”
谷歌的 Stable Diffusion XL
我们将首先尝试运行在 TPU 版本 5e 上的最快演示以获取结果,位于:
为了确保我们的图像生成准确,重要的是通过进入高级设置,将负面提示和图像风格设置为“摄影”。
在高级设置中将“摄影”设置为生成图像的风格
我们将使用相同的提示生成年轻女孩坐在餐馆外面的逼真图像:
年轻女性的照片,突出头发,坐在餐馆外面,穿着裙子,边缘光,工作室照明,凝视镜头,特写,完美的眼睛
使用 SDXL 生成图片
结果令人印象深刻。眼睛、鼻子、嘴唇、阴影和颜色的渲染看起来非常逼真。通过将这里生成的结果与上一部分进行比较,可以明显看到 SDXL 与其旧版本之间的区别。
Prodia 的快速 Stable Diffusion XL
Hugging Face Space 中有多个 SDXL。如果你习惯了 Stable Diffusion WebUI 用户界面,那么“快速 Stable Diffusion XL”空间适合你:
我们将编写相同的正面和负面提示以生成结果。
Hugging Face Space 上的 Prodia 快速 Stable Diffusion XL
我们在这方面获得了更好的阴影和清晰度。让我们尝试生成更多图像,以便对我们的结果做出结论。
让我们修改提示,生成一张男人和一张女人的图片。
使用 SDXL 生成的一对男女的肖像
生成男女性角色的结果异常出色。为了测试模型的偏见,我们将生成印度血统的角色,并将设置更改为医院,在这里两个角色将作为医生。
一对身着医生服装的女人和男人的图像,由 SDXL 生成
SDXL 生成了不错的结果,但图像看起来过于平滑,就像应用了 Instagram 滤镜一样。逼真的图像具有 SDXL 缺少的粉刺、痕迹、粗糙度和锐度。如果您切换到另一个检查点,这可能很难在原始 SDXL 模型中实现,但可以解决。
使用 CivitAI 模型检查点
在这一节中,我们将向前迈进,使用CivitAI.com生成比 SDXL 更逼真的面孔。它是一个模型托管平台,允许用户上传和下载 Stable Diffusion 模型的专业版本。它也是一个用户可以发布 AI 生成图片作品的画廊。
在我们的情况下,我们对最佳逼真模型感兴趣。为了下载,我们将搜索关键词“photorealistic”。会有很多结果。最受欢迎的可能是最好的。因此,请确保您已设置过滤器,以按所有时间下载次数排序列出列表。
在 CivitAI.com 上搜索模型,将结果排序为“最多下载”和“所有时间”有助于找到高质量的模型。
选择最流行的模型,并按照显示的方式下载完整版本(在本例中命名为“Realisic Vision V5.1”)。
从 Civitai.com 下载模型检查点“Realistic Vision V5.1”(注意不是修复版本)。
然后,将下载的模型移动到 Stable Diffusion WebUI 模型目录 stable-diffusion-webui/models/Stable-diffusion
。要在 Web UI 上激活模型,请点击刷新按钮,并通过单击下拉面板选择新模型,或者简单地重新启动 Web UI。
在 Web UI 的左上角选择模型检查点。
所有关于正向提示、负向提示和高级设置的信息都在模型页面上。因此,我们将使用这些信息,并修改以生成一个年轻女性的图像。
-
正向提示:“RAW 照片,美丽的 24 岁女性面部肖像照片,丰满的嘴唇,棕色的眼睛,眼镜,硬阴影,8k 超高清,单反相机,柔和的光照,高质量,胶片颗粒,富士胶片 XT3”
-
负面提示:“变形的虹膜,变形的瞳孔,半现实主义,CGI,3D,渲染,素描,卡通,绘画,动漫,突变的手和手指,变形,扭曲,毁容,画得不好,解剖结构差,错误的解剖结构,多余的肢体,缺失的肢体,漂浮的肢体,断开的肢体,突变,变异,丑陋,恶心,截肢”
-
采样器:DPM++ SDE Karras
-
步骤:25
-
CFG scale: 7
-
尺寸:912×512
使用 Realistic Vision 检查点在 Web UI 上生成的肖像
我们得到了清晰准确的脸部图像。让我们尝试不同的提示生成更加逼真的面孔。
我们将从一张没有戴眼镜的男女图片开始。
没有戴眼镜的男女。使用 Realistic Vision 模型检查点生成的图像。
然后,我们将修改提示生成印度男性和女性。
印度男性和女性。使用 Realistic Vision 模型检查点生成的图像。
你没看到区别吗?我们取得了很好的效果。脸部的纹理很好,皮肤标记自然,细节清晰。
进一步阅读
你可以通过以下资源深入了解这个话题:
总结
在这篇文章中,我们探索了使用 Stable Diffusion 生成超逼真和一致面孔的各种方法。我们从简单的技术开始,逐步进展到更高级的方法,以生成高度真实的图像。具体来说,我们涵盖了:
-
如何使用带有负面提示和高级设置的 Stable Diffusion 1.5 生成逼真的面孔。
-
如何使用 Hugging Face Spaces 的免费演示创建逼真的照片。
-
使用一个在高质量图像上微调的专业模型,以获取具有皮肤纹理和面部清晰度的完美照片。
如何使用稳定扩散 Web UI 创建图像
原文:
machinelearningmastery.com/how-to-create-images-using-stable-diffusion-web-ui/
启动稳定扩散 Web UI 可以通过一个命令完成。之后,你可以通过浏览器控制图像生成管道。管道有很多活动部分,它们都以不同的方式重要。要有效指挥稳定扩散生成图像,你需要识别浏览器中的部件并了解它们的功能。在这篇文章中,你将学习稳定扩散 Web UI 中的许多组件及其如何影响你创建的图像。
通过我的书籍 《掌握稳定扩散的数字艺术》 快速启动你的项目。它提供了自学教程和有效的代码。
让我们开始吧。
如何使用稳定扩散 Web UI 创建图像
图片来源:Kelly Sikkema。保留所有权利。
概述
本文分为四部分,它们是:
-
启动 Web UI
-
txt2img 标签
-
img2img 标签
-
其他功能
启动 Web UI
在你准备好 Python 环境、下载了 Web UI 代码并将模型检查点存储在适当的目录中之后,你可以使用以下命令启动 Web UI:
./webui.sh
Web UI 可以通过编辑 webui-user.sh
中的变量进行自定义。一个例子是允许 Web UI 服务器在一台计算机上运行,而你可以在另一台计算机上启动浏览器,这时你需要在 webui-user.sh
中添加以下行,以允许通过网络访问服务器:
export COMMANDLINE_ARGS="--listen"
运行 ./webui.sh
将启动一个稳定扩散的服务器
默认情况下,命令 ./webui.sh
会在端口 7860 启动一个服务器,你可以通过浏览器访问它。如果你在桌面上运行它,可以使用 URL http://127.0.0.1:7860
;但如果是在另一台计算机上,你需要使用该计算机的 IP 地址代替 127.0.0.1
。你的浏览器应该显示如下的 UI:
稳定扩散 Web UI
在左上角,你可以看到一个下拉框用于选择检查点。检查点提供不同风格的绘图,例如更像照片的真实风格或更像卡通的风格。你可以在模型目录中存储多个检查点,但在管道中只能使用一个。下拉框下方有多个“标签”,你可以通过不同方式生成图像。每个标签都有不同的部件。大多数部件用于为生成管道提供参数。
让我们了解一下有哪些旋钮和参数可用于生成所需的图像。这些参数共同作用,帮助将算法引导到正确的方向。
txt2img 标签页
UI 的启动页面显示了 txt2img 标签页——这是将文本提示转换为图像的 Stable Diffusion 的基本功能。顾名思义,这允许我们将希望或不希望的图像描述为文本提供给算法,然后算法将其转换为嵌入向量以生成图像。请参阅上面的截图,您可以看到解释的部件。
-
检查点由①标记。这个下拉菜单让我们选择模型。确保模型文件放在正确的文件夹中,如模型安装指南(在上一章中介绍)中详细说明。可以在
civitai.com/
找到各种检查点和安全张量。 -
刷新按钮由②标记。位于检查点下拉菜单旁边,这个按钮更新可用模型的列表。如果您在检查点文件夹中添加了新模型但不想重新启动 web UI 服务器,可以使用它来刷新列表。
-
提示文本框由③标记。这是描述预期图像的地方。提供详细且具体的提示(将在下篇文章中详细介绍),以及关键词,有助于提高生成过程。
-
负面提示文本框由④标记。在使用 v2 模型时是可选但重要的,负面提示有助于指定图像中不应该包含的内容。通常,我们不想要的内容较不具体,可以用于许多使用场景。
-
采样方法和步骤由⑤和⑥标记。第一个扩散算法需要超过一百步来创建图像,但我们找到了加速的方法。这些参数决定了去噪过程算法和采样步骤的数量。采样方法的选择影响速度与质量的平衡。
为了平衡速度、质量和良好的收敛性,DPM++ 2M Karras 使用 20-30 步或 UniPC 使用 20-30 步是一些不错的选择。另一方面,DPM++ SDE Karras 使用 10-15 步或 DDIM 使用 10-15 步提供了最佳的图像质量,但收敛较慢。
-
宽度和高度由⑦和⑧标记。它们指定输出图像的大小,确保与所选择的模型兼容。根据使用的是 v1 还是 v2 模型,建议进行调整。通常,您保持默认的 512×512 像素,只有在需要不同的宽高比时才进行更改。
-
批次数量和大小由⑨和⑩标记。这些设置控制图像生成管道运行的次数和每次运行生成的图像数量。批次大小是指一次生成中生成的图像数量。批次数量是生成的次数。
推荐使用较高批次数量的单一批次,以最小化峰值资源的消耗来生成多个高分辨率图像。这种方法较慢,但图像质量远高于仅运行 512×512 图像的批次。
由于图像生成是一个随机过程,将多个图像批量生成可以让你从多个结果中选择最佳的。
-
无分类器指导尺度如⑪标记所示。无分类器指导(CFG)尺度参数允许我们控制模型应多大程度上遵循提示,范围从主要忽略(值为 1)到严格遵循(值为 30)。谈到极端情况,CFG 评分非常低的值意味着提示大多被忽略,生成的图像是随机的。这可能无法实现使用 txt2img 的目的。另一方面,高 CFG 值迫使系统严格遵循提示,但可能会扭曲图像本身。这类似于对提示的过度拟合。
-
随机种子如⑫标记所示。种子值影响潜在空间中的初始随机张量,控制图像的内容。固定种子对于在调整提示时保持可重复性很有用。
你可以通过在提示框中描述你想生成的内容来尝试它(使用普通英语,除非你替换了默认的嵌入模型)。一旦设置好这些,点击右上角的“生成”按钮,你可以看到 Stable Diffusion 模型逐渐为你创建图像。下面是提示“外星人在丛林中探险”的一个示例,其他参数保持默认。
如上所述,生成的图像是按照宽度和高度参数指定的大小生成的。如果你需要比这更大的图像,你可以勾选“高分辨率修复”框,并点击三角形以展开更多选项:
“高分辨率修复”下的参数
这应用了超分辨率深度学习模型来处理 Stable Diffusion 的输出。它解决了 Stable Diffusion 的原始分辨率限制,为以较小尺寸生成的图像提供了放大功能。我们可以从各种放大和调整参数中进行选择,例如“放大倍数”(图像的宽度和高度的倍数),以实现所需的结果。
通常建议从批量中选择最佳图像,然后从 img2img 标签页进行调整以放大分辨率,而不是直接要求 Stable Diffusion 模型生成巨大的输出。
img2img 标签页
在 txt2img 标签页旁边,img2img 标签页是用户利用图像到图像功能的地方。常见的用例包括修复、素描和将一张图像转换成另一张图像。
虽然你仍然可以看到提示和负提示文本框,但 img2img 标签页允许用户执行图像到图像的转换。一个典型的过程包括:
-
将基础图像拖放到“生成”部分下的 img2img 子标签页中
-
调整宽度或高度以保持新图像的纵横比。
-
设置采样方法、采样步骤和批量大小。
-
为新图像编写提示。
-
按下生成按钮以创建图像,并调整去噪强度。
-
img2img 选项卡中的其他参数包括调整模式和去噪强度,控制图像在转换过程中变化的程度。
img2img 的典型工作流程
最重要的设置之一是去噪强度。它表示模型对输入图像的艺术自由度。该参数的低值意味着图像的风格必须保留,而较高的值意味着在风格、颜色等方面的限制最少。
让我们通过以下两个相同输入提示“戴太阳镜的女人”的示例更好地理解这一点:
使用 img2img 制作带有太阳镜的头像。
在第一个示例中,将图像上传到 img2img 子选项卡,将去噪强度设置为 0.4,输入提示,然后点击“生成”。生成的图像将显示在右侧。生成的图像保留了几乎所有内容,除了面部,包括输入图像的颜色和风格。它准确反映了提示上的指示:戴太阳镜。
第二个例子的去噪强度值为 0.7,因此允许算法生成更多随机图像。我们还将批量计数设置为 4,以生成更多的输出。右侧的四个候选图像在颜色、姿势和风格上都不同,如下所示:
增加去噪强度将生成与输入图像偏离更多的图像。
草图和修复
除了上传图片外,用户还可以使用颜色草图工具绘制初始图片,进行创意修改或完全新的构图。草图功能允许用户输入背景图片,用颜色进行草图绘制,并根据草图和附带的提示生成图像。
在 img2img 选项卡中,一个广泛使用的功能是修复,它解决生成图像中的小缺陷。除了上传图像外,你还可以将从 txt2img 选项卡生成的图像发送到 img2img 选项卡进行修复。之后,你可以在图像上绘制以创建一个掩码。调整去噪强度、掩码内容和批量大小也会影响修复过程。以下是一个示例:
通过修复来给肖像添加一个阅读眼镜
你在输入图像上绘制遮罩以标出眼镜的位置。当你绘制时,可以使用键盘快捷键进行缩放和移动,以提高在较小区域工作时的精确度。键盘快捷键包括用于缩放的 Alt+Wheel(在 macOS 中为 Option+Wheel),用于调整画笔大小的 Ctrl+Wheel,重置缩放的“R”,进入/退出全屏的“S”,以及在移动光标时按住“F”来平移。完成遮罩绘制后,你在提示文本框中输入“眼镜”,然后点击“生成”。
如果你觉得在浏览器上绘制遮罩太困难,可以使用其他绘图工具,如 Photoshop,来创建遮罩图像。然后在“修复上传”选项卡中分别上传图像和遮罩。
你还可以设置批处理大小,一次创建多个图像,所有图像都基于相同的提示和输入。这允许你从大量变体中选择最佳输出。
上述示例保留了原始图像,但通过在图像的遮罩区域粗略绘制眼镜的结构,使用修复功能添加了眼镜。修复的一些显著设置包括遮罩模糊(遮罩外部的像素可以被改变的范围)、修复区域(遮罩是否意味着保持或更改)和去噪强度,表示产生变化的周围区域。
一些有用的修复参数
更高级的修复版本是修复素描。在修复过程中,你创建一个遮罩,只有被遮罩的部分会根据提示重新生成。在修复素描中,你用彩色铅笔在图像上绘制,这样你绘制的内容与提示一起控制输出。例如,相同的眼镜提示生成了一副红色框架的眼镜,因为素描是红色的:
红色框架眼镜是通过修复素描创建的
其他功能
正如你已经注意到的,网页 UI 不仅有 txt2img 和 img2img。实际上,你可以通过安装扩展来为网页 UI 添加更多功能。以下是一些顶级选项卡:
-
附加选项卡:它允许你提供一张图像进行重新调整大小。从技术上讲,你只是调用了管道的超分辨率步骤。
-
PNG 信息:如果你生成了一张图像并将其保存为 PNG 文件,图像生成的详细信息会存储在图像的 EXIF 数据中。这个工具帮助从你上传的生成图像中检索参数值,如提示和设置。
-
设置选项卡:在这个选项卡中可以调整许多设置,包括模型和输出的目录。其中最有用的设置之一是“面部恢复”。这个功能应用了一个额外的模型,专门用于修复面部的缺陷。用户可以在设置选项卡中选择一个面部恢复模型,并将其应用于 txt2img 选项卡中的每个生成图像。通过调整 CodeFormer 权重参数可以微调修复效果。
使用 CodeFormer 模型进行面部恢复设置。
进一步阅读
关于 Web UI 最好的学习资源是 GitHub 工具的 wiki 页面。
总结
在本文中,您学习了如何从浏览器中调用稳定扩散 Web UI。
虽然稳定扩散是一种强大的工具,但它仍然在输出的某些属性上缺乏精确控制。在某些情况下,它面临着图像质量下降和颜色不准确的问题。当你使用它时,应该牢记它的局限性。人工智能生成图像的世界每天都在变得更好,速度比以往任何时候都快。在下一篇文章中,让我们了解一些强大的提示技术,以拓展生成图像的极限。
如何有效地使用稳定扩散
原文:
machinelearningmastery.com/how-to-use-stable-diffusion-effectively/
从提示到图片,稳定扩散是一个包含许多组件和参数的管道。所有这些组件共同工作产生输出。如果某个组件行为不同,输出也会发生变化。因此,设置不当很容易毁掉你的图片。在这篇文章中,你将看到:
-
不同组件如何影响稳定扩散管道的输出
-
如何找到最佳配置以帮助你生成高质量的图片
通过我的书籍 《掌握稳定扩散数字艺术》 来启动你的项目。它提供了自学教程和有效代码。
让我们开始吧。
如何有效地使用稳定扩散。
照片由 Kam Idris 提供。保留部分权利。
概述
本文分为三部分;它们是:
-
模型的重要性
-
选择采样器和调度器
-
尺寸和 CFG 规模
模型的重要性
如果管道中有一个组件影响最大,那一定是模型。在 Web UI 中,它被称为“检查点”,以我们在训练深度学习模型时保存模型的方式命名。
Web UI 支持多种稳定扩散模型架构。如今最常见的架构是 1.5 版 (SD 1.5)。事实上,所有 1.x 版本共享相似的架构(每个模型有 860M 参数),但在不同的策略下进行训练或微调。
稳定扩散 1.x 的架构。图源:Rombach et al (2022)
还有稳定扩散 2.0 (SD 2.0) 和其更新版本 2.1。这不是对版本 1.5 的“修订”,而是从头训练的模型。它使用不同的文本编码器(OpenCLIP 而不是 CLIP);因此,它们对关键词的理解不同。一个显著的区别是 OpenCLIP 知道的名人和艺术家的名字较少。因此,稳定扩散 1.5 的提示在 2.1 中可能已经过时。由于编码器不同,SD2.x 和 SD1.x 不兼容,但它们共享类似的架构。
接下来是 Stable Diffusion XL(SDXL)。虽然版本 1.5 的原生分辨率为 512×512,版本 2.0 将其增加到了 768×768,但 SDXL 的分辨率为 1024×1024。建议不要使用与其原生分辨率差异很大的尺寸。SDXL 是一种不同的架构,具有更大的 66 亿参数流水线。最显著的是,这些模型分为两部分:基础模型和精化器模型。它们成对出现,但您可以将其中一个替换为兼容的对应模型,或者如果愿意,跳过精化器。所使用的文本编码器结合了 CLIP 和 OpenCLIP。因此,它应该比任何旧架构更好地理解您的提示。运行 SDXL 的速度较慢,需要更多内存,但通常能提供更好的质量。
SDXL 的架构。来自 Podell 等人(2023)的图示。
对您而言重要的是,您应该将您的模型分类为三个不兼容的系列:SD1.5、SD2.x 和 SDXL。它们在您的提示下表现不同。您还会发现,SD1.5 和 SD2.x 需要一个负面的提示才能获得好的图片,但在 SDXL 中则不那么重要。如果您正在使用 SD2.x 模型,您还会注意到您可以在 Web UI 中选择您的精化器。
使用提示“沙漠中的快餐店,名为‘Sandy Burger’”,使用不同的随机种子,使用 SD 1.5 生成的图片。请注意,没有一张图片正确拼写了名字。
使用提示“沙漠中的快餐店,名为‘Sandy Burger’”,使用不同的随机种子,使用 SD 2.0 生成的图片。请注意,并非所有图片都正确拼写了名字。
使用提示“沙漠中的快餐店,名为‘Sandy Burger’”,使用不同的随机种子,使用 SDXL 生成的图片。请注意,其中三张正确拼写了名字,最后一张只缺少一个字母。
稳定扩散的一个特点是原始模型功能较弱但适应性强。因此,产生了大量第三方精细调整的模型。其中最重要的是专门用于某些风格的模型,比如日本动漫、西方卡通、Pixar 风格的 2.5D 图形或逼真的图片。
您可以在 Civitai.com 或 Hugging Face Hub 上找到这些模型。使用关键词如“逼真”或“2D”进行搜索,并按评分排序通常会有帮助。
选择采样器和调度器
图像扩散是从噪声开始,并通过策略性地用像素替换噪声,直到生成最终图片。后来发现这一过程可以表示为随机微分方程。可以通过数值方法求解该方程,并有不同精度的不同算法。
最常用的采样器是 Euler。它是传统但仍然有用的。然后,有一系列 DPM 采样器。最近还引入了一些新的采样器,如 UniPC 和 LCM。每个采样器都是一个算法。它要运行多个步骤,并且每个步骤使用不同的参数。这些参数是通过调度器(如 Karras 或指数)设置的。一些采样器有一个替代的“祖先”模式,它在每个步骤中增加随机性。如果你想要更具创意的输出,这是很有用的。那些采样器通常在名称中带有后缀“a”,例如“Euler a”而不是“Euler”。非祖先采样器会收敛,即它们在一定步骤后不会再改变输出。祖先采样器在增加步骤大小时会产生不同的输出。
在 Stable Diffusion Web UI 中选择采样器、调度器、步骤和其他参数
作为用户,你可以假设 Karras 是所有情况的调度器。然而,调度器和步长需要一些实验。应该选择 Euler 或 DPM++2M,因为它们在平衡质量和速度方面表现最佳。你可以从大约 20 到 30 的步长开始;你选择的步数越多,输出的质量(细节和准确性)就越好,但相应地速度会变慢。
尺寸和 CFG 比例
请记住,图像扩散过程从一个嘈杂的图片开始,逐渐放置由提示条件的像素。调节参数 CFG 比例(无分类器引导比例)可以控制条件对扩散过程的影响程度。
不幸的是,CFG 比例的最佳值取决于模型。一些模型最适合 CFG 比例为 1 到 2,而其他模型则优化为 7 到 9。在 Web UI 中,默认值为 7.5。但一般而言,CFG 比例越高,输出图像越符合你的提示。
如果你的 CFG 比例过低,输出的图像可能与你预期的不同。然而,导致未达到预期效果的另一个原因是输出大小。例如,如果你提示要一个站立男人的图片,除非将图像大小设置为高度明显大于宽度,否则可能得到一个半身照片或者头部特写。扩散过程在早期阶段设定图片构图。在较高的画布上更容易设计站立的人物。
在提供正方形画布时生成半身照片。
使用相同的提示、相同的种子,只改变画布大小来生成全身照片。
类似地,如果你给一个占图像小部分的物体过多的细节,这些细节可能会被忽略,因为像素不足以呈现这些细节。这就是为什么 SDXL 通常比 SD 1.5 更好的原因,因为通常使用更大的像素大小。
最后一点,使用图像扩散模型生成图片涉及随机性。始终从一批几张图片开始,以确保不良输出不仅仅是由于随机种子造成的。
进一步阅读
如果您希望深入了解这个主题,本节提供了更多资源。
-
使用潜在扩散模型进行高分辨率图像合成,作者为 Rombach 等人(2022)
-
SDXL: 改进高分辨率图像合成的潜在扩散模型,作者为 Podell 等人(2023)
-
稳定扩散页面 在维基百科上
概要
在本文中,您了解了一些微妙的细节,这些细节影响了稳定扩散中的图像生成。具体来说,您学到了:
-
不同版本稳定扩散之间的区别
-
调度器和采样器如何影响图像扩散过程
-
画布大小如何影响输出结果
使用 Diffusers 进行图像修复和扩展
原文:
machinelearningmastery.com/inpainting-and-outpainting-with-diffusers/
图像修复和扩展是流行的图像编辑技术。您已经看到如何使用 WebUI 进行图像修复和扩展。您也可以使用代码完成相同的操作。
在本篇文章中,您将看到如何使用 Hugging Face 的 diffusers 库运行 Stable Diffusion 流水线以执行图像修复和扩展。
完成本教程后,您将学习到
-
如何使用 diffusers 的对应流水线进行图像修复
-
如何将图像扩展问题理解为图像修复的特殊形式
使用我的书籍《掌握数字艺术与稳定扩散》启动您的项目。它提供了自学教程和有效代码。
让我们开始吧。
使用 Diffusers 进行图像修复和扩展
图片由Anna Kolosyuk提供。保留所有权利。
概述
本教程分为两个部分;它们是
-
使用 Diffusers 库进行图像修复
-
使用 Diffusers 库进行图像扩展
使用 Diffusers 库进行图像修复
我们在之前的帖子中讨论了图像修复的概念,并展示了如何使用 WebUI 进行图像修复。在本节中,您将看到如何使用 Python 代码完成相同的操作。
在这篇文章中,您将使用 Google Colab,因为这样您不需要拥有 GPU。如果您决定在本地运行代码,可能需要一些小的修改。例如,您可以直接调用 cv2.imshow()
函数,而不是使用 Google 修改过的 cv2_imshow()
函数。
图像修复要求您对需要重建的图像区域进行遮罩,并使用能够填充缺失像素的模型。您将使用以下方法,而不是在图像上绘制遮罩:
-
Meta AI 的 SAM (Segment Anything Model),一个非常强大的图像分割模型,您将利用它来生成输入图像的遮罩。
-
来自 Hugging Face 库的
StableDiffusionInpaintPipeline
用于文本引导的稳定扩散修复
首先,您应该在 Google Colab 上创建一个笔记本并设置为使用 T4 GPU。在笔记本的开头,您应该安装所有依赖项并加载检查点 ViT-B(URL: dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth
)以用于 SAM。
以下代码应首先运行:
import numpy as np
import torch
import cv2
from PIL import Image
from google.colab.patches import cv2_imshow
!pip install 'git+https://github.com/facebookresearch/segment-anything.git'
from segment_anything import sam_model_registry, SamPredictor
!pip install diffusers accelerate
from diffusers import StableDiffusionInpaintPipeline
!wget -q -nc https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth
CHECKPOINT_PATH='/content/sam_vit_b_01ec64.pth'
DEVICE = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')
MODEL_TYPE = "vit_b"
接下来,您可以将图像上传到 Colab 进行重建。您可以通过点击左侧工具栏上的“文件”图标,然后从本地计算机上传文件来方便地完成此操作:
Google Colab 的左侧面板允许您上传文件。
你上传的文件在目录/content/
下。提供完整路径加载图像,并将其转换为 RGB 格式:
# Give the path of your image
IMAGE_PATH = '/content/Dog.png'
# Read the image from the path
image = cv2.imread(IMAGE_PATH)
cv2_imshow(image)
# Convert to RGB format
image_rgb = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
这是开始的示例图像:
执行修补的示例图片
现在加载您已经下载的 SAM 模型的检查点。在这里,您使用SamPredictor
类来分割图像。您为要掩盖的对象提供图像坐标,模型将自动分割图像。
sam = sam_model_registryMODEL_TYPE
sam.to(device=DEVICE)
mask_predictor = SamPredictor(sam)
mask_predictor.set_image(image_rgb)
# Provide points as input prompt [X, Y]-coordinates
input_point = np.array([[250, 250]])
input_label = np.array([1])
# Predicting Segmentation mask
masks, scores, logits = mask_predictor.predict(
point_coords=input_point,
point_labels=input_label,
multimask_output=False,
)
选定的对象是图像中(250,250)位置的像素。数组mask
是布尔数组(用于二进制图像),我们将其转换为像素值,将形状从(1,512,512)转换为(512,512,1),并将其转换为黑白版本。
mask = masks.astype(float) * 255
mask = np.transpose(mask, (1, 2, 0))
_ , bw_image = cv2.threshold(mask, 100, 255, cv2.THRESH_BINARY)
cv2_imshow(bw_image)
cv2.imwrite('mask.png', bw_image)
del sam, mask_predictor # delete models to conserve GPU memory
创建的掩模如下所示:
SAM 为修补生成的掩模。白色像素将被更改,黑色像素将被保留。
SAM 已经完成了生成掩模的工作,现在我们准备使用稳定扩散进行修补。
使用 Hugging Face 库中的稳定扩散模型创建管道:
# Load images using PIL
init_image = Image.open(IMAGE_PATH)
mask_image = Image.open('mask.png')
pipe = StableDiffusionInpaintPipeline.from_pretrained(
"runwayml/stable-diffusion-inpainting", torch_dtype=torch.float16
)
pipe = pipe.to(DEVICE)
在上述内容中,您使用了StableDiffusionInpaintPipeline
,它仅适用于稳定扩散 1.x 修补模型。如果您不确定您的模型是否是这样的模型,您也可以尝试使用AutoPipelineForInpainting
,看看是否可以自动找到正确的架构。
现在为重建提供提示,并等待魔法!
prompt = "a grey cat sitting on a bench, high resolution"
image = pipe(prompt=prompt, image=init_image, mask_image=mask_image).images[0]
image.save('output.png')
此图像也是在 Colab 中的/content
目录下创建的。现在,您可以像之前一样显示图像了:
image = cv2.imread('/content/output.png')
cv2_imshow(image)
这就是您可能看到的内容:
修补的结果
恭喜您完成了这个快速教程!现在,真正有趣的部分开始了。这就是本短教程的全部内容,注意在示例图像中,只有一个主要对象(狗),但如果有多个对象或者您想尝试不同的掩模技术,请尝试探索SamAutomaticMaskGenerator
或者使用相同的SamPredictor
但带有边界框来处理不同的对象。
使用 Diffusers 库进行外扩。
与修补不同,在扩散库中没有专门的管道用于外扩。但事实上,外扩就像修补一样,只是对掩模和图像进行了一些修改。让我们看看如何实现这一点。
与之前相同,您需要相同的先决条件,例如使用 GPU 设置笔记本并安装 diffusers 库。但不同于使用 SAM 作为图像分割模型来创建图像内部对象的掩模,您应该创建一个掩模来突出显示图片边框外部的像素。
# Give the path of your image
IMAGE_PATH = '/content/Dog.png'
# Read the image from the path
image = cv2.imread(IMAGE_PATH)
height, width = image.shape[:2]
padding = 100 # num pixels to outpaint
mask = np.ones((height+2*padding, width+2*padding), dtype=np.uint8) * 255
mask[padding:-padding, padding:-padding] = 0
cv2_imshow(mask)
cv2.imwrite("mask.png", mask)
上述代码是检查原始图像的大小(并保存到变量height
和width
)。然后创建一个 100 像素边框的外部绘制遮罩,使得创建的整数值数组为 255 以匹配外部绘制图像的大小,然后将中心(不包括填充)设置为零值。请注意,遮罩中的零值意味着像素不会改变。
接下来,您可以创建一个“扩展图像”,以匹配外部绘制图像的形状。与创建的遮罩一起,您将外部绘制问题转换为遮罩沿边界的修复问题。
您可以简单地用灰色填充原始边界之外的像素。您可以使用 numpy 轻松实现:
# extend the original image
image_extended = np.pad(image, ((padding, padding), (padding, padding), (0, 0)), mode='constant', constant_values=128)
cv2_imshow(image_extended)
cv2.imwrite("image_extended.png", image_extended)
这是扩展图像的样子:
扩展图像用于外部绘制
现在您可以像上一节那样运行修复:
# Load images using PIL
init_image = Image.open('image_extended.png')
mask_image = Image.open('mask.png')
pipe = StableDiffusionInpaintPipeline.from_pretrained(
"runwayml/stable-diffusion-inpainting", torch_dtype=torch.float16
)
pipe = pipe.to("cuda")
inpaint_image = pipe(prompt="a dog on a bench in a park", image=init_image, mask_image=mask_image).images[0]
inpaint_image.save('output.png')
您可以按以下方式检查输出:
image = cv2.imread('/content/output.png')
cv2_imshow(image)
结果如下:
外部绘制结果。请注意,树木已添加在侧面。
您可能会想知道为什么在外部绘制中仍然需要提供提示。这是由管道的 API 所要求的,但您可以提供一个空字符串作为提示。但确实需要描述原始图片。您可以尝试使用不同的提示来观察结果,例如“长凳上一只狗的框架图片”。
进一步阅读
本节提供了更多有关该主题的资源,如果您想深入了解。
摘要
在本文中,您已经学会了使用 Diffusers 库中的稳定扩散来进行修复和外部绘制的基本构建块。特别是,您学会了如何使用StablediffusionInpaintPipeline
和 SAM 进行图像分割,并创建修复图像的遮罩。您还学会了如何将外部绘制问题转化为修复问题,以便在 Python 代码中执行相同操作。
使用 Stable Diffusion 进行 Inpainting 和 Outpainting
原文:
machinelearningmastery.com/inpainting-and-outpainting-with-stable-diffusion/
Inpainting 和 outpainting 长期以来一直是流行且研究广泛的图像处理领域。传统的方法往往依赖复杂的算法和深度学习技术,但仍然给出了不一致的输出。然而,最近的 Stable diffusion 进展重塑了这些领域。Stable diffusion 现在在进行 inpainting 和 outpainting 时提供了增强的效果,同时保持了极其轻量化的特性。
在本文中,你将探索 inpainting 和 outpainting 的概念,并了解如何使用 Stable Diffusion Web UI 进行这些操作。
使用我的书 掌握数字艺术与 Stable Diffusion 启动你的项目。它提供了 自学教程 和 可用代码。
让我们开始吧。
使用 Stable Diffusion 进行 Inpainting 和 Outpainting
图片由 Kelly Sikkema 提供。保留所有权利。
概述
本文分为五个部分,它们是:
-
Inpainting 原则
-
在 Stable Diffusion Web UI 中进行 Inpainting
-
使用 Inpaint Anything 扩展
-
Outpainting 原则
-
使用 Stable Diffusion Web UI 进行 Outpainting
Inpainting 原则
Stable diffusion 是一种最先进的 Text2Image 生成模型。
这是一类由 Robin Robmach 等人提出的潜在扩散模型(LDM)。最初在 LAION-5B 数据库的 512×512 图像子集上训练,这个 LDM 在各种图像生成任务中展现了竞争力,包括条件图像合成、inpainting、outpainting、图像-图像转换、超分辨率等等!
与之前的扩散模型不同,后者在像素空间(原始图像)中操作,而 Stable diffusion 应用于潜在空间(压缩图像),这需要更少的计算资源,同时保持细节;这意味着你可以在本地系统上轻松运行它!
Stable diffusion 主要基于三个组件:
1. 文本编码器
文本编码器将文本提示转换为嵌入空间,然后进一步用于指导去噪过程(稍后我们会详细讲解)。Stable diffusion 最初使用了一个冻结的、预训练的 CLIP ViT-L/14 来创建嵌入;然而,改进后的变体转向了 OpenCLIP,它包括参数大小为 354M+ 的文本模型,而前者 CLIP 只有 63M 参数。这使得文本提示可以更准确地描述图像。
2. U-Net
U-Net 反复将有缺陷的图像转换为更干净的形式。它接收两种类型的输入:嘈杂的潜在表示(表示不完整或扭曲的图像数据)和文本嵌入(从输入文本中派生)。这些文本嵌入包含指导 U-Net 理解最终图像理想外观的文本信息。U-Net 的主要任务是预测输入中存在的噪声并减去它以生成去噪的潜在表示。与典型的 U-Net 架构不同,还包括关注层,这些层根据文本信息专注于图像的特定部分,增强去噪过程。
3. 变分自动编码器(VAE)
自动编码器的解码器将 U-Net 预测(去噪的潜在表示)转换回原始像素空间,以创建最终图像。然而,在训练期间,自动编码器的编码器将高维图像(原始图像)压缩为低维潜在表示,作为输入到 U-Net 的一部分。这种压缩创建了一个更加紧凑的形式,并忽略感知上不相关的细节,从而实现了高效的计算训练。
稳定的扩散架构
修补是一种流行的图像处理技术,用于恢复图像中丢失的像素,甚至重建图像的某个区域,同时遵循周围的背景(健康的像素帮助修复损坏的像素)。这是扩散模型的一个惊人特性。典型的修补过程包括:
-
确定需要重建/修复的区域。可以通过二进制图像对这些区域进行掩膜处理,以便算法识别它们。
-
然后,算法从周围像素中分析模式和纹理,以填充语义上合理和一致的区域。
让我们讨论一些重要的修补技术:
1. 纹理合成
这种方法将图像分解为小补丁,分析它们的结构和纹理,并在图像内识别类似的补丁来填补缺失的区域。然而,这需要大量计算资源,并且适用于纹理均匀、一致的图像。
2. 基于样本的
这种方法涉及为每个补丁评估优先级,选择最匹配的补丁,然后根据预定义的优先级利用这些补丁填补缺失区域。它在结构简单、纹理简单的缺失区域表现更好。
3. 基于扩散的
它使用偏微分方程(PDE)将图像数据从周围像素扩散到缺失区域。这是一种快速有效的方法,但随着信息从周围区域扩散,可能会导致锐度或细节的丢失,在重建区域中产生模糊的外观,特别是对于较大的缺失区域。
使用稳定扩散 Web UI 进行修补
默认情况下,在 Stable Diffusion Web UI 中,你不仅拥有 txt2img 功能,还有 img2img 功能。回忆一下,Stable Diffusion 是通过一种随机过程生成图片,该过程将噪声逐渐转化为可识别的图片。在这个过程中,你可以基于提示施加条件。提示是 txt2img 中的文本,而在 img2img 中,它可以是图像和文本提示的组合。
一种进行修补的方法是使用 Web UI 中的 img2img 选项卡。在开始之前,你需要准备一个修补模型,它不同于普通的 Stable Diffusion 模型。例如,你可以从 Hugging Face 下载 Stable Diffusion 2 修补模型:
你可以简单地下载 safetensors 文件(注意,它的大小为 5.2GB)并将其放到 models/Stable-diffusion 目录中。另一个你可能觉得有用的模型(且更小,仅 2GB)是 epiCRealism Inpainting 模型:
当你学习了如何进行图像修补的原理后,你需要一种方法来遮罩要重建的图像区域,并使用一个能够填充缺失像素的模型。在 img2img 选项卡中,你可以找到“inpaint”子选项卡,你可以在这里上传一张图片。
在 Stable Diffusion Web UI 中,你可以在“img2img”选项卡下的“inpaint”子选项卡中上传一张图片
让我们尝试一下以下这张狗的图片:
用于修补的狗的图片
上传此图片后,你可以使用鼠标“绘制”以将狗从图片中移除以创建掩码。你可以使用右上角的图标设置更大的画笔。如果你不能标记图像中狗的精细边界也不要担心,较大的掩码不是问题。例如,这就是你可能创建的:
为修补创建的掩码
如果你立即点击生成,你就让修补模型自由地创建一个图片来填充被遮罩的区域。但让我们将以下内容作为文本提示:
一只坐着的灰色猫,高分辨率
这不是最复杂的提示,但足以告诉模型你想要什么。然后,你应该从左上角的“Stable Diffusion checkpoint”下拉菜单中选择一个修补模型。之后,点击“Generate”按钮将给你正是你描述的结果:
一张狗的照片被修补成猫的照片
你可能会看到不同的结果,因为图像生成过程是随机的。
图像生成的参数也适用于此,包括采样方法(例如,Euler)和采样步骤。但还有几个额外的参数需要注意:
-
输入图像和生成的图像可能具有不同的宽高比。如果需要调整大小,这会影响输出质量。你可以选择调整方法(例如,“Just resize”或“Crop and resize”)。选择“Just resize”可能会扭曲宽高比。
-
被遮罩的图像是稳定扩散模型的起点。你可以选择用噪声(“latent noise”)、保持原始像素内容(“original”),或简单地用相同颜色填充遮罩区域(“fill”)。这由“Masked content”选项控制。
-
输出图像与输入图像的相似度由“Denoising strength”控制。值为 0 将保持输入图像,值为 1 则给了修复模型最大自由度。如果你选择“original”作为“Masked content”选项,此选项的效果最为显著。
使用 Inpaint Anything 扩展
在图像上创建修复遮罩可能很繁琐,取决于遮罩的复杂程度。你可能会注意到在“img2img”下有一个“Inpaint upload”子选项卡,你可以将图像和遮罩作为两个图像文件上传。如果你使用了其他应用程序,如 Photoshop 来创建遮罩,这会很有帮助。
然而,还有一种更高级的创建遮罩方法,使用“Inpaint Anything”扩展。这是利用 Meta AI 的 SAM(Segment Anything Model),一个非常强大的图像分割模型,为输入图像生成遮罩。
要开始使用,请转到 Web UI 的“Extensions”选项卡。然后在“Available”子选项卡中,点击“Load from”按钮,在表格上方的搜索框中输入“inpaint anything”。应该只有一个扩展匹配此名称,你可以通过点击“Install”按钮来安装它。安装后,你需要重新启动 Web UI。
安装“Inpaint Anything”扩展
Inpaint Anything 扩展将创建一个新的同名顶级选项卡。首先,你需要选择一个 SAM 模型,例如此示例中使用的是 sam_hq_vit_l.pth。你需要在第一次运行之前下载该模型。
要开始创建修复,你可以上传你的图像,类似于在 img2img 选项卡中操作。然后,你应该点击“Run Segment Anything”按钮,这将在右侧创建一个分段图,如下所示:
使用 Inpaint Anything 创建遮罩
接下来你需要做的是使用鼠标在与狗相对应的分段上绘制一个小划痕(正如你在上面的截图中看到的狗的胸部和尾部的短黑线)。然后点击“create mask”按钮将生成遮罩。以这种方式创建遮罩比仔细勾画图像中的狗区域要简单。
要运行修补,请返回屏幕左半部分,输入提示并点击“Run inpainting”。
“Inpaint Anything” 的修补结果
但是,请注意,在这种情况下,您只能从下拉菜单“修补模型 ID”中选择几个模型。例如,上述示例中使用了 stable-diffusion-2-inpainting 模型。这些模型不依赖于您放置在 models/Stable-diffusion 目录中的模型文件,而是在第一次使用时从 Hugging Face Hub 下载。这是使用 Inpaint Anything 扩展的一个限制。如果您坚持使用您准备的修补模型,您可以从“仅掩模”子选项卡中检索掩模,并在“img2img”标签中重复使用它。
Outpainting 原则
在修补图像内部像素的同时,外部绘制(outpainting)是一种推测技术,与之相反,它通过生成与原始图像在视觉上一致的新(外部)像素来扩展图像的视觉叙事。因此,现在你可以将图像延伸到其边界之外!
虽然 inpainting 得到了比 outpainting 更少的关注,但是一些基于 CNN 和 GAN 的方法仍然存在。斯坦福研究人员的方法非常有趣。他们使用了 DCGAN 作为生成器网络。他们保持了编码器-解码器结构,并通过增加扩张卷积来增强现实感,通过增加扩张因子来增强神经元的局部感受野(神经元的可访问信息),因为增加扩张因子可以增加感受野,而判别器网络由局部鉴别器组成,每个鉴别器在图像中的特定区域操作,并且通过串联层组合所有局部输出以产生最终输出。要更好地理解,请参阅此资源 感受野。
Radford 等人(2016)的训练管道
使用稳定扩散进行 Outpainting
Outpainting 意味着您提供一个输入图像,并生成一个输出图像,在输出图像中,输入图像是一个子图像。例如,您可以从头像生成一个半身照片。
让我们尝试在稳定扩散 Web UI 中使用这项功能。您可以像以前的工作流程一样从 img2img 标签开始您的项目。但是,您也可以从 txt2img 生成图像,并转移到 img2img。我们尝试用提示生成一张头像:
公园中站立的女人详细的肖像
使用适当的稳定扩散模型和其他参数,在 txt2img 标签下会生成您的输出。在生成的图片下方,您可以找到一个看起来像图片框的按钮,意思是“发送图像和生成参数到 img2img 标签”。点击这个按钮将生成的图片带到 img2img 标签,如下所示:
将 txt2img 结果加载到 img2img 选项卡中
在这一点上,如果您将图像上传到 img2img 选项卡,则情况与您相同。
您可以通过提示描述外部绘制的预期输出,甚至在顶部的两个文本字段中提供负面提示。您需要在 img2img 选项卡中设置输出大小。例如,如果输入图像为 512×512 像素,则可以将输出设置为 512×768 像素。
然后,最重要的步骤是滚动到页面底部,在“脚本”部分选择“穷人的外部绘制”或任何外部绘制脚本。
在“脚本”下拉菜单中选择“穷人的外部绘制”
您需要设置要在输入图像边界之外绘制的像素数。您还需要设置希望扩展图像的外部方向。在上面的截图中,它设置为仅在向下方向上进行 256 像素的外部绘制。请注意,由于输入为 512×512 像素,并且外部绘制将在底部添加 256 像素,因此输出将为 512×768 像素,这就是我们设置输出大小的原因。
当您完成所有参数设置后,可以单击“生成”以获取您的输出。由于生成过程中涉及随机性,您可能需要多次生成输出,直到您对结果满意。这就是您可能会得到的内容:
外部绘制的结果
您的输出可能与原始图像自然地融合不一致。您应该调整去噪强度,并找出适合您的最佳选项。
这是您的最终输出。但是没有什么能阻止您再次运行此过程。(注意下面输出的“发送到 img2img”按钮?)您可以重复此过程以创建全身像,但请记住,您需要使输出“更长”以适应输出。
外部绘制的替代方案
稳定扩散展示了令人印象深刻的外部绘制结果,但在当前生成 AI 浪潮中,值得一提的还有其他两个竞争对手。但是,只有稳定扩散是免费的!
Dall-E
Dall-E 由OpenAI开发,它们也是基于输入提示生成图像的 text2img 模型,目前有三个变种:Dall-E 1、Dall-E 2 和 Dall-E 3。Dall-E 的外部绘制通过考虑图像的阴影、反射和纹理来保持图像的上下文。
图像来自Alphr
Midjourney
Midjourney 机器人是由 Midjourney 发布的另一款领先图像生成器,这是一家独立研究实验室,您可以通过他们的discord 服务器访问它。它在其 V5.2 版本中引入了名为“缩放”功能的Zoom-out feature。
图片由Midjourney提供
进一步阅读
如果您希望深入了解该主题,本节提供了更多资源。
-
使用潜在扩散模型进行高分辨率图像合成,由 Rombach 等人(2022)撰写
-
LAION-5B 数据集
-
无监督表示学习与深度卷积生成对抗网络,由雷德福德等人(2016)撰写
摘要
在本文中,您已经了解了稳定扩散的基本架构及其组成部分,特别是它们如何应用于修补和外延任务。稳定扩散已被证明是生成 AI 领域中的强大工具。除了 txt2img 生成外,它在修补和外延方面也很受欢迎。automatic1111 的 Web UI 是稳定扩散的首选工具,您可以使用 img2img 标签进行修补或外延。
稳定扩散室内设计(8 天迷你课程)
原文:
machinelearningmastery.com/interior-design-with-stable-diffusion-7-day-mini-course/
在核心部分,稳定扩散是一个能够生成图片的深度学习模型。结合其他一些模型和用户界面,你可以把它看作是一个工具,帮助你在一个新的维度上创作图片。不仅可以提供图片外观的指令,还可以让生成模型来构思你未明确指定的内容。
在这个七部分的速成课程中,你将通过示例学习如何利用稳定扩散完成一个绘画项目。这个迷你课程专注于使用生成 AI 模型,而不是它们的内部机制。因此,你不必担心它们如何提供如此惊人的结果的复杂理论。然而,因为没有一步能完成所有,你应该期待学习多个扩展和参数如何协同作用来完成一个图像生成项目。让我们开始吧。
稳定扩散室内设计(7 天迷你课程)
照片由 Arno Smit 提供。部分权利保留。
这个迷你课程适合谁?
在我们开始之前,让我们确保你来对了地方。以下列表提供了关于这门课程设计对象的一些一般指导方针。如果你的情况不完全符合,不要惊慌;你可能只需要在某些领域稍作补充,就可以跟上了。
-
你知道什么是生成模型。你不期望有魔法。你所看到的一切都是一些复杂算法的结果。因此,所有的结果都可以解释,并且一旦你了解了内部原理,这些步骤都是可重用的。
-
你不是艺术家。你不是在数字画布上作画。事实上,你是在没有画笔的情况下创作画作。生成模型不允许你控制太多细节,但你可以给出一些高级指令。这意味着你不应该期望能够精确控制输出。而且,你也不需要学习绘画技巧来创作一幅好画。
-
你有耐心完成一个项目。就像用画笔创作一幅画一样,你需要耐心,完成一个项目需要时间。不像绘画,你花的时间是在实验生成管道中的不同旋钮。根据项目的性质,你需要检查哪些是最佳参数以获得最佳结果。
这个迷你课程不是关于稳定扩散的教科书。但你会看到许多组件如何工作,以及它们如何帮助图像生成的最终结果。关键在于了解每个组件和参数的作用,这样你就可以决定如何在你的下一个项目中使用它们。
迷你课程概述
这个迷你课程分为八个部分。
每节课的设计目标是花费大约 30 分钟。您可能会更快地完成一些课程,而在其他课程中,您可能会选择更深入,花更多时间。
您可以根据自己的喜好快速或缓慢地完成每个部分。建议的舒适进度可能是在八天内每天完成一课。强烈推荐。
下面是你将在接下来的 8 堂课中学习的主题:
-
第 01 课:创建您的稳定扩散环境
-
第 02 课:为自己腾出空间
-
第 03 课:试验和错误
-
第 04 课:提示语法
-
第 05 课:更多试验和错误
-
第 06 课:ControlNet
-
第 07 课:LoRA
-
第 08 课:更好的面孔
这将会非常有趣。
您需要做一些工作:一些阅读、研究和实验。您想学习如何完成一个稳定扩散项目,对吧?
在评论中发布您的结果;我会为您加油!
坚持下去,不要放弃。
第 01 课:创建您的稳定扩散环境
稳定扩散是一个深度学习模型,模拟扩散过程生成图片。您需要了解扩散物理学,以欣赏一个看似不寻常的计算机算法如何生成艺术品。然而,作为用户,您可以假设它是一个可以将您的输入(如文字描述)转换为图片的黑盒子。
稳定扩散是一个基础模型,社区提供了许多重新训练或微调的衍生模型。但归根结底,它是一个需要大量计算资源的深度学习模型。要运行该模型,建议您使用带有良好 GPU 的计算机。如果您的计算机没有 GPU,可以使用 AWS 等云提供商的计算资源。
您可能希望有一个 UI 来使您的工作流程更加顺畅。它可以帮助您更快地迭代,并避免许多可能在编写代码时犯的错误。稳定扩散有几个 UI 可供选择。ComfyUI 非常灵活和强大。然而,由 Automatic1111 在 GitHub 上创建的 Web UI 是最易于使用的。这是您在这些课程中将使用的 UI。
首先,您需要一个现代的 Python,如 Python 3.10 或更高版本。Linux 系统最好,因为流程更加顺畅,但 Windows 或 Mac 也可以使用。首先,您从 GitHub 下载 Web UI。在 Linux 中,您运行以下 git 命令:
git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui
然后,您需要下载稳定扩散模型。Civitai 是一个知名社区,提供用户生成的模型。例如,您可以从以下位置获取“Realistic Vision v6”模型:
选择“safetensors”格式并点击下载按钮。然后将下载的模型文件移动到stable-diffusion-webui/models/Stable-diffusion
。
您可以在 Hugging Face 找到模型的另一个地方。您可以使用关键词“stable diffusion”进行搜索。例如,这些是您可以找到 Deliberate 模型以及原始 Stable Diffusion v1.5 模型的位置:
去这些页面的“文件”选项卡,获取模型文件。类似地,在下载后将其移动到stable-diffusion-webui/models/Stable-diffusion
。
下载完模型后,您可以进入 Web UI 目录并启动它:
cd stable-diffusion-web-ui
./webui.sh
这将自动创建一个 Python 虚拟环境,安装所需的包(如 PyTorch),并启动 Web UI。如果您在自己的计算机上启动它,应该会看到浏览器启动到以下 URL:
- http://localhost:7860
但如果您是在远程运行此操作,例如在云上的远程计算机上,您应该让 Web UI“监听”公共 IP:
./webui.sh --listen
并且这是您在浏览器上应该看到的内容:
您的任务
尝试按照上述步骤启动您的 Web UI。确保没有遇到错误,并在左上角的下拉菜单中选择了您的检查点。
第二课:为自己腾出空间
想象一下,您是室内设计师,您的项目是设计一间卧室。您想向其他人展示您的想法。您可以在纸上绘制它。但您也可以让计算机为您绘制它。
要使用 Stable Diffusion 绘制图片,您可以提供文本提示,并期待返回一幅图片。这就是 Web UI 中的“text2img”功能。您可以在正面提示框中输入以下内容:
卧室、现代风格、一面墙上有一个窗户、真实照片
确保您选择了“检查点”,即您正在使用的 Stable Diffusion 模型。将宽度和高度设置为 768 和 512。然后点击“生成”并等待图片生成。这是您由 Stable Diffusion 创建的第一件艺术品。
正如您在屏幕上所见,您可以在生成图片之前进行更多调整。您使用了正面提示,但也有负面提示。正面提示应描述输出内容,而负面提示告诉图片应该避免什么。由于您要求“真实的照片”,因此可以通过在负面提示中提到其他风格来增强结果,例如
素描、黑白、绘画
您可以添加更多内容,比如“户外”,因为显然您的输出应该是一个室内场景。您还可以尝试调整一些关键词,如果希望以不同风格的房间,例如“砖墙”或“小屋内部”。
使用文本提示生成一个房间的图像
任何提示词(即使是非英语的)都可以使用标准算法转换为嵌入向量。然而,不同模型可能会以不同方式理解提示词。模型可能会忽略或错误解释模型不认识的关键词。这就是为什么你需要尝试不同的模型。
你的任务
在网页界面中,你可以看到许多其他选项。尝试上述方法,并进行多次生成。你应该每次看到不同的图片。然后,找到随机种子的框,输入一个固定的正整数,再次生成。你是否看到图片始终保持不变?固定随机种子但更改采样器会怎样?
要重新创建相同的图片,你需要固定提示词、模型以及选项,包括种子、采样器和步骤。
课程 03:试错法
不幸的是,扩散过程的本质涉及大量随机性,有许多可调节的参数,因此很难判断你的设置是否正确。最简单的检查方法是保持设置(包括提示词、模型、调度器等)不变,但调整随机种子。如果多个随机种子产生了持续错误的结果,你就知道需要更改其他设置。
在网页界面中,你可以调整批量大小和批量计数,同时将随机种子保持在 − 1 -1 −1,一次按下生成按钮即可生成多张图片。
与许多深度学习模型一样,数据是批量处理的,批量大小告诉你 Stable Diffusion 模型需要同时处理多少张图片,每张图片使用不同的随机种子。这仅在你的 GPU 有足够内存时有效。否则,你可以增加批量计数,即你想生成的批次数。每个批次将运行一次生成(因此相对较慢)。
将“批量大小”设置为 4 将一次生成四张图片。设置“批量计数”也会产生类似的效果。
使用多个批量大小或批量计数,你将能在网页界面中一次看到所有输出,显示为“联络表”,展示所有图片。你可以点击每张图片以检查生成它的参数(包括使用的随机种子)。
多张图片是在相同批次中使用相同提示词和设置生成的,但随机种子不同。
你的任务
尝试使用多个批量大小或批量计数生成图片。调整你的提示词或其他设置,再次尝试。你能找到屏幕上显示的图片下载按钮吗?你知道如何查找之前生成的所有图片的历史记录吗?网页界面中有一个标签页可以查看。你还可以找到存储之前生成图片的磁盘位置吗?
课程 04:提示词语法
您提供了一个提示给 Stable Diffusion,并且有一个预处理器将您的文本提示转换为数值嵌入向量。提示将被分解为关键字,并且您可以使每个关键字对图片生成过程有不同的影响。
考虑一个如下提示:
卧室,现代风格,一面墙上有一个窗户,灰色床单,木制床头柜,吊灯,墙上挂着图片,(一只猫在地板上睡觉:1.1),真实照片
在此提示中,您可以看到“(一只猫在地板上睡觉:1.1)”的片段被括号括起来,并且具有“(文本:权重)”的样式。这使得引用的文本对最终的嵌入向量有不同的权重,其中默认权重为 1.0。您可以在 Web UI 的正负提示框中使用此提示语法。
你不应该尝试非常极端的权重,因为模型不是为此设计的。通常情况下,您的权重应该在 0.5 到 1.5 之间。如果您需要非常极端的权重,这可能意味着您的模型没有经过训练来理解该关键字。
您的任务
查看 github.com/AUTOMATIC1111/stable-diffusion-webui/wiki
并查看支持的提示语法。这由 Web UI 中的提示处理器处理,不属于 Stable Diffusion 模型的一部分。有一种语法可以使您在生成步骤的前半部分使用一个提示,在剩余步骤中使用另一个提示。如何编写这样的提示?
第 05 课:更多的试验与错误
使用相同的参数集,您可以使用批量大小同时生成多张具有不同随机种子的图片。通常情况下可以正常工作,并且允许您找到一个适合好图片的良好种子。
有时候,您需要尝试不同的参数,因为您不确定哪个参数可以产生正确的效果。这可以尝试在不同模型上使用相同的提示,或者替换提示中的关键字。
默认情况下,Web UI 中有一个“脚本”部分,在该部分中有一个“X/Y/Z 绘图”。这个名称意味着创建“轴”,其中轴中的每个点都是一个选项,因此您可以通过一个按钮点击尝试所有组合。
让我们尝试以下:将正提示设置为:
卧室,现代风格,一面墙上有一个窗户,真实照片
以及负提示:
素描,黑白,绘画
然后在脚本部分选择“X/Y/Z 绘图”,选择“提示 S/R”作为“X 类型”,然后输入以下内容作为“X 值”:
现代,皇家,中世纪,日本风
使用“X/Y/Z 绘图”脚本和“提示 S/R”类型生成多种具有不同提示的图像。
X/Y/Z 图示部分的所有值都是以逗号分隔的。第一个值,“现代”,是要搜索的内容(S),其余的是要替换的内容(R)。这就是 Prompt S/R 帮助你构建组合的方式。当你点击“生成”时,你将看到如上图所示的图片。例如,现代风格的卧室有简约的装饰风格,而日本卧室没有床,而是榻榻米。
你的任务
脚本中还有一个“提示矩阵”,但“Prompt S/R”更容易使用。尝试使用其他“类型”和“值”的“X/Y/Z 图示”。你最多可以同时使用三个轴。你发现哪个“类型”允许你尝试多个模型?你认为不同的模型能给你不同的房间吗?尝试使用提示生成图像中的人。你应该能看到不同模型如何不同地生成人的面孔。X/Y/Z 图示是一个强大的功能,让你可以探索生成你喜欢的图像的选项。
第 06 课:ControlNet
在幕后,Stable Diffusion 模型从一个随机数字矩阵开始,逐渐将其转换为一个像素矩阵,在这个矩阵中你可以识别出图像符合你提示的描述。这个过程涉及多个迭代(调度步骤),去除的随机性量取决于你在 Web UI 中设置的参数。
由于有多个迭代,你可以故意调整每次迭代的输出,然后再将其反馈给 Stable Diffusion 模型。这就是 ControlNet 的理念。要使用 ControlNet,请在 Web UI 中检查“扩展”选项卡并安装 ControlNet 插件。然后,你还应该从 Hugging Face 下载并安装 ControlNet 模型,按照 ControlNet 扩展的 wiki 页面中的说明进行操作:
安装 ControlNet 后,你可能需要重新启动 Web UI(在扩展选项卡中有一个按钮)并刷新浏览器以加载它。
让我们尝试解决这个提示:如果你多次生成房间,你会发现每次视角都不同。很难写出描述你想要的视角的提示,但在图像中展示出来却很容易。让我们下载并使用这张“空房间”图片:
动漫风格的空房间图像。由作者使用 Stable Diffusion 生成。
您设置提示和其他设置与之前相同。但这次,扩展并启用 ControlNet 部分。在“单图像”选项卡上,上传这张图片。然后选择“MLSD”作为“控制类型”。最重要的是,将“开始控制步骤”设置为 0,并将“结束控制步骤”设置为 0.3。这意味着您仅在步骤的前 30%中使用此 ControlNet。例如,如果您选择了采样步骤为 40,ControlNet 将在步骤 0 到 12 中干扰图像。
设置批处理大小并生成。您会发现生成的图像都是以相同角度观看的。这是因为“MLSD”是一个边缘检测 ControlNet,它将您上传的图片转换为线条艺术并应用于图片上。您可以尝试将 Control Type 更改为“Canny”,这应该会产生类似的效果,因为它是另一种边缘检测算法。
使用 MLSD ControlNet 生成同一视角房间的图片。
您的任务
按照上述说明生成图片后,您看到了查看边缘检测结果的方法吗?您看到了一些控制边缘检测算法灵敏度的参数吗?还有另一种名为“涂鸦”的控制类型。这不需要您上传图片,但允许您用鼠标画一张图片。尝试这个并观察效果。
使用“涂鸦”ControlNet。
第 07 课:LoRA
ControlNet 不是干扰生成图片的扩散过程的唯一方法。LoRA 是一个插件,也可以将效果应用到输出上。首先,让我们下载并使用一个稳定扩散 XL 模型(SDXL),就像这里的一个:
civitai.com/models/312530
(CyberRealistic XL model)
然后,您可以从 Civitai 下载“更好的图片、更多细节的 LoRA”:
并将其保存到路径(stable-diffusion-webui/models/Lora
)。请注意,LoRA 需要匹配的稳定扩散架构。这个需要 SDXL。其他一些 LoRA 可能需要 SD1 或 SD2。您不能混合使用它们。
您可以从 Civitai.com 下载 LoRA 模型。请注意,此 LoRA 需要使用基于 SDXL 的模型。
下载 LoRA 后,请尝试以下提示:
卧室,现代风格,墙上有一个窗户,灰色床单,木制床头柜,吊灯,墙上有图片,(一个女孩坐在地板上抱着一只猫:1.2),逼真的照片,lora:SDXLHighDetail_v5:1.1
带有尖括号的部分是在 Web UI 中使用 LoRA 的方法。您需要指定 LoRA 的文件名和要使用的权重。某些 LoRA 可能允许您使用负权重,但必须检查。如果省略“:1.1”部分,则默认权重为 1.0。
这个特定的 LoRA 添加了诸如纹理之类的细节到您生成的图片中。例如,您应该看到更逼真的布料和头发。
在生成管道中使用 LoRA
您的任务
探索 Hugging Face 和 Civitai 的 LoRA 模型。您看到了如何检查 LoRA 是否适用于 SD1、SD2 或 SDXL 吗?您看到了如何在 Civitai 中使用它们的示例吗?您可以在 SD 1.5 上启用 ControlNet 使用 SDXL 的 LoRA 吗?
第 08 课:更好的面孔
在前一课中,您看到了“一个女孩坐在地板上抱着一只猫”的提示被添加。这使得图片更加复杂,您应该更容易看到不同模型之间的区别。但是,您也应该看到人类面孔有时看起来不自然。特别是如果您不是生成肖像,而是人类仅占图片的一小部分时。
有一种方法可以修复它。首先,您需要转到“扩展”选项卡,并安装名为“ADetailer”的插件。安装完成后,您可能需要重新加载 Stable Diffusion Web UI。然后,您应该像以前一样设置提示和其他选项。
之后,您可以展开“ADetailer”部分,并选择“face_yolov8n.pt”作为面部检测器。您可以跳过提示或设置一个像“困倦的面孔”这样的提示。ADetailer 的作用是在扩散过程完成后检测生成图片上的面部,然后使用您的提示重新生成面部。这有助于使面部更加逼真,或更精确地调整面部表情。
使用 ADetailer 创建逼真的面孔
使用 ADetailer 可以修正畸形的面部,从而使图片变得更好,但不能使面部看起来像另一个人。这是另一个插件的工作:ReActor。同样,您需要转到“扩展”选项卡来安装它。然后,展开“ReActor”部分并上传一张面部的图片。例如,这张图片:
照片由Kune Chan提供。部分版权保留。
为了获得最佳结果,您选择的图片应该是正面且清晰,这样面部的更多特征就能被看到。只需上传图片并生成,您应该看到生成的所有图片都与您上传的照片中的人物相似。
使用 ReActor 扩展生成与另一幅肖像有关的图片
您的任务
在 ADetailer 中,你不仅可以打磨脸部,还可以打磨手部。你能找到用于这一目的的探测器吗?在 ReActor 中,你可以提供多人照片,并选择不同的面孔来使用。你如何控制这个过程?
这是最后一课。
结束啦!(看看你已经走了多远)
你做到了。干得漂亮!
现在你是一个拥有名为稳定扩散的助手的室内设计师。你可以轻松让计算机为你生成不同的设计,并为你生成设计草图。这就是你如何利用生成式 AI 的力量来节省时间,并让你更多地专注于思想,而不是细节。
现在花点时间回顾一下你已经走过的路程。
-
你学会了如何快速设置和运行稳定扩散。
-
你学会了如何使用提示和各种语法控制图像生成。
-
你学会了一些可以帮助你生成更好图片的 Web UI 扩展。
-
你学会了如何有效地进行生成过程的实验。
不要小看这一点;你在短时间内取得了长足的进步。这只是你生成式 AI 之旅的开始。继续练习和发展你的技能。
概要
你在迷你课程中表现如何?
你喜欢这个速成课程吗?
你有任何问题吗?有什么难以解决的问题吗?
让我知道。请在下面留言。
更多稳定扩散提示技巧
原文:
machinelearningmastery.com/more-prompting-techniques-for-stable-diffusion/
图像扩散模型在其最简单的形式中,从提示生成图像。提示可以是文本提示或图像,只要有适当的编码器将其转换为模型可以用作生成过程条件的张量。文本提示可能是提供条件的最简单方法。它容易提供,但你可能发现很难生成符合预期的图像。在本文中,你将学习:
-
如何构建你的提示
-
有效提示的要素
用我的书 《掌握数字艺术与稳定扩散》 来启动你的项目。它提供了自学教程和实用代码。
让我们开始吧。
更多稳定扩散提示技巧
图片来源:Simon English。版权所有。
概述
本文分为三部分;它们是:
-
使用询问器
-
创建有效的提示
-
实验提示
使用询问器
如果你从头开始,可能很难描述你脑海中的图像。这并不容易,因为不是每个人都能有效地用语言表达自己的想法。此外,稳定扩散模型可能也无法理解你的提示。
毋庸置疑,从某些东西开始并加以修改会更容易。你可以复制其他人成功故事中的提示。你也可以提供一张样本图像,让稳定扩散 Web UI 构建提示。这个功能叫做“询问器”。
让我们下载 一张图片 到硬盘上。前往 Web UI 的“img2img”标签,上传该图像,然后点击带有回形针图标的“询问 CLIP”按钮。
Web UI 中 img2img 标签下的询问按钮
你应该看到提示生成如下:
一名男子站在山顶上,俯视山下的山脉,背着一个背包,肩上有一个背包,Constant Permeke,一张库存照片,敬畏感,后极简主义
这对于启动你的提示工程很有帮助。你可以看到,提示的第一部分描述了图像。然后“Constant Permeke”是一位画家。“后极简主义”是一种艺术运动。与“库存照片”一起,它们的作用是控制风格。术语“敬畏感”控制感觉,暗示这个人背对着镜头,面对自然的奇观。
实际上,在“审问 CLIP”旁边,Web 界面上还有另一个审问按钮。带有纸板盒图标的是“审问 Deepbooru”,基于不同的图像字幕模型。对于同一张图片,您会看到生成的提示如下:
1 男孩,背包,袋子,蓝天,靴子,建筑物,城市,城市景观,悬崖,云,多云天空,白天,背对,田野,从背后看,草地,山丘,地平线,房子,岛屿,湖泊,风景,男性焦点,山,山脉地平线,海洋,户外,河流,岩石,风景,天空,雪,单独,站立,树木,水,瀑布,波浪
您有一系列关键词而不是句子。您可以编辑用于您的用途的提示,或者将生成的提示作为您的灵感。
询问模型的表现如何?您不应该期望从提示中获得原始图像,但可以接近。在 txt2img 选项卡上重复提示会给您这个:
使用 CLIP 模型建议的图片生成的图片
不错。但是,如果您使用 Deepbooru 创建的提示,可能会看到它不那么准确:
使用 Deepbooru 询问者建议的提示生成的图片
创造有效的提示
CLIP 模型适用于照片,而 Deepbooru 模型适用于插图,动漫和漫画。然而,使用适当的模型与提示非常重要。例如,如果您打算生成动漫风格的图片,则使用像Counterfeit这样的动漫检查点会很有帮助。
让我们重新审视由 CLIP 模型生成的提示。为什么没有生成原始图片?
一个好的提示应该提到三个 S:
-
主题:前景中的内容及其设置
-
场景:背景内容,包括构图和色彩运用
-
风格:图片的抽象描述,包括媒介
确实,这里有第四个 S:要具体。您应该详细描述您所看到的,但不应该说您所知道的。例如,不要提到背包里面有什么,因为您不能从照片中看到。您不应只提到一个男人,还应该描述他的服装。通常描述看不见和无形的东西(如男人的情绪)是没有帮助的。如果您需要使用同义词词典来帮助您,可以尝试在线提示生成器甚至 ChatGPT。
使用 ChatGPT 帮助构思用于图像生成的文本提示
让我们试着丰富提示:
-
主题:一个站在山顶上的男人,看着他下面的山脉,背着背包,穿着红色夹克,短裤,背对观众
-
场景:明亮的蓝天,白云,旁边是一堆岩石,令人敬畏的感觉
-
风格:照片逼真,高细节,广角,后极简主义,Constant Permeke
将所有这些结合起来,您可能会发现输出如下所示:
由 Stable Diffusion 生成的图片,但未准确遵循提示
还不完美。提示提供了许多细节,但模型并不完全匹配。当然,增加“CFG Scale”参数可以帮助,因为这要求模型更紧密地遵循您的提示。另一种改进方法是查看您的模型生成了什么,并强调模型错过的关键词。您可以使用语法(关键词:权重)调整权重;默认权重为 1.0。
上述图片中缺少几个问题。这张图片是一个男人的特写,所以不是广角镜头。这个男人没有穿黑色短裤。让我们强调这两点。通常,将权重从 1.0 增加到 1.1 会有所帮助。只有在确认需要时,您才会尝试更重的权重。
在调整提示中关键词权重后更好的图片
上面的图片显示了提示(black_shorts:1.1)的使用。下划线是故意的,因为它将被解释为空格,但是为了强调这两个词被一起解释。因此,“black”更可能被视为“shorts”的形容词。
有时,您尝试得很努力,但模型并不准确地遵循您的提示。您可以在负面提示上努力,强制表达您不想要的内容。例如,您看到这个人没有完全背对您。您可以将“face”作为负面提示,意思是您不想看到他的脸。
使用负面提示有助于生成更好的图片
尝试提示
使用稳定扩散创建图片可能需要耐心和大量实验。这是因为不同的模型可能会对相同的提示产生不同的反应,并且图像扩散过程中存在随机性。您可能希望尝试不同的模型,尝试不同的提示,甚至多次重复生成。
在这个试验过程中,一些工具可能会节省您的时间。最简单的方法是一次生成多张图片,每张图片使用不同的随机种子。如果将批次大小设置为大于 1,并且将种子保留为 − 1 -1 −1(表示每次生成一个新种子),您可以一键生成多张图片。请注意,这将消耗 GPU 上更多的内存。如果内存不足,您可以增加批次计数,即运行多次图像生成。速度较慢,但内存消耗较少。
设置批次大小和批次计数,同时将种子保持为-1,可以一次生成多张图片
一旦从生成的众多候选中找到一个好的候选者,您可以点击图片找到使用的种子。接着,为了进一步完善图片,您应该在修改提示的同时修正种子。每次略微修改提示,以便逐步引导生成,创造您想要的图片。
Web UI 将报告用于生成图片的参数,您可以从中找到种子。
但是,您应该如何修改提示?一种方法是尝试关键词的不同组合。在 Web UI 中,您可以使用“提示矩阵”脚本来帮助加速这种实验。您可以将提示设置为由管道字符(|)分隔的不同部分,
一个站在山顶上的男人,看着他下面的山,背着背包,穿着红色夹克,(黑色短裤:1.1),(背对视者:1.1),明亮的蓝天,白云,旁边是一堆岩石,敬畏感,(广角:1.1)| 逼真,高细节 | 后极简主义,康斯坦·佩尔米克
然后,在 txt2img 选项卡的底部,在脚本部分选择“提示矩阵”。因为上述提示被设置为积极提示,请在“选择提示”部分选择“积极”。点击“生成”,您将看到生成的多张图片:
使用提示矩阵脚本进行不同提示的实验
“提示矩阵”枚举了来自您的提示的所有组合,每个部分作为一个单位。请注意,种子和所有其他参数都是固定的;只有提示会变化。这对于公平比较提示效果至关重要。
进一步阅读
如果您想更深入地了解这个主题,本节提供了更多资源。
-
为动漫风格图片的伪造模型:
civitai.com/models/4468/counterfeit-v30
-
逼真视觉模型用于逼真图片:
civitai.com/models/4201/realistic-vision-v60-b1
-
提示生成器 由 Promptomania 提供,您可以了解到对提示有用的不同关键词
-
“注意力和强调” 特性页面上的功能部分,位于 Stable Diffusion Web UI 维基百科
概要
在这篇文章中,您学习了一些有助于在 Stable Diffusion 中创建更好图片的技术。具体来说,您学到了:
-
如何使用询问者从现有图像生成提示
-
有效提示的三个 S:主题、场景和风格
-
如何有效地尝试使用提示
使用稳定扩散的 OpenPose
原文:
machinelearningmastery.com/openpose-with-stable-diffusion/
我们刚刚了解了 ControlNet。现在,让我们探索基于人体姿势控制角色的最有效方式。OpenPose 是一个强大的工具,可以在图像和视频中检测身体关键点的位置。通过将 OpenPose 与稳定扩散集成,我们可以引导 AI 生成与特定姿势匹配的图像。
在这篇文章中,您将了解 ControlNet 的 OpenPose 及如何使用它生成类似的姿势角色。具体来说,我们将涵盖:
-
Openpose 是什么,它是如何工作的?
-
如何使用 ControlNet Hugging Face Spaces 使用参考图像生成精确图像。
-
如何在稳定扩散的 WebUI 中设置 OpenPose 并使用它创建高质量的图像。
-
不同的 OpenPose 处理器专注于身体的特定部位。
使用我的书《稳定扩散数字艺术精通》来启动您的项目。它提供了自学教程和工作代码。
让我们开始吧。
使用稳定扩散的 OpenPose
照片由engin akyurt拍摄。部分权利保留。
概述
这篇文章分为四个部分,它们是:
-
什么是 ControlNet OpenPose?
-
在 Hugging Face Space 中的 ControlNet
-
在稳定扩散的 Web UI 中的 OpenPose 编辑器
-
图像生成
什么是 ControlNet OpenPose?
OpenPose 是一种深度学习模型,用于从图像中检测人体姿势。它的输出是图片中人物的多个关键点(如肘部、手腕和膝盖)的位置。ControlNet 中的 OpenPose 模型将这些关键点作为额外的条件输入到扩散模型中,并生成与这些关键点对齐的人物图像。一旦您能指定关键点的精确位置,就能够基于骨架图生成真实的人体姿势图像。您可以使用它来创建不同姿势的艺术照片、动画或插图。
在 Hugging Face Spaces 中的 ControlNet
要尝试 ControlNet OpenPose 模型的能力,您可以在 Hugging Face Spaces 的免费在线演示中使用:
开始时,您需要创建姿势关键点。这可以通过上传图像并让 OpenPose 模型检测它们来轻松完成。首先,您可以下载Yogendra Singh的照片,然后将其上传到 ControlNet Spaces。这个 ControlNet 帮助您锚定姿势,但您仍然需要提供文本提示以生成图片。让我们写一个简单的提示:“一个女人在雨中跳舞。”,然后点击运行按钮。
在 Hugging Face Spaces 上使用 OpenPose ControlNet 模型
由于图像生成的随机性,你可能需要进行多次尝试。你还可以优化提示,以提供更多细节,例如光照、场景和女性穿着的服装。你甚至可以展开底部的“高级选项”面板,提供更多设置,例如负面提示。
“高级选项”面板中的设置
在上述示例中,你可以看到从骨架图像生成的高质量女性在雨中跳舞的图像,与上传的图像姿势类似。以下是三个在相同提示下生成的其他图像,所有图像都非常出色,并准确地遵循了参考图像的姿势。
使用相同提示生成的其他图像
Stable Diffusion Web UI 中的 OpenPose 编辑器
你还可以使用 Stable Diffusion Web UI 中的 OpenPose ControlNet 模型。实际上,你不仅可以上传图像以获取姿势,还可以在应用到扩散模型之前编辑姿势。在本节中,你将学习如何在本地设置 OpenPose 并使用 OpenPose 编辑器生成图像。
在开始使用 OpenPose 编辑器之前,你需要先安装它并下载模型文件。
-
确保你已安装 ControlNet 扩展,如果没有,请查看之前的帖子。
-
安装 OpenPose 编辑器扩展:在 WebUI 的“Extensions”标签中,点击“Install from URL”并输入以下网址进行安装:
- https://github.com/fkunn1326/openpose-editor
-
前往 Hugging Face 仓库:
hf.co/lllyasviel/ControlNet-v1-1/tree/main
-
下载 OpenPose 模型 “control_v11p_sd15_openpose.pth”
-
将模型文件放入 SD WebUI 目录中的 stable-diffusion-webui/extensions/sd-webui-controlnet/models 或 stable-diffusion-webui/models/ControlNet 文件夹中
现在你已经完成了所有设置,并且 Web UI 中添加了一个名为“OpenPose Editor”的新标签。导航到“OpenPose Editor”标签,并根据你的喜好调整画布的宽度和高度。接下来,你可以开始使用鼠标修改右侧的骨架图像。这是一个简单的过程。
让我们尝试创建一张男人拿着大枪的图片。你可以对骨架图像进行修改,使其看起来像下面的样子:
使用 OpenPose 编辑器创建姿势
然后,点击“Send to text2img”按钮。这将带你进入 text2img 界面,并将骨架图像添加到 ControlNet 面板中。
ControlNet 面板上创建的姿势
接下来,为该 ControlNet 模型选择“启用”,确保选中“OpenPose”选项。您还可以选中“低 VRAM”和“像素完美”。前者适用于 GPU 内存不足的计算机,后者是为了使 ControlNet 模型使用最佳分辨率以匹配输出。
然后,设置正面和负面提示,调整输出图像大小、采样方法和采样步骤。例如,正面提示可以是
详细,杰作,最佳质量,令人惊叹,迷人,引人注目,汤姆克兰西的分裂,持枪的人,美国海军陆战队员,海滩背景
负面提示可以是
最差质量,低质量,低分辨率,单色,灰度,多视角,漫画,素描,解剖不良,畸形,变形,水印,多视角,变异手部,水印,面部不佳
下面的图像,使用尺寸为 912×512 和 DDIM 采样器进行 30 步,结果完全匹配相似的姿势,并且有很好的细节。
使用 OpenPose ControlNet 模型生成的输出
图像生成
如果您在 Web UI 中尝试了 ControlNet 模型,您应该注意到有多个 OpenPose 预处理器。接下来,让我们探索其中一些,重点放在面部和上半身。
我们将使用 Andrea Piacquadio 的照片 作为参考图像。在 Web UI 中,切换到“img2img”选项卡并上传参考图像。然后在 ControlNet 面板中,启用并选择“OpenPose”作为控制类型。在 img2img 中,默认情况下将与 ControlNet 共享参考图像。接下来,在 ControNet 面板中将预处理器改为“openpose_face”,如下所示:
使用“openpose_face”作为预处理器
然后,将正面提示设置为与参考图像风格相匹配,并生成图像。不再是拿着平板电脑的图片,让我们让这位女士拿着手机:
详细,最佳质量,令人惊叹,迷人,引人注目,纽约,建筑,城市,手机放在耳边
以下是可能获得的结果:
使用 img2img 生成的图像
我们通过类似的姿势获得了高质量的结果。您需要调整提示来匹配这个姿势。这里使用的预处理器是“openpose_face”,意味着不仅匹配姿势还包括面部表情。因此,生成的图片不仅在肢体位置上与参考图像匹配,而且在面部表情上也是如此。
让我们将预处理器更改为“openpose_faceonly”,只专注于面部特征。这样,只有面部关键点被识别,不会从 ControlNet 模型应用有关身体姿势的信息。现在,将提示设置为
详细,最佳质量,令人惊叹,迷人,引人注目,纽约,建筑,城市
按照提示中的每个关键词生成了一个更准确的结果,但身体姿势与之前的姿势有很大不同:
使用 ControlNet 仅提供面部关键点生成的图像
要了解为什么会这样,你可以检查预处理器的输出图像。上面的图像是使用“openpose_face”预处理器生成的,而下面的图像是使用“openpose_faceonly”生成的。同样,你可以通过分析这两种骨架结构来了解各种预处理器的输出。
从不同 OpenPose 预处理器生成的关键点
进一步阅读
本节提供了更多资源,如果你希望深入了解这一主题。
-
OpenPose: 实时多人 2D 姿态估计使用部件关联场 作者 Cao 等(2019)
-
OpenPose 在 GitHub 上
-
Controlnet – 人体姿态版本 在 Hugging Face 上
总结
在这篇文章中,我们深入探讨了 ControlNet OpenPose 的世界以及如何利用它获得精准的结果。具体来说,我们讨论了:
-
什么是 OpenPose,它如何在不设置任何东西的情况下立即生成图像?
-
如何使用 Stable Diffusion WebUI 和 OpenPose 编辑器通过修改提示和骨架图像生成自定义姿势的图像。
-
多种 OpenPose 预处理器,用于在 Stable Diffusion WebUI 中生成全脸和仅脸部的图像。