Stable Diffusion 的提示技巧
原文:
machinelearningmastery.com/prompting-techniques-stable-diffusion/
在所有情况下,使用 Stable Diffusion 生成图片都涉及向管道提交一个提示。这只是众多参数中的一个,但却是最重要的一个。一个不完整或构造不良的提示可能会使生成的图像与预期不符。在这篇文章中,你将学习一些构造提示的关键技巧,并看到一个好的提示能够创造出好的图像。
通过我的书 《掌握 Stable Diffusion 的数字艺术》 来启动你的项目。它提供了 自学教程 和 可运行的代码。
让我们开始吧。
Stable Diffusion 的提示技巧
图片由 Sangga Rima Roman Selia 拍摄。保留部分权利。
概述
本文分为三个部分,它们是:
-
影响输出的参数
-
有效提示的特点
-
强调关键词
影响输出的参数
有几个参数会影响 Stable Diffusion 的输出。模型对绘画风格有很大的影响。采样器和步骤数量对生成质量有影响。但提示则指导了输出的内容。
基础的 Stable Diffusion 模型适用于多种用途。但有些模型是专门训练用于特定风格的。例如,“Anything”模型可以轻松生成日本动漫风格的图片,而“Realistic Vision”模型则生成逼真的照片效果。你可以从 Hugging Face Hub 或 Civitai(推荐)下载这些模型:
-
任何东西:
civitai.com/models/9409
,huggingface.co/stablediffusionapi/anything-v5
-
Realistic Vision:
civitai.com/models/4201
,huggingface.co/SG161222/Realistic_Vision_V6.0_B1_noVAE
下载的模型应保存在 WebUI 安装目录中的 models/Stable-diffusion
文件夹内。当你下载一个模型时,除了注意模型本身的版本外,还要注意基础模型的版本。最常见的是 SD 1.5 和 SDXL 1.0。使用不同的基础模型可能会导致与管道其他部分的兼容性问题,包括提示的理解。
理论上,扩散模型需要数百步才能生成图像。但实际上,扩散模型是可以写成微分方程的数学模型;有方法可以近似解决这个方程。采样器和步数控制了近似解的求解方式。一般来说,步数越多,结果越准确。然而,步数的效果依赖于选择的采样器。作为一个大致的参考,大多数采样器应该使用约 20 到 40 步,以获得质量和速度之间的最佳平衡。
提示会影响输出,原因非常简单。在每一步,Stable Diffusion 中的 U-net 会使用提示来指导噪声的细化。不同的模型对提示有不同的理解,就像人们对一个词有不同的预设。然而,一条普遍的规则是,你应该以这样的方式编写提示,以限制重新解释的空间。让我们通过一些示例来了解这一点。
有效提示的特点
提示应该具体明确地描述需要在图像中呈现的内容。随手准备一份关键词列表可以让提示变得非常简单。我们先了解一下不同类别的关键词,然后再看每个类别的示例。
主体或对象
提示的核心在于描述预期图像的细节。因此,首先要先想象出来。让我们通过一个提示示例来理解这一点。
一位穿着 FC Barcelona 球衣的年轻女子在庆祝进球,背景有足球运动员和观众。
生成图像所选择的各种设置如下:
-
模型:Realistic Vision V6.0 B1(VAE)
-
采样方法:DPM++ 2M Keras
-
采样步骤:20
-
CFG 比例:7
-
宽 × 高:512 × 512
-
负面提示:将在后续章节中解释
-
批次大小和数量:1
使用提示在 Stable Diffusion 中生成图像
对于第一次尝试来说,还不错。
使用简单提示进行生成
让我们进一步完善这个。
注意:图像生成是一个随机过程。因此,你可能会看到截然不同的输出。实际上,除非你固定了随机种子,否则每次使用相同的提示和参数生成的图像都会有所不同。
介质
图像是如何创建的?添加图像创作介质使提示变得更加具体。无论图像是照片、数字画作、3D 渲染还是油画,都称为介质。
我们还可以添加一些形容词,例如:
-
超现实主义照片
-
人物数字画作
-
概念艺术
-
水下油画
让我们在提示中添加一个介质:
一位穿着 FC Barcelona 球衣的年轻女子在庆祝进球,背景有足球运动员和观众。
以下是结果。
带摄影介质的提示
区别不大,因为使用的模型默认假设为逼真的摄影效果。如果使用不同的模型,区别会更明显。
艺术风格
现代主义、印象派、波普艺术、超现实主义、新艺术运动、超现实主义等关键词为图像增添了艺术感。让我们通过修改我们的提示来理解这一点。
一幅波普艺术超现实主义风格的年轻女性肖像,穿着 FC 巴萨球衣,庆祝进球,背景有足球运动员和人群。
以下是结果:
具有艺术风格的生成图像
受模型限制保持照片般的效果,但波普艺术风格使输出使用更多的主色(红色、黄色、蓝色),脸上的颜色变化更为突兀。
著名艺术家名字
添加艺术家名字可以选择艺术家的风格。可以提到多个艺术家名字以结合他们的风格。让我们添加两位艺术家的名字,斯坦利·阿特杰姆·劳(Stanley Artgerm Lau),一位超级英雄漫画艺术家,以及加拿大裔美国抽象画家阿格尼丝·马丁(Agnes Martin)。关于艺术家名字的好参考可以在这里找到。
一幅波普艺术超现实主义风格的年轻女性肖像,穿着 FC 巴萨球衣,庆祝进球,背景有足球运动员和人群,由斯坦利·阿特杰姆·劳和阿格尼丝·马丁创作。
添加了艺术家名字到提示中
由于提供了多个艺术家名字,输出可以更具创意。
网站
网站如 Artstation 和 Deviant Art 有多种风格的图形。添加这些网站名称会增加特定的风格。
让我们在提示中添加“artstation”。
通过在提示中提供网站名称,可能会产生一些抽象背景。
分辨率
添加分辨率规格,如高详细度、HD、4K、8K、vray、虚幻引擎或清晰对焦,有助于获取更多图像细节。让我们尝试一下。
一幅波普艺术超现实主义风格的年轻女性肖像,穿着 FC 巴萨球衣,庆祝进球,背景有足球运动员和人群,由斯坦利·阿特杰姆·劳和阿格尼丝·马丁创作,artstation,4K,清晰对焦。
指定 4K 和清晰对焦将强调纹理细节。
你可能注意到,提示不需要是完整的句子。你也可以用逗号分隔的关键词。嵌入引擎可以很好地理解。
灯光
添加灯光关键词可以增强场景的外观和感觉。例如,边缘光、电影灯光、体积光、暮光射线、逆光或微光等。所以你可以将提示修改为:
一幅流行艺术风格的超现实主义年轻女性肖像,她穿着 FC 巴萨球衣,在背景中与足球运动员和人群一起庆祝进球,作者为 Stanley Artgerm Lau 和 Agnes Martin,artstation,4K,清晰对焦,边缘光。
带有“边缘光”的提示将增强轮廓
如果你不熟悉摄影,边缘光就是在被摄体后面设置光线,使被摄体的边缘被光线勾勒出来。
我们还可以使用 ControlNets 或区域提示器来获得更大的控制。
颜色
图像的整体色调可以使用任何颜色关键词来控制。
一幅流行艺术风格的超现实主义年轻女性肖像,她穿着 FC 巴萨球衣,在背景中与足球运动员和人群一起庆祝进球,作者为 Stanley Artgerm Lau 和 Agnes Martin,artstation,4K,清晰对焦,边缘光,青色。
将“青色”添加到提示中将使输出中更多地出现这种颜色。
好的,我们现在可以看到图像中有一些青色。但由于提示中没有提到“青色衬衫”或“青色染发”,所以你留下了重新解释的空间,因此颜色可能出现在任何地方。
使用负面提示
与其描述图像中应该包含什么,不如使用负面提示描述图像中不应该出现的内容。这可以包括属性、对象或风格。我们可以为所有图像生成任务使用下面这样的通用提示。负面提示的好处是可以为负面提示保持一个标准模板,以便在多个任务中重用。但一些模型(如 SD 2.0 或 SD XL)对负面提示的依赖较小。
(最差质量、低质量、普通质量、低分辨率、细节少、过饱和、欠饱和、过度曝光、欠曝光、灰度、黑白、糟糕照片、糟糕摄影、糟糕艺术:1.4),(水印、签名、文本字体、用户名、错误、徽标、文字、字母、数字、签名、商标、名字:1.2),(模糊、模糊、颗粒状),病态、丑陋、不对称、变异畸形、肢解、光线差、阴影差、草图、裁剪、框架外、切断、审查、JPEG 伪影、失焦、故障、重复,(喷涂、卡通、动漫、半现实主义、CGI、渲染、Blender、数字艺术、漫画、业余:1.3),(3D、3D 游戏、3D 游戏场景、3D 角色:1.1),(手部不好、解剖不好、身体不好、脸部不好、牙齿不好、手臂不好、腿部不好、畸形:1.3)
我们已经在我们的生成中使用了这个提示。
强调关键词
我们可以让稳定扩散知道如果我们想强调提示中的某些关键词以及程度。这可以通过以下方法实现:
使用因子
我们可以使用语法 (关键词:因子) 来修改关键词的权重。因子是数字值。让我们在我们的示例中试试这个。
由 Stanley Artgerm Lau 和 Agnes Martin 创作的一幅年轻女性 FC 巴塞罗那球衣的流行艺术超现实主义肖像(庆祝:2),背景有足球运动员和人群,艺术站,4K,清晰对焦,边缘照明,青色。
强调提示中的关键词“庆祝”。
不同于以前的生成方式。也许模型对庆祝有不同的看法。这也是为什么您需要尝试不同的提示的一个例子。
另一种增强效果的方法是使用圆括号。它与使用 1.1 倍数的效果相同。我们还可以使用双括号或三括号来增加更高的强调效果。
-
(关键词)等同于(关键词:1.1)
-
((关键词))等同于(关键词:1.21)
-
(((关键词)))等同于(关键词:1.33)
同样,使用多个方括号的效果是:
-
[关键词]等同于(关键词:0.9)
-
[[关键词]]等同于(关键词:0.81)
-
[[[关键词]]]等同于(关键词:0.73)
关键词混合
如其名称所示,关键词混合可以帮助同时结合多个主题的效果。常见的关键词混合方式如下。
-
[关键词 1:关键词 2:因子]
-
(关键词 1:因子 1),(关键词 2:因子 2)
让我们在提示中使用第二种格式。
一幅流行艺术超现实主义肖像,由 Stanley Artgerm Lau 和 Agnes Martin 创作,年轻女性,(加尔·加多特:0.9),(斯嘉丽·约翰逊:1.1),穿着 FC 巴塞罗那球衣庆祝进球,背景有足球运动员和人群,艺术站,4K,清晰对焦,边缘照明,青色。
通过提示来控制脸部的外观应该是什么样子。
这是一个很好的混合。这是漫威对 DC 在足球场上的对抗。然而,看起来模型完全忘记了庆祝、人群和球员。可以通过尝试以不同的方式创建提示或重新表述来改进这一点。
最后,以下是应用相同提示的效果,但使用模型 Anything XL v5.0。这是一个面向动漫或卡通风格的模型。差异应该非常明显:
通过使用相同的提示但不同的模型获得的卡通风格
总结起来,在提示稳定扩散生成器时有很多实验可以做,专业知识只能通过实践获得。因此要不断练习!
进一步阅读
以下是一些可能帮助您提示的资源:
-
Stable Diffusion 页面来自 InstallGentoo 维基
-
数据文件来自 CLIP 审讯器源代码
摘要
在本文中,您学习了如何创建一个提示来使 Stable Diffusion 生成您喜欢的图片。您了解到关键是对图片进行具体描述。您的提示应包括:
-
主题:主要焦点的外观。如果描述人物的服装、动作和姿势,将会有很大帮助。
-
媒介和风格:例如,说明它是照片、素描还是水彩画。
-
一些艺术家或网站的名称,如果你希望作品具有特定风格的话。
-
分辨率和光线:通过使用 4K 分辨率和清晰的对焦,你可以获得更多的细节。描述光线也会呈现出不同的效果。
-
其他细节:你可以在提示中添加更多描述性的特征,包括主要颜色或角度。
稳定扩散生成的输出可以因许多其他参数而变化,包括模型。你需要进行实验以找到最佳的生成效果。
使用 Python 运行 Stable Diffusion
原文:
machinelearningmastery.com/running-stable-diffusion-with-python/
Stable Diffusion 是一个能够生成图片的深度学习模型。实际上,它是一个程序,你可以提供输入(例如文本提示),并获得一个表示像素数组的张量,这个张量可以保存为图像文件。没有规定必须使用特定的用户界面。在任何用户界面可用之前,你需要通过代码运行 Stable Diffusion。
在本教程中,我们将学习如何使用来自 Hugging Face 的 diffusers
库来运行 Stable Diffusion。
完成本教程后,你将学到
-
如何安装
diffusers
库及其依赖项 -
如何在
diffusers
中创建一个 pipeline -
如何微调你的图像生成过程
通过我的书籍 《掌握数字艺术与稳定扩散》 来启动你的项目。它提供了自学教程和可运行的代码。
让我们开始吧。
在 Python 中运行 Stable Diffusion
图片由 Himanshu Choudhary 提供。保留所有权利。
概述
本教程分为三个部分;它们是
-
Diffusers 库简介
-
自定义 Stable Diffusion 管道
-
Diffusers 库中的其他模块
Diffusers 库简介
Stable Diffusion 在文本到图像生成领域引起了轰动。它能够从文本描述中生成高质量、详细的图像,使其成为艺术家、设计师以及任何具有创造力的人士的强大工具。借助 Stable Diffusion 模型文件,你可以使用 PyTorch 重建深度学习模型,但因为涉及很多步骤,你需要编写大量代码。Hugging Face 的 Diffusers 库可以利用 Stable Diffusion 的潜力,让你创作出梦幻般的作品。
在使用之前,你应该在你的 Python 环境中安装 diffusers 库:
Shell
pip install diffusers transformers accelerate
这些 Python 包有很多依赖项,包括 PyTorch。
在这篇文章中,你将使用 diffusers 库中的 pipeline 函数。之所以称为 pipeline,是因为不是单个深度学习模型能够从输入生成图片,而是许多较小的模型协同工作来实现这一点。我们来看一个例子:
from diffusers import StableDiffusionPipeline, DDPMScheduler
import torch
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4",
variant="fp16", torch_dtype=torch.float16)
pipe.to("cuda")
prompt = "A cat took a fish and running in a market"
scheduler = DDPMScheduler(beta_start=0.00085, beta_end=0.012,
beta_schedule="scaled_linear")
image = pipe(
prompt,
scheduler=scheduler,
num_inference_steps=30,
guidance_scale=7.5,
).images[0]
image.save("cat.png")
以下是生成一张图片并将其保存为 PNG 格式到 cat.png
的几行代码。这是生成的图片示例:
使用 Stable Diffusion 管道生成的图片。
然而,后台正在进行大量工作。你传递了一个文本提示。这个提示已经通过预训练的嵌入模型转换成了数值张量。张量然后被传递给从 Hugging Face 仓库“CompVis/stable-diffusion-v1-4”(官方 Stable Diffusion v1.4 模型)下载的 Stable Diffusion 模型。这个模型将运行 30 步和 DDPM 调度器。Stable Diffusion 模型的输出将是一个浮点张量,必须转换成像素值后才能保存。所有这些都是通过将组件链式连接到pipe
对象中来完成的。
自定义 Stable Diffusion 管道
在之前的代码中,你从 Hugging Face 仓库下载了一个预训练模型。即使是同一仓库,不同的“变体”模型也是可用的。通常,默认变体使用 32 位浮点数,适合在 CPU 和 GPU 上运行。你在上述代码中使用的变体是fp16
,即使用 16 位浮点数。它并不总是可用的,也不总是以这种名称存在。你应该查看相应的仓库以了解更多详细信息。
由于使用的变体是 16 位浮点数,你还指定了torch_dtype
使用torch.float16
。注意,大多数 CPU 不能处理 16 位浮点数(也称为半精度浮点数),但它在 GPU 上是可用的。因此,你会看到创建的管道通过语句pipe.to("cuda")
传递给了 GPU。
你可以尝试以下修改,你应该会观察到生成速度大幅变慢,因为它是在 CPU 上运行的:
from diffusers import StableDiffusionPipeline, DDPMScheduler
pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4")
prompt = "A cat took a fish and running in a market"
scheduler = DDPMScheduler(beta_start=0.00085, beta_end=0.012,
beta_schedule="scaled_linear")
image = pipe(
prompt,
scheduler=scheduler,
num_inference_steps=30,
guidance_scale=7.5,
).images[0]
image.save("cat.png")
然而,假设你一直在使用 Stable Diffusion Web UI 并下载了第三方 Stable Diffusion 模型,那么你应该对以 SafeTensors 格式保存的模型文件比较熟悉。这种格式不同于上述 Hugging Face 仓库的格式。特别是,仓库通常会包含一个config.json
文件来描述如何使用模型,但这些信息应该从 SafeTensor 模型文件中推断出来。
你仍然可以使用你下载的模型文件。例如,使用以下代码:
from diffusers import StableDiffusionPipeline, DDPMScheduler
model = "./path/realisticVisionV60B1_v60B1VAE.safetensors"
pipe = StableDiffusionPipeline.from_single_file(model)
pipe.to("cuda")
prompt = "A cat took a fish and running away from the market"
scheduler = DDPMScheduler(beta_start=0.00085, beta_end=0.012,
beta_schedule="scaled_linear")
image = pipe(
prompt,
scheduler=scheduler,
num_inference_steps=30,
guidance_scale=7.5,
).images[0]
image.save("cat.png")
这段代码使用了StableDiffusionPipeline.from_single_file()
,而不是StableDiffusionPipeline.from_pretrained()
。这个函数的参数被假定为模型文件的路径。它会识别文件是 SafeTensors 格式。diffusers
库的整洁性在于,在你更改了创建管道的方法之后,不需要进行其他任何更改。
请注意,每个 Pipeline 假设了特定的架构。例如,diffusers
库中的StableDiffusionXLPipeline
专用于 Stable Diffusion XL。你不能使用不匹配的 Pipeline 构建器的模型文件。
当触发过程时,您可以在pipe()
函数调用中看到稳定扩散图像生成过程的最重要参数。例如,您可以指定调度器、步长和 CFG 比例。调度器确实有另一组配置参数。您可以从diffusers
库支持的众多调度器中进行选择,详情可以在 diffusers API 手册中找到。
例如,以下是使用更快的替代方案,即欧拉调度器,并保持其它一切不变:
from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler
model = "./path/realisticVisionV60B1_v60B1VAE.safetensors"
pipe = StableDiffusionPipeline.from_single_file(model)
pipe.to("cuda")
prompt = "A cat took a fish and running away from the market"
scheduler = EulerDiscreteScheduler(beta_start=0.00085, beta_end=0.012,
beta_schedule="scaled_linear")
image = pipe(
prompt,
scheduler=scheduler,
num_inference_steps=30,
guidance_scale=7.5,
).images[0]
image.save("cat.png")
Diffusers 库中的其他模块
StableDiffusionPipeline
不是diffusers
库中唯一的管道。如上所述,您有StableDiffusionXLPipeline
适用于 XL 模型,但还有更多。例如,如果您不仅仅提供文本提示而是使用 img2img 调用稳定扩散模型,您必须使用StableDiffusionImg2ImgPipeline
。您可以将 PIL 对象的图像作为管道的参数。您可以从diffusers
文档中查看可用的管道:
即使有许多不同的管道,您应该发现它们都工作类似。工作流程与上面的示例代码非常相似。您会发现它易于使用,无需了解幕后的详细机制。
进一步阅读
如果您想更深入地了解这个主题,本节提供了更多资源。
总结
在本文中,您发现了如何从 Hugging Face 的diffusers
库中使用。特别是,您了解到:
-
如何创建一个从提示创建图像的管道
-
如何重复使用本地模型文件而不是动态从在线仓库下载?
-
从扩散器库中可用的其他管道模型有哪些?
稳定扩散项目:商业海报
原文:
machinelearningmastery.com/stable-diffusion-project-commercial-poster/
稳定扩散已经席卷了 AI 艺术界,让用户只需几个文本提示就能生成令人惊叹和富有想象力的视觉效果。这为创意人士带来了令人兴奋的可能性,包括制作有影响力的商业海报。
在本文中,我们将深入使用稳定扩散来设计一款产品的引人注目的海报。阅读完本文后,你将学到:
-
如何准备产品的照片以供稳定扩散使用
-
如何创建吸引人的商业海报,无需复杂的绘画技巧
用我的书 《使用稳定扩散精通数码艺术》 来启动你的项目。它提供了带有可操作代码的自学教程。
让我们开始吧
稳定扩散项目:商业海报
照片由Wexor Tmg提供。部分权利保留。
概述
本文分为四部分:
-
项目想法
-
创建海报的第一个草稿
-
完善海报
-
其他技巧
项目想法
假设你在一家化妆品公司工作,即将推出一款新香水。你有香水瓶的图片如下,想要为它制作海报。为了简单起见,假设这个海报没有文字,只考虑图形。
一瓶香水的项目(不是真实产品,而是稳定扩散生成的想象)。
这是一瓶小蓝瓶。产品主题是“海洋”,海报设计取决于你的想象力。
创建海报的第一个草稿
首先,让我们关注背景,因为它决定了整体海报的风格和氛围。一个简单的提示足以:
在海洋深处,远处背景中游动着一群鱼,海底珊瑚
测试提示以验证模型和其他参数生成符合你期望的图片。
看起来不错。让我们添加产品。
首先,你需要使用 Photoshop 或者 GIMP 创建一个模板。这是一个重要的步骤,稍后你会明白其重要性。你设置画布大小(例如,512×768 像素),白色背景,并将产品放在上面。注意,你需要调整产品的大小和角度,放置在画布上,就像你希望最终海报中的样子一样。一个示例如下:
在 GIMP 中创建海报模板
保存这张图片。然后回到 Stable Diffusion Web UI。在 ControlNet 中,上传这张图片并选择 Canny 作为控制类型。将生成的图像的宽度和高度设置为 512×768 像素。修改提示以提到瓶子,比如
在海洋深处,远处有一群鱼在游动,底部有珊瑚。一个瓶子悬浮在水中。
运行生成,您将看到如下图片:
利用 ControlNet 制作瓶子在海洋中的图片
您会看到生成的图片与没有使用 ControlNet 的图片不同。这是预期的,因为您改变了扩散过程。您可以尝试增加批次计数和批次大小以生成几个并选择最佳的图片。
但是在这里您有一个严重的问题:瓶子与原始瓶子不同。在这种情况下,您应该导出这张图片并进行一些编辑。还记得您在开始时创建的模板图片吗?因为它是白色背景,您可以在 Photoshop 或 GIMP 中轻松地将背景设置为透明。将新生成的图片作为背景层,将原始模板作为顶层,并移除白色背景。这样可以在背景上放置正确的产品,因为您在生成图片时使用了 Canny 类型的 ControlNet,它与大小和位置完美匹配。您将看到以下效果:
使用 GIMP 将实际产品叠加在生成的图片上
看起来正确但不完美。瓶子可能会在背景中混合得很尴尬。而且分辨率太低不能做海报。但是让我们先将其保存为中间图片。
完善海报
对生成的输出进行微小的修整的技巧是在 Stable Diffusion 中使用 img2img 生成。您提供没有提示的图像,并将去噪强度设置为较低但非零值,然后要求 Stable Diffusion 重新生成具有一些微小变化的同一图片。通常,这些是在看起来不自然的部分进行的修整。
在这个例子中,您可以在 img2img 选项卡上传图片,并将调整模式设置为“只调整大小”(以保持纵横比)。然后选择“按比例调整”选项并将其最大化到 4 倍比例。大多数采样方法都有效,但您希望采样步骤更多(这样每个步骤都较小,以避免图片发生剧烈变化)。您可以稍微降低 CFG 比例,但将“去噪强度”设置为 0.33。
调整海报大小作为修饰技术
结果如下所示:
生成的海报
其他技巧
这是一个多步骤工作流的示例。您可以在 Stable Diffusion 中探索许多功能,并将它们组合在多个步骤中以创建惊人的结果。
例如,您可以在 txt2img 步骤中使用两个 ControlNet 单元:一个用于主题,一个用于背景。您可以像上面一样使用 Canny 来处理主题。但是,与其编写详细的提示以创建背景,您可以向 ControlNet 的第二单元提供一个示例图片,并将控制类型设置为 IP 适配器。这样,示例图片的色彩方案和风格将被采用。您可以使用一个更简单的背景描述作为提示。扩散过程将知道生成什么。
记住,当您使用多个 ControlNet 单元时,必须降低所有单元的控制权重,因为对最终输出的总影响是所有权重的总和。
进一步阅读
如果您希望深入了解该主题,本节提供了更多资源。
-
Reliberate 模型 在 Hugging Face 上
-
ControlNet 在 GitHub 上
-
向文本到图像扩散模型添加条件控制 作者:Zhang 等人(2023)
-
IP 适配器 网站
-
IP-适配器:文本兼容图像提示适配器用于文本到图像扩散模型 作者:Ye 等人(2023)
摘要
在这篇文章中,您体验了一个涉及多个步骤的工作流程,通过稳定扩散来创建最终输出。您使用了 txt2img 来创建图片,使用了 img2img 函数来优化输出。您还使用了外部图片编辑器来帮助创建适用于 ControlNet 的图像。虽然没有单一工具可以完成所有工作,但您学会了如何将稳定扩散作为更大项目的构建模块。
稳定扩散项目:创建插图
原文:
machinelearningmastery.com/stable-diffusion-project-creating-illustration/
许多人在工作中写作。并非所有人都是小说作家;有些人写技术文档、商业计划、新闻文章甚至博客帖子。在这些写作中,插图不是必需的,但通常是有益的。它们是文本的装饰、解释或视觉说明。然而,你可能不希望花费太多时间或没有绘画技能来创建插图。稳定扩散在这里帮助你!
在这篇文章中,你将看到如何使用稳定扩散来创建插图。完成这篇文章后,你将学到:
-
如何从文本中创建提示
-
如何调整提示以获得更好的插图
用我的书**掌握稳定扩散数字艺术来启动你的项目**。它提供了自学教程和有效的代码。
让我们开始吧
稳定扩散项目:创建插图
图片来源:Koushik Chowdavarapu。部分版权保留。
概述
这篇文章分为三部分:
-
项目想法
-
创建插图
-
面部细节
项目想法
插图是对文本的装饰。我们从以下故事开始:
一些将军正在攻击一座堡垒。将军们必须作为一个集体决定是攻击还是撤退;有些将军可能倾向于攻击,而其他将军则倾向于撤退。重要的是所有将军在共同决策上达成一致,否则少数将军的半心半意的攻击将变成溃败,效果比协调的攻击或协调的撤退更糟。
问题复杂化在于存在背叛的将军,他们不仅可能投票支持次优策略,还可能有选择地投票。例如,如果有九位将军投票,其中四位支持攻击,四位支持撤退,第九位将军可能向支持撤退的将军投票撤退,而向其余将军投票攻击。那些收到第九位将军撤退票的将撤退,而其余将攻击(这可能对攻击者不利)。问题进一步复杂化在于将军们被物理分隔,必须通过信使发送投票,而信使可能无法送达投票或伪造虚假投票。
如果你对这个故事熟悉,它描述了拜占庭将军问题。上述文本来自维基百科。你将创建一幅图像来配合上述文本。
创建插图
简单来说,你可以打开 Stable Diffusion 的 Web 界面,将故事作为正向提示输入并生成。但也存在一些问题。首先,故事可能包含不同的场景,而你只需要一个场景的插图。其次,描述没有针对提示进行优化。由于文本会被转换为扩散过程中的嵌入,你需要强调关键字,而语法正确的句子并不重要。第三,除了正向提示,你可能还需要一个负向提示。
将故事改写成适合用作提示的形式是第一步。ChatGPT 或其他 AI 工具擅长改写。你可以在 ChatGPT 中使用以下提示开始:
以下是一个故事。请提取一个关键场景,并将其描述为 Stable Diffusion 生成插图的提示。如果适用,请同时描述相应的负向提示。
故事:一群将军正在攻击一个堡垒。将军们必须集体决定是攻击还是撤退;有些人可能倾向于攻击,而另一些人则倾向于撤退。重要的是所有将军必须达成一致的决定,因为部分将军半心半意的攻击将变成溃败,比协调一致的攻击或撤退都要糟糕。问题因存在奸诈的将军而复杂化,他们不仅可能投票支持次优策略,还可能有选择性地这样做。例如,如果有九位将军投票,其中四位支持攻击,而另外四位支持撤退,第九位将军可能会向支持撤退的将军发送撤退的投票,而向其余将军发送攻击的投票。那些收到撤退投票的将军将会撤退,而其余将军则会攻击(这可能对攻击者不利)。问题进一步复杂化,因为将军们被物理分隔,必须通过可能无法传递投票或伪造虚假投票的信使来发送他们的投票。
响应将是:
Stable Diffusion 的关键场景描述:
在一个戏剧性的时刻,九位将军在一个昏暗的战斗帐篷内紧张地站成一圈。气氛充满悬念,他们面临着是否攻击或撤退到即将到来的堡垒的关键决定。将军们正在深入讨论,有些人脸上带着决心的表情,而其他人则充满怀疑,反映出他们的冲突偏好。在场景中心,一位信使正被描绘为递送投票,他的出现增加了紧张感,将军们警惕地注视着他。背景中有地图和战斗计划贴在帐篷墙上,通过帐篷的开口可以看到远处堡垒的轮廓。将军们的表情和肢体语言传达了他们困境的严重性,暗示了潜在的背叛和即将到来的灾难性误通信威胁。
负向提示:
避免描绘现代技术、未来元素和不现实或幻想的场景。这个场景不应包含任何超自然的元素或不合时宜的细节,比如计算机或现代制服。
使用 ChatGPT 生成 Stable Diffusion 的提示。
只需将这两个生成的段落复制并粘贴到 Stable Diffusion Web UI 中作为正面和负面提示,你可能会得到这样的结果:
通过使用 ChatGPT 建议的提示生成的 Stable Diffusion 生成的图片。
这是使用模型 Deliberate 生成的,生成设置为 768×512 像素。这个结果不错,但可能不是您想要的。首先,这个输出看起来像一张照片。如果你重复几次,你会看到可能会生成各种不同的风格,因为您从未提及您想要的风格!当然,您希望为更好的图片改进提示。
让我们再次求助于 ChatGPT,作为后续:
将正面提示的答案简化为更少的词语
然后你得到:
稳定扩散的正面提示:
一个昏暗的战争帐篷里,九位将军深入讨论是进攻还是撤退的问题。紧张的表情和身体语言反映了他们不同的偏好。一名信使递交了一张票,增加了紧张感。地图和战斗计划装饰着帐篷的墙壁,帐篷的开口处可以看到堡垒的轮廓。
请求 ChatGPT 简化提示
您可以用这个更简短的版本替换您的正面提示。结果不应该有太大的区别。一个好的提示应该提到主要焦点、背景、构图和风格。这个提示缺乏后者。所以你可以修改提示以丰富这些细节。如果你想要一个看起来逼真的输出,添加关键词“逼真”应该起作用。
负面提示对于生成同样重要。我们还可以简化负面提示,只提供关键词即可。您还应该为负面提示添加一些样式关键词,以控制不希望出现的内容。一个例子如下:
现代技术、未来元素、幻想、超自然元素、素描、卡通、动漫、模型
输出如下:
通过调整使用的提示改进稳定扩散的生成
面部细节
如果你希望图片非常真实,那么在图片中有很多人物的情况下很容易失败。这正是上面的屏幕截图中的情况:如果你更仔细地看每个人的脸,你会看到很多人的面部表情有一种扭曲的解剖学。这个问题可以修复,但不能通过提示来解决。
要安装“ADetailer”插件到稳定扩散版本:进入扩展标签页,输入 URL 到“从 URL 安装”部分,然后重新启动 Web UI。然后你可以在 text2img 控制中看到“ADetailer”部分。
重复提示,但这次你应该检查“ADetailer”以启用它,并确保检测器是“face_yolo8n.pt”。这将检测生成图片中的面部并运行修复以重新生成面部。您不需要在 ADetailer 插件中提供任何额外的提示,除非您希望为这些面部提供一些额外的细节。结果如下:
从稳定扩散生成。注意面部看起来畸形。
应用 ADetailer 插件后改进的图片。
这两幅图片是用固定的随机种子生成的,所以它们看起来很相似。但使用 ADetailer 插件,你会看到面部看起来更自然。现在你可以将生成的图片用作你的写作插图。
更多阅读
如果你想深入了解这个主题,本节提供了更多资源。
摘要
在本文中,您体验了从文本中提取场景并将其转换为稳定扩散提示的工作流程。通过注意细节,您可以修改提示以生成适合作为文本插图的图片。您还了解到,稳定扩散 Web UI 的 ADetailer 扩展可以通过用更自然的面孔替换生成的面孔来帮助您制作更好的图片。
稳定扩散项目:复兴旧照片
原文:
machinelearningmastery.com/stable-diffusion-project-reviving-old-photos/
摄影已有一个多世纪的历史。周围有许多旧照片,可能您的家庭也有一些。受当时相机和胶片的限制,您可能有分辨率低、模糊或有折痕或划痕的照片。恢复这些旧照片,使它们像今天用相机拍摄的新照片一样,是一个具有挑战性的任务,但是即使您也可以使用诸如 Photoshop 等图片编辑软件来完成。
在这篇文章中,您将看到如何使用稳定扩散修复旧照片,并使它们焕发新生。完成本文后,您将学到:
-
如何清除扫描照片中的瑕疵
-
如何给黑白照片上色
使用我的书籍《稳定扩散数字艺术大师》,启动您的项目。它提供自学教程和可运行的代码。
让我们开始吧。
稳定扩散项目:复兴旧照片
照片由Antonio Scant拍摄。部分权利保留。
概览
本教程分为三部分;它们是
-
项目构想
-
超分辨率
-
重建
项目构想
让我们来看一个来自纽约公共图书馆的旧照片:
“年轻的开蚝者”照片。来自 NYPL 数字收藏。
如果您下载它,您会注意到照片分辨率低。从胶片颗粒中有少许噪声(不太明显)。照片是黑白的。这个项目的目标是将这个照片制作成高分辨率彩色照片,描绘相同的人物。
超分辨率
原始图片分辨率低。将分辨率放大称为超分辨率,已开发了多个机器学习模型用于此目的。
处理旧照片的第一步是进行超分辨率处理。通常,旧照片分辨率较低,但这并不是问题所在。即使分辨率很高(例如,因为您以高分辨率扫描了旧照片),您可能仍希望对照片进行降采样,并运行超分辨率以去除噪声和胶片颗粒。
在稳定扩散 Web 界面中,您可以将照片上传到“额外”选项卡。该选项卡允许您执行许多操作,但与扩散过程无关。相反,它是应用于各种现有机器学习模型的图像。在这里,您可以启用“放大”并设置“按比例缩放”的合理因子。对于这张特定的照片,您可以将因子设置为 2。然后,您应该选择一个放大器,例如“R-ESRGAN 4x+”。
在“Extra”标签页上,您可以做的下一件事是使用 CodeFormer。这是一个用于修复面部的模型。启用它并设置权重。低权重可以使 CodeFormer 更自由地改变面部,而高权重则倾向于保留原始的面部表情。最佳权重应取决于原始照片的质量。如果面部上有更多划痕或标记,您希望使用较低的权重来更轻松地进行重建。
超分辨率是处理旧照片的第一步。
您应该下载提升后的输出以进行下一步操作。
重建
要重建一张旧照片,您将使用 txt2img。您不应该使用 img2img,因为提供旧照片作为起点会对输出施加太多影响,您无法看到期望的修正。
但首先,您应该在 img2img 标签页中上传提升后的输出,并点击“CLIP 询问器”旁边的纸夹图标。这将根据上传的图像自动填充积极提示。您将根据 CLIP 询问器的结果在 txt2img 标签页构建您的提示。
您可以在 img2img 标签页中使用 CLIP 询问器。
现在前往 txt2img 标签页。让我们使用 SD1.5 模型进行逼真生成,例如 Realistic Vision v6。设置积极提示,如
一群孩子站在一起,手持水桶,穿着帽子和礼服,背景是一座建筑物,奥古斯特·桑德尔(August Sander)拍摄的彩色照片,WPA,美国巴比松学派,最佳质量,8K 原始照片,详细的面部
最后几个关键词是用来控制输出风格的。您可以使用一个常规的负面提示,例如
绘画,绘画,蜡笔,素描,石墨,印象派,嘈杂,模糊,柔和,畸形,丑陋,低分辨率,坏解剖,坏手,裁剪,最差质量,低质量,普通质量,JPEG 伪影,签名,水印,单色,灰度,旧照片
旧照片重建的关键是使用 ControlNet。您需要两个 ControlNet 单元以获得最佳结果。
首先将提升后的图像上传到第一个 ControlNet 单元,并设置类型为 Canny。记得启用此单元并勾选“Pixel Perfect”。这有助于 ControlNet 预处理器使用最佳分辨率。将第一个单元的控制权重设置为 0.8。
然后启用第二个 ControlNet 单元。上传相同的图像,打开 Pixel Perfect,并选择控制类型为“重新着色”。这是一个用于给黑白照片上色的 ControlNet 模型。您应该使用“recolor_luminance”模型作为预处理器。将第二单元的控制权重设置为 0.2。可选地,您可以调整伽马校正,如果需要微调输出的亮度。
记得在 txt2img 中设置输出尺寸,以便与原始图像的宽高比类似,并接近你的 Stable Diffusion 模型的原生分辨率。在此示例中,我们使用 760×600 像素。点击生成,你将看到以下内容:
一张使用 Stable Diffusion 上色的旧照片
你可以下载结果。看看你得到的是什么:
重建的旧照片。
这张照片有些过曝,但你可以看到一张旧照片被复原。所有细节都被保留:人物的面部表情、他们穿的衣物上的污点等等。
那么它是如何工作的?这要求 Stable Diffusion 重新绘制照片。因此,你需要一个提示来指导绘制的扩散过程。但为了精准控制形状和人物,你使用了 Canny 类型的 ControlNet 来勾勒图像,并要求扩散过程符合轮廓。然而,这个轮廓并不完美,因为 Canny 边缘检测算法无法将照片转换为线条图。为了降低失真,你使用第二个 ControlNet 单元基于亮度重新上色输入照片。所有原始颜色被忽略(而且没有),颜色是基于机器学习模型填充的。然而,你不希望照片中有这些缺陷。因此,你为 Canny 设置了更高的权重,为 Recolor 设置了更低的权重。
如果你再次点击生成按钮,你可能会看到人物穿着不同颜色的衣物。这是因为模型对他们应该穿什么颜色没有把握。你可以在提示中描述他们的颜色来控制这一点。你还可以尝试关闭一个 ControlNet 单元并观察结果。只有当两个单元一起工作时,才能获得最佳结果。
关于带有面孔的照片的注意事项:如果你的原始照片状况很差,以至于人物面孔不太可辨认,你可能需要启用 ADetailer 来重建面孔。但仅在必要时进行!否则,你可能会发现你的照片描绘了完全不同的人。
在上述设置中,输出分辨率设置为 760×600。但是,你可能希望获得比 Stable Diffusion 模型支持的更高分辨率。你可以在 txt2img 中使用“高分辨率修复”功能,在图像生成后运行放大器。选项与 Extra 标签中的非常相似。但记得将放大器中的去噪强度设置为低值(如 0.2),因为你不希望施加额外的失真。
进一步阅读
本节提供了更多关于该主题的资源,如果你想深入了解。
-
Lewis Wickes Hine 纪录片摄影,1905-1938 在纽约公共图书馆数字藏品
-
在Civitai和Hugging Face Hub上的Realistic Vision模型。
-
ControlNet 的重新上色模型
-
ControlNet 的canny 模型
摘要
在这篇文章中,你清理了一张旧照片。你去除了缺陷并给一张黑白照片上色,将其带入了现代。在这个过程中,你使用文本提示来驱动扩散过程,在粗糙层级生成图片。然后你使用 ControlNet 来微调输出。你在粗略层面控制了氛围,并在精细层面保留了细节。稳定扩散用于填补空白并重建了照片。
稳定扩散项目:文字艺术
原文:
machinelearningmastery.com/stable-diffusion-project-word-art/
稳定扩散是一个强大的工具,可以帮助你生成图片。玩这个生成式 AI 工具很有趣。但如果这个工具能够在实际工作中帮助你,那将会很有用。在这篇文章中,你将看到如何利用稳定扩散的力量来处理一些现实和实用的事情。完成这篇文章后,你将学到:
-
决定如何使用稳定扩散的推理过程
-
在你的创意项目中,使用稳定扩散来增强其他工具
通过我的书籍 《掌握稳定扩散的数字艺术》 来启动你的项目。它提供了自学教程和有效代码。
让我们开始吧
稳定扩散项目:文字艺术
图片由 Zach Key 提供。保留部分权利。
概述
本文分为三个部分;它们是:
-
项目构思
-
创建图片
-
不同主题下的相同想法
项目构思
想象一下你正在进行一个项目,需要一些文字艺术。它可以是你网站的横幅或海报中的关键视觉元素。文字应该清晰可见,但图形也很重要。你怎么将字母融入图片中?你希望结果非常吸引人,而不是那种你可以轻松用 Photoshop 或 Microsoft Word 创建的效果。
让我们考虑“绿色”这个主题来保护环境。我们想要一张自然景观和“绿色”这个词的图片。看看它是如何创建的。
创建图片
在稳定扩散中创建自然场景非常容易,只需使用适当的提示。将文本叠加到图片上应该不太困难,因为你可以很容易地在 PowerPoint 中为图片背景添加带有阴影的文本。但让场景与文本融合则需要一些技巧,即使使用 Photoshop,也需要相当多的时间。
提供一个提示以控制图片生成,同时对图片施加额外约束的想法是 ControlNet 可以做到的。要使用 ControlNet,你需要一张图片。让我们用 GIMP 创建一张。
假设目标图片是 768×512 像素(记住 SD1 模型的默认分辨率是 512×512 像素;你不应该使尺寸差别太大)。你可以在 GIMP 中将画布设置为这个尺寸,并在白色背景上制作黑色文字“GREEN”。然后将图片保存为 PNG 格式。
创建一个白色背景和黑色文字“GREEN”的图片。
请注意,你并不一定要使用 GIMP 来创建这样的图片。你也可以在 Microsoft Word 中输入文本并截屏。这个方法唯一的问题是你不容易控制分辨率。
让我们进入 Stable Diffusion Web UI。你应该使用“text2img”功能,并选择一个 Stable Diffusion 1.x 模型(如 Deliberate_v6)。因为我们想生成自然场景,你可以设置提示词:
森林的自然场景,高度细致,史诗般的
并保持负面提示词为空。将图像大小设置为宽 768 像素,高 512 像素。使用这样的提示(并取决于你选择的模型、CFG 规模和采样器),你可以生成如下图片:
一张森林的图片。由作者使用 Stable Diffusion 生成。
看起来不错。现在你已经确认提示词有效,输出符合预期。让我们继续使用 ControlNet。启用 ControlNet,上传你用 GIMP 创建的图片。将“控制类型”设置为“All”,然后在预处理器中选择“反转(从白色背景和黑色线条)”,模型选择一个深度模型(如“control_v11f1p_sd15_depth”)。然后点击生成,看看效果。你可能会看到如下结果:
一张生成效果较差的图片,文字与背景融合不佳。
“GREEN”这个文本似乎没有很好地融入图片。文字有些纹理,但仍然显得生硬。这是因为你没有正确使用 ControlNet。这是 ControlNet 驱动图片生成时间过长的结果。你可以将 ControlNet 的重要性调整到 0.7,而不是 1.0。但是最重要的是,你希望 ControlNet 仅参与扩散过程的前 60% 步骤。这样,后 40% 的步骤仅使用你的提示词,但图片的轮廓已经建立。
只需这个更改,你应该能看到文字和图片的更好融合。但有时,你可能会看到文字变形,因为你给了扩散过程过多自由来改变图片的最后 40% 步骤。这将很难控制,但你可以设置更大的批量大小或生成多个批次,以检查多个随机种子的运气。以下是你可能得到的一个示例:
由 Stable Diffusion 生成的文字艺术,文字与背景融合良好。
这张图片使用了 CFG 规模为 5 的“Euler a”采样器,Karras 调度在 25 步骤上。ControlNet 的权重为 0.7,起始控制步骤为 0,结束控制步骤为 0.6。生成的图片中有一半可能会出现字母变形,但这是另一半中最好的。你可以看到树木如何形成了字母。用 Photoshop 绘制这样的效果需要很长时间。
相同的想法,不同的主题
“绿色”并不总是与自然有关。通过不同的提示,但保持所有其他参数相同,你可以得到不同的图片。让我们“走绿色”并推广吃蔬菜。只需将提示更改为
厨房桌上的蔬菜
你可以得到如下图片:
在 Stable Diffusion 中重用相同模板生成不同的图片。
实际上,这就是你应该学习如何有效使用 Stable Diffusion 的课程:通过实验不同的参数并找到最佳参数,你可以轻松地调整工作流程,创建出质量相同但完全不同的新图片。
进一步阅读
本节提供了更多关于该主题的资源,如果你想深入了解。
-
ControlNet 在 GitHub 上
-
向文本到图像扩散模型添加条件控制 作者:张等(2023)
-
Deliberate 模型 在 Hugging Face 上
总结
在这篇文章中,你已经看到如何创建一个将文字自然融入背景中的字艺术图片。结果很吸引人,而手工绘制这种效果并不容易。然而,你可以使用带有 ControlNet 插件的 Stable Diffusion 快速生成这种详细的结果。
使用 Dreambooth 训练稳定扩散
原文:
machinelearningmastery.com/training-stable-diffusion-with-dreambooth/
Stable Diffusion 是在 LAION-5B 上训练的,这是一个包含数十亿通用图像文本对的大规模数据集。然而,在理解特定主题及其生成在不同语境中方面存在不足(通常是模糊的、模糊的或无意义的)。为了解决这个问题,对稳定扩散进行特定用例的微调变得至关重要。对于稳定扩散有两种重要的微调技术:
-
文本反转:这种技术专注于重新训练模型的文本嵌入,将一个词注入为主题。
-
DreamBooth:与文本反转不同,DreamBooth 涉及重新训练整个模型,专门针对主题进行优化,从而实现更好的个性化。
在这篇文章中,您将探索以下概念:
-
DreamBooth 中的微调挑战和推荐设置
-
使用 DreamBooth 进行稳定扩散微调的示例
-
有效使用 Dreambooth 在稳定扩散中的提示
启动你的项目,使用我的书籍 掌握稳定扩散数字艺术。它提供了 自学教程 和 工作代码。
让我们开始吧
使用 DreamBooth 训练稳定扩散
摄影师 Sasha Freemind。部分权利保留。
概述
本文分为五部分;它们是:
-
什么是 DreamBooth?
-
微调挑战
-
使用 DreamBooth 进行微调的工作流程
-
使用您训练过的模型
-
使用 DreamBooth 效果的技巧
什么是 DreamBooth?
DreamBooth 是生成 AI 中的重大飞跃,特别是 Text2Img 模型。它是谷歌研究人员引入的一种专门技术,用于微调预训练的大型 Text2Img 模型,例如 Stable Diffusion,以特定的主题、字符或对象。现在你可以向模型注入自定义对象或概念,以获得更个性化和多样化的生成结果。这是谷歌研究人员的表述方式
它就像一个照相亭,但一旦捕捉到主题,它可以在你的梦中合成。
DreamBooth 在各个领域提供了一系列令人兴奋的用例,主要集中在增强图像生成方面。这包括
-
个性化: 用户可以创建所爱之人、宠物或特定对象的图像,适合作为礼物、社交媒体和个性化商品。
-
艺术和商业用途: 艺术家和设计师可以用他们的艺术作品训练模型,生成多样化的艺术图像和视觉化效果。这对于商业用途也很有益,可以根据品牌和营销需求进行定制图像生成。
-
研究与实验: DreamBooth 是一个强大的研究工具。它使探索深度学习模型、领域特定应用和受控实验成为可能。通过微调模型,研究人员可以推动生成式 AI 的边界,并获得对其潜力的新见解。
只需提供几张你主题的图像,加上训练期间的类别名称和推理期间特别定制的提示,你就可以生成个性化的输出。让我们深入了解 DreamBooth 微调过程:
-
创建微调图像数据集
包含几张(3-5 张)高质量和具有代表性的主题图像。模型将根据训练数据学习如何适应主题,因此需要仔细设计。有关更多详细信息,请参见微调部分。
-
绑定唯一标识符和类别名称
主题必须与文本模型词汇表中不常用的稀有标记关联。模型将通过这个唯一标识符识别主题。为了保持主题的原始本质,你还需要在训练期间提供一个类别名称(模型已经知道)。例如,你可以将个人宠物狗与标识符 “[V]” 和类别名称 “dog” 关联,以便当提示 “a [V] dog sitting” 时,模型在生成狗图像时会识别出宠物狗的标识符。
微调模型。图像来自 DreamBooth
上述第一个标准在图像生成中因显而易见的原因而重要。第二个标准也很重要,因为你不是从头开始训练 Stable Diffusion,而是对现有模型进行微调以适应你的数据集。模型已经学会了什么是狗。让模型学习你的标记是狗的变种比让模型忘记一个词(即将一个词的意义重新分配给一个完全不同的概念)或从头开始学习一个新词(例如,从一个从未见过任何动物的模型中学习狗是什么)要容易。
微调挑战
微调一个 Stable Diffusion 模型意味着从一个已知有效的现有模型开始重新训练。这种特定类型的训练有一些挑战:
-
过拟合
过拟合发生在模型过于紧密地记忆训练数据时,从而忘记如何进行泛化。它开始只对训练数据表现良好,但对新数据表现不佳。由于你只提供了少量图像给 Dreambooth,它可能会迅速发生过拟合。
-
语言漂移
语言漂移是在微调语言模型时常见的现象,并且这种影响扩展到 Txt2Img 模型。在微调期间,模型可能会丧失有关类别内不同表现形式的重要信息。这种漂移导致模型在生成同一类别中的多样化主题时出现困难,从而影响输出的丰富性和多样性。
这里有几个 DreamBooth 设置,通过仔细调整这些设置,您可以使模型更适应生成多样化的输出,同时还减少过拟合和语言漂移的风险:
-
优化学习率和训练步骤
调整学习率、训练步骤和批量大小是克服过拟合的关键。高学习率和许多训练步骤会导致过拟合(影响多样性)。小学习率和较少的训练步骤将导致模型拟合不足(未能捕捉主题)。因此,建议从较低的学习率开始,并逐步增加训练步骤,直到生成看起来令人满意为止。
-
先前保留损失
通过生成相同类别的新样本(大约 200 到 300 个)以及主题图像,然后将这些添加到我们的训练图像集中来完成。这些额外的图像是通过一个类提示由稳定扩散模型本身生成的。
-
GPU 高效技术
诸如 8bit-Adam(支持量化)、fp16 混合精度训练(将梯度计算的精度降低到 16 位浮点数)和梯度累积(分步计算梯度而不是整个批量)等技术可以帮助优化内存利用和加快训练速度。
DreamBooth 微调工作流程
我们已经准备好开始微调过程,并使用基于扩散器的 DreamBooth 训练脚本的简化版本,如下所示。借助上述 GPU 高效技术,您可以在 Google Colab 笔记本中的 Tesla T4 GPU 上运行此脚本。
在开始之前,您应该设置环境。在笔记本单元格中,您可以使用以下内容来运行 shell 命令:
!wget -q https://github.com/ShivamShrirao/diffusers/raw/main/examples/dreambooth/train_dreambooth.py
!wget -q https://github.com/ShivamShrirao/diffusers/raw/main/scripts/convert_diffusers_to_original_stable_diffusion.py
%pip install -qq git+https://github.com/ShivamShrirao/diffusers
%pip install -q -U --pre triton
%pip install -q accelerate transformers ftfy bitsandbytes natsort safetensors xformers
在上述中,下载的训练脚本名为train_dreambooth.py
。还下载了一个转换脚本来处理训练输出。一些包已安装在 Python 环境中。为了验证其是否正常工作,您可以在新的单元格中运行这些导入语句,以确保没有触发任何错误:
import json
import os
from google.colab import files
import shutil
from natsort import natsorted
from glob import glob
import torch
from torch import autocast
from diffusers import StableDiffusionPipeline, DDIMScheduler
from IPython.display import display
训练稳定扩散模型需要大量资源。最好利用一些在线资源来存储模型。脚本假定您已注册了 Hugging Face 账户并获得了 API 令牌。请在标记为HUGGINGFACE_TOKEN
的指定字段中提供您的访问令牌,以使脚本正常工作,即,
!mkdir -p ~/.huggingface
HUGGINGFACE_TOKEN = "put your token here"
!echo -n "{HUGGINGFACE_TOKEN}" > ~/.huggingface/token
让我们指定我们的基础模型和输出目录,模型将在其中保存。我们将在启动脚本时传递这些变量。
MODEL_NAME = "runwayml/stable-diffusion-v1-5"
OUTPUT_DIR = "/content/stable_diffusion_weights/zwx"
# Create output directory
!mkdir -p $OUTPUT_DIR
现在是从 DreamBooth 中获得满意和一致结果的最关键部分。重要的是使用代表您主题的高质量图像。请注意,模型将从训练集中学习到低分辨率或运动模糊等工件。在创建数据集时应考虑以下几点:
-
数据集大小:由于这些模型可能很快过拟合,最好包括 10 到 120 个主题样本。将它们裁剪并调整大小为 512×512 像素
-
图像多样性:选择一致的样本,并尝试包括不同角度的图像。为了多样性,你可能需要包含背景场景,如人物、风景或动物/物体。此外,移除内部的多余物体(例如,水印、被边缘剪裁的人物)。避免使用背景单一或透明的图像。
在你将图像上传到 Colab 笔记本之前,让我们运行以下单元格:
# The concepts_list is a list of concepts/subject, each represented as a dictionary
concepts_list = [
{
"instance_prompt": "photo of zwx dog",
"class_prompt": "photo of a dog",
"instance_data_dir": "/content/data/zwx",
"class_data_dir": "/content/data/dog"
},
]
# Create a directory for each concept according to its instance_data_dir
for c in concepts_list:
os.makedirs(c["instance_data_dir"], exist_ok=True)
#Dump the concepts_list to a JSON file
with open("concepts_list.json", "w") as f:
json.dump(concepts_list, f, indent=4)
运行此单元格后,映射到instance_data_dir
的路径会被创建为一个目录。你准备的图像应通过 Colab 笔记本侧边面板上的文件图标上传到上述目录。
instance_prompt
是一个示例。你应根据你希望为图像命名的方式进行更新。建议使用新的令牌(例如上述“zwx”)作为唯一标识符。但class_prompt
应仅使用易于理解的词语来突出图像。
在这个示例中,我们正在对 Husky 犬进行 Stable Diffusion 微调,我们提供了 7 张实例图像。你可以尝试类似的操作。在此单元格之后,你的目录结构可能如下所示:
从 Colab 笔记本侧边面板中查看的目录,其中包含训练图像
现在你准备好开始训练了。以下表格列出了根据计算要求的最佳标志。限制因素通常是 GPU 上的内存。
训练的推荐标志
训练是执行diffusers
提供的训练脚本。这里是一些你可能考虑的参数:
-
--use_8bit_adam
启用完全精度和量化支持 -
--train_text_encoder
启用文本编码器微调 -
--with_prior_preservation
启用先验保持损失 -
--prior_loss_weight
控制先验保持的强度
在 Colab 笔记本上创建并运行以下单元格将完成训练:
!python3 train_dreambooth.py \
--pretrained_model_name_or_path=$MODEL_NAME \
--pretrained_vae_name_or_path="stabilityai/sd-vae-ft-mse" \
--output_dir=$OUTPUT_DIR \
--revision="fp16" \
--with_prior_preservation --prior_loss_weight=1.0 \
--seed=1337 \
--resolution=512 \
--train_batch_size=1 \
--train_text_encoder \
--mixed_precision="fp16" \
--use_8bit_adam \
--gradient_accumulation_steps=1 \
--learning_rate=1e-6 \
--lr_scheduler="constant" \
--lr_warmup_steps=0 \
--num_class_images=50 \
--sample_batch_size=4 \
--max_train_steps=800 \
--save_interval=10000 \
--save_sample_prompt="photo of zwx dog" \
--concepts_list="concepts_list.json"
耐心等待此脚本完成。然后你可以运行以下命令,将其转换为我们可以使用的格式:
WEIGHTS_DIR = natsorted(glob(OUTPUT_DIR + os.sep + "*"))[-1]
ckpt_path = WEIGHTS_DIR + "/model.ckpt"
half_arg = ""
fp16 = True
if fp16:
half_arg = "--half"
!python convert_diffusers_to_original_stable_diffusion.py --model_path $WEIGHTS_DIR --checkpoint_path $ckpt_path $half_arg
print(f"[*] Converted ckpt saved at {ckpt_path}")
上述操作将在指定给WEIGHTS_DIR
(即最新检查点目录)的目录下创建文件model.ckpt
。该输出文件将与 Automatic1111 提供的 Stable Diffusion Web UI 兼容。如果fp16
设置为True
,则只占用一半的空间(即 2GB),通常推荐使用。
使用你训练好的模型
创建的模型就像任何其他 Stable Diffusion 模型权重文件一样。你可以将其加载到 WebUI 中。你也可以使用 Python 代码加载它,如下单元格所示:
model_path = WEIGHTS_DIR
pipe = StableDiffusionPipeline.from_pretrained(model_path, safety_checker=None,
torch_dtype=torch.float16
).to("cuda")
pipe.scheduler = DDIMScheduler.from_config(pipe.scheduler.config)
pipe.enable_xformers_memory_efficient_attention()
g_cuda = torch.Generator(device='cuda')
seed = 52362
g_cuda.manual_seed(seed)
让我们尝试四个样本:
prompt = "photo of zwx dog in a bucket wearing 3d glasses"
negative_prompt = ""
num_samples = 4
guidance_scale = 7.5
num_inference_steps = 24
height = 512
width = 512
with autocast("cuda"), torch.inference_mode():
images = pipe(
prompt,
height=height,
width=width,
negative_prompt=negative_prompt,
num_images_per_prompt=num_samples,
num_inference_steps=num_inference_steps,
guidance_scale=guidance_scale,
generator=g_cuda
).images
for img in images:
display(img)
# Free runtime memory
exit()
这就是生成图像的样子:
就这样!
有效使用 DreamBooth 的提示
如果您正在为面部微调模型,先前的保留至关重要。面部需要更严格的训练,因为梦幻亭在面部微调时需要更多的训练步骤和更低的学习率。
像 DDIM(首选)、PNDM 和 LMS Discrete 这样的调度器可以帮助减轻模型的过拟合。当输出看起来嘈杂或缺乏锐度或细节时,您应该尝试使用调度器。
除了 U-Net 训练外,训练文本编码器可以显著提升输出质量(特别是在面部),但会消耗内存;至少需要一个 24GB 的 GPU。您也可以使用上述讨论的高效 GPU 技术进行优化。
进一步阅读
如果您想深入了解此主题,本节提供了更多资源。
-
LAION-5B 数据集:
laion.ai/blog/laion-5b/
-
通过视觉基础对抗语言漂移,Lee 等人(2019)
总结
现在您已经探索了梦幻亭,它是用于个性化内容的稳定扩散模型的强大工具。然而,由于图像较少和语言漂移,它面临着过拟合等挑战。为了充分利用梦幻亭,您还看到了一些优化方法。请记住,成功使用梦幻亭取决于仔细的数据集准备和精确的参数调整。有关更深入的见解,请参考详细的梦幻亭训练指南。
在稳定扩散中使用 LoRA
原文:
machinelearningmastery.com/using-lora-in-stable-diffusion/
稳定扩散的深度学习模型非常庞大。权重文件的大小达到数 GB。重新训练模型意味着需要更新大量权重,这是一项繁重的工作。有时我们必须修改稳定扩散模型,例如,定义新的提示解释或让模型默认生成不同风格的画作。事实上,有方法可以在不修改现有模型权重的情况下对现有模型进行扩展。在这篇文章中,你将了解低秩适配,它是修改稳定扩散行为的最常见技术。
用我的书《掌握稳定扩散数字艺术》来启动你的项目,Mastering Digital Art with Stable Diffusion。它提供了自学教程和可运行代码。
让我们开始吧。
在稳定扩散中使用 LoRA
图片来源:Agent J。保留部分权利。
概述
本文分为三部分;它们是:
-
低秩适配是什么
-
检查点还是 LoRA?
-
LoRA 模型示例
低秩适配是什么
LoRA(低秩适配)是一种轻量级训练技术,用于对大型语言模型和稳定扩散模型进行微调,而无需进行完整的模型训练。对较大模型(由数十亿个参数组成)进行全面微调本质上是昂贵且耗时的。LoRA 通过向模型添加较少的新权重进行训练,而不是重新训练整个参数空间,从而显著减少了可训练参数的数量,这样可以缩短训练时间并减小文件大小(通常在几百兆字节左右)。这使得 LoRA 模型更容易存储、共享,并在消费者级 GPU 上使用。
简而言之,LoRA 就像是在现有工厂中添加一小队专业工人,而不是从头开始建立一个全新的工厂。这允许对模型进行更高效、更有针对性的调整。
LoRA 是一种由微软研究人员提出的最先进的微调方法,用于将较大模型适配到特定概念。一个典型的全面微调涉及在神经网络的每一层中更新整个模型的权重。Aghajanyan et al.(2020) 解释了预训练的过参数化模型实际上存在于低内在维度上。LoRA 方法基于这一发现,通过将权重更新限制在模型的残差上。
假设 W 0 ∈ R d × k W_0\in \mathbb{R}^{d\times k} W0∈Rd×k 表示一个预训练的权重矩阵,大小为 R d × k \mathbb{R}^{d\times k} Rd×k(即,一个有 d d d 行和 k k k 列的实数矩阵),它通过 Δ W \Delta W ΔW(更新矩阵)进行变化,以使微调模型的权重为
W ’ = W 0 + Δ W W’ = W_0 + \Delta W W’=W0+ΔW
LoRA 使用这种技术,通过秩分解来降低更新矩阵 Δ W \Delta W ΔW 的秩,使得:
$$
\Delta W = B \times A
$$
其中 B ∈ R d × r B\in\mathbb{R}^{d\times r} B∈Rd×r 和 A ∈ R r × k A\in\mathbb{R}^{r\times k} A∈Rr×k,使得 r ≪ min ( k , d ) r\ll \min(k,d) r≪min(k,d)$。
将矩阵拆分为两个低秩矩阵
通过冻结 W 0 W_0 W0(以节省内存),我们可以微调 A A A 和 B B B,这包含了用于适应的可训练参数。这导致微调后的模型的前向传递如下:
$$
h = W’x = W_0 x + BA x
$$
对于稳定扩散微调,应用秩分解到交叉注意力层(下方阴影部分)就足够了,这些层负责整合提示和图像信息。具体来说,这些层中的权重矩阵 W O W_O WO、 W Q W_Q WQ、 W K W_K WK 和 W V W_V WV 被分解以降低权重更新的秩。通过冻结其他 MLP 模块并仅微调分解后的矩阵 A A A 和 B B B,LoRA 模型可以实现更小的文件大小,同时速度更快。
稳定扩散的工作流程。交叉注意力模块可以被 LoRA 修改。
检查点还是 LoRA?
检查点模型是一个在训练期间保存于特定状态的完整预训练模型。它包含了训练过程中学习到的所有参数,可以用于推理或微调。然而,微调检查点模型需要更新模型中的所有权重,这可能会计算量大且文件大小较大(对于稳定扩散,通常为几 GB)。
另一方面,LoRA(低秩适应)模型要小得多且更高效。它作为一种适配器,建立在检查点模型(基础模型)的基础之上。LoRA 模型仅更新检查点模型的部分参数(增强检查点模型)。这使得这些模型体积较小(通常为 2MB 到 500MB),并且可以频繁地针对特定概念或风格进行微调。
例如,稳定扩散模型的微调可以使用 DreamBooth。DreamBooth 是一种微调方法,它更新整个模型以适应特定的概念或风格。虽然它可以产生令人印象深刻的结果,但也有一个显著的缺点:微调模型的大小。由于 DreamBooth 更新了整个模型,结果检查点模型可能非常大(约 2 到 7 GB),并且需要大量 GPU 资源进行训练。相比之下,LoRA 模型显著减少了 GPU 需求,但推断效果仍然与 DreamBooth 检查点相当。
虽然 LoRA 是最常见的,但它并不是唯一修改 Stable Diffusion 的方式。参见上面的工作流程,crossattention 模块接收了输入 τ θ \tau_\theta τθ,通常是将提示文本转换为文本嵌入的结果。修改嵌入就是 Text Inversions 所做的,以改变 Stable Diffusion 的行为。Textual Inversions 甚至比 LoRA 更小、更快。然而,Textual Inversions 有一个限制:它们 仅微调特定概念或风格的文本嵌入。负责生成图像的 U-Net 保持不变。这意味着 Textual Inversions 只能生成与其训练图像相似的图像,无法生成超出其已知范围的内容。
LoRA 模型的示例
在 Stable Diffusion 的背景下,有许多不同的 LoRA 模型。对它们进行分类的一种方式是基于 LoRA 模型的功能:
-
人物 LoRA:这些模型经过微调,以捕捉特定角色的外观、身体比例和表情,通常出现在卡通、视频游戏或其他媒体形式中。它们对创建粉丝艺术作品、游戏开发和动画/插图目的非常有用。
-
风格 LoRA:这些模型在特定艺术家或风格的艺术作品上进行了微调,以生成该风格的图像。它们通常用于将参考图像风格化为特定的美学。
-
服装 LoRA:这些模型在特定艺术家或风格的艺术作品上进行了微调,以生成该风格的图像。它们通常用于将参考图像风格化为特定的美学。
一些示例如下:
使用人物 LoRA “goku black [dragon ball super]” 在 Civitai 上创建的图像,由 TheGooder 贡献。
使用风格 LoRA “动漫线稿/漫画风格 (线稿/線画/マンガ風/漫画风) Style” 在 Civitai 上创建的图像,由 CyberAIchemist 贡献。
使用服装 LoRA “动漫线稿/漫画风格 (线稿/線画/マンガ風/漫画风) Style” 在 Civitai 上创建的图像,由 YeHeAI 贡献。
找到 LoRA 模型文件最受欢迎的地方是 Civitai。如果你正在使用 Stable Diffusion Web UI,你只需下载模型文件并将其放入 stable-diffusion-webui/models/Lora
文件夹中。
要在 Web UI 中使用 LoRA,你只需将 LoRA 的名称用尖括号括起来,作为提示的一部分。例如,上述图像之一是通过以下提示生成的:
最佳杰作,1girl,独自,极其荒谬的分辨率,卫衣,耳机,街头,户外,下雨,霓虹灯,微笑,帽子戴上,手插在口袋里,侧面看,线条画,单色,lora:animeoutlineV4_16:1
部分“lora:animeoutlineV4_16:1”表示使用名为animeoutlineV4_16.safetensors
的 LoRA 模型文件,并以权重 1 应用它。注意,在提示中,除了对 LoRA 模型的引用外,并未提及线条画风格。因此,你可以看到 LoRA 模型对输出产生了巨大的影响。如果你感兴趣,你可以从 Civitai 上发布的内容中经常找到生成图片所使用的提示和其他参数。
查看在 Civitai 上发布的图片,可以在屏幕右半部分看到生成它所使用的提示和其他参数。
最后提醒,LoRA 依赖于你使用的模型。例如,Stable Diffusion v1.5 和 SD XL 在架构上不兼容,因此你需要一个与基础模型版本匹配的 LoRA。
进一步阅读
以下是介绍 LoRA 微调技术的论文:
-
“LoRA: 大型语言模型的低秩适应”,由 Hu 等人(2021 年)
-
“内在维度解释语言模型微调的有效性”,由 Aghajanyan 等人(2020 年)
总结
在这篇文章中,你了解了什么是 Stable Diffusion 中的 LoRA 以及它为何是轻量级的增强。你还了解到,使用 Stable Diffusion Web UI 中的 LoRA 就像在提示中添加一个额外的关键词一样简单。许多 Stable Diffusion 用户开发了 LoRA 模型,并在互联网上提供下载。你可以找到一个来轻松改变生成的结果,而无需过多担心如何描述你想要的风格。