Stable Diffusion - API和微服务开辟

[复制链接]
查看958 | 回复0 | 2023-8-16 16:30:46 | 显示全部楼层 |阅读模式
Stable Diffusion 是一种尖端的开源工具,用于从文本天生图像。 Stable Diffusion Web UI 通过 API 和交互式 UI 打开了很多这些功能。 我们将起首先容如何使用此 API,然后设置一个示例,将其用作隐私掩护微服务以从图像中删除人物。

   保举:用 NSDT场景筹划器 快速搭建3D场景。
  1、天生式AI简介

基于呆板学习的数据天生器在客岁发生了如此多的创新,你可以将 2022 年称为“天生 AI 年”。
我们有 DALL-E 2,这是来自 OpenAI 的文本到图像天生模子,它天生了宇航员骑马和狗穿着人衣服的惊人逼真的图像。 GitHub Copilot 是一款功能强大的代码完成工具,可以自动完成语句、编写文档并通过一条批评为您实现全部功能,已作为订阅服务向公众发布。
我们拥有 Dream Fields、Dream Fusion 和 Magic3D,这是一系列能够仅从文本天生带纹理的 3D 模子的开创性模子。 末了但同样重要的是,我们有 ChatGPT,这是当今不必要先容的尖端人工智能聊天呆板人。
这份清单几乎没有触及外貌。 在像 DALL-E 2 如许的天生图像模子的天下中,我们还有 Midjourney、Google Imagen、StarryAI、WOMBO Dream、NightCafe、InvokeAI、Lexica Aperture、Dream Studio、Deforum……我想你明确了。   可以绝不夸张地说,天生式AI已经俘获了全天下的想象力。
2、Stable Diffusion

固然很多盛行的天生式 AI 工具(如 ChatGPT、GitHub Copilot 和 DALL-E 2)都是专有的和付费的,但开源社区并没有错过任何时机。 客岁,LMU Munich、Runway 和 Stability AI 合作公开分享了 Stable Diffusion,这是一种强大而高效的文本到图像模子,足以在消费类硬件上运行。 这意味着任何拥有良好 GPU 和互联网毗连的人都可以下载 Stable Diffusion 代码和模子权重,从而为天下带来低成本的图像天生。
3、Stable Diffusion Web UI

Stable Diffusion Web UI 是最盛行的使用 Stable Diffusion 的工具之一,它在基于浏览器的交互式用户界面中公开了 Stable Diffusion 的各种设置和功能。 该项目的一个鲜为人知的功能是你可以将其用作 HTTP API,从而允许你从本身的应用步伐哀求图像。

它具有大量功能,比方图像修复、图像扩展、调整大小、放大、变革等等。 项目 wiki 提供了所有功能的一个很好的概述。 别的,它还提供可扩展性脚本。
4、Stable Diffusion Web UI设置

在开始之前,请确保你的体系上有至少 8GB VRAM 的 GPU(最好是 NVIDIA,但也支持 AMD)。 这将确保你可以将模子加载到内存中。 接下来,必要将存储库克隆到你的体系(比方通过 HTTPS):
  1. git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
复制代码
请按照体系的安装阐明举行操作,因为它们大概与我的不同。 我安装了 Ubuntu 18.04 来设置它,但它也应该实用于 Windows 和 Apple Silicon。 这些阐明将包括设置 Python 环境,因此请确保你设置的环境在稍后启动服务器时处于活动状态。
完成后,我们必要模子权重的副本。 我使用的是 Stable Diffusion 2.0,但如今也可以使用 Stable Diffusion 2.1。 无论选择哪个选项,请务必下载 stablediffusion 存储库的权重。 末了,将这些权重复制到 models/Stable-diffusion 文件夹,如下所示:
  1. cp 768-v-ema.ckpt models/Stable-diffusion
复制代码
如今应该准备好开始天生图像了! 要启动服务器,请从根目次实行以下下令(确保你设置的环境已激活):
  1. python launch.py
复制代码
服务器将必要一些时间来设置,因为它大概必要安装依靠、将模子权重加载到内存中以及查抄嵌入等。 准备就绪后,应该会在终端中看到一条消息,如下所示:
  1. Running on local URL:  http://127.0.0.1:7860
复制代码
用户界面是基于浏览器的,因此请在你喜欢的网络浏览器中导航到“127.0.0.1:7860”。假如它正常工作,它应该看起来像如许:

5、Stable Diffusion Web UI用法

如今应该准备好天生一些图像了! 继续并通过在“提示”字段中输入文本并单击“天生”来天生一些内容。 假如这是你第一次使用此 UI,请花点时间探索和相识它的一些功能和设置。 假如有任何标题,请参阅 wiki。 这些知识稍后在筹划 API 时会派上用场。
我不会深入研究如何使用 Web UI,因为在我之前的很多人都如许做过。 但是,我将提供以下根本设置备忘单以供参考。


  • 采样方法:采样算法。 这会极大地影响天生图像的内容和团体外观。 方法之间的实行时间和结果大概有很大差别。 最好先试验这个选项。
  • 采样步数:图像天生过程中的去噪步数。 一些结果会随着步数的增长而发生巨大变革,而另一些结果会很快导致收益递减。 20-50 的值对于大多数采样器来说是抱负的。
  • 宽度、高度:输出图像尺寸。 对于 SD 2.0,768x768 是首选分辨率。 分辨率会影响天生的内容。
  • CFG 量表:无分类器引导 (CFG) 量表。 增长它会增长提示对图像的影响程度。 较低的值会产生更具创意的结果。
  • 去噪强度:确定允许原始图像的变革量。 值为 0.0 时不会发生任何变革。 值为 1.0 时会完全忽略原始图像。 从 0.4–0.6 之间的值开始通常是一个安全的选择。
  • 种子:随机种子值。 当你想比较变革尽大概小的设置的结果时很有用。 假如喜欢特定的一代但想对其举行一些修改,请复制种子。
6、使用 Stable Diffusion 作为 API

Web UI 专为单个用户筹划,非常恰当作为交互式艺术工具来制作你本身的作品。 但是,假如我们想使用它作为引擎构建应用步伐,那么我们将必要一个 API。 stable-diffusion-webui 项目的一个鲜为人知(且记载较少)的特性是它还有一个内置 API。 Web UI 是使用 Gradio 构建的,但还有一个 FastAPI 应用步伐可以通过以下方式启动:
  1. python launch.py
  2. --nowebui
复制代码
这为我们提供了一个 API,可以公开我们在 Web UI 中拥有的很多功能。 我们可以发送带有我们的提示和参数的 POST 哀求,并接收包罗输出图像的相应。
7、创建Stable Diffusion微服务

比方,我们如今将设置一个简单的微服务,用于从照片中删除人物。 这有很多应用,比方掩护个人隐私。 我们可以使用Stable Diffusion作为根本的隐私掩护过滤器,它可以从照片中去除人物,而不会出现任何丢脸的马赛克或像素块。
请注意,这是一个根本设置; 它不包括加密、负载平衡、多租户、RBAC 或任何其他功能。 此设置大概不实用于生产环境,但它可用于在家庭或私人服务器上设置应用步伐。
8、以API方式启动Stable Diffusion

以下阐明将在 API 模式下使用服务器,因此请继续并使用 CTRL+C 暂时制止 Web UI。 使用 --nowebui 选项以 API 模式再次启动它:
  1. python launch.py
  2. --nowebui
复制代码
服务器准备好后应该打印如下内容:
  1. INFO:     Uvicorn running on http://127.0.0.1:7861 (Press CTRL+C to quit)
复制代码
9、向 Stable Diffusion API 发送哀求

我们要做的第一件事是演示如何向 API 发出哀求。 我们盼望向应用步伐的 txt2img(即“文本到图像”)API 发送 POST 哀求以简单地天生图像。
我们将使用 requests 包,以是假如你还没有安装它:
  1. pip install requests
复制代码
我们可以发送一个包罗提示的哀求作为一个简单的字符串。 服务器将返回一个图像作为 base64 编码的 PNG 文件,我们必要对其举行解码。 要解码 base64 图像,我们只需使用 base64.b64decode(b64_image)。 以下脚本应该是测试它所需的全部内容:
  1. import json
  2. import base64
  3. import requests
  4. def submit_post(url: str, data: dict):
  5.     """
  6.     Submit a POST request to the given URL with the given data.
  7.     """
  8.     return requests.post(url, data=json.dumps(data))
  9. def save_encoded_image(b64_image: str, output_path: str):
  10.     """
  11.     Save the given image to the given output path.
  12.     """
  13.     with open(output_path, "wb") as image_file:
  14.         image_file.write(base64.b64decode(b64_image))
  15. if __name__ == '__main__':
  16.     txt2img_url = 'http://127.0.0.1:7861/sdapi/v1/txt2img'
  17.     data = {'prompt': 'a dog wearing a hat'}
  18.     response = submit_post(txt2img_url, data)
  19.     save_encoded_image(response.json()['images'][0], 'dog.png')
复制代码
将内容复制到文件并将其定名为 sample-request.py。 如今实行这个:
  1. python sample-request.py
复制代码
假如有用,它应该将图像的副本生存到文件 dog.png 中。 我的看起来像这个衣冠楚楚的家伙:

请记住,你的结果会与我的不同。 假如遇到标题,请仔细查抄运行Stable Diffusion应用步伐的终端的输出。 大概是服务器尚未完成设置。 假如您遇到“404 Not Found”之类的标题,请仔细查抄 URL 是否输入准确并指向准确的地点(比方 127.0.0.1)。
10、设置图像掩码

假如到现在为止齐备正常,那就太好了! 但是我们如何使用它来修改我们已有的图像呢? 为此,我们必要使用 img2img(即“图像到图像”)API。 此 API 使用稳固扩散来修改你提交的图像。 我们将使用修复功能:给定图像和遮罩,修复技术将实行用稳固扩散天生的内容更换图像的遮罩部分。 遮罩充当权重,在原始图像和天生图像之间平滑插值,以将两者肴杂在一起。
我们将实行使用我们可用的很多预练习盘算机视觉模子之一来天生一个面具,而不是手工制作面具。 我们将使用模子输出的“人”类来天生掩码。 固然对象检测模子可以工作,但我选择使用分割模子,以便您可以实行使用麋集掩码或界限框。
我们将必要一个示例图像来举行测试。 我们可以从 Internet 下载一个,但本着掩护隐私(和版权)的精力,为什么不制作一个稳固传播的呢? 下面是我用提示“美丽的山景,一个女人从镜头前走开”天生的。

你可以下载这个,但我鼓励你实行本身天生一个。 固然,你也可以使用真实照片。 以下是将来自 torchvision 的分割模子作为蒙版应用于此图像的最小代码。
  1. import torch
  2. from torchvision.models.segmentation import fcn_resnet50, FCN_ResNet50_Weights
  3. from torchvision.io.image import read_image
  4. from torchvision.utils import draw_segmentation_masks
  5. import matplotlib.pyplot as plt
  6. if __name__ == '__main__':
  7.     img_path = 'woman-on-trail.png'
  8.     # Load model
  9.     weights = FCN_ResNet50_Weights.DEFAULT
  10.     model = fcn_resnet50(weights=weights, progress=False)
  11.     model = model.eval()
  12.     # Load image
  13.     img = read_image(img_path)
  14.     # Run model
  15.     input_tform = weights.transforms(resize_size=None)
  16.     batch = torch.stack([input_tform(img)])
  17.     output = model(batch)['out']
  18.     # Apply softmax to outputs
  19.     sem_class_to_idx = {cls: idx for (idx, cls) in enumerate(weights.meta['categories'])}
  20.     normalized_mask = torch.nn.functional.softmax(output, dim=1)
  21.     # Show results
  22.     class_idx = 1
  23.     binary_masks = (normalized_mask.argmax(class_idx) == sem_class_to_idx['person'])
  24.     img_masked = draw_segmentation_masks(img, masks=binary_masks, alpha=0.7)
  25.     plt.imshow(img_masked.permute(1, 2, 0).numpy())
  26.     plt.show()
复制代码
像从前一样,将其复制到名为 segment-person.py 的文件中。 使用以下代码实行代码:
  1. python segment-person.py
复制代码
天生的推测应如下所示:

我们如今拥有向 API 发出哀求并推测界限框的机制。 如今我们可以开始构建我们的微服务了。
11、人物清除微服务

如今让我们转向我们的实际示例:从图像中删除人物。 微服务应实行以下操作:


  • 读取多个输入参数
  • 从文件加载图像
  • 将种别为“person”的分割模子应用于图像以创建掩码
  • 将图像和掩码转换为base64编码
  • 向本地服务器的 img2img API 发送包罗 base64 编码图像、base64 编码掩码、提示和任何参数的哀求
  • 解码并将输出图像生存为文件
由于我们已经分别先容了所有这些步调,因此已在此 GitHub Gist 中为您实行微服务。 如今下载脚本并使用以下下令在图像“woman-on-trail.png”(或您喜欢的任何图像)上实行它:
  1. python inpaint-person.py woman-on-trail.png -W 1152 -H 768
复制代码
-W 和 -H 分别表现所需的输出宽度和高度。 它将天生的图像生存为 inpaint-person.png,并将相应的蒙版生存为 mask_inpaint-person.png。 你的会有所不同,但这是我收到的输出:
嗯,不是我们想要的。 似乎人的大部分都还在,尤其是剪影。 我们大概必要遮盖更大的地区。 为此,让我们实行将掩码转换为界限框。 我们可以使用 -B 标志来做到这一点。
`
  1. python inpaint-person.py woman-on-trail.png -W 1152 -H 768
  2. -B
复制代码
我收到的输出是如许的:

这也不对! 混凝土柱不是我们盼望在小径中心找到的东西。 大概引入提示将有助于将事情引向准确的方向。 我们使用 -p 标志在哀求中添加提示“mountain scenery, landscape, trail”。 我们还使用 -D 32 扩大界限框以消除一些边沿结果,并使用 -b 16 含糊界限框以将掩码与背景肴杂一点。
  1. python inpaint-person.py woman-on-trail.png \
  2.     -W 1152 -H 768 \
  3.     -b 16 -B -D 32 \
  4.     -p "mountain scenery, landscape, trail"
复制代码
有了这个,我收到了以下输出:

如今看起来似乎不错! 继续实行不同的图像、设置和提示,使其恰当你的用例。 要检察此脚本可用的参数和提示的完备列表,请输入 python inpaint-person.py -h。
12、竣事语

你的图像很大概与上面的图像看起来非常不同。 因为它是一个固有的随机过程,纵然使用具有相同设置的稳固扩散也会产生大相径庭的输出。 要相识所有功能和恰当的提示筹划,学习曲线相当陡峭,纵然如许,结果也大概很挑剔。 使图像看起来完全符合您的喜欢黑白常困难的,必要反复试验。
为了资助你完成任务,请记住以下提示:


  • 在切换到 API 之前,使用 Web UI 找到恰当你的用例的准确参数。
  • 根据你的喜欢微调图像时,依靠提示矩阵和 X/Y 绘图功能。 这些将资助你快速探索参数搜索空间。
  • 注意种子。 假如你喜欢特定的输出但想要对其举行迭代,请复制种子。
  • 实行使用不同的天生器,比方 Midjourney! 每个工具都略有不同。
  • 使用 Lexica 等 Internet 资源作为灵感并找到好的提示。
  • 使用设置菜单中的“使用天生参数在每个图像旁边创建一个文本文件”选项来跟踪你用于制作每个图像的提示和设置。
最重要的是,玩得开心!

原文链接:Stable Diffusion API — BimAnt

来源:https://blog.csdn.net/shebao3333/article/details/129612118
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则