• 在 SDXL 上用 T2I-Adapter 实现高效可控的文生图


    f602ea5f45dfde8bd0a7f2bac94c3a05.png

    T2I-Adapter 是一种高效的即插即用模型,其能对冻结的预训练大型文生图模型提供额外引导。T2I-Adapter 将 T2I 模型中的内部知识与外部控制信号结合起来。我们可以根据不同的情况训练各种适配器,实现丰富的控制和编辑效果。

    同期的 ControlNet 也有类似的功能且已有广泛的应用。然而,其运行所需的 计算成本比较高。这是因为其反向扩散过程的每个去噪步都需要运行 ControlNet 和 UNet。另外,对 ControlNet 而言,复制 UNet 编码器作为控制模型的一部分对效果非常重要,这也导致了控制模型参数量的进一步增大。因此,ControlNet 的模型大小成了生成速度的瓶颈 (模型越大,生成得越慢)。

    在这方面,T2I-Adapters 相较 ControlNets 而言颇有优势。T2I-Adapter 的尺寸较小,而且,与 ControlNet 不同,T2I-Adapter 可以在整个去噪过程中仅运行一次。

    模型参数量所需存储空间(fp16)
    ControlNet-SDXL1251 M2.5 GB
    ControlLoRA (rank = 128)197.78 M (参数量减少 84.19%)396 MB (所需空间减少 84.53%)
    T2I-Adapter-SDXL79 M (参数量减少 93.69%)158 MB (所需空间减少 94%)

    在过去的几周里,Diffusers 团队和 T2I-Adapter 作者紧密合作,在 diffusers 库上为 Stable Diffusion XL (SDXL) 增加 T2I-Adapter 的支持。本文,我们将分享我们在从头开始训练基于 SDXL 的 T2I-Adapter 过程中的发现、漂亮的结果,以及各种条件 (草图、canny、线稿图、深度图以及 OpenPose 骨骼图) 下的 T2I-Adapter checkpoint!

    ba0dadb8e7ab2c2108ee4f7c2d0e6242.png
    结果合辑

    与之前版本的 T2I-Adapter (SD-1.4/1.5) 相比,T2I-Adapter-SDXL 还是原来的配方,不一样之处在于,用一个 79M 的适配器去驱动 2.6B 的大模型 SDXL!T2I-Adapter-SDXL 在继承 SDXL 的高品质生成能力的同时,保留了强大的控制能力!

    diffusers 训练 T2I-Adapter-SDXL

    我们基于 diffusers 提供的 这个官方示例 构建了我们的训练脚本。

    本文中提到的大多数 T2I-Adapter 模型都是在 LAION-Aesthetics V2 的 3M 高分辨率 图文对 上训练的,配置如下:

    • 训练步数: 20000-35000

    • batch size: 采用数据并行,单 GPU batch size 为 16,总 batch size 为 128

    • 学习率: 1e-5 的恒定学习率

    • 混合精度: fp16

    我们鼓励社区使用我们的脚本来训练自己的强大的 T2I-Adapter,并对速度、内存和生成的图像质量进行折衷以获得竞争优势。

    diffusers 中使用 T2I-Adapter-SDXL

    这里以线稿图为控制条件来演示 T2I-Adapter-SDXL 的使用。首先,安装所需的依赖项:

    1. pip install -U git+https://github.com/huggingface/diffusers.git
    2. pip install -U controlnet_aux==0.0.7 # for conditioning models and detectors
    3. pip install transformers accelerate

    T2I-Adapter-SDXL 的生成过程主要包含以下两个步骤:

    1. 首先将条件图像转换为符合要求的 控制图像 格式。

    2. 然后将 控制图像提示 传给 StableDiffusionXLAdapterPipeline

    我们看一个使用 Lineart Adapter 的简单示例。我们首先初始化 SDXL 的 T2I-Adapter 流水线以及线稿检测器。

    1. import torch
    2. from controlnet_aux.lineart import LineartDetector
    3. from diffusers import (AutoencoderKL, EulerAncestralDiscreteScheduler,
    4.                        StableDiffusionXLAdapterPipeline, T2IAdapter)
    5. from diffusers.utils import load_image, make_image_grid
    6. # load adapter
    7. adapter = T2IAdapter.from_pretrained(
    8.     "TencentARC/t2i-adapter-lineart-sdxl-1.0", torch_dtype=torch.float16, varient="fp16"
    9. ).to("cuda")
    10. # load pipeline
    11. model_id = "stabilityai/stable-diffusion-xl-base-1.0"
    12. euler_a = EulerAncestralDiscreteScheduler.from_pretrained(
    13.     model_id, subfolder="scheduler"
    14. )
    15. vae = AutoencoderKL.from_pretrained(
    16.     "madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16
    17. )
    18. pipe = StableDiffusionXLAdapterPipeline.from_pretrained(
    19.     model_id,
    20.     vae=vae,
    21.     adapter=adapter,
    22.     scheduler=euler_a,
    23.     torch_dtype=torch.float16,
    24.     variant="fp16",
    25. ).to("cuda")
    26. # load lineart detector
    27. line_detector = LineartDetector.from_pretrained("lllyasviel/Annotators").to("cuda")

    然后,加载图像并生成其线稿图:

    1. url = "https://huggingface.co/Adapter/t2iadapter/resolve/main/figs_SDXLV1.0/org_lin.jpg"
    2. image = load_image(url)
    3. image = line_detector(image, detect_resolution=384, image_resolution=1024)
    956c02c57d874d46b2e10d037ea2201e.png
    龙的线稿图

    然后生成:

    1. prompt = "Ice dragon roar, 4k photo"
    2. negative_prompt = "anime, cartoon, graphic, text, painting, crayon, graphite, abstract, glitch, deformed, mutated, ugly, disfigured"
    3. gen_images = pipe(
    4.     prompt=prompt,
    5.     negative_prompt=negative_prompt,
    6.     image=image,
    7.     num_inference_steps=30,
    8.     adapter_conditioning_scale=0.8,
    9.     guidance_scale=7.5,
    10. ).images[0]
    11. gen_images.save("out_lin.png")
    501e6cd99979a8acb5e0124690ddf35e.png
    用线稿图生成出来的龙

    理解下述两个重要的参数,可以帮助你调节控制程度。

    1. adapter_conditioning_scale

      该参数调节控制图像对输入的影响程度。越大代表控制越强,反之亦然。

    2. adapter_conditioning_factor

      该参数调节适配器需应用于生成过程总步数的前面多少步,取值范围在 0-1 之间 (默认值为 1)。adapter_conditioning_factor=1 表示适配器需应用于所有步,而 adapter_conditioning_factor=0.5 则表示它仅应用于前 50% 步。

    更多详情,请查看 官方文档。

    试玩演示应用

    你可以在 这儿 或下述嵌入的游乐场中轻松试玩 T2I-Adapter-SDXL:

    33657edb18d8737819c4278edbd163d9.png

    你还可以试试 Doodly,它用的是草图版模型,可以在文本监督的配合下,把你的涂鸦变成逼真的图像:

    81babe5572d47eb9035ceb238f0ff169.png

    更多结果

    下面,我们展示了使用不同控制图像作为条件获得的结果。除此以外,我们还分享了相应的预训练 checkpoint 的链接。如果想知道有关如何训练这些模型的更多详细信息及其示例用法,可以参考各自模型的模型卡。

    使用线稿图引导图像生成

    8442a66c1d7c62c49e21722e22f85882.png模型见 TencentARC/t2i-adapter-lineart-sdxl-1.0

    使用草图引导图像生成

    efbdc27f13acafcd1066463d5b7bc6d8.png模型见 TencentARC/t2i-adapter-sketch-sdxl-1.0

    使用 Canny 检测器检测出的边缘图引导图像生成

    0ccc75ca02ac4f850ec982a352be511d.png模型见 TencentARC/t2i-adapter-canny-sdxl-1.0

    使用深度图引导图像生成

    49cd7e9d7b6f3b03ef5adf82649d3c66.png模型分别见 TencentARC/t2i-adapter-depth-midas-sdxl-1.0TencentARC/t2i-adapter-depth-zoe-sdxl-1.0

    使用 OpenPose 骨骼图引导图像生成

    e0ccd72a86cfb3a0d735ae9d66a6cc50.png模型见 TencentARC/t2i-adapter-openpose-sdxl-1.0


    致谢: 非常感谢 William Berman 帮助我们训练模型并分享他的见解。

    🤗 宝子们可以戳 阅读原文 查看文中所有的外部链接哟!


    英文原文: https://hf.co/blog/t2i-sdxl-adapters

    原文作者: Chong Mou,Suraj Patil,Sayak Paul,Xintao Wang,hysts

    译者: Matrix Yao (姚伟峰),英特尔深度学习工程师,工作方向为 transformer-family 模型在各模态数据上的应用及大规模模型的训练推理。

    审校/排版: zhongdongy (阿东)

  • 相关阅读:
    ELK集群部署
    香港第一金:美元指数昨晚拉高,不确定性加深金价下跌
    2022-01-29-Ajax
    R语言使用caret包的preProcess函数进行数据填充、使用K近邻KNN算法进行缺失值填充
    <前端>Electron-builder为公证后的app打更新信息latest.yml
    从“新零售”到“即时零售”看中国电商之变
    网站整站优化-网站整站优化工具
    Java中如何执行多条shell/bat命令 2023年验证通过
    Linux0.12内核源码解读(2)-Bootsect.S
    Codeforces Round #832 (Div. 2)「D 思维 + 异或前缀和 + 奇偶二分优化」
  • 原文地址:https://blog.csdn.net/HuggingFace/article/details/133399226