万字长文:stable diffusion 保姆级教程
2022年绝对是人工智能爆发的元年,前有 stability.ai 开源 stable diffusion 模型,后有 open ai 发布 chatgpt,二者都是里程碑式的节点事件,其重要性不亚于当年苹果发布iphone,google推出android。它们让ai不再是一个遥不可及的技术名词,而是触手可及、实实在在的智能应用工具。
不同于chatgpt可以直接体验,stable diffusion需要自己部署后才能使用,所以国内了解的人还不多。但stable diffusion绝对是ai图像生成领域的chatgpt级的杀手产品——它使用超级简单、完全开源免费,生成的图片以假乱真、震惊四座。今天,我将用万字保姆级教程教你如何一步一步在本地运行起stable diffusion,并手把手教你如何生成以假乱真的ai生成图片。
文章目录
什么是stable diffusion
stable diffusion是一种潜在扩散模型(latent diffusion model),能够从文本描述中生成详细的图像。它还可以用于图像修复、图像绘制、文本到图像和图像到图像等任务。简单地说,我们只要给出想要的图片的文字描述在提stable diffusion就能生成符合你要求的逼真的图像!
stable diffusion将“图像生成”过程转换为逐渐去除噪声的“扩散”过程,整个过程从随机高斯噪声开始,经过训练逐步去除噪声,直到不再有噪声,最终输出更贴近文本描述的图像。这个过程的缺点是去噪过程的时间和内存消耗都非常大,尤其是在生成高分辨率图像时。stable diffusion引入潜在扩散来解决这个问题。潜在扩散通过在较低维度的潜在空间上应用扩散过程而不是使用实际像素空间来减少内存和计算成本。
与dall·e和midjourney相比,stable diffusion最大的优势是开源,这就意味着stable diffusion的潜力巨大、发展飞快。stable diffusion已经跟很多工具和平台进行了集成,且可用预训练模型数量众多(参见stable diffusion资源列表)。正是由于社区的活跃,使得stable diffusion在各种风格的图像生成上都有着出色的表现,随便给大家看几张我生成的图片:
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
核心概念
为了方便大家更好地理解后面的内容,下面对stable diffusion中的几个核心概念做简单的说明。stable diffusion的详细原理请参考《stable diffusion原理详解》。
自动编码器
自动编码器 (vae) 由两个主要部分组成:编码器和解码器。编码器会将图像转换为低维潜在表示(像素空间–>潜在空间),该表示将作为输入传递给u_net。解码器做的事情刚好相反,将潜在表示转换回图像(潜在空间–>像素空间)。
u-net
u-net 也由编码器和解码器组成,两者都由 resnet 块组成。编码器将图像表示压缩为较低分辨率的图像,解码器将较低分辨率解码回较高分辨率的图像。
为了防止 u-net 在下采样时丢失重要信息,通常在编码器的下采样 resnet 和解码器的上采样 resnet 之间添加快捷连接。
此外,stable diffusion 中的 u-net 能够通过交叉注意力层调节其在文本嵌入上的输出。 交叉注意力层被添加到 u-net 的编码器和解码器部分,通常在 resnet 块之间。
文本编码器
文本编码器会将输入提示转换为 u-net 可以理解的嵌入空间。一般是一个简单的基于transformer的编码器,它将标记序列映射到潜在文本嵌入序列。
好的提示(prompt)对输出质量直观重要,这就是为什么现在大家这么强调提示设计(prompt design)。提示设计就是要找到某些关键词或表达方式,让提示可以触发模型产生具有预期属性或效果的输出。
推理过程
stable diffusion的大致工作流程如下:
首先,stable diffusion模型将潜在种子和文本提示作为输入。 然后使用潜在种子生成大小为 64×64 的随机潜在图像表示,而文本提示通过 clip 文本编码器转换为 77×768 的文本嵌入。
接下来,u-net 以文本嵌入为条件迭代地对随机潜在图像表示进行去噪。 u-net 的输出是噪声残差,用于通过调度算法计算去噪的潜在图像表示。 调度算法根据先前的噪声表示和预测的噪声残差计算预测的去噪图像表示。这里可选用的调度算法很多,每个算法各有优劣,对stable diffusion来说建议用以下几个:
去噪过程重复大约 50 次以逐步检索更好的潜在图像表示。 完成后,潜在图像表示由变分自动编码器的解码器部分解码。
整体流程可以用下面的流程图表示:
快速体验stable diffusion
如果你不想自己搭建stable diffusion环境,或者你想在自己动手部署statble diffusion之前,先体验一下stable diffusion的威力,可以尝试如下5个免费的工具:
1. dream studio
dreamstudio 是stable diffusion的创造者stability ai的官方网络应用程序。
最大的优势是官方出品,支持stability.ai旗下的所有模型,包括最新发布的stable diffusion v2.1。
用dream studio生成图片需要消耗积分,注册是会免费赠送积分,用来体验基本够用。如果想生成更多图片可以花10美元购买积分,大约可以生成1000张图片。
2. replicate
replicate是一个机器学习模型共享平台,你可以通过api来分享或使用上面的模型。
大神cjwbw在replicate上共享了stable diffusion v2.0模型,你可以免费测试。
3. playground ai
playground ai是一个专注ai图像生成的网站,功能丰富、模型众多。最近也上线了最新的stable diffusion v2.1,可以免费使用,但限制每个用户每天最多生成1000张图片。
4. google colab
如果你是数据工程师或算法工程师,可能你更希望在jupyter notebook中使用stable diffusion。anzor qunash在google colab上共享了stable diffusion 2.0 colab(已更新到2.1),你可以直接复制过来使用。
该notebook用gradio搭建了界面,只需点击运行按钮,就会显示gradio ui界面。然后,您就可以在上面生成任意数量的图像,并且可以调节参数,控制生成效果。
5. baseten
baseten是一个mlops平台,用于创业公司在生产阶段快速开发、部署和测试模型。baseten最近发布了对stable diffusion的api支持,并提供了一个演示页面。
这个工具非常简单,只有一个文本框和一个生成按钮,没有其他参数可以调节,也没有生成数量的限制。
本地部署stable diffusion
本地部署stable diffusion最简单的方法是使用stable diffusion web ui。
stable diffusion web ui是一套无代码、可视化的stable diffusion集成运行环境。它将stable diffusion的安装部署集成打包,提供一键安装脚本,并提供web界面操作界面,极大简化了stable diffusion的操作和使用,让没有不懂代码的小白也能轻松上手使用stable diffusion模型。
系统配置需求
stable diffusion还是比较吃资源的,因此对基础硬件有一定要求。
- nvidia gpu 至少 4gb 显存
- 至少 10gb 可用硬盘空间
上面的配置是stable diffusion运行起来的基础要求,如果想要生成速度快,显卡配置自然是越高越好,显存最好也上到8g。推荐配置最好不低于:
- nvidia rtx gpu 至少 8gb 显存
- 至少 25gb 可用硬盘空间
如果本地机器配置达不到,可以考虑用云虚拟主机。目前最经济的是aws的g4dn.xlarge,¥3.711元/小时。
环境准备
stable diffusion web ui用python开发,完全开源,因此在运行stable diffusion web ui前,我们需要安装git来拉取stable diffusion web ui源代码,并安装python。
安装git
git是一个开源的分布式版本控制系统。这里安装git是为了获取stable diffusion web ui的代码。当然,如果不安装git,我们也可以通过代码打包下载链接直接下载stable diffusion web ui的代码,但是这样获取的代码无法后续更新,每次stable diffusion web ui升级都要重新下载代码覆盖老版本代码。用git就很方便,可以通过clone
命令从代码库获取代码,通过git pull
更新到最新版代码。
git安装很简单,只需到git下载页面下载对应平台安装包安装即可(linux发行版一般自带git可以不用安装)。
windows用户请注意,安装时在安装配置界面勾选上“add a git bash profile to windows terminal”选项。
安装python
python的安装方法有很多,这里推荐大家通过miniconda来安装。用miniconda有几个好处:
- 方便创建和管理多个python虚拟环境。我建议每个python项目都创建一套自己独立的python虚拟环境,防止python环境或库版本不对导致代码运行出错。
- miniconda体积很小,只有conda+python+pip+zlib和一些其他常用的包,小巧灵活。
大家只要到miniconda下载页面下载对应平台的安装包即可,最新的miniconda包含python 3.10.9。
下载完安装包直接双击安装即可(linux版本在shell中运行下载下来的shell脚本)。windows用户请注意,当看到下面界面时,请务必勾选第一个选项,将miniconda添加到环境变量path中。
配置国内源
由于 python 第三方库的来源是国外源,使用国内网络安装库时会出现下载缓慢、卡顿等现象,不仅耽误时间,而且很容易安装失败。因此我们需要将 conda 的安装源替换成国内镜像,这样可以大幅提升下载速度,提高安装成功率。这里推荐清华源,执行下方命令即可添加:
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
添加成功后可以通过conda config --show-sources
查看当前源
channels:
- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
- defaults
show_channel_urls: true
除了清华源,还可以添加中科大源或阿里云源
中科大的源
conda config –add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
阿里云的源
conda config --add channels http://mirrors.aliyun.com/pypi/simple/
最后,运行conda clean -i
清除索引缓存,保证用的是镜像站提供的索引。
安装stable diffusion web ui
环境配置好后,我们就可以开始安装stable diffusion web ui了。
首先从github上下载stable diffusion web ui的源代码:
git clone https://github.com/automatic1111/stable-diffusion-webui.git
下载完成后,cd stable-diffusion-webui
进入stable diffusion web ui的项目目录,在项目目录里会看到webui.bat
和webui.sh
这两个文件,这两个文件就是stable diffusion web ui的安装脚本。
- 如果你是windows系统,直接双击运行
webui.bat
文件 - 如果你是linux系统,在控制台运行
./webui.sh
- 如果你是mac系统,使用方法跟linux相同
安装脚本会自动创建python虚拟环境,并开始下载安装缺失的依赖库。这个过程可能会有点久,请耐心等待。如果中途安装失败,多半是网络连接超时,此时可以重新执行安装脚本,脚本会接着上次的下载安装位置继续安装。直到看到
running on local url: http://127.0.0.1:7860
说明stable diffusion web ui安装成功。
用浏览器打开http://127.0.0.1:7860
就会看到stable diffusion web ui的界面。
模型安装
stable diffusion web ui安装过程中会默认下载stable diffusion v1.5模型,名称为v1-5-pruned-emaonly。如果想用最新的stable diffusion v2.1,可以从hugging face上下载官方版本stabilityai/stable-diffusion-2-1。下载后将模型复制到models
目录下的stable-diffusion
目录即可。完成后点击页面左上角的刷新按钮,即可在模型下拉列表中看到新加入的模型。
除了标准模型外,stable diffusion还有其他几种类型的模型,models
目录下每一个子目录就是一种类型的模型,其中用的最多的是lora模型。
lora(low-rank adaptation)模型是小型稳定扩散模型,可对标准模型进行微调。它通常比标准模型小10-100倍,这使得lora模型在文件大小和训练效果之间取得了很好平衡。lora无法单独使用,需要跟标准模型配合使用,这种组合使用方式也为stable diffusion带来了强大的灵活性。
lora模型下载后需要放到lora
目录中,使用时在提示中加入lora语法,语法格式如下:
<lora:filename:multiplier>
filename
是lora模型的文件名(不带文件后缀)
multiplier
是lora 模型的权重,默认值为1,将其设置为 0 将禁用该模型。
关于stable diffusion提示的使用规则请参考这里。
使用stable diffusion web ui
界面介绍
stable diffusion web ui整体上分为2个部分,最上面是模型选择,可以从下拉列表中选择已下载的预训练模型
模型选择下面是一个tab栏,这里是stable diffusion web ui提供的所有功能。
- txt2img — 根据文本提示生成图像;
- img2img — 根据提供的图像作为范本、结合文本提示生成图像;
- extras — 优化(清晰、扩展)图像;
- png info — 显示图像基本信息
- checkpoint merger — 模型合并
- train — 根据提供的图片训练具有某种图像风格的模型
- settings — 系统设置
平时使用最多的是txt2img 和 img2img,下面针对这2大块功能详细讲解。
txt2img
txt2img有三个区域:
- 提示区
- 参数调节区
- 输出浏览区
提示区主要是2个文本框,可以输入提示文本。其中:
prompt: 主要是对于图像进行描述。prompt对stable diffusion图像生成质量至关重要,因此如果想生成高质量图片,一定要在提示设计上下功夫。一个好的提示需要详细和具体,后面会专门讲解如何设计一个好的提示。
negative prompt:主要是告诉模型我不想要什么样的风格或元素;
参数调节区提供了大量参数用于控制和优化生成过程:
sampling method:扩散去噪算法的采样模式,不同采样模式会带来不一样的效果,具体需要在实际使用中测试;
sampling steps:模型生成图片的迭代步数,每多一次迭代都会给 ai 更多的机会去对比 prompt 和 当前结果,从而进一步调整图片。更高的步数需要花费更多的计算时间,但却不一定意味着会有更好的结果。当然迭代步数不足肯定会降低输出的图像质量;
width、height:输出图像宽高,图片尺寸越大越消耗资源,显存小的要特别注意。一般不建议设置的太大,因为生成后可以通过 extras 进行放大;
batch count、 batch size:控制生成几张图,前者计算时间长,后者需要显存大;
cfg scale:分类器自由引导尺度,用于控制图像与提示的一致程度,值越低产生的内容越有创意;
seed:随机种子,只要种子一样,参数和模型不变,生成的图像主体就不会剧烈变化,适用于对生成图像进行微调;
restore faces:优化面部,当对生成的面部不满意时可以勾选该选项;
tiling:生成一张可以平铺的图像;
highres. fix:使用两个步骤的过程进行生成,以较小的分辨率创建图像,然后在不改变构图的情况下改进其中的细节,选中该选项会有一系列新的参数,其中重要的是:
upscaler:缩放算法;
upscale by:放大倍数;
denoising strength:决定算法对图像内容的保留程度。0什么都不会改变,1会得到一个完全不同的图像;
img2img
img2img跟txt2img界面类似,不同的是没有了txt2img中的参数调节区,取而代之的是图像范本区。
我们可以上传范本图片让stable diffusion模仿,其他地方跟txt2img相同
界面汉化
通过这里下载简体中文语言文件,下载完成后将其复制到项目文件夹的“localizations”目录中。之后在settings -> user interface -> localization (requires restart),在下拉菜单中选择zh_cn。如果下拉列表中看不到zh_cn,请先点击右侧的刷新按钮,然后就能在下拉列表中看到了。设置完成后记得点击页面上方的“apply settings”按钮保存设置。
语言设置需要重启才能生效。ctrl + c
先终止stable diffusion web ui服务,然后再运行webui.bat
或webui.sh
,重启后刷新浏览器页面就能看到语言变成了简体中文了。
prompt语法
为了产生具有特定风格的图像,必须以特定格式提供文本提示。 这通常需要添加提示修饰符或添加更多关键字或关键短语来实现。下面为大家介绍一下stable diffusion的prompt语法规则。
stable diffusion提示文本中的关键字或关键短语通过半角逗号分割,一般越靠前权重越高。我们可以通过提示修饰符来认为修改权重。
- (tag):增加权重5%
- [tag]:降低权重5%
- (tag: weight):设置具体权重值
括号可以嵌套使用,例如:(tag)的权重为 1 × 1.05 = 1.05 1 \times 1.05 = 1.05 1×1.05=1.05,((tag))的权重为 1 × 1.05 × 1.05 = 1.1025 1 \times 1.05 \times 1.05 = 1.1025 1×1.05×1.05=1.1025。同理[tag]的权重为 1 1.05 = 0.952 \frac{1}{1.05} = 0.952 1.051=0.952,[[tag]]的权重为 1 1.0 5 2 = 0.907 \frac{1}{1.05^2} = 0.907 1.0521=0.907 。
-
[tag1 | tag2]:将tag1和tag2混合;
-
{tag1 | tag2 | tag3}:从标签集合中随机选择一个标签;
-
[tag1 : tag2 : 0.5 ]:表示先用tag1生成,当生成进程到50%时,改用tab2生成;如果输入整数的话表示步长,比如10,意思是生成10步后改用tag2;
-
<lora:filename:multiplier>:lora模型引用语法
示例
模型
这里我将使用chilloutmix + koreandolllikeness生成写实风韩系偶像小姐姐。
首先需要下载chilloutmix模型(我用的是chilloutmix_niprunedfp32fix.safetensors
),将其拷贝到stable-diffusion
目录,还需要下载koreandolllikeness这个lora模型,将其拷贝到lora
目录。
然后在stable diffusion web ui主界面的模型选择中下拉选择chilloutmix_niprunedfp32fix.safetensors
。如果找不到该模型,可以点击右侧刷新按钮刷新一下。
prompt
选择好模型后,我们开始设计prompt。首先我们引入lora
<lora:koreandolllikeness_v10:0.66>
然后定义生成图片的风格,我们希望超写实风,可以用如下关键词:
best quality, ultra high res, (photorealistic:1.4)
其中photorealistic
我们赋予较高的权重1.4。
接着来定义图片的主体内容,这里我将希望图片中出现的元素都做个权重增强:
1girl, thighhighs, ((school uniform)),((pleated skirt)), ((black stockings)), (full body), (kpop idol), (platinum blonde hair:1), ((puffy eyes))
最后,修饰一些表情、姿势的细节:
smiling, solo focus, looking at viewer, facing front
这样我们完整的promt是:
<lora:koreandolllikeness_v10:0.66>, best quality, ultra high res, (photorealistic:1.4), 1girl, thighhighs, ((school uniform)),((pleated skirt)), ((black stockings)), (full body), (kpop idol), (platinum blonde hair:1), ((puffy eyes)), smiling, solo focus, looking at viewer, facing front
negative prompt
我们还需要提供negative prompt去除我们不想要的风格和元素:
paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, glan
这里主要剔除了绘画风、简笔画、低质量、灰度图,同时去除雀斑、痤疮等皮肤瑕疵。
参数设置
为了让图片生成得更加真实自然,我们需要对参数做一些调整,需要调整的参数如下:
- sampler: dpm++ sde karras
- sample steps: 28
- cfg scale: 8
- size: 512x768
这里鼓励大家多尝试其他取值,上面只是我认为效果最好的一组参数。
生成
完成上面所有设置后,就可以点击generate按钮生成图片了。生成速度由你的设备性能决定,在我的电脑上大约30s生成一张图片。
stable diffusion资源列表
好的生成质量离不开好的模型,这里为大家列出了stable diffusion预训练模型资源的获取来源。
1. hugging face
hugging face是一个专注于构建、训练和部署先进开源机器学习模型的网站。
huggingface是stable diffusion模型创作的首选平台,目前平台上有270多个与stable diffusion相关的模型,用"stable diffusion"作为关键字就能搜到。
推荐dreamlike photoreal 2.0这个模型,这是一个由dreamlike.art制作的基于stable diffusion v1.5的真实感模型,生成效果非常接近真实照片。
另一个热门模型是waifu diffusion,推荐尝试。
2. civitai
civitai是一个专为stable diffusion ai艺术模型设计的网站。该平台目前有来自250+创作者上传的1700个模型。这是迄今为止我所知的最大的ai模型库。你可以在上面分享自己的模型或生成作品。
3. discord
在stable diffusion的discord页面中有一个名为“models-embeddings”的专属频道,里面提供了很多可以免费下载的各种模型。
4. rentry for sd
rentry网站上有一个保存stable diffusion模型的页面sdmodels,上面由70多个模型可以免费下载。
使用这些模型资源的时候要注意:下载自定义ai模型会带来危险。例如,某些可能包含nsfw(不安全)内容。
另一个风险是,这些自定义ai模型可能包含恶意代码或恶意脚本,特别是ckpt文件。如果想要更安全地使用ai模型,请尽量选择safetensor文件类型。
发表评论