如何在Stable Diffusion上Fine Tuning出自己风格的模型

Stable Diffusion在很多事情上都很出色,但并不是在所有事情上都很棒,并且以特定的样式或外观获得结果通常涉及大量工作“即时工程”。那么,如果您想要生成特定类型的图像,除了花很长时间制作复杂的文本提示(prompt)之外,还有另一种方法是微调(Fine Tuning)图像生成模型本身。

Fine Tuning是一种常见的做法,即把一个已经在广泛而多样的数据集上预训练过的模型,再在你特别感兴趣的数据集上再训练一下。这是深度学习的常见做法,比如在自然语言处理(NLP)的BERT模型上微调实际上就是生成专业模型的主要方式,而在图像处理领域,已被证明是从标准图像分类网络到 GAN 的各种模型都非常有效。在此示例中,我们将展示如何在 宝可梦 数据集上微调 Stable Diffusion 以创建对应的txt2img模型,该模型根据任何文本提示制作自定义 宝可梦。

以下是经过训练的模型可以产生的输出类型的一些示例,以及使用的提示(prompt):

Girl with a pearl earring, Cute Obama creature, Donald Trump, Boris Johnson, Totoro, Hello Kitty

如果您只是关注模型、代码或数据集,请参阅:

如果您只想生成一些神奇宝贝,请使用此notebook或在Replicate上试用。

硬件

按照今天的标准,运行Stable Diffusion本身的要求并不高,微调模型不需要像预训练那样投入大量的计算资源。对于这个示例,我在Lambda GPU Cloud上使用 2xA6000 GPU,并运行大约 15,000 步的训练,运行大约需要 6 个小时,成本约为 10 美元。训练应该能够在单个或更低规格的 GPU 上运行(只要 VRAM 大于 24GB),但您可能需要调整批量大小和梯度累积步骤以适合您的 GPU。有关如何调整这些参数的更多详细信息,请参阅微调笔记本

数据!

首先,我们需要一个数据集来训练。Stable Diffusion训练需要每个图像都带有对应的文本标题。如果我们为我们的数据集选择具有统一主题和风格的内容,事情会变得简单。在此,我将使用来自 FastGAN 的 宝可梦 数据集,因为它大小合适(几乎一千张图像),高分辨率,并且有非常一致的风格,但是有一个问题是,图像上没有任何的文字描述(文本标题)!

我们将使用神经网络来为我们完成艰苦的工作,而不是自己费力地为每个图片进行标注。这里用到的是一个名为BLIP的图像标注模型。模型的标注并不完美,但它们相当准确且足以满足我们的目的。

我们已将带标注 宝可梦 数据集上传到 Huggingface 以使其易于重用:lambdalabs/pokemon-blip-captions

from datasets import load_dataset
ds = load_dataset("lambdalabs/pokemon-blip-captions", split="train")
sample = ds[0]
display(sample["image"].resize((256, 256)))
print(sample["text"])

a drawing of a green pokemon with red eyes

做好准备

现在我们有一个数据集,我们需要原始模型的Stable Diffusion模型,可在此处下载,(名称为:sd-v1-4-full-ema.ckpt)接下来我们需要设置训练的代码和环境。我们将使用原始训练代码的一个分支,该分支已经过修改以使其能更友好地进行微调:justinpinkney/stable-diffusion

Stable Diffusion 使用基于 yaml 的配置文件以及传递给main.py函数的一些额外命令行参数来启动训练。

我们创建了一个运行此微调示例的基本 yaml 配置文件。如果你想在自己的数据集上运行它应该很容易修改,你需要编辑的主要部分是数据配置,这是自定义 yaml 文件的相关摘录:

data:
  target: main.DataModuleFromConfig
  params:
    batch_size: 4
    num_workers: 4
    num_val_workers: 0 # Avoid a weird val dataloader issue
    train:
      target: ldm.data.simple.hf_dataset
      params:
        name: lambdalabs/pokemon-blip-captions
        image_transforms:
        - target: torchvision.transforms.Resize
          params:
            size: 512
            interpolation: 3
        - target: torchvision.transforms.RandomCrop
          params:
            size: 512
        - target: torchvision.transforms.RandomHorizontalFlip
    validation:
      target: ldm.data.simple.TextOnly
      params:
        captions:
        - "A pokemon with green eyes, large wings, and a hat"
        - "A cute bunny rabbit"
        - "Yoda"
        - "An epic landscape photo of a mountain"
        output_size: 512
        n_gpus: 2 # small hack to make sure we see all our samples

这部分配置基本上做了以下事情,它使用该ldm.data.simple.hf_dataset函数创建一个数据集,用于对Huggingface Hub 上名为lambdalabs/pokemon-blip-cpations的dataset进行训练,但也可以是格式正确的本地数据目录。对于validation,我们不使用“真实”数据集,而仅使用一些文本提示来评估我们的模型表现如何以及何时停止训练,我们希望训练足够多以获得良好的输出,但我们不想要它忘记原始模型中的所有“常识”。

Train

设置好配置文件后,您就可以通过运行main.py带有一些额外参数的脚本来进行训练了:

  • -t- 进行训练
  • --base configs/stable-diffusion/pokemon.yaml- 使用我们的自定义配置
  • --gpus 0,1- 使用这些 GPU
  • --scale_lr False- 按原样使用配置中的学习率
  • --num_nodes 1- 在单台机器上运行(可能有多个 GPU)
  • --check_val_every_n_epoch 10- 不要太频繁地检查验证样本
  • --finetune_from models/ldm/stable-diffusion-v1/sd-v1-4-full-ema.ckpt- 从原始Stable Diffusion上进行微调
python main.py \
    -t \
    --base configs/stable-diffusion/pokemon.yaml \
    --gpus 0,1 \
    --scale_lr False \
    --num_nodes 1 \
    --check_val_every_n_epoch 10 \
    --finetune_from sd-v1-4-full-ema.ckpt

结果

在训练过程中,结果应该被记录到日志文件夹中,你应该看到每隔一段时间从训练数据集中抽取的样本,所有的验证样本都应该被运行。开始的时候,样本看起来像正常的图像,然后开始有口袋妖怪的风格,随着训练的继续,最终与原始提示相背离。

原始风格渐进到宝可梦风格

如果我们想使用该模型,我们可以像使用其他模型一般,例如使用txt2img.py脚本,只需将我们传递的检查点修改为我们的微调版本而不是原始版本:

python scripts/txt2img.py \
    --prompt 'robotic cat with wings' \
    --outdir 'outputs/generated_pokemon' \
    --H 512 --W 512 \
    --n_samples 4 \
    --config 'configs/stable-diffusion/pokemon.yaml' \
    --ckpt 'logs/2022-09-02T06-46-25_pokemon_pokemon/checkpoints/epoch=000142.ckpt'
from PIL import Image
im = Image.open("outputs/generated_pokemon/grid-0000.png").resize((1024, 256))
display(im)
print("robotic cat with wings")

“robotic cat with wings”的输出

该模型应该与为Stable Diffusion开发的任何现有存储库或用户界面兼容,并且还可以使用简单的脚本移植到 Huggingface Diffusers 库。

如果您只想快速的了解,并nodebook中从头到尾运行此示例,请查看此处

插入您自己的数据

如果您想使用自己的数据进行训练,那么最简单的方法是以正确的方式将其格式化为huggingface上的数据集,如果您的数据集返回imagetext列,那么您可以重新使用本文中的配置,只需将数据集名称更改为您自己的数据集地址即可.

结论

现在您知道如何在自己的数据集上训练自己的Stable Diffusion模型了!

原文地址:https://cloud.tencent.com/developer/article/2137897

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340