产品概述
Stable Diffusion 是一种基于潜在扩散模型(Latent Diffusion Models)的文本到图像、图像到图像生成模型,能够根据任意文本或图像输入,生成高质量、高分辨率、高逼真的图像。

eCloudrover 提供了一个开箱即用的文生图与图生图 AIGC 解决方案,可以帮助客户快速生成图片、海报等美术素材信息。

这个方案的主体是一个基于 Deep Learning AMI GPU PyTorch 1.13.1 (Ubuntu 20.04),安装了 Stable Diffusion WebUI,集成了 Stable Diffusion 1.5 与 ControlNet 模型的 AMI。 在这个 AMI 中,我们还部署了一个 Nginx 应用,用来将 80 端口的请求转发至 Stable Diffusion WebUI 的 7860 端口。Nginx 和 SD-WebUI 都被配置为开机自动启动,您在初次从 AMI 启动 EC2 时,可能会需要等待 10-15 分钟,等待 Stable Diffusion 加载和编译模型。

基于 Stable Diffusion WebUI,您可以在网页上轻松进行文生图、图生图的操作。通过安装 WebUI 插件,您也可以实现更高程度的定制化,例如通过 Dreambooth 对模型进行 Fine-Tune,导入第三方 VAE/Lora 模型等。

为了方便 Chinese Speaker 使用,我们默认为 WebUI 安装了中文插件,您也可以在 WebUI 上禁用它。 我们默认为您安装了 ControlNet 模型,可以通过边缘检测、深度检测、人体姿势识别等方式,增强您在文生图、图生图过程中的控制,使生成的图片更符合预期。 我们强烈建议客户将该方案运行在带有 GPU 的 EC2 上,建议您的 EC2 规格不低于 g4dn.2xlarge 或 g5.2xlarge。该 AMI 不支持 ARM 架构的 CPU。
Stable Diffusion 基础知识
Stable Diffusion 是一种基于潜在扩散模型(Latent Diffusion Models)的文本到图像生成模型,能够根据任意文本输入生成高质量、高分辨率、高逼真的图像。
Stable Diffusion 的生图原理可以分为以下几个步骤:
Stable Diffusion 使用一个新颖的文本编码器(OpenCLIP),由 LAION 开发并得到 Stability AI 的支持,将文本输入转换为一个向量表示。这个向量表示可以捕捉文本的语义信息,并与图像空间对齐。
Stable Diffusion 使用一个扩散模型(Diffusion Model),将一个随机噪声图像逐渐变换为目标图像。扩散模型是一种生成模型,可以从训练数据中学习出一个概率分布,并从中采样出新的数据。
在扩散过程中,Stable Diffusion 利用文本向量和噪声图像作为条件输入,给出每一步变换的概率分布。这样,Stable Diffusion 可以根据文本指导噪声图像向目标图像收敛,并保持图像的清晰度和连贯性。
最后,Stable Diffusion 使用一个超分辨率放大器(Upscaler Diffusion Model),将生成的低分辨率图像放大到更高的分辨率。超分辨率放大器也是一个扩散模型,可以从低分辨率图像中恢复出细节信息,并增强图像质量。
通过以上步骤,Stable Diffusion 可以实现从文本到图像的生成,并且具有以下优点:
Stable Diffusion 可以处理任意领域和主题的文本输入,并生成与之相符合的多样化和富有创意的图像。
Stable Diffusion 可以生成高达 2048x2048 或更高的分辨率的图像,并且保持了良好的视觉效果和真实感。
Stable Diffusion 还可以进行深度引导(Depth-guided)和结构保留(Structure-preserving)的图像转换和合成。例如,它可以根据输入图片推断出深度信息,并利用深度信息和文本条件生成新图片。
Stable Diffusion 的几类主要模型
微调模型:
- Textual Inversion(也称为 Embedding,文本转换模型),是一种从少量示例图像中捕捉新概念/新词语的技术,随后可以将新词用在 Prompt 中来精细控制文生图的结果。
- 它实际上并没有修改原始的 Diffusion 模型, 而是通过深度学习找到了和你想要的形象一致的角色形象特征参数,通过这个小模型保存下来。这意味着,如果原模型里面这方面的训练缺失的,其实你很难通过嵌入让它“学会”,它并不能教会 Diffusion 模型渲染其没有见过的图像内容。
- 常在需要画特定物体时使用
- 后缀为 PT,30KB 左右
- 安装路径:盘符:\软件文件夹\embeddings\
- LoRA (Low-Rank Adaptation) 也使用少量图片,生成的模型较小、训练速度快
- 它是训练单独的特定网络层的权重,向原有的模型中插入新的网络层,这样就避免了去修改原有的模型参数,从而避免将整个模型进行拷贝的情况,同时其也优化了插入层的参数量,最终实现了一种很轻量化的模型调校方法。
- 常用于指定人物的特定元素(脸型/姿势/衣服/风格等)
- 后缀为 safetensors,一般 100-200MB 左右
- 安装路径:盘符:\软件文件夹\models\Lora\
- Hypernetworks 的训练原理与 LoRA 差不多,与 LoRA 不同的是,Hypernetwork 是一个单独的神经网络模型,该模型用于输出可以插入到原始 Diffusion 模型的中间层。 因此通过训练,我们将得到一个新的神经网络模型,该模型能够向原始 Diffusion 模型中插入合适的中间层及对应的参数,从而使输出图像与输入指令之间产生关联关系。
常见的模型后缀:
基础模型后缀名:
- safetensor:以 .safetensors 为后缀,加载速度快,更加安全
- pickletensor:以 .ckpt 为后缀,开源,但可能存在恶意代码,加载速度相对较慢
以下几种模型后缀经常会在模型名称中出现:
- pruned:剪枝模型,存储小,效率高,优化后的神经网络
- ema:泛化能力强,优化后的神经网络模型
- ft/fp:ft16/ft32 标识模型精度,数字越高越好,对性能要求也更高
SD-Webui 常用基础操作
常用插件和 Webui 界面设置
推理
理解提示词 (prompt) 的基本概念 使用 Stable Diffusion 进行创作,最重要的是提示词 (Prompt) 的编写,正确且合理的提示词会大幅提升生成的图片质量。
参考以下几个方法,选择最合适的提示词生成图片: - 提示词(`prompt`)由多个词缀构成。 - 提示词分为正向提示词(`positive prompt`)和反向提示词(`negative prompt`),用来告诉AI哪些需要,哪些不需要。 - 反向提示词往往比正向提示词更有用,例如输入“NSFW”来屏蔽不适合在工作时看的内容。常写在反向提示词的还有低画质相关和一些容易变形身体部位的描述等。 - 词缀的权重默认值都是1,从左到右依次减弱,权重会影响画面生成结果。 - 比如景色Tag在前,人物就会小,相反的人物会变大或半身。 - 选择正确的顺序、语法来使用提示词,将更好、更快、更有效率地展现所想所愿的画面。 - AI 会依照概率来选择性执行,如提示词之间有冲突,AI 会根据权重确定的概率来随机选择执行哪个提示词。 - 生成图片的大小会影响 Prompt 的效果,图片越大需要的 Prompt 越多,不然 Prompt 会相互污染。 - Prompt 支持使用 emoji,且表现力较好,可通过添加 emoji 图来达到效果。如形容喜欢表情,可修手。
理解 Prompt 的权重
权重逻辑
● 若是想明确某主体,应当使其生成步骤向前,生成步骤数加大,词缀排序向前,权重提高。 画面质量 → 主要元素 → 细节 ● 若是想明确风格,则风格词缀应当优于内容词缀 画面质量 → 风格 → 元素 → 细节 ● 风格权重需要优于画面质量,从而不至于被画面质量污染特殊风格质感。
分割符
● , 逗号:分割词缀,有一定权重排序功能,逗号前权重高,逗号后权重低,因而建议排序: 1、综述(图像质量+画风+镜头效果+光照效果+主题+构图) 2、主体(人物&对象+姿势+服装+道具) 3、细节(场景+环境+饰品+特征)
组合符
● 一般流程:先把要描述的画面写下生成一次,根据生成结果边试边改不满意或遗漏的描述,要强调的概念用 (xxx: 1.x ) 语法形式来提升权重,其中 xxx 是你要强调的词,1.x 代表要提升的比例,如 1.5 就是提升 150% 的权重。 ● 权重取值范围 0.4-1.6,权重太小容易被忽视,太大容易拟合图像出错。例:(beautiful:1.3) 。 ● 叠加权重:通过叠加小括号方式提高权重,每加一层相当于提高1.1倍权重, 例:((((beautiful eyes)))) 。
使用 ControlNet 控制图像生成

AIGC 的可控性是它进入实际生产最关键的一环。在此之前,大家用了很多方法想让 AI 生成的结果尽可能符合要求,但都不尽如人意。ControlNet 比之前 img2img 要更加精准和有效,可以直接提取画面的构图,人物的姿势和画面的深度信息等等。有了它的帮助,就不用频繁用提示词来碰运气抽卡式创作了。

SD-Webui 基础 Linux 运维
实时查看 WebUI 运行日志
显存不足问题
查看显存占用:nvidia-smi 优化显存流程: - 设置环境变量,编辑 bashrc 文件:vim ~/.bashrc - 在文件最后添加一行:export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:32 - 具体的 max_split_size_mb 值要根据显存超出的额度调整,可以参考文档: https://blog.csdn.net/MirageTanker/article/details/127998036 - 填写完成后运行:source ~/.bashrc 使更改生效 - 运行:export -p | grep PYTORCH_CUDA_ALLOC_CONF 查看当前配置额度