AI绘图!Lora训练简明教程

发布时间 2023-04-23 18:00:49作者: no_sense

如果想要快速训练,使用B站up主秋叶的整合包搭配视频【AI绘画】最佳人物模型训练!保姆式LoRA模型训练教程 一键包发布_哔哩哔哩_bilibili即可.

训练的基本逻辑就是首先进行预处理,可以通过stable diffusion web ui中的预处理,也可以通过ps这种图片处理软件,比如我想训练一个某动漫角色的Lora模型,那就需要这个角色的一些图.

当然有了图之后,也需要标注,也就是label标签,可以选择deepbooru或者BLIP生成标注数据.

然后进行配置训练参数,如果用的有GUI的直接读入配置json文件即可.下面是一套低显存配置.

{
  "pretrained_model_name_or_path": "runwayml/stable-diffusion-v1-5",
  "v2": false,
  "v_parameterization": false,
  "logging_dir": "C:/Users/ohmni/AI/SAMPLE IMAGES/ADAMS/LORA OUTPUT/log",
  "train_data_dir": "C:/Users/ohmni/AI/SAMPLE IMAGES/ADAMS/LORA OUTPUT/img",
  "reg_data_dir": "",
  "output_dir": "C:/Users/ohmni/AI/SAMPLE IMAGES/ADAMS/LORA OUTPUT/model",
  "max_resolution": "512,512",
  "learning_rate": "0.0001",
  "lr_scheduler": "constant",
  "lr_warmup": "0",
  "train_batch_size": 1,
  "epoch": "1",
  "save_every_n_epochs": "1",
  "mixed_precision": "fp16",
  "save_precision": "fp16",
  "seed": "1234",
  "num_cpu_threads_per_process": 2,
  "cache_latents": true,
  "caption_extension": ".txt",
  "enable_bucket": false,
  "gradient_checkpointing": true,
  "full_fp16": false,
  "no_token_padding": false,
  "stop_text_encoder_training": 0,
  "use_8bit_adam": true,
  "xformers": true,
  "save_model_as": "safetensors",
  "shuffle_caption": false,
  "save_state": false,
  "resume": "",
  "prior_loss_weight": 1.0,
  "text_encoder_lr": "5e-5",
  "unet_lr": "0.0001",
  "network_dim": 128,
  "lora_network_weights": "",
  "color_aug": false,
  "flip_aug": false,
  "clip_skip": 2,
  "gradient_accumulation_steps": 1.0,
  "mem_eff_attn": true,
  "output_name": "Addams",
  "model_list": "runwayml/stable-diffusion-v1-5",
  "max_token_length": "75",
  "max_train_epochs": "",
  "max_data_loader_n_workers": "1",
  "network_alpha": 128,
  "training_comment": "",
  "keep_tokens": "0",
  "lr_scheduler_num_cycles": "",
  "lr_scheduler_power": ""
}

实际配置的时候,可以多在C站看看好的Lora模型然后拉到stable-diffusion中看看别人的训练信息.

然后存训练的图片也有讲究,文件夹命名有格式要求,这里后面细说.

流程梳理

主要使用derrian-distro/LoRA_Easy_Training_Scripts: A set of two training scripts written in python for use in Kohya's SD-Scripts repository. (github.com)这个仓库学习.

下载安装即可,Windows平台下载installer.py文件,作者推荐使用3.10.6,当然3.10版本应该都能跑.

image-20230419215740689

脚本会询问是否安装一些可选项,我基本没有装特别的.

image-20230419215705031

数据集准备

安装完成后开始准备数据集,推荐两个图片搜集软件,这样不用自己到处爬取了.一个是Grabber和Hydrus.我用了一下,Grabber是不错的,下载链接在参考资料里.

此外还可以使用Release first release · derrian-distro/Quick_Image_Sort (github.com)来进行图片整理排序.

图片裁剪和修改

图片的分辨率影响模型的生成,同时也要注意你机器的配置,比如512x512是一般8G以上的图片大小,最好将获取的图片裁剪或调整到相同的分辨率同时可以进行重命名.这写步骤可以在一些在线图片编辑网站BIRME - Bulk Image Resizing Made Easy 2.0 (Online & Free)操作,web ui中也有相关选项用于图片裁剪.同时注意图片中背景处理,可以使用Cleanup.pictures - Remove objects, people, text and defects from any picture for free清除图片中的一些东西.

数据集打标签与编辑标签

如果使用Grabber下载图片,可以直接设置下载图片的同时得到标签文件.设置如下

image-20230421194316595 image-20230421194257509

也可以参考链接https://i.imgur.com/XHvfAkj.png

如果要获取自己的图像文件标签并编辑,可以使用很多软件,比如stable diffusion web ui的插件,比如stable-diffusion-webui-wd14-taggerstable-diffusion-webui-dataset-tag-editor.

或者使用软件https://github.com/starik222/BooruDatasetTagManager编辑标签.值得一提的是这里的"标签"一般叫caption或者tag.

image-20230421201313975

除了stable-diffusion web ui中有打标签的,本身kohya_ss的GUI也有打标功能

image-20230422113936860

本质上是使用一些已有的模型得到图片的信息。

有了生成的标签后需要自己对标签进行一些处理,这里的处理是为了后面训练lora达到效果,一般叫pruning captions.

Pruning Captions

一般的准则:

  1. 如果你要训练一个画家作品的Lora,那给这些作品打标签时需要去掉关于这个作家的标签,如果是一个人物Lora,那需要去除人物的名字相关tag以及一些决定性的特征.这样这种风格或人物就存在与其他标签上.
  2. 剔除任何应该隐含在所有生成结果中的标签或任何会偏离训练数据的标签

比如关于一个人物的Lora模型,那么这个人物名字就没必要作为prompt了,所以就要去掉这个tag.

编辑标签可以用上述说的stable diffusion中的dataset-editor或者软件BooruDatasetTagManager.

设置图片文件夹

Directory Example

其中的txt文件就是caption文件,而其中的5_ConceptA是概念文件夹,5表示其中的图片每张训练5次.

Concept 概念文件夹遵循这种格式:<编号>_<名称>

<编号>决定了你的训练脚本将在该文件夹上进行的重复次数。只要你有匹配的txt标题文件,<名称>就纯粹是装饰性的。

caption文件是强制性的,否则LoRAs将使用概念名称作为标题进行训练。

需要一个根目录,根目录下面是多个concept文件夹.同时可以在这个根目录同级创建一个reg文件夹用于正则化防止过拟合.

image-20230421212314625

比如这里 train_girls里面是训练数据,下面放置多个概念文件夹,reg_girls里放图片.

实战

实战训练一个人物Lora,这里就懒得在网上一个一个找角色的图了,使用Grabber搜索角色名,比如星野爱,hoshino_ai.注意设置所有来源

image-20230422122414943

在 "来源 "下勾选你希望搜索的任何一个Booru(s)。
(注意:不是所有的Boorus都能立即工作,Danbooru需要配置)
在 "目的地 "下选择你希望保存图像的文件夹(!确保这与日志是同一个文件夹!)。
要下载,只需右击任何图像缩略图并点击保存即可
如果你想批量下载,你可以在底部选择 "获取本页 "或 "获取全部 "来组成一个下载队列。
你也可以使用ctrl + click,然后使用get selected。
然后导航到上面的 "下载 "选项卡,开始下载
你下载的所有图片都会有一个包含标签的同名文本文件

注意可能图片样式会有很多,包括nsfw的,等会在训练的时候可以设置多个概念文件夹.

同时设置下载图片时增加tag文件,按下图设置即可.Filename要跟下载图片的路径一样.

imgbird image-20230422123208032

Grabber这个软件还是不错的,此外还有另一个软件之前推荐过Hydrus,不过设置相对麻烦,这里就不使用了.

最后下载内容如下

image-20230422125727350

你可以将人物不同风格和样式的图片放到不同文件夹.

然后注意,我们需要一个所谓的触发词,也就是使用你这个Lora模型的词汇,这里可以使用hoshino_ai这个tag,所以我们需要添加这个触发词,操作如下

image-20230422131005321

然后使用Dataset Tag Editor插件编辑tag

image-20230422125853433

将包含图片和tag文件的目录加载到插件中,这里我删除了一些频率高同时没什么含义的标签比如有个++的标签.具体操作可以看看仓库写的很详细toshiaki1729/stable-diffusion-webui-dataset-tag-editor: Extension to edit dataset captions for SD web UI by AUTOMATIC1111 (github.com)

最终tag如下,注意这是其中一个概念文件夹的图片

image-20230422130925796

最后不要忘了保存

image-20230422131618882

对于其他concept文件夹操作类似.

最后开始训练,如果使用GUi,那么需要调的值比较多,可以加载别人的配置https://pastebin.com/dl/ZgbbrE7f,自己需要改的就是底模路径,导出模型和数据路径.

也可以使用B站up主秋葉aaaki写的脚本,本质类似,不过对于新手不用跳太多参数了.

image-20230422183430349

后面发现我的笔记本竟然显存只有4G,所以后面把图片进行了统一裁剪并减少了数量,大概三十张图片,concept在3~6之间并且只训练Unet,最后终于不提示显存溢出了.

只训练了10个epoch每两个epoch生成一个模型,最终结果如下.走完了一套流程,虽然显存只有4G,最终效果可能也一般,但还是希望能帮到一些人.

image-20230423111800865

最后测试了一下训练结果,可以说是莫名其妙,惨不忍睹.根本看不出训练集是星野爱的.

不过也算是走完了训练流程吧,毕竟显卡能力有限.

xyz_grid-0000-212138179

xyz_grid-0001-3228716209

xyz_grid-0002-3260766832

后续会写一些参数解析,欢迎关注.

参考资料

  1. LoRA Training Guide (rentry.co)

  2. 《BLIP》-用更干净更多样的数据进行多模态预训练,性能超越CLIP!代码已开源! - 知乎 (zhihu.com)

  3. Bionus/imgbrd-grabber: Very customizable imageboard/booru downloader with powerful filenaming features. (github.com)

  4. [AI绘画]《LORA模型训练超入门级教程》--人人都可以当炼金术士 - 知乎 (zhihu.com)

  5. 开源图像模型Stable Diffusion入门手册 - 腾讯云开发者社区-腾讯云 (tencent.com)

  6. Lora人物训练(多concept)导论 - 哔哩哔哩 (bilibili.com)