前言
本文为转载,转载涉及的模型和项目为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
|
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
|
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}')
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."
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"
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] 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
|
def save_all(image, OUTDIR="./dreamimg/"):
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}')
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."
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"
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] save_all(image) display(image)
|
方法2多个strength可以设置。
数据清理和备份
退出项目前最好清理生成的图片(以及自己上传的训练素材),并保存。
- 删除训练素材文件夹
- 执行【5 清理特定文件夹】下的清理相关代码