该存储库提供了使用 KerasCV 和 TensorFlow 的 DreamBooth 实现。该实现大量引用了 Hugging Face 的diffusers
示例。
DreamBooth 是一种快速教授(微调)新视觉概念的稳定扩散的方法。有关更多详细信息,请参阅此文档。
此存储库中提供的代码仅用于研究目的。请查看本节以了解有关潜在用例和限制的更多信息。
通过加载此模型,您接受 https://raw.githubusercontent.com/CompVis/stable-diffusion/main/LICENSE 上的 CreativeML Open RAIL-M 许可证。
如果您只是寻找此存储库的随附资源,请点击以下链接:
更新 15/02/2023 :感谢 Soumik Rakshit;我们现在有更好的实用程序来支持权重和偏差(参见#22)。
安装先决条件: pip install -r requirements.txt
。
您首先需要选择一个附加唯一标识符的类。该存储库代码库使用sks
作为唯一标识符和dog
作为类进行了测试。
然后会生成两种类型的提示:
(a)实例提示:f“{self.unique_id} {self.class_category} 的照片” (b)班级提示:f“{self.class_category} 的照片”
实例图像
获取一些代表要对模型进行微调的概念的图像 (3 - 10)。这些图像将与instance_prompt
相关联。这些图像在代码库中被称为instance_images
。将这些图像存档并将其托管在网上某处,以便可以在内部使用tf.keras.utils.get_file()
函数下载存档。
班级形象
DreamBooth 使用先验保留损失来规范训练。长话短说,先验保留损失有助于模型根据其可能拥有的有关该概念的任何先验知识,慢慢适应所考虑的新概念。要使用事先保留损失,我们需要如上所示的类提示。类提示用于生成预定义数量的图像,这些图像用于计算 DreamBooth 训练的最终损失。
根据此资源,使用课堂提示生成的 200 - 300 个图像在大多数情况下效果很好。
因此,在您决定了instance_prompt
和class_prompt
后,请使用此 Colab Notebook 生成一些图像,这些图像将用于使用先前保留损失进行训练。然后将生成的图像存档为单个存档并将其在线托管,以便可以在内部使用tf.keras.utils.get_file()
函数下载。在代码库中,我们将这些图像简单地称为class_images
。
无需使用先前的保存损失即可进行 DreamBooth 训练。这个存储库总是使用它。为了让人们轻松测试这个代码库,我们在这里托管了实例和类图像。
启动训练!您可以使用许多超参数。请参阅train_dreambooth.py
脚本以了解有关它们的更多信息。以下命令启动混合精度和其他默认值的训练:
python train_dreambooth.py --mp
您还可以通过指定--train_text_encoder
选项来微调文本编码器。
此外,该脚本支持与权重和偏差 ( wandb
) 集成。如果您指定--log_wandb
,
WandbMetricsLogger
回调自动将训练指标记录到您的wandb
仪表板。wandb
项目,作为模型版本控制的工件。这是使用DreamBoothCheckpointCallback
完成的,该回调是使用WandbModelCheckpoint
回调构建的。wandb
仪表板中的wandb.Table
中。这是使用QualitativeValidationCallback
完成的,它还会在训练结束时将生成的图像记录到wandb
仪表板上的媒体面板中。以下命令可启动训练并将训练指标和生成的图像记录到权重和偏差工作区:
python train_dreambooth.py
--log_wandb
--validation_prompts
" a photo of sks dog with a cat "
" a photo of sks dog riding a bicycle "
" a photo of sks dog peeing "
" a photo of sks dog playing cricket "
" a photo of sks dog as an astronaut "
这是一个wandb
运行示例,您可以在其中找到生成的图像以及模型检查点。
我们用两种不同的方法测试了我们的实现:(a) 仅微调扩散模型(UNet),(b) 微调扩散模型和文本编码器。这些实验是在训练期间的learning rate
和training steps
以及推理期间的number of steps
和unconditional guidance scale
(ugs) 的各种超参数上进行的。但这里只包含最显着的结果(从我们的角度来看)。如果您对不同的超参数如何影响生成的图像质量感到好奇,请找到每个部分中完整报告的链接。
请注意,我们的实验是由 Hugging Face 的这篇博客文章指导的。
以下是我们进行的各种实验中精选的一些结果。我们对此设置的实验日志可在此处找到。更多可视化图像(通过这些实验的检查点生成)可在此处获得。
图片 | 步骤 | 地下地质调查局 | 环境 |
---|---|---|---|
50 | 30 | LR:1e-6 训练步数:800(重量) | |
25 | 15 | LR:1e-6 训练步数:1000(重量) | |
75 | 15 | LR:3e-6 训练步数:1200(重量) |
图片 | 步骤 | 乌格斯 |
---|---|---|
75 | 15 | |
75 | 30 |
w/学习率=9e-06,最大训练步数=200(权重|报告)
图片 | 步骤 | 乌格斯 |
---|---|---|
150 | 15 | |
75 | 30 |
w/学习率=9e-06,最大训练步数=200(数据集|报告)
diffusers
库提供了最先进的工具,用于试验不同的扩散模型,包括稳定扩散。它包括不同的优化技术,在使用大型稳定扩散检查点时,可利用这些优化技术对diffusers
执行有效的推理。 diffusers
的一项特别有利的功能是它支持不同的调度程序,这些调度程序可以在运行时配置,并且可以集成到任何兼容的扩散模型中。
一旦您使用此代码库获得了 DreamBooth 微调检查点,您实际上可以将它们导出到方便的StableDiffusionPipeline
中并直接从diffusers
库中使用它。
考虑这个存储库:chansung/dreambooth-dog。运行一些小步骤后,您可以在StableDiffusionPipeline
中使用此存储库的检查点:
from diffusers import StableDiffusionPipeline
# checkpoint of the converted Stable Diffusion from KerasCV
model_ckpt = "sayakpaul/text-unet-dogs-kerascv_sd_diffusers_pipeline"
pipeline = StableDiffusionPipeline . from_pretrained ( model_ckpt )
pipeline . to ( "cuda" )
unique_id = "sks"
class_label = "dog"
prompt = f"A photo of { unique_id } { class_label } in a bucket"
image = pipeline ( prompt , num_inference_steps = 50 ). images [ 0 ]
请按照本指南了解更多信息。
我们已将狗图像的微调检查点转换为与 Diffusers 兼容的 StableDiffusionPipeline,并使用不同的调度程序设置进行了各种实验。例如, DDIMScheduler
的以下参数在不同的guidance_scale
和num_inference_steps
集上进行测试。
num_inference_steps_list = [ 25 , 50 , 75 , 100 ]
guidance_scale_list = [ 7.5 , 15 , 30 ]
scheduler_configs = {
"DDIMScheduler" : {
"beta_value" : [
[ 0.000001 , 0.02 ],
[ 0.000005 , 0.02 ],
[ 0.00001 , 0.02 ],
[ 0.00005 , 0.02 ],
[ 0.0001 , 0.02 ],
[ 0.0005 , 0.02 ]
],
"beta_schedule" : [
"linear" ,
"scaled_linear" ,
"squaredcos_cap_v2"
],
"clip_sample" : [ True , False ],
"set_alpha_to_one" : [ True , False ],
"prediction_type" : [
"epsilon" ,
"sample" ,
"v_prediction"
]
}
}
下面是beta_schedule
参数不同值之间的比较,而其他参数则固定为默认值。查看原始报告,其中包括其他调度程序(例如PNDMScheduler
和LMSDiscreteScheduler
的结果。
人们经常观察到默认设置确实可以保证生成质量更好的图像。例如, guidance_scale
和beta_schedule
的默认值设置为 7.5 和linear
。然而,当guidance_scale
设置为7.5时, beta_schedule
的scaled_linear
似乎工作得更好。或者,当beta_schedule
设置为linear
时,更高的guidance_scale
似乎效果更好。
我们进行了 4,800 次实验,总共生成了 38,400 张图像。这些实验记录在权重和偏差中。如果您好奇,请在此处查看它们以及用于运行实验的脚本。
除了本博文中分享的提示和技巧之外,我们在准备对人脸进行 DreamBooth 训练的实例时还遵循以下内容:
感谢 Abhishek Thakur 分享这些技巧。