<!--StartFragment-->
## 背景介绍
在过去的数月中,亚马逊云科技已经推出了多篇 Blog,来介绍如何在亚马逊云科技上部署 Stable Diffusion,或是如何结合 [Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) 与 Stable Diffusion 进行模型训练和推理任务。
为了帮助客户快速、安全地在亚马逊云科技上构建、部署和管理应用程序,众多合作伙伴与亚马逊云科技紧密合作。他们提供各种各样的服务、深入的技术知识、最佳实践和解决方案,包括基础设施迁移、应用程序现代化、安全和合规性、数据分析、[机器学习](https://aws.amazon.com/cn/machine-learning/?trk=cndc-detail)、人工智能、云托管、DevOps、咨询和培训。
最近,亚马逊云科技核心级服务合作伙伴 **eCloudrover(****伊克罗德****)** 推出了基于 Stable Diffusion 的 AI 绘画解决方案——**imAgine**,既拥有经过广泛验证且易于部署的先进 AI 算法模型,又提供丰富且高性价比的云端资源以优化成本,旨在帮助游戏、电商、媒体、影视、广告、传媒等行业快速构建 AIGC 应用通路,打造 AI 时代的领先生产力。
本文主要分享我们在帮助客户使用 Stable Diffusion 时总结的实战经验,以及使用基于 Stable Diffusion 研发的 imAgine 产品生成艺术二维码的最佳实践。
我们将以 QRCode 作为 ControlNet 的输入,使 QRCode 数据点融入到艺术图像中,同时仍然可以被 QRCode 阅读器扫描。借助这项技术,您可以将任何二维码转化为独特的艺术作品,以一种全新的方式来表达和传递信息。以下为几张图片案例:
| ![插图1.1.jpg](https://dev-media.amazoncloud.cn/ae62fe2c83694f47a0133de6c7cea1c7_%E6%8F%92%E5%9B%BE1.1.jpg "插图1.1.jpg") | ![插图1.2.jpg](https://dev-media.amazoncloud.cn/d1540d5a884d45d999d1065963b406fd_%E6%8F%92%E5%9B%BE1.2.jpg "插图1.2.jpg") | ![插图1.3.jpg](https://dev-media.amazoncloud.cn/fab9e9f684b3410fa16ce76775a76b10_%E6%8F%92%E5%9B%BE1.3.jpg "插图1.3.jpg") |
| --- | --- |--- |
### Stable Diffusion 实战技巧
古语有云:“万事开头难”,“致广大而尽精微”。这对应了在 Stable Diffusion 实战中,客户最常遇到的两方面问题,一是如何**选择合适的提示词起手式**,来生成满足期望的图片;二是如何**对图片进行细节优化**,使最终产出的结果能够满足生产应用需求。
我们根据过往服务客户使用 Stable Diffusion 的经验,整理了以下内容作为我们推荐的最佳实践,希望对读者使用 Stable Diffusion 进行创作时提供参考。
#### 提示词工程
随着 Stable Diffusion 版本不断迭代,AI 对语义的理解越来越接近“常识”之后,对提示词(Prompts)的要求也会越来越高。很多提示词上的误区有时会对绘图产生反作用。
##### Prompt 的基本概念
* 提示词分为正向提示词(positive prompt)和反向提示词(negative prompt),用来告诉 AI 哪些需要,哪些不需要。
##### Prompt 的误区
* Prompt 在于精确,不在于数量;用最简短的单词阐述画面,比自然语言要更有效。
* 提升质量的描绘词绝不是无脑堆砌、越多越好。
* 经常出现的起手式:**“masterpiece” “best quality”** 等,很多时候会成为提示词中的累赘。这些词语在 NovelAI 时代是有意义的,因为当时 NovelAI 训练模型时大量使用了这些词汇来对图像进行评价;但在如今,经过 Civitai 上模型作者们不断重新炼制模型,这些提示词已经很难在生图结果中展现应有的作用。
##### 调整提示词的权重
* 词缀的权重默认值都是 1,从左到右依次减弱
* 提示词权重会显著影响画面生成结果
* 通过小括号+冒号+数字来指定提示词权重,写法如 (one girl:1.5)
##### 注意提示词的顺序
* 比如景色 Tag 在前,人物就会小,相反的人物会变大或半身
* 选择正确的顺序、语法来使用提示词,将更好、更快、更有效率地展现所想所愿的画面
##### Prompt 中的 Emoji
* Prompt 支持使用 emoji,且表现力较好,对于特定的人脸表情或动作,可通过添加 emoji 图来达到效果
* 为了防止语义偏移,优先考虑 emoji,然后少用不必要的 with 一类的复杂语法
##### 视角 Prompt 推荐
| **参数** | **解释** |
| -------------------- | ------ |
| extreme closeup | 脸部特写 |
| **close up** | 头部 |
| **medium close up** | 证件照 |
| **medium shot** | 半身 |
| **cowboy shot** | 无腿 |
| **medium full shot** | 无脚 |
| **full shot** | 全身 |
<!--StartFragment-->
#### 图片优化
很多时候我们生成了一张差强人意的图片,希望对这个结果进行进一步的优化,但往往不知道从何下手。这时您或许可以参考以下图片参数调优的最佳实践:
##### 哪些参数需要调整
* **CFG Scale**:图像与提示词的相关度。该值越高,提示词对最终生成结果的影响越大,契合度越高。
* CFG 2-6:有创意,但可能太扭曲,没有遵循提示。对于简短的提示来说,可以很有趣和有用。
* CFG 7-10:推荐用于大多数提示。创造力和引导力度之间的良好平衡。
* CFG 10-15:当您确定提示是详细且非常清晰的,对图片内容有极明确的要求时使用。
* CFG 16-20:除非提示非常详细,否则通常不推荐。可能影响一致性和质量。
* CFG >20:几乎无法使用。
* **Sampling** **Steps** **迭代步数**:步骤越多,每一步图像的调整也就越小、越精确。同时也会成比例地增加生成图像所需要的时间。
* 对于大部分采样器,迭代越多次效果越好,但超过 50 步后就收效甚微。
* **Sampling** **method** **采样方法**:不同的采样方法,对应的最佳迭代步数是不同的,在进行对比时需要综合考虑。
* Euler a:富有创造力,不同步数可以生产出不同的图片。并且这是一个效率较高的采样方法,可以用来快速检查 prompt 效果的好坏。
* DPM2 a Karras:适合跑真实模型,30 步以后不好把控。
* DPM++ 2M Karras:在高步数下表现优异,步数越高细节越多。
* DDIM:收敛快,但效率相对较低,因为需要很多 step 才能获得好的结果,适合在重绘时候使用。
* 不同模型与采样方法搭配出的结果也不同,以上仅供参考,在进行采样方法的选择时,最好使用 X/Y/Z 图表进行对比。
* **Seed 随机种子**:随机种子值很多时候对构图的影响是巨大的,这也是 SD 生图随机性的最主要来源。
* 保持种子不变,同样的提示词和模型,保持所有参数一致的情况下,相同的种子可以多次生成(几乎)相同的图像。
* 在确定好一个合适的画面构图时,固定种子,对细节进行进一步打磨,是最合适的做法。
#### 如何对比寻找最佳参数
* **利用 X/Y/Z 图找最佳参数**:通过使用 X/Y/Z 图,我们可以很清晰地对比不同参数下的结果,快速定位合适的参数范围,进行进一步的生成控制。
![插图2.jpg](https://dev-media.amazoncloud.cn/b221d38524114d0ea0a703618c24518a_%E6%8F%92%E5%9B%BE2.jpg "插图2.jpg")
<!--StartFragment-->
##### 图片尺寸优化
* 图片质量并不直接与图像尺寸挂钩。
* 但尺寸在一定程度上影响了主题/图片内容,因为它潜在代表选择的类别(比如竖屏人物,横屏风景,小分辨率表情包等)。
* 当出图尺寸太宽时,图中可能会出现多个主体。
* 1024 之上的尺寸可能会出现不理想的结果,并且对服务器显存压力是巨大的。推荐使用**小尺寸分辨率 + 高清修复。**
##### 优化多人物 / 宽幅单人物的生成
* 单纯使用 txt2img 无法有效指定多人物情况下,单个人物的特征。
* 较为推荐的方案是制作草稿 + img2img 或 ControlNet 的方式。
* 宽幅画作+单人物生成最好打草图,进行色彩涂抹,确定画面主体;或使用 ControlNet 的 OpenPose 做好人物骨架。
* 多人物确定人物数量,最好使用 ControlNet 的 OpenPose 来指定;该方案也适合画同一人物的三视图。
##### 进行手部修复
* 将图片送入 img2img inpaint,使用大致相同的提示词,将关于“手”的提示放在前面,根据希望手部特征变动多少来设置重绘幅度(如果只是希望手更完整,调至 0.25 以下),然后保留步骤和 CFG 与 txt2img 相同。
* 找到一个满足期望的手部图片,借助 ControlNet 的 Canny 或 OpenPose_hands 等预处理器+模型,结合 inpaint 操作,能实现更精确的手部控制。
##### 进行面部修复
* 在绘制人物主体较小的图片时,经常会出现面部崩坏的情况。尤其是本文之后会介绍的生成艺术二维码流程,人物的面部经常会因为二维码码点的存在而崩坏。
* 对面部的重绘,更推荐使用 !After Detailer 插件实现,通称 ADetailer。
* 该插件会使用 yolo 算法对图片中的物体进行识别,我们设定其识别人物面部,并提供面部重绘的提示词和模型;该插件会在识别到的面部位置进行局部重绘,完成面部修复。
* ADetailer 插件可以满足面部和手部的识别与修复。
* 在 ADetailer 中也能引用 Lora 模型进行局部重绘生成。
![插图3.jpg](https://dev-media.amazoncloud.cn/15c35b8d2a554e16b610dbe683de6287_%E6%8F%92%E5%9B%BE3.jpg "插图3.jpg")
### 借助 ControlNet 生成艺术二维码
#### Step1:优化二维码
二维码是一种借助特定几何图形分配,在二维空间上分布的、黑白相间的、记录数据符号信息的图形。二维码有多种不同的编码方式,我们此处采用通用度最高也是最基础的编码方式:QR Code。
![插图4.jpg](https://dev-media.amazoncloud.cn/6ea3d34a651c4328ac334cfd075f930e_%E6%8F%92%E5%9B%BE4.jpg "插图4.jpg")
输入的二维码是借助 SD 生成艺术二维码过程中**最重要的部分之一**。我们主要关心输入的二维码的以下两个特点:
**1. 二维码中包含的信息量**
无论二维码采用何种编码方式,承载的字符信息越多,二维码在视觉上呈现的黑白结构就越复杂。复杂的结构很容易导致我们在生成艺术创意时,极大地收到二维码本身信息的掣肘。因此我们首先要想办法**精简二维码中包含的字符长度**。
对于最广泛的应用场景,二维码通常会包含一个网页链接;为了提升二维码生成的美观性,我们首先需要对网页链接进行缩短。市面上的链接缩短工具有很多,您可以自由选择。但需要注意,在中国大陆境内请选择有域名备案的缩链平台,否则会被微信、浏览器等阻挡。
例如我们有一个希望制作成二维码的网址:<https://www.ecloudrover.com/aigc/?trk=cndc-detail>,通过缩链处理后为:<http://c.suo.nz/7KZrF?trk=cndc-detail>。
通过下图可以比较直观地看出链接长短对于二维码视觉的影响,缩短的链接将更有利于我们接下来的创作。
![插图5.jpg](https://dev-media.amazoncloud.cn/8483014636e74909afd32604533aff88_%E6%8F%92%E5%9B%BE5.jpg "插图5.jpg")
<!--StartFragment-->
**2. 二维码的呈现形式**
随着技术发展,二维码不仅只支持黑白方块状的图案样式,定位点和码元都支持多样化的呈现,例如以下几种样式
![插图6.jpg](https://dev-media.amazoncloud.cn/f0eb8f812c604762b437f4f9e9bc9217_%E6%8F%92%E5%9B%BE6.jpg "插图6.jpg")
在实际操作中,我们可以尝试多种不同的码点形式,以使得生图效果符合我们的预期。
下图展示了不同的二维码形式对最终效果图的影响:
![插图7.jpg](https://dev-media.amazoncloud.cn/4313c9d02935410290d5069616071cb4_%E6%8F%92%E5%9B%BE7.jpg "插图7.jpg")
生成参数:
```
Prompt: mountain, green grassland, sky, cloud, bird, blue sky, no human, day, wide shot, flying, border, outdoors, white bird, scenery
Negative prompt: easynegative
Steps: 40, Sampler: DPM++ 2M Karras, CFG scale: 6, Seed: 3943213078, Size: 872x872, Model hash: 876b4c7ba5, Model: cetusMix_Whalefall2, Clip skip: 2, ControlNet: "preprocessor: none, model: control_v1p_sd15\\_qrcode_monster \\[a6e58995], weight: 1.35-1.5, starting/ending: (0.05, 1), resize mode: Resize and Fill, pixel perfect: True, control mode: Balanced, preprocessor params: (512, 64, 64)", Version: v1.3.
```
#### Step2:制作基础二维码
了解了上述要点后,我们将要开始使用二维码制作工具,生成一个输入给 SD 的基础二维码。互联网上有多种网页二维码生成工具,您可以自由选择。同时为了方便您使用,我们在 Blog 专用的 AMI 中已经预装了 QRCode 生成插件,只要您从正确的版本中启用 AMI,都可以直接在 Webui 上看到下述的 QRCode Toolkit:
* **Anthony’s QR Toolkit:整合在 Webui 的 QRCode 生成与优化工具**
<https://github.com/antfu/sd-webui-qrcode-toolkit?trk=cndc-detail>
接下来我们演示如何使用 Anthony’s QR Toolkit 来生成二维码,您可以参考下图完成二维码参数的配置。
![插图8.jpg](https://dev-media.amazoncloud.cn/363f253ba7d949a0b779636791ec3341_%E6%8F%92%E5%9B%BE8.jpg "插图8.jpg")
完成二维码制作后,可以点击右侧的 “Download” 以下载到本地。或点击 “Send to ControlNet”,直接将二维码发送至 ControlNet 以进行下一步操作。
#### Step3:确定艺术风格
使用 Stable Diffusion 进行艺术创作的核心是选择合适的模型+提示词。我们在创作艺术二维码之前,建议先不使用 ControlNet,先进行一次普通的图片生成,以测试生图效果。
此处我希望二维码中有山川、蓝天、白云等自然景观,因此先使用以下参数,测试提示词和模型的生成效果。
![插图9.jpg](https://dev-media.amazoncloud.cn/8da10491fd924ee7af1d7a0b15ee06f4_%E6%8F%92%E5%9B%BE9.jpg "插图9.jpg")
生成参数:
```
Prompt: mountain, green grassland, sky, cloud, bird, blue sky, no human, day, wide shot, flying, border, outdoors, white bird, scenery
Negative prompt: easynegative
Steps: 20, Sampler: Euler a, CFG scale: 7, Seed: 4078355702, Face restoration: CodeFormer, Size: 512x512, Model hash: 876b4c7ba5, Model: cetusMix_Whalefall2, Clip skip: 2, Version: v1.3.2
```
#### Step4:在 ControlNet 中导入二维码
确认好图片风格后,我们将未经处理的二维码上传 ControlNet。请注意以下几个选项的配置:
* “启用” 按钮:**勾选**以确保 ControlNet 在图片生成过程中生效;
* 模型选框:请选择 **“control_v1p_sd15\_qrcode_monster”** 来加强二维码的控制力度;
* 控制权重:对于 qrcode_monster 模型,我们建议设置在 **1.1-1.6** 之间;
* 引导介入/终止时机:介入时机建议在 **0-0.1** 之间,终止时机建议为 **1**。
![插图10.png](https://dev-media.amazoncloud.cn/d4d12b3f964f479b9d927585dba5faf2_%E6%8F%92%E5%9B%BE10.png "插图10.png")
在文生图配置中建议调整两组数值:
* 迭代步数:建议在 **30-50** 之间,默认值 20 不足以引导生成一个高质量的二维码图片
* 宽度/高度:建议直接从 ControlNet 发送二维码原图的宽高比至上方
![插图11.png](https://dev-media.amazoncloud.cn/fa7dcd3f11a945f99b1b5276f63b615a_%E6%8F%92%E5%9B%BE11.png "插图11.png")
参数全部配置完成后,点击生成即可,可以看到此处我们生成了一个效果不错的图片,使用手机扫码测试也完全通过。
![插图12.png](https://dev-media.amazoncloud.cn/366123bbc6a3441cbc0a91501ecbaf3c_%E6%8F%92%E5%9B%BE12.png "插图12.png")
如果生成的二维码不能够达到期望,可以选择微调以下几个参数,并增加生成的总批次数,不断尝试抽卡以逼近最终期望的效果:
* 提示词
* 采样方法
* ControlNet 控制权重
* ControlNet 引导介入/终止时机
![插图13.png](https://dev-media.amazoncloud.cn/1d646d9defb041568148b7a30d348d41_%E6%8F%92%E5%9B%BE13.png "插图13.png")
必要时可以选择使用 “脚本” 中的 X/Y/Z Plot,来对比不同参数下生成二维码的效果。我们此处对比了 ControlNet 的控制权重和引导介入时机:
![插图14.png](https://dev-media.amazoncloud.cn/18a7d32199284f5f8c8f381ece620388_%E6%8F%92%E5%9B%BE14.png "插图14.png")
<!--StartFragment-->
### 附录
#### 附录1:ControlNet QRCode 模型的选择
为方便您使用,我们在 Blog 专用的 AMI 中已经完成了 ControlNet QRCode 模型的植入,只要您从正确的版本中启用 AMI,都可以直接在 ControlNet 中选择模型。
截至目前,**QRCode Monster** 是我们测试后认为控制二维码成功率最高,也是二维码融入图像效果最好的模型,该模型可以在 HuggingFace 下载到:
<https://huggingface.co/monster-labs/control_v1p_sd15_qrcode_monster?trk=cndc-detail>
市面上也有另一个二维码模型:**QR Pattern v2.0**。该模型我们建议结合使用IoC Lab的 **Brightness** 模型作为辅助模型来提高局部对比度,也会产出不错的效果。但根据我们的测试,该模型自带的干扰内容较多,可能会导致图像风格发生很大的变化。这两个模型可以在下方链接下载:
<https://civitai.com/models/90940/controlnet-qr-pattern-qr-codes?trk=cndc-detail>
<https://huggingface.co/ioclab/ioc-controlnet?trk=cndc-detail>
#### 附录2:如何使用 Stable Diffusion AI 绘图解决方案
imAgine 是一款由亚马逊云科技核心级服务合作伙伴伊克罗德,基于 Automatic1111 Stable Diffusion Webui,结合亚马逊云科技多种托管服务定制开发的 AI 绘图解决方案。imAgine 目前已经上线亚马逊云科技 MarketPlace,用户能够在 Marketplace 中一键订阅,快速启动,无需进行复杂的环境配置,敏捷地在云上部署 AI 绘画环境。
同时还结合亚马逊云科技[无服务器](https://aws.amazon.com/cn/serverless/?trk=cndc-detail)服务 [Amazon API Gateway](https://aws.amazon.com/cn/api-gateway/?trk=cndc-detail)、[Amazon DynamoDB](https://aws.amazon.com/cn/dynamodb/?trk=cndc-detail) 等,将 WebUI 前端的训练、推理请求,无缝转发到 [Amazon SageMaker](https://aws.amazon.com/cn/sagemaker/?trk=cndc-detail) 后端的专用推理、训练服务器上,实现算力的无缝扩展,并基于此架构基础实现前后端分离、精确的成本管控。
对于任何希望快速上手 AIGC 技术,并且希望得到全生命周期维护与技术支持的客户订阅并测试解决方案,限于篇幅,订阅 imAgine 解决方案的详细操作流程请参考 WorkShop 页面:<https://catalog.us-east-1.prod.workshops.aws/workshops/facdf921-2eea-4638-bc01-522e1eef3dc5?trk=cndc-detail>。
### 参考链接
* Stable Diffusion AI 方案 MarketPlace 订阅链接:<https://aws.amazon.com/marketplace/pp/prodview-ohjyijddo2gka?sr=0-1&ref_=beagle&applicationId=AWSMPContessa?trk=cndc-detail>
* Stable Diffusion AI 方案 Workshop:<https://catalog.us-east-1.prod.workshops.aws/workshops/facdf921-2eea-4638-bc01-522e1eef3dc5?trk=cndc-detail>
* Stable Diffusion AI 方案解决方案官网:<https://www.ecloudrover.com/aigc/?trk=cndc-detail?trk=cndc-detail>
* QR Toolkit 插件作者 Anthony Fu 的 QRCode 共创文档:<https://antfu.me/posts/ai-qrcode-101?trk=cndc-detail>
* IoC Lab 模型展示:<https://mp.weixin.qq.com/s/i4WR5ULH1ZZYl8Watf3EPw?trk=cndc-detail>
* IoC Lab Stable Diffusion 文档:[aigc.ioclab.com?trk=cndc-detail](http://aigc.ioclab.com/?trk=cndc-detail)