我们以训练的舰r AIII 航战为例子
我们先去舰r百科,找到AIII的界面
然后点开立绘图片,右键下载原始文件
接着添加白色背景,
可以使用chatgpt编写的脚本或者photoshop加上白色背景,也可以直接用waifuc的脚本的清洗功能
裁剪原始文件为全身,脚部出框,七分身,上半身,肖像,以及某些较难还原的部位的特写
对于某些难以还原的部位,可以分出不同的文件夹单独额外训练,比如说头部的某些装饰
(对于repeat,有一个经验公式,大概是body文件夹(全身,脚部出框,七分身,上半身,肖像)10,全身强化(全身)20,上半身30(脚部出框,七分身),头部(上半身,肖像)40,对于一张图的种类的re,当为两种图时,头部权重变为45,三种图50,假如有两种图但两种图头部一致,上半身有区别比如裸体和着衣,可以让肖像(相同的脸部)保持为40(注意,是两张加起来40,不是两张repeat40,即20rex1+20rex1,而不是40x1+40x1,这样就符合之前的一组40,两组45三组50的情况因为同样的脸部调用的时候也调用的是同样的提示词,所以只需要训练1图re40,假如训2图40就会脸部过拟合),上半身(有不同的变化)为45)
接着就是打标,选择的是秋叶的lora script训练器兼打标器
先使用tagger1.4开0.3置信度打标,使用的打标模型是wd-eva02-large-tagger-V3
打完后使用BooruDatasetTagManager翻译标签并修改标签为danbooru形式,
将transparent background标签转化为white background,并对各个裁剪立绘检查和加上这些词full body,feet out of frame,cowboyshot,upper body,portrait
表明构图结构防止构图结构过拟合
然后加上触发词,因为对于模型来说,不认识的词就是画风以及未打标的物体的触发词,加上我们训练的角色图片通常比较少(2到3张图)所以我们通常来讲不需要标注出特定的角色和画师名,只需要对同一画风且同一角色的图片标注单一且一致的自创提示词即可
因此,对于这三个眼罩,原立绘,大破我们都标注aIII(style1)就好,因为这三类的画风一致,符合画风提示词,且人物一致,也符合人物提示词。同时aIII(style1)这个词本身不存在模型内部,不会受到模型原有概念污染,这样的提示词可以把它看成是画风人物合并提示词,当图片数量以及种类够多的时候,分角色和画风提示词才具有某种区分上的意义,否则没有必要特别区分二者
依照danbooru里面对于舰娘的打标方法,打上一些特殊的词汇描述
分别是rigging,flight deck,machinery,battle damage,(描写舰装) holding weapon,ship turret ,
rudder footwear ,armored boots(脚上的舰装)等等
并对于一些颜色类的衣服或者服饰做描述比如thighhighs要加上black thighhighs
然后是训练不过拟合的重点,使用waifuc或者其他脚本或者直接下载huggingface别人已经爬好的danbooru训练集,以1girl为提示词,随机爬取下载清洗去重后的至少5000图以上训练集,然后将训练集的打标文件里的1girl标注前置为提示词,作为正则化训练集,并对数据集进行过滤,去除相似类型的图片(因为相似类型的图片正则化训练效果比较弱,难以防止图片数量少带来的过拟合,不如直接收集其他的不相似图片来训练,但它不是没有防止过拟合的效果,只是效果非常弱(也就是说正则化训练集要求覆盖的提示词概念广,相似度低,这样可以保持模型原有提示词对应的概念不被小样本微调极具改变从而防止过拟合))至于黑白图片,我觉得只要质量不是太低(也就是分辨率低,画面模糊)都可以接受,不需要过滤(因为有danbooru自带的提示词吸纳黑白概念)
,然后因为训练的特征中有比较特殊的舰装和飞机,我们还要下载有关舰装和飞机的数据集,每个概念大约500图,并清洗,这是为了特殊概念不过拟合,同时可以更好地训练出特殊概念
,对于特殊概念的训练,推荐使用多重tag查找图片,比如爬取有'airplane aircraft'的图片来训练飞机或者爬取'machinery flight_deck'的图片来训练飞行甲板
因为danbooru的tag和我们训练的tag不一样,所以我们还需要对标注的格式进行更改,
用conda建立虚拟环境为waifuset,在这个网站 https://github.com/Eugeoter/waifuset/tree/v2 pip安装waifuset软件后,对这个app.py文件修改其扫描路径和读取标注,然后在虚拟环境里面使用python app.py,对正则化文件夹里的训练集进行标注优化
大致顺序为,先格式化为训练格式,然后一般去重和语义去重,然后保存更改
开启lora script,按照以下参数训练
pretrained_model_name_or_path = "D:/stablediffusion/lora-scripts/sd-models/noobaiXLNAIXL_epsilonPred11Version.safetensors"
resume = ""
vae = "D:/stablediffusion/lora-scripts/VAE/sdxl-vae-fp16-fix.safetensors"
train_data_dir = "D:/stablediffusion/lora-scripts/train/train/AIII战列舰/AIII战列舰/新建文件夹"
reg_data_dir = "D:/stablediffusion/lora-scripts/train/正则化训练集存放处"
prior_loss_weight = 1
resolution = "1024,1024"
enable_bucket = true
min_bucket_reso = 256
max_bucket_reso = 4096
bucket_reso_steps = 32
output_name = "aiii (style1) v4.4"
output_dir = "./output"
save_model_as = "safetensors"
save_precision = "bf16"
save_every_n_epochs = 1
save_state = true
max_train_epochs = 10
train_batch_size = 2
gradient_checkpointing = true
gradient_accumulation_steps = 8
network_train_unet_only = true
network_train_text_encoder_only = false
learning_rate = 0.0002
unet_lr = 0.0002
text_encoder_lr = 5e-5
lr_scheduler = "cosine"
lr_warmup_steps = 0
optimizer_type = "AdamW"
min_snr_gamma = 5
network_module = "lycoris.kohya"
network_dim = 100000
network_alpha = 1
sample_prompts = "D:\\stablediffusion\\lora-scripts\\config\\autosave\\20241213-041739-promopt.txt"
sample_sampler = "euler_a"
sample_every_n_epochs = 1
log_with = "tensorboard"
logging_dir = "./logs"
caption_extension = ".txt"
shuffle_caption = true
keep_tokens = 1
max_token_length = 255
multires_noise_iterations = 6
multires_noise_discount = 0.3
seed = 1337
mixed_precision = "bf16"
full_bf16 = true
xformers = true
lowram = false
cache_latents = true
cache_latents_to_disk = true
persistent_data_loader_workers = true
network_args = [ "conv_dim=8", "conv_alpha=1", "dropout=0", "algo=lokr", "factor=8", "train_norm=True", "preset=attn-mlp",]
optimizer_args = [ "weight_decay=0.1", "betas=0.9,0.99",]
训练,2h左右训练完成
训练完了拉xyz图测试,
测试完了发布,结束
(未完待续)