Plane Helper

详情

下载文件

模型描述

介绍 Plane Helper!这是一个多概念 LyCORIS(训练为 LoHa),适用于 v2.1。Plane Helper 在约 2300 张来自 71 种不同飞机的图像上进行了训练。我想与任何有兴趣了解如何在复杂概念上训练多概念 LoHa 的人分享我的训练过程。这绝非科学性研究,而是为了帮助那些可能正面临与我相同障碍的人们。

数据集:

我创建了一个数据表,其中包含本模型中的所有 71 种飞机类型及其对应的关键词标记,可在此查看:

https://docs.google.com/spreadsheets/d/1N7o4pc9mGyYSYIoeD4fU_WpO_2tL_JfKDETOJPVQw18/edit?usp=sharing

该项目始于发现 v2.1 在处理飞机图像时表现极差:机翼位置总是错误,或出现多余机翼,细节也非常不足,有时甚至只是一团尖锐几何形状。我决定对此做些改进。于是我先收集了大约 130 张外观酷炫的飞机图片,通过批处理标注工具进行图像描述生成。使用 Kohya 训练后,我发现无论怎么训练,问题依旧存在。我意识到问题在于我包含了太多不同对象,而没有区分它们,仅统称为“飞机”或“喷气机”,这混淆了 LoHa。因此,我决定明确每种飞机的类型,并将它们的名称注入到各自的描述中。

我对飞机了解不多,但我希望 v2.1 能生成出色的飞机图像。因此,将每张图片上传至 image.google.com 进行识别的过程虽然繁琐,却是必要的。最终,我确定了 71 种不同的飞机类型。我没有只挑选两种就草草结束,而是想深入了解这种 LoHa 类型模型的构成,于是继续扩充数据集,为每种飞机类型至少收集 30 张图像,并将它们全部训练进一个 LoHa 中。有些飞机类型我无法找到 30 张高质量图片,但我仍将其保留在数据集中,因为最终目标是训练一个通用飞机模型,保留这些少数类型或许有助于提升整体效果。到完成这一步时,我总共拥有约 2300 张图像,涵盖 71 种飞机类型,全部整齐归类于各自的文件夹中。接下来是描述生成阶段。

使用 Captionr 进行批处理标注后,我为每种飞机类型在谷歌上搜索并制作了一个 Excel 表格,记录飞机名称及其简要但详细的描述。然后,我逐个将文件夹导入 Dataset Tag Editor 插件,清理描述内容,并将 Excel 表中制作的关键词标记注入到每个描述中。我还为倾转旋翼飞机添加了两个调试标记:“CHV3CPlane” 和 “CHV3CTiltRotor”(因为它们的形状差异很大),并将其加入每个描述中。这些调试标记在生成独特飞机图像时也非常有效。我还启用了加权描述功能,使这些调试标记和飞机类型标识符都带有权重。例如,一个描述可能看起来像这样:

"(Hawker Hunter), transonic jet-powered fighter aircraft, Hawker Aircraft, Royal Air Force (RAF), Avon turbojet engine, swept wing, (CHV3CPlane), a plane is flying in the air, swiss, low level, man, viewed in profile from far away, switzerland, illustration, overhead"。

经过漫长而耐心的测试过程后,我终于得到了一个足够优质的训练数据集。

重复次数:

我最初将每个文件夹的重复次数设为 5,但由于不同飞机类型的图像数量不同,我进行了粗略平衡:图像数量较多的类型使用 5 次重复,图像较少的类型则使用 10 至 15 次重复。

训练方法:

我以一种非传统的方式进行该项目。由于数据集如此庞大,我自然遇到了过拟合问题。对于 LoHa,推荐的网络维度(dim)是 8,但我将其改为 32,以提供更多训练空间。我尝试了多个阶段,寻找最佳设置,以在过拟合前实现更多训练轮次。原始源模型为 v2-1_768-ema-pruned,但每次训练后,我会将上一轮训练的 LoHa 合并到 v2-1_768-ema-pruned 中,并将该合并模型作为下一轮训练的源模型。其理论依据是:模型能从上一轮训练中获得额外知识,从而获得一点先发优势。这一理论仍需更多测试,最好在较小数据集上进行。每次训练后,我还会将上一轮的源模型与新合并的源模型再次合并,作为下一轮的源模型。同时,我使用 Extract LyCORIS LoCON 从中提取一个 LoRA。本模型正是由四个不同训练轮次(均基于同一 71 种飞机数据集)的 LoHa 合并后提取而成。

训练参数:

我不会深入讨论训练参数的细节,而是直接分享本项目中我找到的最佳设置,并推荐以下三份更详尽的指南:

THE OTHER LoRA TRAINING RENTRY

https://rentry.org/59xed3

LoRA Training Guide

https://rentry.org/lora_train

RFKTR's in-depth guide to Training high quality models

https://civitai.com/articles/397

我的参数配置:

{
  "LoRA_type": "LyCORIS/LoHa",
  "adaptive_noise_scale": 0,
  "additional_parameters": "",
  "block_alphas": "",
  "block_dims": "",
  "block_lr_zero_threshold": "",
  "bucket_no_upscale": true,
  "bucket_reso_steps": 64,
  "cache_latents": true,
  "cache_latents_to_disk": false,
  "caption_dropout_every_n_epochs": 0.0,
  "caption_dropout_rate": 0,
  "caption_extension": ".txt",
  "clip_skip": "1",
  "color_aug": false,
  "conv_alpha": 1,
  "conv_alphas": "",
  "conv_dim": 4,
  "conv_dims": "",
  "decompose_both": false,
  "dim_from_weights": false,
  "down_lr_weight": "",
  "enable_bucket": true,
  "epoch": 20,
  "factor": -1,
  "flip_aug": true,
  "full_fp16": false,
  "gradient_accumulation_steps": 2.0,
  "gradient_checkpointing": true,
  "keep_tokens": "0",
  "learning_rate": 0.0001,
  "logging_dir": "",
  "lora_network_weights": "",
  "lr_scheduler": "cosine",
  "lr_scheduler_num_cycles": "",
  "lr_scheduler_power": "",
  "lr_warmup": "10",
  "max_data_loader_n_workers": "4",
  "max_resolution": "768,768",
  "max_timestep": 1000,
  "max_token_length": "150",
  "max_train_epochs": "",
  "mem_eff_attn": true,
  "mid_lr_weight": "",
  "min_snr_gamma": 5,
  "min_timestep": 0,
  "mixed_precision": "bf16",
  "model_list": "custom",
  "module_dropout": 0,
  "multires_noise_discount": 0,
  "multires_noise_iterations": 0,
  "network_alpha": 4,
  "network_dim": 32,
  "network_dropout": 0,
  "no_token_padding": false,
  "noise_offset": 0,
  "noise_offset_type": "Original",
  "num_cpu_threads_per_process": 4,
  "optimizer": "AdamW8bit",
  "optimizer_args":
  "output_dir": "",
  "output_name": "",
  "persistent_data_loader_workers": false,
  "pretrained_model_name_or_path": "",
  "prior_loss_weight": 1.0,
  "random_crop": false,
  "rank_dropout": 0,
  "reg_data_dir": "",
  "resume": "",
  "sample_every_n_epochs": 0,
  "sample_every_n_steps": 0,
  "sample_prompts": "",
  "sample_sampler": "euler_a",
  "save_every_n_epochs": 1,
  "save_every_n_steps": 0,
  "save_last_n_steps": 0,
  "save_last_n_steps_state": 0,
  "save_model_as": "safetensors",
  "save_precision": "bf16",
  "save_state": true,
  "scale_v_pred_loss_like_noise_pred": true,
  "scale_weight_norms": 0,
  "sdxl": false,
  "sdxl_cache_text_encoder_outputs": false,
  "sdxl_no_half_vae": false,
  "seed": "",
  "shuffle_caption": true,
  "stop_text_encoder_training": 0,
  "text_encoder_lr": 5e-05,
  "train_batch_size": 2,
  "train_data_dir": "",
  "train_on_input": false,
  "training_comment": "",
  "unet_lr": 8e-05,
  "unit": 1,
  "up_lr_weight": "",
  "use_cp": false,
  "use_wandb": false,
  "v2": true,
  "v_parameterization": true,
  "vae_batch_size": 0,
  "wandb_api_key": "",
  "weighted_captions": true,
  "xformers": true
}

此模型生成的图像

未找到图像。