跳到主要内容

StableDiffusion 初体验

StableDiffusion 鼎鼎大名相信大家都听过,最近我正好有作图的需求,就想试试看用它生成的图片能否直接用到我的程序中。

由于我的 Windows 笔记本配置太低,只有一个 1050Ti 的显卡,感觉跑 AI 是肯定不够用的。所以只好选择略强一点的 Mac Mini 了,好歹也算是有 M1 芯片加持,因此文章仅包含 Mac 平台下的安装步骤。

方案一:Mochi Diffusion

Mochi Diffusion 是 Mac 平台的原生软件,支持专为 Mac 平台构建的模型,因此在图片生成速度上有不小的提升,但缺点是目前可配置的选项较少,仅适合入门体验。

这是一个开源软件,可以从 Github 的 Release 页面 下载安装。

安装之后还不能直接使用,还需要到 Hugging Face 上下载对应的模型才能使用。

在 Models 选项卡下,需要添加两个筛选条件:

  • Tasks: Multimodal=Text-to-Image
  • Libraries: Core ML

然后在右侧的模型列表中,可以先下载两个模型尝尝鲜,之后再根据自己的兴趣下载更多模型。

split_einsum 目录下的模型文件是针对 M1 芯片构建的,original 则是为英特尔芯片构建的模型文件,根据实际情况下载即可。

下载好压缩包文件后,将其解压并放到用户目录下的 MochiDiffusion/models 目录,重新打开 MochiDiffusion 或点击左下角模型列表的刷新按钮,即可加载到刚刚下载的模型。

信息

模型文件通常是以 GB 为单位的,所以要做好下载很长时间的准备。

一个猜想,仅供参考

在一些模型仓库中可能找不到压缩包文件,仅有 compiled 和 packges 两个目录,其实 compiled 下的所有文件就是压缩包解压后的文件列表。

当模型加载好之后,可以写一些文字试试效果:

上图前四张是通过 StableDiffusion2.1 生成的,后四张是通过 StableDiffusion1.5 生成的,除了随机种子不一样,别的都是相同的参数,生成的结果差距咋就那么大呢?

感觉 2.1 还不如 1.5 呢,1.5 至少符合题意,可能 2.1 需要输入更多的提示词才能生成准确的图像?

另外和官方的演示图片相比,差距也是蛮大的,可能还是自己提示词写得太少导致的。

又试着用 ChatGPT 给的提示词生成了两组照片,总算有那么点意思了,不过大部分图片还是看着很假,估计得生成很多很多图片自己去筛选才行。

方案二:Web UI

这种方法需要本机安装有 python 环境,而且是特定版本的才可以,整体来说安装较为复杂,但拥有最强的可玩性。

安装

StableDiffusion Web UI 同样是个开源项目,在项目首页可以找到各个系统的安装教程,这个链接 https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Installation-on-Apple-Silicon 是 M1 芯片的安装教程,参照 自动安装 - 全新安装 章节的六个步骤安装即可。

如果本机已经安装了 Homebrew 或 Python3.10,则可以跳过一二步骤,通过命令行先进入一个合适的目录,再执行 git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui 命令把 Web UI 项目克隆到本地。

第 4 步跟 Mochi Diffusion 一样,需要去 Hugging Face 网站下载模型文件。

警告

这次需要下载的模型文件格式是 .ckpt.safetensor,和上个方案下载的模型文件并不兼容。

.ckpt.safetensor 文件可以互相转换,区别在于 .ckpt 可以执行脚本, .safetensor 则只是一堆参数的集合,因此安全性会高一点。

这次只需在左侧添加一个筛选条件:Libraries: Diffusers ,然后在右侧列表选择自己感兴趣的模型即可,以下是我下载的几个官方提供的模型项目地址:

下载完成后直接把文件保存到 Web UI 项目目录/models/Stable-diffusion 下即可。

信息

如果下载了 StableDiffusion 2.1,则还需要下载一个配置文件,鼠标右键点击 这里 选择另存为,以我下载的 v2-1_768-ema-pruned.ckpt 模型文件为例,这个配置文件需要保存到相同目录,且文件名要保持一致,即 v2-1_768-ema-pruned.yaml,见上图最后两个文件。

模型放到对应目录之后,在命令行中回到 Web UI 目录下,执行 ./webui.sh 命令,它会自动安装缺失的依赖,过程中可能会出现各种各样的报错,需要根据报错提示自行查找解决办法。

警告

脚本运行过程中需要下载资源,国内需要自行配置科学上网环境。

如果执行到最后报错 Missing dependencies for SOCKS support,关闭当前命令行重新执行 ./webui.sh 脚本即可,原因是当前命令行走的代理请求,此时脚本已经下载好所有依赖了,需要在本地监听端口,不需要走代理请求了。

最后看到输出网址就表示启动成功了。

参数说明

左上角可以切换下载的模型文件(每次切换需要重新加载到内存,需要一定的时间),第一个选项卡就是 文生图,是本次需要着重把玩的地方。

前两个输入框分别输入正向和反向的关键词,简单来说就是说明自己想要什么不想要什么。

下面的参数还是挺多的,以下内容是从知乎的 Stable Diffusion 新手入门手册 摘录的。

提示

这篇文章写得非常详尽,非常推荐去原文查看。

Sampling method(采样器/采样方法), 选择使用哪种采样器。 Euler a(Eular ancestral)可以以较少的步数产生很大的多样性,不同的步数可能有不同的结果。而非 ancestral 采样器都会产生基本相同的图像。DPM 相关的采样器通常具有不错的效果,但耗时也会相应增加。

  • Euler 是最简单、最快的
  • Euler a 更多样,不同步数可以生产出不同的图片。但是太高步数 (>30) 效果不会更好。
  • DDIM 收敛快,但效率相对较低,因为需要很多 step 才能获得好的结果,适合在重绘时候使用。
  • LMS 是 Euler 的衍生,它们使用一种相关但稍有不同的方法(平均过去的几个步骤以提高准确性)。大概 30 step 可以得到稳定结果
  • PLMS 是 Euler 的衍生,可以更好地处理神经网络结构中的奇异性。
  • DPM2 是一种神奇的方法,它旨在改进 DDIM,减少步骤以获得良好的结果。它需要每一步运行两次去噪,它的速度大约是 DDIM 的两倍,生图效果也非常好。但是如果你在进行调试提示词的实验,这个采样器可能会有点慢了。
  • UniPC 效果较好且速度非常快,对平面、卡通的表现较好,推荐使用。

Sampling Steps(采样步数), Stable Diffusion 的工作方式是从以随机高斯噪声起步,向符合提示的图像一步步降噪接近。随着步数增多,可以得到对目标更小、更精确的图像。但增加步数也会增加生成图像所需的时间。增加步数的边际收益递减,取决于采样器。一般开到 20~30。

Seed (种子),种子决定模型在生成图片时涉及的所有随机性,它初始化了 Diffusion 算法起点的初始值。

Width And Height (图片大小),出图尺寸太宽时,图中可能会出现多个主体。1024 之上的尺寸可能会出现不理想的结果,推荐使用小尺寸分辨率+高清修复(Hires fix)。

Batch Size (每批次生成数量),同时生成多少个图像。增加这个值可以提高性能,但也需要更多的显存。大的 Batch Size 需要消耗巨量显存。若没有超过 12G 的显存,请保持为 1。

Batch Count (批次数量),每次生成图像的批次数,每执行完一个批次都会清理内存,所以性能会略低一点。总计生成图像的数量为“批次数 * 批次数量”。

Hires.fix (高清修复), 默认情况下,文生图在高分辨率下会生成非常混沌的图像。如果使用高清修复,模型首先按照指定的尺寸生成一张图片,然后通过放大算法将图片分辨率扩大,以实现高清大图效果。最终尺寸为(原分辨率*缩放系数 Upscale by)。

  • 放大算法中,Latent 在许多情况下效果不错,但重绘幅度小于 0.5 后就不甚理想。ESRGAN_4x、SwinR 4x 对 0.5 以下的重绘幅度有较好支持。
  • Hires step 表示在进行这一步时计算的步数。
  • Denoising strength 字面翻译是降噪强度,表现为最后生成图片对原始输入图像内容的变化程度。该值越高,放大后图像就比放大前图像差别越大。低 denoising 意味着修正原图,高 denoising 就和原图就没有大的相关性了。一般来讲阈值是 0.7 左右,超过 0.7 和原图基本上无关,0.3 以下就是稍微改一些。实际执行中,具体的执行步骤为 Denoising strength * Sampling Steps。

Restore faces (面部修复),如果生成的人脸看着不正常,可以勾选此项,修复画面中人物的面部,但是非写实风格的人物开启面部修复可能导致面部崩坏。

提示

理论上,在应用完全相同参数(如 Step、CFG、Seed、prompts)的情况下,生成的图片应当完全相同。

提示词

提示词所做的工作是缩小模型出图的解空间,即缩小生成内容时在模型数据里的检索范围,而非直接指定作画结果。 提示词的效果也受模型的影响,有些模型对自然语言做特化训练,有些模型对单词标签对特化训练,那么对不同的提示词语言风格的反应就不同。

提示词中可以填写以下内容:

  • 自然语言 可以使用描述物体的句子作为提示词。大多数情况下英文有效,也可以使用中文。避免复杂的语法。
  • 单词标签 可以使用逗号隔开的单词作为提示词。一般使用普通常见的单词。单词的风格要和图像的整体风格搭配,否则会出现混杂的风格或噪点。避免出现拼写错误。 可参考 Tags | Danbooru (donmai.us)
  • Emoji、颜文字 Emoji ( ) 表情符号也是可以使用并且非常准确的。因为 Emoji 只有一个字符,所以在语义准确度上表现良好。关于 emoji 的确切含义,可以参考 Emoji List, v15.0 (unicode.org),同时 Emoji 在构图上有影响。

对于使用 Danbooru 数据的模型来说,可以使用西式颜文字在一定程度上控制出图的表情。如::-) 微笑 :-( 不悦 ;-) 使眼色 :-D 开心 :-P 吐舌头 :-C 很悲伤 :-O 惊讶 张大口 :-/ 怀疑

语法

根据自己想画的内容写出提示词,多个提示词之间使用英文半角符号 [ , ],如:

masterpiece, best quality, ultra-detailed, illustration, close-up, straight on, face focus, 1girl, white hair, golden eyes, long hair, halo, angel wings, serene expression, looking at viewer

信息

刚刚用上面这个提示词生成的,其他保持默认设置,效果十分惊艳,可以看出提示词的好坏对生成的结果有多么重要。

一般而言,概念性的、大范围的、风格化的关键词写在前面,叙述画面内容的关键词其次,最后是描述细节的关键词,大致顺序如:

(画面质量提示词), (画面主题内容)(风格), (相关艺术家), (其他细节)

不过在模型中,每个词语本身自带的权重可能有所不同,如果模型训练集中较多地出现某种关键词,我们在提示词中只输入一个词就能极大地影响画面,反之如果模型训练集中较少地出现某种关键词,我们在提示词中可能输入很多个相关词汇都对画面的影响效果有限。

提示词的顺序很重要,越靠后的权重越低。关键词最好具有特异性,譬如 Anime(动漫)一词就相对泛化,而 Jojo 一词就能清晰地指向 Jojo 动漫的画风。措辞越不抽象越好,尽可能避免留下解释空间的措辞。

可以使用括号人工修改提示词的权重,方法如:

  • (word) - 将权重提高 1.1 倍
  • ((word)) - 将权重提高 1.21 倍(= 1.1 * 1.1)
  • [word] - 将权重降低至原先的 90.91%
  • (word:1.5) - 将权重提高 1.5 倍
  • (word:0.25) - 将权重减少为原先的 25%
  • (word) - 在提示词中使用字面意义上的 () 字符

( n ) = ( n : 1.1 ) (( n )) = ( n : 1.21 ) ((( n ))) = ( n : 1.331 ) (((( n )))) = ( n : 1.4641 ) ((((( n )))) = ( n : 1.61051 ) (((((( n )))))) = ( n : 1.771561 )

警告

权重值最好不要超过 1.5。

模版

可参考 Civitai 中优秀作品的提示词作为模板。类似的网站如下:

模型推荐

这里列出我下载的其他模型,并以同样的提示词生成样张,以便之后选用。

OpenJourney

这个看文件名特别像最近特别火的 Midjourney 的 V4 版本,生成的图片感觉比官方的要好不少。