我在自己脸上训练了FLUX.1(你也可以这样做哦)
2 个月前
我在我的脸上训练了 FLUX.1 (你也可以这样做)
使用 Python 和 Replicate 的简易微调指南
虽然大型语言模型 (LLMs) 最近备受关注,但图像生成模型同样快速发展。目前的尖端技术是 FLUX.1,这是来自黑森林实验室 (Stable Diffusion 团队的一个分支) 的图像模型。在本文中,我分享了我用来微调这个模型的完整过程,以便生成我自己的无限高质量照片。
微调模型输出 (采用了丰厚的头发和体态调整)。
FLUX.1 是一个可以处理文本和图像的模型。更具体地说,它 接受文本和图像输入并生成图像输出。这使得您可以仅通过文本提示生成图像,或者使用文本编辑图像!
该模型有三个版本:Pro、Dev 和 Schnell (德语中的“快”)。Pro 是表现最佳的模型,而 Schnell 是最快和最便宜的。
虽然这些模型可以做惊人的事情,但它们 无法生成特定人物的照片 (除非这些人是知名公共人物)。这就是微调能为我们提供帮助的地方。
微调 FLUX.1
微调 是指通过 额外训练使模型适应特定用例。这很有价值,因为它通常能产生比更大(更昂贵)的模型更好的效果。
油管高效微调
虽然微调比从头开始训练模型要简单和便宜得多,但在处理像 FLUX.1 这样具有 120 亿参数的模型时,仍然是一项重大任务。作为参考,120 亿参数的模型在 FP32 表示下,将需要 48GB 的内存进行推理 和 超过 200GB 用于完整微调!
由于这需要专用的 GPU 集群,让我们采取更聪明的方法。换句话说,我们可以使用一种称为 LoRA(低秩适应) 的技术,它 在保持基础参数不变的情况下,向模型添加相对少量新的可训练参数,而不是重新训练所有模型参数。
关于 LoRA 的更多背景知识,请查看这个链接。
示例:使用 Python 和 Replicate 微调 FLUX.1
在了解了背景之后,让我们通过 Python 代码来逐步演示这个过程。这基本上遵循了 Replicate 的博客上的指南[1]。另外,感谢 Jarret Burkett,他通过在 Replicate 上发布 训练端点 简化了这个过程[2]。
油管中可以免费获得。需求:
- Python 3.8+
- 一个 Replicate API 密钥
- 10–20 张高质量的个人照片 (至少 1024 x 1024)
导入
首先,我们需要导入几个 Python 包。关键的是 replicate,我们将使用它来生成图像描述,微调 FLUX,以及使用微调后的模型。
from PIL import Image
import os
import shutil
import replicate
from dotenv import load_dotenv
接下来,我从一个秘密的 .env 文件中导入我的 replicate API 密钥。或者,您可以将此变量添加到全局环境中(或硬编码它)。
# load vars from .env
load_dotenv()
# set replicate api key
replicate = replicate.Client(api_token=os.getenv("REPLICATE_API_KEY"))
筛选训练图像
在我的训练运行过程中,我将 20 张我在各种场景下的图片放在名为 raw/ 的文件夹中。以下是其中一些图像。
用于训练的原始照片。图片来自作者。
请注意,这些图片的大小和分辨率各不相同。在用这些图片训练 FLUX 之前,我们需要进行一些关键的预处理步骤。具体来说,我们需要使每张图片变为正方形、将尺寸减少到 1024 x 1024 (它们的质量都比这更高),并以 .png (或 .jpeg) 格式保存。
# Set input and output directories
input_dir = "raw/" # 将其更改为您的文件夹
output_dir = "data/"
# Ensure output directory exists
os.makedirs(output_dir, exist_ok=True)
# image counter
i = 0
# Process each image
for filename in os.listdir(input_dir):
# Check for PNG and JPEG
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
img_path = os.path.join(input_dir, filename)
img = Image.open(img_path)
# Get original dimensions
width, height = img.size
new_size = min(width, height) # Smallest dimension for square crop
# Calculate cropping box (centered)
left = (width - new_size) // 2
top = (height - new_size) // 2
right = left + new_size
bottom = top + new_size
# Crop the image
img_cropped = img.crop((left, top, right, bottom))
# Resize to 1024x1024 using high-quality resampling
img_resized = img_cropped.resize((1024, 1024), Image.LANCZOS)
# Crop and save the image
output_path = os.path.join(output_dir, f"img-{i}.png")
img_resized.save(output_path, format="PNG")
i += 1
下面是处理后这些图像的样子。
用于训练的图片 (处理后)。图片来自作者。
生成描述
现在我们已经准备好训练的图像,接下来需要做的是为它们撰写描述。
这一步的一个关键点是要在每个描述中包含一个 “触发标记”。这个是 模型可以学习和我的面部关联的唯一字符序列。在这里,我使用的触发标记是 shw-tlb。
一个示例描述可以是这样的:
一张 shw-tlb 的照片。一个光头并留有胡须的男人穿着黑色衬衫,坐在白色砖墙旁。
虽然我可以手动生成这些描述,但我使用了一个多模态 LLM (llava-13b) 通过 replicate 的 API 为我撰写这些描述。
for filename in os.listdir(output_dir):
if filename.lower().endswith('.png'):
img_path = os.path.join(output_dir, filename)
image = open(img_path, "rb")
# generate caption
output = replicate.run(
"yorickvp/llava-13b:a0fdc44e4f2e1f20f2bb4e27846899953ac8e66c5886c5878fa1d6b73ce009e5",
input={
"image": image,
"prompt": "请为这张图片写描述。"
}
)
# extract text from output
response = " ".join(list(output))
# add trigger token "shw-tlb"
caption = f"一张 shw-tlb 的照片。{response}"
# save caption as text file
caption_filename = img_path.split('.')[0] + '.txt'
with open(caption_filename, "w") as file:
print(caption)
file.write(caption)
到最后,我们有一个名为 data/ 的文件夹,其中包含 20 张预处理过的我的图片和对应的描述。
作为一个文件步骤,我们可以将这个文件夹压缩成一个 .zip 文件。
# inputs: name of .zip file, compression format, directory to compress
shutil.make_archive("data", 'zip', "data/")
微调模型
接下来,我们可以微调我们的模型。这实际上是过程中的最简单部分。我们甚至不需要写代码,因为有一个 web 界面 可以完成我即将编程进行的所有工作 (如果您这么做,可以跳到下一部分)。
不过,通过 Python 的过程仍然很简单。首先,我们需要在 Replicate 上 创建一个新模型。
model = replicate.models.create(
owner="shawhint",
name="flux-shaw-ft",
visibility="public", # 或者选择 "private" 如果你更喜欢
hardware="gpu-t4", # Replicate 会为微调模型覆盖此设置
description="FLUX.1 基于我的照片微调(Shaw)"
)
print(f"模型创建成功: {model.name}")
print(f"模型 URL: https://replicate.com/{model.owner}/{model.name}")
然后,我们可以将数据上传到训练端点并 微调模型。
# Now use this model as the destination for your training
training = replicate.trainings.create(
version="ostris/flux-dev-lora-trainer:4ffd32160efd92e956d39c5338a9b8fbafca58e03f791f6d8011f3e20e8ea6fa",
input={
"input_images": open("data.zip", "rb"),
"steps": 1000,
},
destination=f"{model.owner}/{model.name}"
)
print(f"训练开始: {training.status}")
print(f"训练 URL: https://replicate.com/p/{training.id}")
训练 运行了 12 分钟,花费了我 1.12 美元。
使用模型
一旦训练完成,我们的模型将在 Replicate 上公开可用 (如果您在上述代码中将 visibility 设置为“私有”,则为私有)。默认会创建一个 Playground 界面,使我们能够通过 web 界面使用该模型。
以下是我的一些杰作…
微调模型输出 (采用了丰厚的头发和体态调整)。
另外,我们可以以编程方式访问微调后的模型。如果您正在构建自定义软件解决方案或 UI,这样更方便。
output = replicate.run(
"shawhint/flux-shaw-ft:8b55b2745adc5e7f13fdee9931b2fe622fc7f12a4780e5c48d42991c19699a72",
input={
"prompt": "shw-tlb 的肖像照片,穿着深色西装的男人",
"num_inference_steps": 28,
"guidance_scale": 7.5,
"model": "dev",
"num_outputs": 4,
}
)
for url in output:
print(url)
# >> https://replicate.delivery/xezq/tr94REeVCpQtMKi2KElmyVaQBwzeTdmVhkJUVLgszjKT7EMUA/out-0.webp
# >> https://replicate.delivery/xezq/GFWxS22aHXKjBRc0eAOEfI1rueKDJqzdYM9JeajnLDKMtTwQB/out-1.webp
# >> https://replicate.delivery/xezq/WFmEIVUCO56WNxdEfr99tdln4OezSJe7fCRWcGDzLWtPtTwQB/out-2.webp
# >> https://replicate.delivery/xezq/k7f3OimVsb3iaav8jaypjxQ7cBnfvrTLZOMErUGLZilT7EMUA/out-3.webp
接下来是什么?
油管尽管 Replicate 使这个过程变得非常简单,但它有一定的经济成本,并且需要通过他们的平台进行推理。因此,在未来的文章中,我想回顾一下如何在本地完成整个过程。
如果您有任何问题,请在评论中告诉我 :)
🗞️ 获取独家 AI 资源和项目创意 : https://the-data-entrepreneurs.kit.com/shaw
🧑🎓 在 6 周内通过构建来学习 AI : https://maven.com/shaw-talebi/ai-builders-bootcamp
参考文献
[1] https://replicate.com/blog/fine-tune-flux
[2] https://replicate.com/ostris/flux-dev-lora-trainer/train
推荐阅读:
FluxAI 中文
© 2025. All Rights Reserved