最新编辑日期: 23-03-10
写在前面
本文仅做技术归档,旨在将从安装依赖到最终生成lora的步骤进行说明记录.同时也涵盖了个人总结的经验积累.受限于本人的知识面与未来技术的发展,未免会有不准确与过时之处.
必要的准备
Python 3.10
必须是3.10.x, 最好不低于3.10.8
一些关于python操作的基础知识
所涉及的工具
本文中选取的工具来源于国人的整合包,故不会对具体的脚本编写做详细介绍.之前已经有现成工作链的读者可以移步 https://github.com/kohya-ss?tab=repositories
以下工具请根据其附带的安装说明正确安装,具体的安装步骤这里不再赘述
sd-script整合包
https://github.com/Akegarasu/lora-scripts
青龙训练脚本
https://www.bilibili.com/video/BV15j411F7nJ
tag编辑工具
https://github.com/starik222/BooruDatasetTagManager
抠图工具 anime-segmentation (作者的名字有敏感词…自行Google)
webui,这里选择了秋叶启动器
https://www.bilibili.com/video/BV1ne4y1V7QU
哈吉马路呦!
准备训练环境 (此过程请参照 lora-scripts 的readme操作)
clone训练整合包 git clone https://github.com/Akegarasu/lora-scripts
执行 install-cn.ps1
将下载好的青龙脚本放入根目录,之后我们只会使用到青龙的脚本
准备训练集
其实就是进游戏截图.最终的目的是获取15张左右(更多也可以,但会增加训练时长.根据硬件情况酌情选择)人物不同角度,不同光线环境的近身像.
Tips:
背景不建议离人物主体过近,尤其是光线条件不好的情况.会导致抠图效果差
如果gpose截图.
不要开模拟景深!!! 人物边缘的模糊会导致抠图效果急剧下降,甚至会直接扣掉一只手之类的.
如果不局限于一种表情/动作的话,建议不同表情/不同动作的图多来几张.不用担心图中只有一部分人物.ai会正确处理这种情况.
同上,全身像,半身像,特写,背面. 训练集尽可能覆盖全面会让训练效果更好.
直接截图还是gpose? 训练集的质量大于数量,所以尽可能保证图片的清晰度与可分辨性是最好的.我更加推荐gpose.但记得关掉景深等会导致人物与背景边界模糊的选项.
最终我们得到了如下的一些截图
ozjjP.png
接下来我们处理图片
首先将图片裁切成只有人物的部分(建议手动裁切,目前我还没有找到适合的裁切工具能够完整的裁切出人物主体).不需要顾忌长宽比.但最好能做到最小分辨率不小于512x512 (这也是为什么建议截图时选择近身像)
ozpcN.png
在 anime-segmentation 项目中新建两个文件夹 train 和 output 用于放置抠图的原图和结果
然后将图片放入 anime-segmentation/train 中.
执行python inference.py --net isnet_is --ckpt ./model/isnetis.ckpt --data ./train --out ./output --img-size 1024 --only-matted (如果启用了venv,需要在虚拟环境中执行)
切好的图片就会在 output 文件夹中了
ozTtF.md.png
可以看到有一张图的手被切掉了,这就是开了景深的后果 😞 这也导致了我最后模型的左手效果很差,因为训练集中没有提供足够的信息.
处理好的图就可以拖进webui进行打tag了,建议使用图示的配置,可以尽可能保留图片的内容不会被意外裁切
o6V2t.png
打完tag之后,就可以进行tag的编辑. 具体如何编辑tag请参照青龙的视频 https://www.bilibili.com/video/BV15j411F7nJ 其中的要点在于. 你需要将属于你的角色的tag删除 以我的角色举例,就是 白发 红色眼睛 粉色和服 等等.这样ai就可以将这些特征绑定到你的人身上,而不是绑定到大模型上.
待tag编辑完之后,就可以进入正式的训练阶段了.
我个人训练使用的底膜是 https://huggingface.co/Linaqruf/anything-v3.0/tree/main fp16版本.具体哪个底模效果更好我没有数据支撑.欢迎补充.
按照青龙的说法,我们先使用 DA 算法进行训练测试. 拿到最高学习率数据之后,将最高学习率除以三,text学习率选择unet学习率/8 的数据,选择 Lion 模型进行正式训练.
秋叶整合包中,默认没有安装DA 需要 pip install dadaptation才能运行
此处建议先完整看一遍青龙视频再回来看文章
如何获取学习率数据?
青龙脚本,只将优化器调整为 DAdaptation,其他参数不变(训练集位置等还是要调整的)
跑2个epoch,看到 epoch 2 结束了直接 ctrl + C终止.然后运行 tensorboard --logdir=logs 稍后他的命令行会输出一个url,打开url就可以看到刚刚训练的图表了.将图表下拉到 lr这一项,鼠标hover上去就可以看到对应的学习率数值.我们选取最高点.可以看到是 2.22e-4
2,22e-4 = 2.22 * 10^-4 = 0.000222
o6bpk.png
将其除以三取接近值可得 74e-6, 再除8可得 9e-6
o6rdv.png
这样就得到了我们需要的学习率,将优化器改回 Lion 就可以进行实际的训练了(记得将之前训练的产物删掉,不确定不删除会发生什么)
训练完成后,在output文件夹就可以训练好的模型了,一般来说直接选取最后一个即可.但也存在中间的效果会更好的情况,可以参考tensorboard 给出的loss数据来判断.
成果
o6gpF.md.png
o6x9H.png
原角色
o6eNE.png
可以看出模型还是存在一些问题的. 角没有了(这主要是tag处理的问题,况且ai对ff14这种不讲道理的穿模头处理效果真的不太好),衣服上的花偶尔会被ai当做场景贴上去(这是因为给的关键词太少了).但人物的基本特征保留的没有什么大问题.
一些额外的…
因为上文中切图意外将手切掉的问题,我后续又把带背景的图和不带背景的图混在一起训练了一次,但loss情况差了一倍(紫色为抠图数据)
o6GHX.md.png
这里面显然有数据集质量的问题,但如果不追求对特定场景重现的话.抠图或许是更好的选择?