稳定扩散 3 的不同图像生成方式

稳定扩散3图像生成实测

原文:towardsdatascience.com/different-ways-of-image-generation-with-stable-diffusion-3-763b9d34d120

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/936d2386a72ff58f0b1974804c36fdda.png

由作者生成的图像(SD3,付费创作者许可)

稳定扩散被认为是最好的开源文本到图像模型之一,看到最新的“稳定扩散 3 Medium”模型于 2024 年 6 月发布,并且现在可以在HuggingFace上使用,这非常令人兴奋。此模型在非商业研究社区许可下免费提供,因此让我们写一些 Python 代码来看看它是如何工作的!

一般信息

稳定扩散(SD)是一个文本到图像模型;这种方法本身相对较新。关于使用潜在扩散模型进行图像合成的第一篇论文(Rombach 等人撰写的《使用潜在扩散模型进行高分辨率图像合成》)于 2022 年发表。一家名为 Stability AI 的公司对这个项目产生了兴趣,该模型于 2022 年 8 月以“稳定扩散”的名字发布。之后,它被改进了几次。在撰写本文时,稳定扩散 1.1 在 HuggingFace 上仍然可用,最新版本 3 于 2024 年 6 月发布。

现在,让我们在 Python 中运行这个模型。

基本测试

使用 HuggingFace 🤗 Diffusers库运行稳定扩散极其简单:

import torch
from diffusers import StableDiffusion3Pipeline

model_id = "stabilityai/stable-diffusion-3-medium-diffusers"
pipe = StableDiffusion3Pipeline.from_pretrained(model_id,
                                                torch_dtype=torch.float16)
pipe = pipe.to("cuda")

模型大小约为 9 GB,库将在第一次运行时自动下载所有文件(可能需要 HuggingFace 免费访问令牌)。

当模型加载后,我们可以运行图像生成:

image = pipe(
    prompt="a cartoon style drawing of a cat typing on a laptop",
    negative_prompt="",
    generator=torch.manual_seed(1100),
    num_inference_steps=24,
    height=1024,
    width=1024,
    guidance_scale=7.0,
).images[0]

display(image)

在这里,我使用了torch.manual_seed方法来使生成过程具有确定性,否则每次运行代码时图像都会改变。结果看起来很有趣:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/755ad160339d350f55e8a9b7dff3114a.png

由作者生成的图像

使用 NVIDIA L4 GPU 生成图像大约花费了 12 秒。

内存优化

我在 Google Colab 上进行了最后的测试,模型生成图像需要大约22 GB的 GPU RAM。一般来说,这相当多,大多数消费级显卡的 RAM 都较少。幸运的是,通过添加一行代码,这个数字可以减少近一半:

pipe = StableDiffusion3Pipeline.from_pretrained(model_id,
                                                torch_dtype=torch.float16)
pipe.enable_model_cpu_offload()

之后,模型只需要12.4 GB的 RAM,这要好得多。

更激进的步骤是移除内存密集型的 T5-XXL 文本编码器。我们可以通过将text_encoder_3tokenizer_3参数设置为 None 来实现这一点:

pipe = StableDiffusion3Pipeline.from_pretrained(model_id,
                                                text_encoder_3=None,
                                                tokenizer_3=None,
                                                torch_dtype=torch.float16)
pipe.enable_model_cpu_offload()

如库描述中所写,它可能会导致“性能略有损失”。在我的情况下,内存占用确实减少了,但图像质量显著下降:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/876241cbbb1723574c5b748e4329a948.png

由作者生成的图像

如我们所见,图像的细节不再一致,但对于不同的提示,结果可能会有所不同;欢迎读者自行进行更多测试。

使用文本编码器的量化版本来优化内存占用的一种更“温和”的方法:

model_id = "stabilityai/stable-diffusion-3-medium-diffusers"
text_encoder = T5EncoderModel.from_pretrained(
    model_id,
    subfolder="text_encoder_3",
    quantization_config=BitsAndBytesConfig(load_in_8bit=True),
)
pipe = StableDiffusion3Pipeline.from_pretrained(
    model_id,
    text_encoder_3=text_encoder,
    device_map="balanced",
    torch_dtype=torch.float16
)

现在我们尝试一种不同的提示。使用 Stable Diffusion 模型,我们可以显然制作不仅像卡通一样的绘画,还可以制作其他图像:

image = pipe(
    prompt="a cat staring at the computer screen with a cat drawing on it",
    negative_prompt="",
    generator=torch.manual_seed(11110),
    num_inference_steps=24,
    height=1024,
    width=1024,
    guidance_scale=7.0,
).images[0]

结果不是照片般完美的,但图像看起来很有趣,有自己的魅力:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8e4720ede0a003e4734d25486f74c7b9.png

由作者生成的图像

使用 ControlNet 的条件生成

一个稳定的扩散算法从随机噪声开始生成图像,并且每次运行的结果都会不同。但对于艺术家和设计师的工作来说,使用现有草图开始绘画可能很重要。已经尝试了不同的方法来控制生成过程。ControlNet是一个流行的开源实现(其 GitHub 仓库有 28.8K 个星标);它也适用于 Stable Diffusion 3。

作为下一个例子,我将使用伦勃朗于 1635 年创作的素描“Saskia in Bed”:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/a0787deee8cfcd53c0be7f95ea7258c4.png

图像来源 – 维基百科,公有领域

如我们所见,它只是一个草图;让我们从它制作一幅真正的画作。

在 Python 中实现它,我将使用一个SD3ControlNetModel类,这个类也包含在Diffusers库中:

from diffusers import StableDiffusion3ControlNetPipeline
from diffusers.models import SD3ControlNetModel, SD3MultiControlNetModel

controlnet = SD3ControlNetModel.from_pretrained("InstantX/SD3-Controlnet-Canny",
                                                torch_dtype=torch.float16)

pipe = StableDiffusion3ControlNetPipeline.from_pretrained(
    "stabilityai/stable-diffusion-3-medium-diffusers", controlnet=controlnet,
    torch_dtype=torch.float16
)
pipe.enable_model_cpu_offload()

在处理图像之前,我将应用一个Canny 边缘检测器

def make_canny_image(img_path: str) -> Image:
    """ Load an image and apply Canny edge detector """
    control_image = cv2.imread(img_path)
    low_threshold = 100
    high_threshold = 200
    image = cv2.Canny(control_image, low_threshold, high_threshold)
    image = image[:, :, None]
    image = np.concatenate([image, image, image], axis=2)
    return Image.fromarray(image)

canny_image = make_canny_image("saskia.jpg")

之后,我可以在 SD3ControlNet 管道中使用一个图像:

prompt = "An oil painting of a woman sitting in bed, made in the 17th century"
image = pipe(prompt, control_image=canny_image,
             controlnet_conditioning_scale=0.7).images[0]
display(image)

输出看起来是这样的:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/22045c4cce3277562ae89338c52a7dc5.png

由作者生成的图像

它并不完美;图像在细节上有几个问题,但结果看起来很有趣。

局限性

在模型测试期间,我发现了两个主要局限性。

第一件事是许可证。Stable Diffusion 1 和 2 模型使用了 Creative ML OpenRAIL-M 许可证,允许商业和非商业使用。这使得 SD 模型变得流行;例如,A1111 的 stable-diffusion-webui 项目在 GitHub 上有 135K 个星标。最新的 Stable Diffusion 3 模型是在 非商业研究社区许可证 下发布的,Stability AI 公司希望艺术家和 AI 爱好者每月支付 20 美元以获得“创作者许可证”,允许商业使用(更新 – 自 2024 年 7 月起,许可证已更改)。

第二件事是图像质量。以我的一个爱好摄影为例,有时我会写摄影器材的评论。比如说,我想得到一张“一位美丽的女士用相机拍照”的简介图片。我运行了 SD3 模型四次,这是未经编辑和编排的原始结果:

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/56cf37d5a8ce433846b96318e8bcfa62.png

作者生成的图像

显然,我无法将这些图像“原样”用于摄影文章。我喜欢 SD3 模型的“鲜艳”色彩和更高的分辨率。但模型的输出并不一致(例如,我们可以看到女士手上有 6 个手指),在我看来,这些图像并不“适合生产”。

顺便说一句,就在几天前,我读了一篇关于开源 AI 模型的 TDS 文章,在我看来,SD3 的情况与这篇文章完美相关:

Llama 是开源的,但为什么?

我认为如果 Stable Diffusion 3 模型有一个不那么限制性的许可证,社区可以更快地对其进行改进。我们都知道 MVP(最小可行产品)的概念,至少对我来说,SD3 模型作为一个商业产品还没有“可行性”。为了科学起见,我支付了 20 美元以获得使用 SD3 图像的法律权利,但我在月底将取消订阅。

更新:2024 年 7 月,Stability AI 引入了一种具有较少限制的新社区许可证,这是一条好消息。读者应查看公司网站以获取更多详细信息。

结论

在这篇文章中,我使用 HuggingFace Python 库测试了 Stable Diffusion 3 Medium 模型。我使用了一个全尺寸和量化质量的模型,并能够通过“随机”和“条件”方式生成图像。

从技术角度来看,使用模型很有趣。然而,结果很有趣,但可能不一致。同样,与之前的版本一样,SD3 模型可能会在小细节上遇到困难,比如手指;不同的物体,如笔记本电脑,通常看起来不正常(比如按键在错误的一侧等)。SD3 模型对硬件要求相对较高,推荐至少使用 16GB GPU 来运行模型(也可以使用 Apple Silicon)。

感谢阅读。如果您喜欢这个故事,请随意订阅Medium,您将在我新文章发布时收到通知,以及访问来自其他作者成千上万故事的完整权限。您也可以通过LinkedIn与我联系,我在那里定期发布一些不够成文章大小的短文。如果您想获取这篇文章和其他文章的完整源代码,请随意访问我的Patreon 页面

对使用不同 AI 模型感兴趣的人也可以阅读其他文章:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值