从自拍到专业摄影:用DreamBooth训练Flux.1!你试过吗?


大约 2 个月前

从自拍到专业摄影:用 DreamBooth 训练 Flux.1

作者 : Rafay Farhan 在 DreamAI 软件公司(私人)有限公司

你是否曾经想创建看起来专业的头像,而不需要走进摄影工作室?作为一个AI爱好者和开发者,我最近使用先进的图像生成模型 Flux.1,以及 DreamBooth 的微调,来解决这个挑战。今天,我很高兴和大家分享我的旅程,并提供一些易于使用的笔记本,简化整个过程。

包含训练和测试笔记本的 GitHub 存储库可以在这里找到。

挑战:让使用 DreamBooth 训练 Flux 更加简单

在探索 AI 领域时,我注意到一个显著的空白:尽管 Flux.1 拥有令人印象深刻的能力,但并没有很多用户友好的资源展示如何用 DreamBooth 进行训练。官方文档存在于 Hugging Face 的 diffusers 存储库 中,但我希望让这项强大的技术对更广泛的社区更加易用。

因此,我创建了两个 Colab 笔记本,简化了这个过程,建立在 diffusers 团队的优秀工作基础上。这些笔记本让训练Flux.1在你自己的图像上变得前所未有的简单,并生成惊艳的结果。

数据集准备:少即是多?

在我的实验中,我使用了一个相对较小的个人照片数据集。虽然传统观念可能认为更多的数据总是更好,但真正令人着迷的是,Flux.1 就算在有限的训练数据下仍能产生令人满意的结果。

[原始数据集的 3/11 张图像]: 这些训练图像虽然不是专业的头像——它们是低质量的休闲照片和自拍,角度、光照、发型和背景不一,拍摄时间间隔几个月,但 Flux.1 仍然能够非常好地学习到我的面部特征。想象一下,如果有一个更精心整理的数据集,它能够做得多么出色!

但是,创建最佳数据集的一些建议如下:

  • 目标是清晰、光线良好的面部照片
  • 包含各种角度和表情
  • 确保图像质量一致
  • 删除任何模糊或遮挡的照片
  • 考虑包括特写镜头和中景镜头

训练过程:两阶段方法

我开发的训练过程分为两个阶段,这被证明尤其有效。让我们看看关键组成部分:

首先,我们需要安装必要的依赖项:

!pip install --upgrade pip
!pip install accelerate transformers diffusers torch torch-fidelity mediapy wandb
!pip install -q xformers
!pip install scipy ftfy
!pip install -q triton prodigyopt
!pip install -q peft>=0.6.0

# 从源代码安装 diffusers
!git clone https://github.com/huggingface/diffusers
%cd diffusers
!pip install -e .
%cd examples/dreambooth
!pip install -r requirements_flux.txt

第一阶段:基础模型训练

首先,我们使用 DreamBooth 从头开始训练一个基础模型。这为模型理解你的面部特征和特性奠定了基础。下面是我们设置训练配置的方式:

# 设置训练配置
MODEL_NAME = "black-forest-labs/FLUX.1-schnell"
INSTANCE_DIR = "portrait_images"  # 存放训练图像的目录
OUTPUT_DIR = "latest-flux-your-identifier"
INSTANCE_PROMPT = "a photo of <your-identifier> person"  # 替换为你的身份标识

# 使用优化参数启动训练
!accelerate launch train_dreambooth_lora_flux.py 
  --pretrained_model_name_or_path="$MODEL_NAME" 
  --instance_data_dir="$INSTANCE_DIR" 
  --output_dir="$OUTPUT_DIR" 
  --mixed_precision="bf16" 
  --instance_prompt="$INSTANCE_PROMPT" 
  --resolution=256 
  --train_batch_size=1 
  --gradient_accumulation_steps=8 
  --learning_rate=1.0 
  --optimizer="prodigy" 
  --lr_scheduler="constant" 
  --lr_warmup_steps=0 
  --max_train_steps=500 
  --seed=42 
  --gradient_checkpointing 
  --cache_latents 
  --lora_layers="attn.to_k,attn.to_q,attn.to_v,attn.to_out.0" 
  --rank=4

这些参数经过精心调整,以获得使用人像图像的最佳结果。

第二阶段:精炼

在评估初步结果后,我使用第一阶段的检查点进行了额外的 500 步训练。这个精炼阶段有助于模型捕捉更细致的细节,并提高输出质量。以下是设置精炼训练的方式:

# 为继续训练设置目录
OUTPUT_DIR = "latest-flux-your-identifier-v2"  # 精炼模型的新输出目录

# 复制之前训练的检查点文件
!mkdir -p $OUTPUT_DIR
!cp previous-checkpoint/pytorch_lora_weights.safetensors $OUTPUT_DIR/
!cp previous-checkpoint/optimizer.bin $OUTPUT_DIR/
!cp previous-checkpoint/scheduler.bin $OUTPUT_DIR/
!cp previous-checkpoint/random_states_0 $OUTPUT_DIR/

# 使用相同的参数启动精炼训练
!accelerate launch train_dreambooth_lora_flux.py 
  --pretrained_model_name_or_path="$MODEL_NAME" 
  --instance_data_dir="$INSTANCE_DIR" 
  --output_dir="$OUTPUT_DIR" 
  # ... (与第一阶段相同的参数)

训练笔记本包含注释部分,清楚地指示出根据你是从头开始还是精炼现有模型使用哪些代码。

测试和生成:用户友好的界面

这个项目中最激动人心的方面之一是我使用 Gradio 开发的测试界面。它提供了一种直观的方式来使用你的训练模型生成图像。这个界面允许你:

  • 输入自定义提示
  • 调整生成参数
  • 实时查看结果
  • 实验不同的风格和设置

下面是我们如何设置的:

import torch
from diffusers import FluxPipeline
import gradio as gr
import random

# 初始化模型
def load_model():
    pipe = FluxPipeline.from_pretrained("black-forest-labs/FLUX.1-schnell", torch_dtype=torch.float16)
    pipe.load_lora_weights("latest-flux-rffzzgh-v2.1")
    return pipe.to("cuda")

# 生成图像函数
def generate_portrait(prompt_prefix, prompt_suffix, negative_prompt, guidance_scale, num_steps, seed):
    # 使用所需的身份标识构建完整提示
    full_prompt = f"a professional studio portrait of rffzzgh person, {prompt_prefix}, {prompt_suffix}"

    # 如果未提供,则生成随机种子
    if seed == -1:
        seed = random.randint(0, 999999)

    # 生成图像
    with torch.cuda.amp.autocast():
        image = pipe(
            full_prompt,
            negative_prompt=negative_prompt,
            guidance_scale=float(guidance_scale),
            num_inference_steps=int(num_steps),
            max_sequence_length=256,
            generator=torch.Generator("cuda").manual_seed(seed)
        ).images[0]

    return image, seed

# 创建 Gradio 界面
def create_interface():
    with gr.Blocks(title="Flux Portrait Generator") as interface:
        gr.Markdown("# Flux Portrait Generator")

        with gr.Row():
            with gr.Column():
                # 输入组件
                prompt_prefix = gr.Textbox(
                    label="提示前缀(风格、设置等)",
                    placeholder="惊艳的 4k UHD,专业的工作室照明",
                    value="惊艳的 4k UHD,专业的工作室照明"
                )

                prompt_suffix = gr.Textbox(
                    label="提示后缀(附加细节)",
                    placeholder="清晰聚焦,详细特征,高端时尚",
                    value="清晰聚焦,详细特征,高端时尚,清晰细节,专业摄影,获奖肖像,使用 Phase One 拍摄,完美构图,杂志质量"
                )

                negative_prompt = gr.Textbox(
                    label="消极提示",
                    value="模糊,低质量,扭曲,变形,丑陋,解剖结构差,比例失调,业余,过饱和,过曝,欠曝,颗粒感,噪音,失焦,重复,变异"
                )

                with gr.Row():
                    guidance_scale = gr.Slider(
                        label="引导比例",
                        minimum=0.0,
                        maximum=15.0,
                        value=7.5,
                        step=0.5
                    )
                    num_steps = gr.Slider(
                        label="步数",
                        minimum=1,
                        maximum=50,
                        value=4,
                        step=1
                    )

                seed = gr.Number(
                    label="种子(-1 为随机)",
                    value=-1,
                    precision=0
                )

                generate_btn = gr.Button("生成肖像", variant="primary")

            with gr.Column():
                # 输出组件
                output_image = gr.Image(label="生成肖像")
                used_seed = gr.Number(label="使用的种子", precision=0)

        # 处理生成
        generate_btn.click(
            fn=generate_portrait,
            inputs=[prompt_prefix, prompt_suffix, negative_prompt, guidance_scale, num_steps, seed],
            outputs=[output_image, used_seed]
        )

    return interface

# 全局加载模型
print("加载模型中...")
pipe = load_model()
print("模型加载完成!")

# 启动界面
if __name__ == "__main__":
    interface = create_interface()
    interface.launch(share=True)  # 如果不想公开共享请设置 share=False

结果

实施细节

对于那些对技术细节感兴趣的人,这个项目利用了:

  • Black Forest Labs 的 Flux.1 模型
  • Hugging Face diffusers 库中的 DreamBooth 训练实现
  • Gradio 用于用户界面
  • Google Colab 用于易于访问的 GPU 计算

硬件要求

为了获得最佳性能,我推荐:

  • GPU: NVIDIA A100(40GB)— 我是通过 Google Colab 使用这个
  • VRAM: 至少 16GB(尽管 40GB 提供更好的性能)
  • 磁盘空间:~10GB 用于模型存储和生成的图像

注意:虽然你可能在低端 GPU 上运行这个,但使用 A100 或类似的高端 GPU 将显著提高训练速度和稳定性。

软件设置

笔记本处理所有复杂的设置,包括:

  • 安装依赖项
  • 加载和配置模型
  • 设置训练参数
  • 管理模型检查点

结果与洞察

结果确实令人印象深刻。即使在一个适度的数据集上,模型也学会生成高质量的、工作室风格的头像,同时保持我的相貌,并增加了专业的光线和构图。这说明了将 Flux.1 的能力与 DreamBooth 微调相结合的强大效果。

开始使用

准备好自己尝试了吗?你可以在我的存储库中找到这些笔记本。以下是快速入门指南,包括一些有效的示例提示:

# 示例提示配置
prompt_prefix = "惊艳的 4k UHD,专业的工作室照明"
prompt_suffix = "清晰聚焦,详细特征,高端时尚,清晰细节,专业摄影,获奖肖像,使用 Phase One 拍摄,完美构图,杂志质量"

negative_prompt = """模糊,低质量,扭曲,变形,丑陋, 
                    解剖结构差,比例失调,业余,过饱和, 
                    过曝,欠曝,颗粒感,噪音,失焦, 
                    重复,变异"""

# 生成参数
guidance_scale = 7.5
num_inference_steps = 4
seed = 42  # 使用 -1 作为随机种子

1. 准备你的个人照片数据集 2. 在 Colab 中打开训练笔记本 3. 按照设置说明进行操作 4. 运行训练过程 5. 使用带有 Gradio 界面的测试笔记本生成图像

致谢

非常感谢 Hugging Face diffusers 团队出色的 DreamBooth 实现和文档。本项目在他们的基础上扩展,旨在使这项技术对所有人更具可访问性。

结论

这个项目展示了如何将强大的 AI 图像生成工具变得更具可访问性。不论你是开发者、艺术家,还是出于好奇想了解 AI,这些笔记本提供了一种简单明了的方式来尝试自定义模型训练。

Flux.1 和 DreamBooth 的结合为个性化图像生成提供了令人兴奋的可能性,希望这些工具能帮助其他人更容易地探索这项技术。

推荐阅读:

FluxAI 中文

© 2025. All Rights Reserved