首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >使用自定义图像微调SDXL模型指南

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

原创
作者头像
用户11764306
发布2025-10-22 15:31:46
发布2025-10-22 15:31:46
1730
举报

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

某机构最近开源了SDXL,这是Stable Diffusion最新且功能最强大的版本。某平台在发布当天就提供了托管版本的SDXL,您可以从网页或使用云API运行。

今天我们宣布对SDXL 1.0的微调支持。微调允许您在特定对象或样式上训练SDXL,并创建生成这些对象或样式图像的新模型。例如,我们在芭比电影图像和同事Zeke的图像上对SDXL进行了微调。有多种微调SDXL的方法,例如Dreambooth、LoRA扩散(最初用于LLMs)和Textual Inversion。某平台已为SDXL 1.0覆盖了所有这些方法。

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

什么是微调?

微调是采用预训练模型并使用更多数据对其进行训练以创建更适合特定任务的新模型的过程。您可以在自己的图像上微调像SDXL这样的图像生成模型,以创建更擅长生成特定人物、对象或样式图像的新版本模型。

准备训练图像

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

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

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

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

代码语言:bash
复制
zip -r data.zip data

添加API令牌

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

代码语言:bash
复制
export REPLICATE_API_TOKEN=r8_...

上传训练数据

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

创建模型

您还需要在某平台上创建一个模型,作为训练后SDXL版本的目标位置。转到某平台创建模型。在下面的示例中,我们称其为my-name/my-model。

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

开始训练

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

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

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

首先安装某平台Python包:

代码语言:bash
复制
pip install replicate

然后创建训练:

代码语言:python
复制
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设置。这将自动使用人脸分割,使训练仅集中在图像中的人脸上。

代码语言:python
复制
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"
)

微调样式

要为样式获得最佳结果,您需要:

  • 加快lora学习速率,这可以防止训练过于关注细节。尝试不同的值,如1e-4、2e-4。我们的芭比微调使用了4e-4
  • 使用不同的caption_prefix来引用样式
代码语言:python
复制
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"
)

为了展示可能性,我们基于芭比和创:战纪电影组合了几个微调。

监控训练进度

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

代码语言:python
复制
training.reload()
print(training.status)
print("\n".join(training.logs.split("\n")[-10:]))

运行模型

当模型完成训练后,您可以使用某平台上的GUI或通过API运行它:

代码语言:python
复制
output = replicate.run(
    "my-name/my-model:abcde1234...",
    input={"prompt": "a photo of TOK riding a rainbow unicorn"},
)

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

微调工作原理

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

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

高级:将微调模型与Diffusers一起使用

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

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

代码语言:python
复制
print(training.output)
# {
#   'version': 'cloneofsimo/sdxl_mixes:...',
#   'weights': 'https://pbxt.replicate.delivery/.../trained_model.tar'
# }

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

代码语言:python
复制
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) # 应该需要不到2秒

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提示模型来生成输出:

代码语言:python
复制
pipe(prompt="A photo of <s0><s1>").images[0].save("monster.png")

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

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

后续步骤

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

我们将在未来几周继续改进SDXL微调。请关注社交媒体和社区平台以获取更新。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用自定义图像微调SDXL模型
    • 什么是微调?
    • 准备训练图像
    • 添加API令牌
    • 上传训练数据
    • 创建模型
    • 开始训练
    • 使用Dreambooth + LoRA微调人脸数据集
    • 微调样式
    • 监控训练进度
    • 运行模型
    • 微调工作原理
    • 高级:将微调模型与Diffusers一起使用
    • 高级:用自定义提示替换生成的提示进行训练
    • 后续步骤
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档