【转载】飞桨dreambooth训练教程
前言
本文为转载,转载涉及的模型和项目为【腾讯文档】22年10月23日的版本,如有需要请自行寻找资源更新,转载时请注明原作者。本文在AI作图方面已几乎没有参考价值。
喜欢自己玩生图的可以在B站搜一下秋叶的整合包来把玩。
本文仅涉及使用dreambooth+novelai进行训练的内容,其他功能请在项目中自行探索。
原文地址:
原始训练项目地址:
新推荐项目:
其他类似项目推荐:
注:现在画图相关AI发展太快了,目前dreambooth和博客中提过的Auto-DL都已经有些复杂,目前最简单的训练方法是在https://pixai.art/消耗2000积分进行训练(也可画图)。
训练好的模型可以在网站自行下载后,在国内的网页端画图平台海艺或者哩布或者吐司进行。
目前比较推荐吐司……原因自己去看……我不说了。
然后我自己开了个c站的主页(https://civitai.com/user/Kiriya_55)有兴趣可以看看。
准备篇
准备图片素材和项目拷贝。
图片素材
训练素材一般使用512*512尺寸和较低分辨率的图片,这里推荐网页工具:
https://photokit.com/batch/?from=appinn

批量上传需要处理的图片以后,设置好尺寸和scale mode(smart即可),会自动进行裁切和缩放步骤,无需操作
裁切以后效果大概这样:

少数不满意的自己上传以后单独调整即可。
项目拷贝
访问上面提到的地址:https://aistudio.baidu.com/aistudio/projectdetail/4813242

点击【运行一下】
过程中涉及登录百度账号,记得登录。
登录后复制项目:

复制后点击运行,会先填写一些必要信息,然后可以选择环境配置:

这里选择【V100 32GB】。
免费用户每天第一次运行可以拿8个机时,还是很耐用的。
显示环境启动成功以后即可进入项目。

解压设置篇
进入项目后的初始设置。
解压
点击最左侧的目录,转到【1.2. 二、代码开始第一步 运行下面的代码!】一节。

按照要求,点击下方代码框左侧的运行按钮。

运行完成后显示“加载完毕, 下次不用再运行这里了”即解压完成。
训练素材上传
点击最左侧的目录,转到【4.4 dreambooth训练模型】一节。
点击最左侧的文件,下滑并选中文件管理器中“train_dreambooth(1).py”文件,重命名为“train_dreambooth.py”

点击最左侧的文件,创建训练用图片文件夹,如本文使用的【browndust】:

进入文件夹browndust后,通过上图的上传功能批量上传前面处理好的512*512图片。
训练脚本修正
点击最左侧的目录,转到【4.5 开始训练 下面的代码其实是一个运行文件 不能添加其他说明文字】一节。
将下方代码替换为以下内容:
!python -u train_dreambooth.py \
--pretrained_model_name_or_path=./NovelAI_latest_ab21ba3c_paddle \
--instance_data_dir=./browndust \
--instance_prompt="browndust" \
--class_prompt="beautiful" \
--resolution=512 \
--train_batch_size=2 \
--gradient_accumulation_steps=1 \
--learning_rate=5e-6 \
--lr_scheduler="constant" \
--lr_warmup_steps=0 \
--max_train_steps=5000 \
--output_dir="./dreambooth-model_browndust"
需要修改的内容:
- 每行最后的“\”后不能有空格;
- 第二行为调用模型的文件夹,可查看文件管理器选择,这里默认为novelai;
- 第三行为训练素材文件夹,请参考之前的内容进行设定;
- 第四行为训练结果需要对应的关键词,请自行设定;
- 第五行为预设定训练关键词【不确定】;
- 第六行为训练图片分辨率,默认512(512*512),推荐不要改,容易爆显存。
- 第12行为总训练步数,推荐5000+步,5000步初次训练差不多1个小时。
- 第13行为训练模型导出文件夹,请自行设定。
运行篇
设置好上述内容后,点击代码块旁的运行按钮即可。显示下图的状态时即训练完成。

如果提示显存占用100%,则重启内核(下图)。

结果篇
下面按照我的5000步训练结果看看。
模型加载篇
下滑到训练代码块下方:

- 修改第5行 为“训练模型导出文件夹”(上面的第13行)
- 增加第6行
pipe = StableDiffusionPipeline.from_pretrained(model_path)
然后点击左侧的代码加载模型。
模型导图篇
关键词生成
先看单张出图:
先修改prompt部分(关键词),记得套上刚才用的模型关键词:

prompt = "browndust,master pieces,1 girl,black hair,smiling,red eyes,wind."
类似的加上negative prompt(回避关键词):
negative_prompt = "NSFW, lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worstquality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, extra arms, extra legs."
注:如果嫌写tag那行代码太长,可以在你想要分段的地方输入""并按回车分段。
填好以后大概是这个效果:

- 可在11行中修改height高、width宽、步数、cfg、seed等参数。
- 可在15行、16行修改导出图片的文件夹,需要先在文件管理器出新建同名的文件夹。
运行,重启项目或内核后可能出现红框中的三行黑字,不要急,正常现象。

成功生成图片:

另外在导出文件夹也会有包含关键词的txt文件:

看得出来效果还很一般……估计得加步数了。
多张出图方法类似,可复制前面的关键词,直接粘贴:

num_return_images = 5
代表出图量。
图生图
【这里照抄原文档的内容。】
随意选中一段代码,点击+Code
输入以下内容:
#dreambooth图生图
#每次重启内核或项目后都只需运行一次
from diffusers_paddle import StableDiffusionImg2ImgPipeline
from diffusers_paddle.testing_utils import load_image
from utils import ReadImage
import os, time
model_path = "./dreambooth-model_browndust"
pipe = StableDiffusionImg2ImgPipeline.from_pretrained(model_path) #记得训练相关模型
pipe_i2i = StableDiffusionImg2ImgPipeline(vae=pipe.vae,text_encoder=pipe.text_encoder,tokenizer=pipe.tokenizer,
unet=pipe.unet,scheduler=pipe.scheduler,safety_checker=pipe.safety_checker,feature_extractor=pipe.feature_extractor)
复制粘贴以上代码,每次重启内核或项目都要运行一次。
有两种生成方法,在下面任选其一,新建代码段,复制粘贴以上代码后修改代码段中对应的路径即可。
方法1
#方法一
#默认生成图保存地址为dreaming文件夹,可修改
def save_all(image, OUTDIR="./dreamimg/"):
PRECISION = "fp32"
argument = image.argument
os.makedirs(OUTDIR, exist_ok=True)
epoch_time = time.time()
PROMPT = argument["prompt"]
try:
HEIGHT = argument["height"]
WIDTH = argument["width"]
except:
HEIGHT = 512
WIDTH = 512
SEED = argument["seed"]
INFERENCE_STEPS = argument["num_inference_steps"]
GUIDANCE_SCALE = argument["guidance_scale"]
filename = f'{str(epoch_time)}_scale_{GUIDANCE_SCALE}_steps_{INFERENCE_STEPS}_seed_{SEED}.jpg'
filedir = f'{OUTDIR}/{filename}'
image.save(filedir)
with open(f'{OUTDIR}/{epoch_time}_prompt.txt', 'w') as file:
file.write(f'PROMPT: {PROMPT}\n\nINFERENCE_STEPS: {INFERENCE_STEPS}\nHeight: {HEIGHT}\nWidth: {WIDTH}\nSeed: {SEED}\n\nPrecision: {PRECISION}\nGUIDANCE_SCALE: {GUIDANCE_SCALE}')
# 下面的可以复制到一个新的cell单元里面。
prompt = "a style hidari,1girl,an extremely delicate and beautiful girl,grey hair,red eyes,detailed face,close up,black clothes,tight shirt,short hair,half-skirt,long sleeves,\
hooded coat,ankle boots,holster,wind,master pieces,\
extremely detailed CG."
#先加自定关键词,我的模型是a style hidari
negative_prompt = "NSFW, lowres,bad anatomy,bad hands, text, error, missing fingers,extra digit, \
fewer digits, cropped, worstquality, low quality, normal quality,jpegartifacts,signature, watermark, username,blurry,bad feet"
#相同seed加载与不加载反向tag测试,生成图不同,疑似有效。
num_return_images = 5#生成多少张图片
init_image = load_image("./sample.png")#参考图地址
for _ in range(num_return_images):
image = pipe(prompt,init_image=init_image,negative_prompt=negative_prompt,\
num_inference_steps=120, guidance_scale=12).images[0]#可自行添加seed
save_all(image)
display(image)
方法2
#方法二
#生成图保存地址,默认为dreaming
def save_all(image, OUTDIR="./dreamimg/"):
# PRECISION = "fp32"
argument = image.argument
os.makedirs(OUTDIR, exist_ok=True)
epoch_time = time.time()
PROMPT = argument["prompt"]
NEGATIVE_PROMPT = argument["negative_prompt"]
try:
HEIGHT = argument["height"]
WIDTH = argument["width"]
except:
HEIGHT = -1
WIDTH = -1
SEED = argument["seed"]
INFERENCE_STEPS = argument["num_inference_steps"]
GUIDANCE_SCALE = argument["guidance_scale"]
filename = f'{str(epoch_time)}_scale_{GUIDANCE_SCALE}_steps_{INFERENCE_STEPS}_seed_{SEED}.jpg'
filedir = f'{OUTDIR}/{filename}'
image.save(filedir)
with open(f'{OUTDIR}/{epoch_time}_prompt.txt', 'w') as file:
file.write(f'PROMPT: {PROMPT}\n\nNEGATIVE_PROMPT: {NEGATIVE_PROMPT}\n\nINFERENCE_STEPS: {INFERENCE_STEPS}\nHeight: {HEIGHT}\nWidth: {WIDTH}\nSeed: {SEED}\n\nGUIDANCE_SCALE: {GUIDANCE_SCALE}')
# 下面的可以复制到一个新的cell单元里面。
path = "绛改头像v002_512.png"#参考图地址
prompt = "a style hidari,1girl,grey hair,red eyes,detailed face,close up,black clothes,tight shirt,half-skirt,long sleeves,\
hooded coat,ankle boots,holster,light smile,sunset,\
extremely detailed CG."
#记得先加自定关键词,我的模型是a style hidari
negative_prompt = "NSFW, lowres,bad anatomy,bad hands, text, error, missing fingers,extra digit, \
fewer digits, cropped, worstquality, low quality, normal quality,jpegartifacts,signature, watermark, username,blurry,bad feet"
#反向tag疑似有效
num_return_images = 1#生成图数量
init_image = ReadImage(path, height=-1, width=-1)
for _ in range(num_return_images):
image = pipe_i2i(prompt,init_image=init_image,strength=0.5,negative_prompt=negative_prompt,\
num_inference_steps=100, guidance_scale=9,seed=3636144139).images[0]#参数设置和ui版图生图一样。删除seed即为随机值
save_all(image)
display(image)
方法2多个strength可以设置。
数据清理和备份
退出项目前最好清理生成的图片(以及自己上传的训练素材),并保存。
- 删除训练素材文件夹
- 执行【5 清理特定文件夹】下的清理相关代码