T2I-Adapter 是一种高效的即插即用模型,它在冻结原始大型文本到图像模型的同时,为其提供额外的指导。T2I-Adapter 通过将 T2I 模型内部知识与外部控制信号进行对齐,可以根据不同条件训练各种适配器,并实现丰富的控制和编辑效果。
作为一项同时进行的工作,ControlNet 具有类似的功能并广泛使用。然而,运行 ControlNet 可能会导致计算开销大。这是因为,在反向扩散过程的每个去噪步骤中,需要同时运行 ControlNet 和 UNet。此外,ControlNet 强调将 UNet 编码器复制为控制模型的重要性,导致参数数量更多。因此,生成过程受到 ControlNet 的大小(越大,过程越慢)的限制。
T2I-Adapters 在这方面为 ControlNets 提供了竞争优势。T2I-Adapters 尺寸较小,并且与 ControlNets 不同,T2I-Adapters 只需在整个去噪过程中运行一次。
在过去的几周中,Diffusers 团队和 T2I-Adapter 作者一直在合作,为 Stable Diffusion XL(SDXL)中的 diffusers 带来 T2I-Adapters 的支持。在这篇博文中,我们分享了从头开始在 SDXL 上训练 T2I-Adapters 的研究结果,一些吸引人的成果,当然还有各种条件(草图、Canny 边缘、线条、深度和 openpose)下的 T2I-Adapter 检查点!
与之前版本的 T2I-Adapter(SD-1.4/1.5)相比,T2I-Adapter-SDXL 仍然使用原始配方,用 79M Adapter 驱动 2.6B SDXL!T2I-Adapter-SDXL 在继承 SDXL 的高质量生成的同时,保持了强大的控制能力!
使用 diffusers
训练 T2I-Adapter-SDXL
我们根据 diffusers
提供的官方示例构建了训练脚本。
在本博文中提到的大多数 T2I-Adapter 模型都是使用 LAION-Aesthetics V2 中的 3M 高分辨率图像文本对进行训练的,具体设置如下:
- 训练步骤:20000-35000
- 批量大小:数据并行,单个 GPU 批量大小为 16,总批量大小为 128。
- 学习率:恒定学习率为 1e-5。
- 混合精度:fp16
我们鼓励社区使用我们的脚本训练定制且功能强大的 T2I-Adapters,在速度、内存和质量之间取得有竞争力的平衡。
在 diffusers
中使用 T2I-Adapter-SDXL
这里,我们以线条条件为例,演示如何使用 T2I-Adapter-SDXL。首先,安装所需的依赖项:
pip install -U git+https://github.com/huggingface/diffusers.git
pip install -U controlnet_aux==0.0.7 # 用于条件模型和检测器
pip install transformers accelerate
T2I-Adapter-SDXL 的生成过程主要包括以下两个步骤:
- 首先将条件图像准备成适当的控制图像格式。
- 将控制图像和提示传递给
StableDiffusionXLAdapterPipeline
。
让我们以使用 Lineart Adapter 的简单示例为例。我们首先初始化 T2I-Adapter pipeline 和线条检测器。
import torch
from controlnet_aux.lineart import LineartDetector
from diffusers import (AutoencoderKL, EulerAncestralDiscreteScheduler,
StableDiffusionXLAdapterPipeline, T2IAdapter)
from diffusers.utils import load_image, make_image_grid
# 加载 adapter
adapter = T2IAdapter.from_pretrained(
"TencentARC/t2i-adapter-lineart-sdxl-1.0", torch_dtype=torch.float16, varient="fp16"
).to("cuda")
# 加载 pipeline
model_id = "stabilityai/stable-diffusion-xl-base-1.0"
euler_a = EulerAncestralDiscreteScheduler.from_pretrained(
model_id, subfolder="scheduler"
)
vae = AutoencoderKL.from_pretrained(
"madebyollin/sdxl-vae-fp16-fix", torch_dtype=torch.float16
)
pipe = StableDiffusionXLAdapterPipeline.from_pretrained(
model_id,
vae=vae,
adapter=adapter,
scheduler=euler_a,
torch_dtype=torch.float16,
variant="fp16",
).to("cuda")
# 加载线条检测器
line_detector = LineartDetector.from_pretrained("lllyasviel/Annotators").to("cuda")
然后,加载一张图片来检测线稿:
url = "https://huggingface.co/Adapter/t2iadapter/resolve/main/figs_SDXLV1.0/org_lin.jpg"
image = load_image(url)
image = line_detector(image, detect_resolution=384, image_resolution=1024)
然后我们生成:
prompt = "冰龙吼,4K照片"
negative_prompt = "动画,卡通,图形,文本,绘画,蜡笔,石墨,抽象,故障,变形,丑陋,畸形"
gen_images = pipe(
prompt=prompt,
negative_prompt=negative_prompt,
image=image,
num_inference_steps=30,
adapter_conditioning_scale=0.8,
guidance_scale=7.5,
).images[0]
gen_images.save("out_lin.png")
有两个重要的参数需要理解,它们可以帮助您控制条件的程度。
-
adapter_conditioning_scale
此参数控制条件在输入上的影响程度。较高的值意味着更高的条件效果,反之亦然。
-
adapter_conditioning_factor
此参数控制应用条件的初始生成步骤数量。该值应设置在0-1之间(默认值为1)。
adapter_conditioning_factor=1
表示适配器应用于所有时间步长,而adapter_conditioning_factor=0.5
表示只应用于前50%的步骤。
有关更多详细信息,欢迎查阅官方文档。
尝试演示
您可以在此空间或下方嵌入的游乐场中轻松尝试 T2I-Adapter-SDXL:
更多结果
下面,我们展示使用不同条件得到的结果。我们还提供了它们对应的预训练检查点的链接。它们的模型卡包含了有关它们的训练方式以及示例用法的更多详细信息。
线稿引导
来自 TencentARC/t2i-adapter-lineart-sdxl-1.0
素描引导
来自 TencentARC/t2i-adapter-sketch-sdxl-1.0
Canny 边缘检测引导
来自 TencentARC/t2i-adapter-canny-sdxl-1.0
深度引导
来自 TencentARC/t2i-adapter-depth-midas-sdxl-1.0
和 TencentARC/t2i-adapter-depth-zoe-sdxl-1.0
OpenPose 引导
来自 TencentARC/t2i-adapter-openpose-sdxl-1.0
致谢:非常感谢William Berman先生帮助我们训练模型并分享他的见解。