Diffusers 有哪些新功能?🎨

发布于 2022 年 9 月 12 日
在 GitHub 上更新

一个半月前,我们发布了 `diffusers`,这是一个为跨模态扩散模型提供模块化工具箱的库。几周后,我们发布了对 Stable Diffusion 的支持,这是一种高质量的文本到图像模型,并提供免费演示供所有人试用。除了耗费大量 GPU 外,在过去三周,团队决定为该库添加一到两个新功能,我们希望社区会喜欢!这篇博客文章概述了 `diffusers` 0.3 版本中的新功能!请记得给 GitHub 仓库 一个 ⭐。

图像到图像 (Image to Image) 流水线

最受欢迎的功能之一是图像到图像生成。这个流水线允许您输入一张图像和一个提示,它将根据这些输入生成一张图像!

我们来看看基于官方 Colab notebook 的一些代码。

from diffusers import StableDiffusionImg2ImgPipeline

pipe = StableDiffusionImg2ImgPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4",
    revision="fp16", 
    torch_dtype=torch.float16,
    use_auth_token=True
)

# Download an initial image
# ...

init_image = preprocess(init_img)

prompt = "A fantasy landscape, trending on artstation"
images = pipe(prompt=prompt, init_image=init_image, strength=0.75, guidance_scale=7.5, generator=generator)["sample"]

没有时间写代码?不用担心,我们还创建了一个 空间演示,您可以直接在那里试用

image info

文本反转 (Textual Inversion)

文本反转 (Textual Inversion) 允许您仅使用 3-5 个样本,即可在您自己的图像上个性化 Stable Diffusion 模型。通过此工具,您可以训练一个关于概念的模型,然后将该概念与社区中的其他人分享!

image info

短短几天内,社区就分享了 200 多个概念!快来看看吧!

  • 包含概念的组织
  • Navigator Colab:可视化浏览和使用社区创建的 150 多个概念。
  • 训练 Colab:教 Stable Diffusion 一个新概念,并与社区分享。
  • 推理 Colab:使用学习到的概念运行 Stable Diffusion。

实验性修复 (Inpainting) 流水线

修复功能允许您提供一张图像,然后选择图像中的一个区域(或提供一个蒙版),并使用 Stable Diffusion 替换该蒙版区域。这是一个示例:

Example inpaint of owl being generated from an initial image and a prompt

您可以尝试一个极简的 Colab notebook 或查看下面的代码。演示即将推出!

from diffusers import StableDiffusionInpaintPipeline

pipe = StableDiffusionInpaintPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4",
    revision="fp16", 
    torch_dtype=torch.float16,
    use_auth_token=True
).to(device)

images = pipe(
    prompt=["a cat sitting on a bench"] * 3,
    init_image=init_image,
    mask_image=mask_image,
    strength=0.75,
    guidance_scale=7.5,
    generator=None
).images

请注意,这是实验性的,因此仍有改进空间。

针对小型 GPU 的优化

经过一些改进,扩散模型可以占用更少的显存。🔥 例如,Stable Diffusion 只占用 3.2GB!这会产生完全相同的结果,但速度会牺牲 10%。以下是如何使用这些优化:

from diffusers import StableDiffusionPipeline

pipe = StableDiffusionPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4", 
    revision="fp16", 
    torch_dtype=torch.float16,
    use_auth_token=True
)
pipe = pipe.to("cuda")
pipe.enable_attention_slicing()

这非常令人兴奋,因为它将进一步降低使用这些模型的门槛!

Mac OS 上的 Diffusers

🍎 没错!又一个广受好评的功能发布了!请阅读官方文档中的完整说明(包括性能比较、规格等)。

使用 PyTorch mps 设备,拥有 M1/M2 硬件的用户可以运行 Stable Diffusion 推理。🤯 这对用户来说只需要最少的设置,快来试试吧!

from diffusers import StableDiffusionPipeline

pipe = StableDiffusionPipeline.from_pretrained("CompVis/stable-diffusion-v1-4", use_auth_token=True)
pipe = pipe.to("mps")

prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt).images[0]

实验性 ONNX 导出器和流水线

新的实验性流水线允许用户在任何支持 ONNX 的硬件上运行 Stable Diffusion。这是一个如何使用它的示例(请注意,正在使用 `onnx` 修订版):

from diffusers import StableDiffusionOnnxPipeline

pipe = StableDiffusionOnnxPipeline.from_pretrained(
    "CompVis/stable-diffusion-v1-4",
    revision="onnx",
    provider="CPUExecutionProvider",
    use_auth_token=True,
)

prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt).images[0]

另外,您也可以直接使用导出脚本将您的 SD 检查点转换为 ONNX。

python scripts/convert_stable_diffusion_checkpoint_to_onnx.py --model_path="CompVis/stable-diffusion-v1-4" --output_path="./stable_diffusion_onnx"

新文档

以上所有功能都非常酷。作为开源库的维护者,我们深知高质量文档的重要性,它能让任何人尽可能轻松地试用该库。

💅 因此,我们进行了一次文档冲刺,非常高兴发布我们的文档的第一个版本。这是第一个版本,所以我们计划添加许多内容(并且始终欢迎贡献!)。

文档的一些亮点

社区

在我们进行上述工作的同时,社区也没有闲着!以下是一些(尽管不全面)已完成工作的亮点:

Stable Diffusion 视频

通过探索潜在空间并在文本提示之间进行形态转换,使用 Stable Diffusion 创建 🔥 视频。您可以:

  • 梦想同一提示的不同版本
  • 在不同的提示之间进行形态转换

Stable Diffusion Videos 工具可通过 pip 安装,附带 Colab notebook 和 Gradio notebook,并且非常易于使用!

这里是一个例子

from stable_diffusion_videos import walk

video_path = walk(['a cat', 'a dog'], [42, 1337], num_steps=3, make_video=True)

Diffusers Interpret

Diffusers interpret 是一个基于 `diffusers` 构建的可解释性工具。它具有以下酷炫功能:

  • 查看扩散过程中的所有图像
  • 分析提示中每个 token 如何影响生成
  • 如果您想了解图像的某个部分,可以在指定的边界框内进行分析

image info (图片来自该工具仓库)

# pass pipeline to the explainer class
explainer = StableDiffusionPipelineExplainer(pipe)

# generate an image with `explainer`
prompt = "Corgi with the Eiffel Tower"
output = explainer(
    prompt, 
    num_inference_steps=15
)

output.normalized_token_attributions # (token, attribution_percentage)
#[('corgi', 40),
# ('with', 5),
# ('the', 5),
# ('eiffel', 25),
# ('tower', 25)]

日语 Stable Diffusion

名字说明了一切!JSD 的目标是训练一个也能捕捉文化、身份和独特表达信息的模型。它使用 1 亿张带有日语字幕的图片进行训练。您可以在模型卡片中阅读有关模型训练方式的更多信息

Waifu Diffusion

Waifu Diffusion 是一个经过微调的 SD 模型,用于生成高质量的动漫图像。

Images of high quality anime
(图片来自该工具仓库)

交叉注意力控制

交叉注意力控制允许通过修改扩散模型的注意力图来精细控制提示。您可以做一些很酷的事情:

  • 替换提示中的目标(例如,将 cat 替换为 dog)
  • 减少或增加提示中单词的重要性(例如,如果您希望“岩石”获得较少的注意力)
  • 轻松注入样式

以及更多!请查看仓库。

可复用种子

Stable Diffusion 最令人印象深刻的早期演示之一是种子的重用以调整图像。其思想是使用感兴趣图像的种子,并使用不同的提示生成新图像。这会产生一些很酷的结果!请查看 Colab

感谢阅读!

希望您阅读愉快!请记得在我们的GitHub 仓库中给我们点赞,并加入Hugging Face Discord 服务器,我们那里有一个专门讨论扩散模型的频道。那里会分享库的最新消息!

欢迎随时提出功能请求和错误报告!如果没有如此优秀的社区,这一切都不可能实现。

社区

注册登录发表评论