推荐:用NSDT场景设计器快速建立3D场景。
Stable Diffusion 是一种尖端的开源东西,用于从文本生成图画。 Stable Diffusion Web UI 经过 API 和交互式 UI 打开了许多这些功用。 咱们将首先介绍怎么运用此 API,然后设置一个示例,将其用作隐私维护微服务以从图画中删去人物。
2、生成式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):
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 文件夹,如下所示:
cp 768-v-ema.ckpt models/Stable-diffusion
现在应该准备好开端生成图画了! 要发动服务器,请从根目录履行以下指令(保证你设置的环境已激活):
python launch.py
服务器将需求一些时刻来设置,因为它或许需求装置依赖、将模型权重加载到内存中以及检查嵌入等。 准备就绪后,应该会在终端中看到一条音讯,如下所示:
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,768×768 是首选分辨率。 分辨率会影响生成的内容。
- 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 运用程序能够经过以下方法发动:
python launch.py --nowebui
这为咱们供给了一个 API,能够揭露咱们在 Web UI 中具有的许多功用。 咱们能够发送带有咱们的提示和参数的 POST 恳求,并接纳包含输出图画的呼应。
7、创立Stable Diffusion微服务
例如,咱们现在将设置一个简略的微服务,用于从相片中删去人物。 这有很多运用,例如维护个人隐私。 咱们能够运用Stable Diffusion作为根本的隐私维护过滤器,它能够从相片中去除人物,而不会出现任何难看的马赛克或像素块。
请注意,这是一个根本设置; 它不包含加密、负载平衡、多租户、RBAC 或任何其他功用。 此设置或许不适用于生产环境,但它可用于在家庭或私人服务器上设置运用程序。
8、以API方法发动Stable Diffusion
以下阐明将在 API 形式下运用服务器,因而请持续并运用 CTRL+C 暂时停止 Web UI。 运用 –nowebui 选项以 API 形式再次发动它:
python launch.py --nowebui
服务器准备好后应该打印如下内容:
INFO: Uvicorn running on http://127.0.0.1:7861 (Press CTRL+C to quit)
9、向 Stable Diffusion API 发送恳求
咱们要做的榜首件事是演示怎么向 API 宣布恳求。 咱们希望向运用程序的 txt2img(即“文本到图画”)API 发送 POST 恳求以简略地生成图画。
咱们将运用 requests 包,所以假如你还没有装置它:
pip install requests
咱们能够发送一个包含提示的恳求作为一个简略的字符串。 服务器将回来一个图画作为 base64 编码的 PNG 文件,咱们需求对其进行解码。 要解码 base64 图画,咱们只需运用 base64.b64decode(b64_image)。 以下脚本应该是测验它所需的全部内容:
import json
import base64
import requests
def submit_post(url: str, data: dict):
"""
Submit a POST request to the given URL with the given data.
"""
return requests.post(url, data=json.dumps(data))
def save_encoded_image(b64_image: str, output_path: str):
"""
Save the given image to the given output path.
"""
with open(output_path, "wb") as image_file:
image_file.write(base64.b64decode(b64_image))
if __name__ == '__main__':
txt2img_url = 'http://127.0.0.1:7861/sdapi/v1/txt2img'
data = {'prompt': 'a dog wearing a hat'}
response = submit_post(txt2img_url, data)
save_encoded_image(response.json()['images'][0], 'dog.png')
将内容仿制到文件并将其命名为 sample-request.py。 现在履行这个:
python sample-request.py
假如有用,它应该将图画的副本保存到文件 dog.png 中。 我的看起来像这个衣冠楚楚的家伙:
请记住,你的成果会与我的不同。 假如遇到问题,请仔细检查运转Stable Diffusion运用程序的终端的输出。 或许是服务器没有完结设置。 假如您遇到“404 Not Found”之类的问题,请仔细检查 URL 是否输入正确并指向正确的地址(例如 127.0.0.1)。
10、设置图画掩码
假如到目前为止一切正常,那就太好了! 可是咱们怎么运用它来修正咱们已有的图画呢? 为此,咱们需求运用 img2img(即“图画到图画”)API。 此 API 运用安稳分散来修正你提交的图画。 咱们将运用修正功用:给定图画和遮罩,修正技术将测验用安稳分散生成的内容替换图画的遮罩部分。 遮罩充任权重,在原始图画和生成图画之间滑润插值,以将两者混合在一起。
咱们将测验运用咱们可用的许多预练习计算机视觉模型之一来生成一个面具,而不是手工制造面具。 咱们将运用模型输出的“人”类来生成掩码。 尽管目标检测模型能够作业,但我挑选运用切割模型,以便您能够测验运用密集掩码或鸿沟框。
咱们将需求一个示例图画来进行测验。 咱们能够从 Internet 下载一个,但本着维护隐私(和版权)的精神,为什么不制造一个安稳传播的呢? 下面是我用提示“美丽的山景,一个女性从镜头前走开”生成的。
你能够下载这个,但我鼓励你测验自己生成一个。 当然,你也能够运用真实相片。 以下是将来自 torchvision 的切割模型作为蒙版运用于此图画的最小代码。
import torch
from torchvision.models.segmentation import fcn_resnet50, FCN_ResNet50_Weights
from torchvision.io.image import read_image
from torchvision.utils import draw_segmentation_masks
import matplotlib.pyplot as plt
if __name__ == '__main__':
img_path = 'woman-on-trail.png'
# Load model
weights = FCN_ResNet50_Weights.DEFAULT
model = fcn_resnet50(weights=weights, progress=False)
model = model.eval()
# Load image
img = read_image(img_path)
# Run model
input_tform = weights.transforms(resize_size=None)
batch = torch.stack([input_tform(img)])
output = model(batch)['out']
# Apply softmax to outputs
sem_class_to_idx = {cls: idx for (idx, cls) in enumerate(weights.meta['categories'])}
normalized_mask = torch.nn.functional.softmax(output, dim=1)
# Show results
class_idx = 1
binary_masks = (normalized_mask.argmax(class_idx) == sem_class_to_idx['person'])
img_masked = draw_segmentation_masks(img, masks=binary_masks, alpha=0.7)
plt.imshow(img_masked.permute(1, 2, 0).numpy())
plt.show()
像以前一样,将其仿制到名为 segment-person.py 的文件中。 运用以下代码履行代码:
python segment-person.py
生成的猜测应如下所示:
咱们现在具有向 API 宣布恳求并猜测鸿沟框的机制。 现在咱们能够开端构建咱们的微服务了。
11、人物铲除微服务
现在让咱们转向咱们的实践示例:从图画中删去人物。 微服务应履行以下操作:
- 读取多个输入参数
- 从文件加载图画
- 将类别为“person”的切割模型运用于图画以创立掩码
- 将图画和掩码转换为base64编码
- 向本地服务器的 img2img API 发送包含 base64 编码图画、base64 编码掩码、提示和任何参数的恳求
- 解码并将输出图画保存为文件
因为咱们现已别离介绍了一切这些步骤,因而已在此 GitHub Gist 中为您施行微服务。 现在下载脚本并运用以下指令在图画“woman-on-trail.png”(或您喜爱的任何图画)上履行它:
python inpaint-person.py woman-on-trail.png -W 1152 -H 768
-W 和 -H 别离表明所需的输出宽度和高度。 它将生成的图画保存为 inpaint-person.png,并将相应的蒙版保存为 mask_inpaint-person.png。 你的会有所不同,但这是我收到的输出:
嗯,不是咱们想要的。 好像人的大部分都还在,尤其是剪影。 咱们或许需求遮盖更大的区域。 为此,让咱们测验将掩码转换为鸿沟框。 咱们能够运用 -B 标志来做到这一点。
python inpaint-person.py woman-on-trail.png -W 1152 -H 768 -B
我收到的输出是这样的:
这也不对! 混凝土柱不是咱们希望在小径中间找到的东西。 或许引入提示将有助于将工作引向正确的方向。 咱们运用 -p 标志在恳求中添加提示“mountain scenery, landscape, trail”。 咱们还运用 -D 32 扩大鸿沟框以消除一些边缘作用,并运用 -b 16 模糊鸿沟框以将掩码与布景混合一点。
python inpaint-person.py woman-on-trail.png \
-W 1152 -H 768 \
-b 16 -B -D 32 \
-p "mountain scenery, landscape, trail"
有了这个,我收到了以下输出:
现在看起来好像不错! 持续测验不同的图画、设置和提示,使其合适你的用例。 要查看此脚本可用的参数和提示的完好列表,请输入 python inpaint-person.py -h。
12、结束语
你的图画很或许与上面的图画看起来十分不同。 因为它是一个固有的随机进程,即便运用具有相同设置的安稳分散也会产生截然不同的输出。 要了解一切功用和适当的提示设计,学习曲线相当峻峭,即便这样,成果也或许很挑剔。 使图画看起来完全符合您的喜爱是十分困难的,需求重复试验。
为了协助你完结任务,请记住以下提示:
- 在切换到 API 之前,运用 Web UI 找到合适你的用例的正确参数。
- 根据你的喜爱微调图画时,依托提示矩阵和 X/Y 绘图功用。 这些将协助你快速探究参数搜索空间。
- 注意种子。 假如你喜爱特定的输出但想要对其进行迭代,请仿制种子。
- 测验运用不同的生成器,例如 Midjourney! 每个东西都略有不同。
- 运用 Lexica 等 Internet 资源作为创意并找到好的提示。
- 运用设置菜单中的“运用生成参数在每个图画旁边创立一个文本文件”选项来跟踪你用于制造每个图画的提示和设置。
最重要的是,玩得高兴!
原文链接:Stable Diffusion as an API: Make a Person-Removing Microservice
BimAnt翻译收拾,转载请标明出处
生成式AI