前言

本文为转载,转载涉及的模型和项目为22年10月23日的版本,如有需要请自行寻找资源更新,转载时请注明原作者。
本文推荐的包括多个项目,教学为原始项目;现在推荐的是新推荐项目,请按照文档顺序操作即可。

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

原文地址:

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

原始训练项目地址:

一个项目体验多种模型

新推荐项目:

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

其他类似项目推荐:

【AI绘画】二次元小姐姐生成!专业版!

【有手就会系列】四步教你生成二次元小姐姐

注:现在画图相关AI发展太快了,目前dreambooth和博客中提过的Auto-DL都已经有些复杂,目前最简单的训练方法是在https://pixai.art/消耗2000积分进行训练(也可画图)。

训练好的模型可以在网站自行下载后,在国内的网页端画图平台海艺或者哩布或者吐司进行。

目前比较推荐吐司……原因自己去看……我不说了。

然后我自己开了个c站的主页(https://civitai.com/user/Kiriya_55)有兴趣可以看看。

准备篇

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

图片素材

训练素材一般使用512*512尺寸和较低分辨率的图片,这里推荐网页工具:

https://photokit.com/batch/?from=appinn

【转载】飞桨dreambooth训练教程

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

裁切以后效果大概这样:

【转载】飞桨dreambooth训练教程

少数不满意的自己上传以后单独调整即可。

项目拷贝

访问上面提到的地址:https://aistudio.baidu.com/aistudio/projectdetail/4813242

【转载】飞桨dreambooth训练教程

点击【运行一下】

过程中涉及登录百度账号,记得登录。

登录后复制项目:

【转载】飞桨dreambooth训练教程

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

【转载】飞桨dreambooth训练教程

这里选择【V100 32GB】。

免费用户每天第一次运行可以拿8个机时,还是很耐用的。

显示环境启动成功以后即可进入项目。

【转载】飞桨dreambooth训练教程

解压设置篇

进入项目后的初始设置。

解压

点击最左侧的目录,转到【1.2. 二、代码开始第一步 运行下面的代码!】一节。

【转载】飞桨dreambooth训练教程

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

【转载】飞桨dreambooth训练教程

运行完成后显示“加载完毕, 下次不用再运行这里了”即解压完成。

训练素材上传

点击最左侧的目录,转到【4.4 dreambooth训练模型】一节。

点击最左侧的文件,下滑并选中文件管理器中“train_dreambooth(1).py”文件,重命名为“train_dreambooth.py

【转载】飞桨dreambooth训练教程

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

【转载】飞桨dreambooth训练教程

进入文件夹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行为训练模型导出文件夹,请自行设定。

运行篇

设置好上述内容后,点击代码块旁的运行按钮即可。显示下图的状态时即训练完成。

【转载】飞桨dreambooth训练教程

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

【转载】飞桨dreambooth训练教程

结果篇

下面按照我的5000步训练结果看看。

模型加载篇

下滑到训练代码块下方:

【转载】飞桨dreambooth训练教程

  • 修改第5行 为“训练模型导出文件夹”(上面的第13行)
  • 增加第6行
pipe = StableDiffusionPipeline.from_pretrained(model_path)

然后点击左侧的代码加载模型。

模型导图篇

关键词生成

先看单张出图:

先修改prompt部分(关键词),记得套上刚才用的模型关键词:

【转载】飞桨dreambooth训练教程

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那行代码太长,可以在你想要分段的地方输入""并按回车分段。

填好以后大概是这个效果:

【转载】飞桨dreambooth训练教程

  • 可在11行中修改height高、width宽、步数、cfg、seed等参数。
  • 可在15行、16行修改导出图片的文件夹,需要先在文件管理器出新建同名的文件夹。

运行,重启项目或内核后可能出现红框中的三行黑字,不要急,正常现象。

【转载】飞桨dreambooth训练教程

成功生成图片:

【转载】飞桨dreambooth训练教程

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

【转载】飞桨dreambooth训练教程

看得出来效果还很一般……估计得加步数了。

多张出图方法类似,可复制前面的关键词,直接粘贴:

【转载】飞桨dreambooth训练教程

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 清理特定文件夹】下的清理相关代码
文章目录