使用自定义图像微调SDXL模型

Fine-tune SDXL with your own images

某机构近期开源了SDXL,这是迄今为止最新、最强大的Stable Diffusion版本。某平台在发布首日即提供了可通过网页或云API运行的托管版SDXL。

今天,我们进一步宣布支持SDXL 1.0的微调功能。微调允许您针对特定物体或风格训练SDXL,并创建一个能生成对应物体或风格图像的新模型。例如,我们使用某电影和同事Zeke的图像对SDXL进行了微调。微调SDXL有多种方法,例如Dreambooth、LoRA diffusion(最初用于大语言模型)和Textual Inversion。这些方法均已支持SDXL 1.0。

本文将展示如何用一行代码在您的图像上微调SDXL,并将微调结果发布为您自己托管的公开或私有模型。您只需少量图像即可训练模型,训练过程大约需要10-15分钟。您也可以下载微调后的LoRA权重用于其他地方。

🍿 观看YouTube上的微调指南

目录

  • 什么是微调?
  • 准备训练图像
  • 添加您的API令牌
  • 创建一个模型
  • 开始训练
  • 微调人像
  • 微调风格
  • 监控训练进度
  • 运行模型
  • 微调的工作原理
  • 理解学习率
  • 进阶:在Diffusers中使用微调模型
  • 下一步计划

什么是微调?

微调是一个获取预训练模型并使用更多数据进行训练,以创建一个更适合特定任务的新模型的过程。您可以对像SDXL这样的图像生成模型使用自己的图像进行微调,从而创建一个新版本模型,该模型更擅长生成特定人物、物体或风格的图像。

准备训练图像

训练API需要一个包含训练图像的zip文件。针对单个人物微调SDXL,少量图像(5-6张)即可,但如果您的训练主体更复杂或图像差异很大,则可能需要更多图像。

可参考SDXL代码库中的示例数据集获取灵感。

准备训练图像时请牢记以下准则:

  • 图像可以是您自己、您的宠物、您喜欢的毛绒玩具或任何独特的物体。
  • 图像应仅包含主体本身,无背景干扰或其他物体。
  • 未经他人同意,请勿使用他人图像。
  • 图像可以是JPEG或PNG格式。
  • 尺寸和大小不重要。
  • 文件名不重要。

将您的图像放入一个文件夹并压缩。zip文件的目录结构无关紧要:

zip -r data.zip data

添加您的API令牌

在开始训练任务之前,您需要从平台获取您的API令牌。在您的终端中,将该令牌存储在名为REPLICATE_API_TOKEN的环境变量中。

export REPLICATE_API_TOKEN=r8_...

上传训练数据

将您的训练数据zip文件上传到互联网上可公开访问的某个地方,例如某云存储或代码托管页面。

创建一个模型

您还需要在平台上创建一个模型,它将作为训练后SDXL版本的存储目的地。前往平台创建模型。在下面的示例中,我们将其命名为my-name/my-model

您可以将模型设为公开或私有。如果模型是私有的,只有您可以运行它。如果模型是公开的,任何人都可以运行它,但只有您可以更新它。

开始训练

现在您已经收集了训练数据并创建了模型,是时候使用平台的API开始训练过程了。

本指南使用Python,但如果您想使用其他语言,可以使用客户端库或直接调用HTTP API。

如果您尚未配置Python环境,可以使用某平台托管的Jupyter笔记本来启动训练过程:

首先安装Python包:

pip install replicate

然后创建训练任务:

import replicate

training = replicate.trainings.create(
    version="stability-ai/sdxl:39ed52f2a78e934b3ba6e2a89f5b1c712de7dfea535525255b1aa35c5565e08b",
    input={
        "input_images": "https://my-domain/my-input-images.zip",
    },
    destination="my-name/my-model"
)
print(training)

使用Dreambooth + LoRA微调人像数据集

如果您对人像进行微调,默认训练参数效果很好,但您也可以使用use_face_detection_instead设置。这将自动使用人脸分割,使训练仅集中在图像中的人脸上。

import replicate

training = replicate.trainings.create(
    version="stability-ai/sdxl:39ed52f2a78e934b3ba6e2a89f5b1c712de7dfea535525255b1aa35c5565e08b",
    input={
        "input_images": "https://my-domain/face-images.zip",
        "use_face_detection_instead": True,
    },
    destination="my-name/my-model"
)

微调风格

要为风格获得最佳效果,您需要:

  1. 提高lora学习率,这可以防止训练过度关注细节。尝试不同的值,如1e-4、2e-4。我们的芭比微调使用了4e-4。
  2. 使用不同的caption_prefix来指代风格。
import replicate

training = replicate.trainings.create(
    version="stability-ai/sdxl:39ed52f2a78e934b3ba6e2a89f5b1c712de7dfea535525255b1aa35c5565e08b",
    input={
        "input_images": "https://my-domain/style-images.zip",
        "lora_lr": 2e-4,
        "caption_prefix": 'In the style of TOK,',
    },
    destination="my-name/my-model"
)

为了展示可能性,我们基于某电影制作了几个微调示例。

监控训练进度

访问平台训练页面以跟踪训练任务的进度,或以编程方式检查训练状态:

training.reload()
print(training.status)
print("\n".join(training.logs.split("\n")[-10:]))

运行模型

当模型训练完成后,您可以在平台页面上通过图形界面运行它,或通过API运行:

output = replicate.run(
    "my-name/my-model:abcde1234...",
    input={"prompt": "a photo of TOK riding a rainbow unicorn"},
)

训练的概念默认命名为TOK,但您可以在训练过程中通过设置token_stringcaption_prefix输入来更改它。

微调的工作原理

在微调开始之前,输入图像会使用多个模型进行预处理:

  • SwinIR将输入图像放大到更高分辨率。
  • BLIP为每张输入图像生成文本描述。
  • CLIPSeg移除图像中对训练没有帮助或无趣的区域。

进阶:在Diffusers中使用微调模型

如果您直接使用diffusers库构建自定义流程,可以使用您在平台上训练的模型的权重。

训练对象的.output字段既包含指向训练后版本的指针,也包含训练权重的URL:

print(training.output)
# {
#   'version': 'cloneofsimo/sdxl_mixes:...',
#   'weights': 'https://pbxt.replicate.delivery/.../trained_model.tar'
# }

下载weights字段中的.tar文件并解压。现在您可以使用diffusers包加载权重。

import torch
from diffusers import DiffusionPipeline

from safetensors import safe_open
from dataset_and_utils import TokenEmbeddingsHandler
from diffusers.models import AutoencoderKL

pipe = DiffusionPipeline.from_pretrained(
        "stabilityai/stable-diffusion-xl-base-1.0",
        torch_dtype=torch.float16,
        variant="fp16",
).to("cuda")

with safe_open("training_out/unet.safetensors", framework="pt", device="cuda") as f:
    for key in f.keys():
       tensors[key] = f.get_tensor(key)

pipe.unet.load_state_dict(tensors, strict=False) # should take < 2 seconds

text_encoders = [pipe.text_encoder, pipe.text_encoder_2]
tokenizers = [pipe.tokenizer, pipe.tokenizer_2]

embhandler = TokenEmbeddingsHandler(text_encoders, tokenizers)
embhandler.load_embeddings("training_out/embeddings.pti")

根据special_params.json中的提示来生成输出。

pipe(prompt="A photo of <s0><s1>").images[0].save("monster.png")

进阶:使用自定义提示替换生成的提示进行训练

对于大多数用户,BLIP为训练生成的描述效果很好。但是,您可以通过在提供的训练输入图像zip文件中添加一个caption.csv文件来提供自己的描述。每个输入图像都需要有一个对应的描述。这是格式细节的示例csv。

下一步计划

  • 查看在芭比电影图像上微调的sdxl-barbie模型。
  • 参考GitHub上的示例训练数据集获取灵感。
  • 学习如何使用API运行SDXL。
  • 在模型比较平台上将SDXL与其他图像模型进行比较。

我们将在未来几周继续改进SDXL微调。请通过社交平台和社区关注更新。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

posted @ 2026-01-03 22:19  CodeShare  阅读(17)  评论(0)    收藏  举报