【转载】飞桨dreambooth训练教程

前言

本文为转载,转载涉及的模型和项目为22年10月23日的版本,如有需要请自行寻找资源更新,转载时请注明原作者。

本文推荐的包括多个项目,教学为原始项目;现在推荐的是新推荐项目,请按照文档顺序操作即可。

本文仅涉及使用dreambooth+novelai进行训练的内容,其他功能请在项目中自行探索。

原文地址:

【腾讯文档】飞桨dreambooth训练教程

原始训练项目地址:

一个项目体验多种模型

新推荐项目:

想定制自己的文图生成模型吗?想画什么画什么

其他类似项目推荐:

【AI绘画】二次元小姐姐生成!专业版! 【有手就会系列】四步教你生成二次元小姐姐

准备篇

准备图片素材和项目拷贝。

图片素材

训练素材一般使用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 ** 开始训练 ** 下面的代码其实是一个运行文件 不能添加其他说明文字】一节。

将下方代码替换为以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
!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

输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#方法一
#默认生成图保存地址为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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#方法二
#生成图保存地址,默认为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 清理特定文件夹】下的清理相关代码