4.Stable Diffusion WebUI 模型训练

        本文看了知乎训练Embedding - Stable Diffusion WebUI使用手冊 - Stable Diffusion文档中心的文章,这篇文章写的很详细,可能是我的SDW版本升级了,有的地方和这篇文章的不同,所以内容有部分的改动,但最后还是可以正常训练了,这里作为笔记用。

        如果要更全面了解Stable Diffusion WebUI 的使用,建议大家看上面那篇知乎的文章,文章写的很全,包括文生图、图生图的细节及模型训练、模型合并的细节,都讲的很详细。

1.为什么要训练模型?

        为什么要训练自己的模型?训练自己的模型可以在现有模型的基础上,让AI懂得如何更精确生成/生成特定的风格、概念、角色、姿势、对象。

        举例来说,如果喂给AI十几张我精挑细选的「Hara老师绘制的、不同角度、FGO的斯卡萨哈」做训练,那么就能让AI更懂得如何生成斯卡萨哈的脸部,风格也会比较固定。

        以下是一个具体例子,通过使用自行训练的HyperNetwork,便改善单靠Anything模型无法生成出Hara老师画风的缺点。在不使用HyperNetwork的情况下,风格永远是左边那样;一使用HyperNetwork,右边的风格就能轻松生成出来了。

        训练模型是复杂的议题,基于哪个现有模型,以及喂给AI学习的图片品质,还有训练时的参数,都会影响模型训练结果。

        本文提及的Embedding、HyperNetwork、LoRA都是「小模型」,这是相对于网络动辄好几GB的checkpoint「大模型」而言。这些小模型训练时间短,文件约几MB而已,训练成本不高。主要是用于生成特定人物/对象/画风,并且训练的模型可以多个混用。

        如果硬件条件许可的话,搜集大量图片训练特定领域的checkpoint大模型,再上传到HuggingFace造福他人也是不错的选项,只不过此任务过于庞大。要知道Stable Diffusion 1.5版的模型可是输入了23亿张图片训练出来的!网络上其他人训练的模型至少也准备了几万张图片。因此要生成特定的人物/对象/画风,训练小模型对一般人来说比较划算。

        各个模型的原理差异请参考下图。技术原理以及训练参数设置请参阅「参考数据」一章,碍于篇幅无法一一细讲,本章以操作过程为主。

        就训练时间与实用度而言,目前应是 LoRA > HyperNetwork > Embedding

        本章节以AUTOMATIC1111开发的Stable Diffusion WebUI为中心撰写,因其图形化且好操作。后面简称SD WebUI。

        接着选择部署在本机或是云端?

        训练模型至少需要10GB的VRAM,也就是RTX3060等级以上的GPU。

        如果你有Nvidia RTX3060以上等级的GPU,那就参考安装教学部署在本机,想训练多久就训练多久。训练数据不到50张图片的小模型训练时间约只要1~3个小时。

        如果没有强力的GPU,那就用云端训练,例如Google Colab

2.准备训练数据

2.1 取得高品质图片

训练用的图片最少最少要准备10张。重质不重量。因为我要训练的是单一人物且风格固定,图片不宜有复杂背景以及其他无关人物。

网络图片一张一张右键下载当然可以,不过要大量下载图片的话我会使用Imgrd GrabberHydrus Network

这里我是在视觉中国视觉中国图片-视觉中国素材-视觉中国图片下载-视觉中国VCG.COM搜索FGO的斯卡萨哈,然后挑取合适的图片一张一张手动下载的图片,下载的图片如下:

2.2 裁剪图片

        下载图片后,要将训练图片裁切成512x512像素。你可以选择用SD WebUI自动裁切,或是手动裁切。

2.2.1 自动裁剪图片

裁切图片不会用到显卡计算。

  1. 将要裁切的图片放到同一个目录下,例如/home/user/桌面/input
  2. 打开SD WebUI,进到Train → Preprocess images页面

  1. 第一个字段Source directory填写原始图片的路径
  2. 第二个字段Destination directory填写输出路径,例如/home/user/桌面/cropped
  3. Width和Height设置为512x512
  4. 点击Preprocess ,图片即会自动裁切。在那之后原始图片就可以删除,只留下裁切后的图片。

2.2.2 手动裁剪图片

手动把图片转成512x512理由是避免重要的部分被裁掉。

  1. 1安装修图软件GIMP,点击文件→添加512x512像素的项目

  1. 2点油漆桶将其漆成白色

  1. 3将图片拖曳进画面,成为新的图层

  1. 4点击工具→变形工具→缩放,缩放图片使其符合目前画布大小,再按Enter。

  1. 5点击文件→Export,导出成png。

  1. 6为加快后面图片的处理速度,按右下角删除目前图层,再拖新的图片进来,重复操作。

  1. 7将33张Hara绘制的斯卡萨哈裁切后,统一放到名为raw的目录。

2.3 预先给图片上提示词

 1.进入 Extras页面

2.再进入Batch from Directory页面

在该页面的input directory下面输入自己裁剪好的图片路径文件夹路径,在out direcyory下面输入自己要输出图片的文件夹路径,然后勾选create flipped copies 和 Caption,再点击Generate。之后在输出图片的文件夹会有如下文件:

        里面的txt文件对应每张图片的标签,可以进入txt文件把一些不需要的标签删去。在这里,训练前的数据准备就结束了。

3.训练embedding

3.1 embedding 训练

接着要给图片预先上提示词,这样AI才知道要学习哪些提示词。由于我的版本和知乎文章的版本不同,这里与知乎文章的有一些不同,大家可以根据自己的版本自行看着完成这个步骤。

1.启动SD WebUI,进入Train页面。

2.进入Train页面的Create embedding页面

        在该页面的name下面写入heraembedding,并将Number of vectors per token改为7,然后按Create embedding.

完成以上步骤后,进入Train页面,如下图所示

        在该页面的embedding下面输入heraembedding,在Dataset directory下面输入刚才的那个有txt文件和图片的文件夹路径,然后点击最下面的Train Embedding即可训练。

  1. SD WebUI应会显示剩余时间,通常是一小时起跳,每500步会在右边显示训练该步数的成果。
  2. 你也可以到SD WenUI根目录下的texual_inversions查看训练成果。里面image_embeddings目录会存放第几步所训练的成果。

  1. 待训练完成后,至SD WenUI根目录下的texual_inversions/embeddings,对照image_embeddings目录的图片挑选合适的成品。

  1. 例如觉得9500步的不错,那就将该pt档从里面挑出,将其放到SD WebUI程序目录下的embeddings

3.2 embedding模型使用

  1. 于SD WebUI的生图界面,点击右上角Show Extra Networks

  1. 接着选取要使用的embedding,点击将其加入提示词字段。Embedding只能配合训练时使用的模型来算图。

  1. 然后按照Embedding训练时使用的提示词下提示词,这样算出来的图便会有该Embedding的人物了。

4.训练HyperNetwork

        HyperNetwork训练方式和embedding训练方式相同,只是在train页面选择Create hypernetwork即可。

5.训练Lora

LoRA (Low-rank adaptation)是用来微调大型模型的技术,其生成的模型训练时间短,文件更小。

DreamBooth内含LoRA,可作为SD WebUI的扩充功能安装。

本机训练还可以用LoRA_Easy_Training_Scripts,支持Linux和Windows系统。

有用Google Colab的采用Linaqruf/kohya-trainer会比较好上手。Reddit有一图流教学。

1. 安装环境

"LoRA Easy Training Scripts"这个Python程序Linux和Windows都可以用,下面以Ubuntu为例。

  1. 安装Anaconda,创建虚拟环境
conda create --name loratraining python=3.10.6
conda activate loratraining
  1. 拷贝保存库
git clone https://github.com/derrian-distro/LoRA_Easy_Training_Scripts.git
cd LoRA_Easy_Training_Scripts
git submodule init
git submodule update
cd sd_scripts
pip install torch torchvision --extra-index-url https://download.pytorch.org/whl/cu116
pip install --upgrade -r requirements.txt
pip install -U xformers
  1. 设置加速选项
accelerate config
#依序回答:
#- This machine
#- No distributed training
#- NO
#- NO
#- NO
#- all
#- fp16
  1. LoRA的训练数据目录结构不太一样,需创建目录结构如下。已经上好提示词的训练数据要放在img_dir下面,将目录名称取名为数字_概念,目录名称前面加上数字代表要重复的步数。

  1. 添加训练设置档trainingconfig.json
vim trainingconfig.json
  1. 填入以下内容(双斜线的注解记得删除) LoRA的总训练步数计算公式为: 训练图片数量 × 重复次数 ÷ train_batch_size × epoch
{
  //基于何种模型训练
  "pretrained_model_name_or_path": "/home/user/桌面/heralora/anything-v4.5-pruned.ckpt",
  "v2": false,
  "v_parameterization": false,
  //纪录档输出目录
  "logging_dir": "/home/user/桌面/heralora/log_dir/",
  //训练数据目录
  "train_data_dir": "/home/user/桌面/heralora/image_dir/",
  //注册目录
  "reg_data_dir": "/home/user/桌面/heralora/reg_dir/",
  //输出目录
  "output_dir": "/home/user/桌面/heralora/output_dir",
  //训练的图片最大长宽
  "max_resolution": "512,512",
  //学习率
  "learning_rate": "1e-5",
  "lr_scheduler": "constant_with_warmup",
  "lr_warmup": "5",
  "train_batch_size": 3,
  //训练时期
  "epoch": "4",
  "save_every_n_epochs": "",
  "mixed_precision": "fp16",
  "save_precision": "fp16",
  "seed": "",
  "num_cpu_threads_per_process": 32,
  "cache_latents": true,
  "caption_extension": ".txt",
  "enable_bucket": true,
  "gradient_checkpointing": false,
  "full_fp16": false,
  "no_token_padding": false,
  "stop_text_encoder_training": 0,
  "use_8bit_adam": true,
  "xformers": true,
  "save_model_as": "safetensors",
  "shuffle_caption": true,
  "save_state": false,
  "resume": "",
  "prior_loss_weight": 1.0,
  "text_encoder_lr": "1.5e-5",
  "unet_lr": "1.5e-4",
  "network_dim": 128,
  "lora_network_weights": "",
  "color_aug": false,
  "flip_aug": false,
  "clip_skip": 2,
  "mem_eff_attn": false,
  "output_name": "",
  "model_list": "",
  "max_token_length": "150",
  "max_train_epochs": "",
  "max_data_loader_n_workers": "",
  "network_alpha": 128,
  "training_comment": "",
  "keep_tokens": 2,
  "lr_scheduler_num_cycles": "",
  "lr_scheduler_power": "",
  "persistent_data_loader_workers": true,
  "bucket_no_upscale": true,
  "random_crop": false,
  "caption_dropout_every_n_epochs": 0.0,
  "caption_dropout_rate": 0
}

2. 开始训练

有些系统需要指定CUDA安装路径

export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
  1. 输入以下指令,加载json设置档。libnvinfer.so.7: cannot open shared object file的警告可以暂时忽略。
accelerate launch main.py --load_json_path "/home/user/trainingconfig.json"
  1. 之后会自动开始训练。训练好的模型位于训练设置档所写的output_dir目录。将.safetensors档移动至SD WebUI根目录下的/models/Lora

3. LoRA模型使用方式

  1. 点击SD WebUI右上角,Show extra networks

  1. 点击要使用的LoRA,将其加入至提示词字段

  1. 再加上训练时使用的提示词,即可生成使用LoRA风格的人物。

### 使用 Stable Diffusion WebUI 进行图生图训练 #### 什么是图生图? 图生图是指通过输入一张参考图像以及一些参数设置,利用 AI 模型生成新的图像的过程。在 Stable Diffusion 中,WebUI 提供了一个友好的界面来进行此类操作[^2]。 #### 主要功能模块 Stable Diffusion WebUI 的图生图功能支持多种模式和工具,包括但不限于以下几种: - **基础图生图**:基于参考图像生成新图像。 - **手绘修正/涂鸦绘制**:允许用户通过简单的草图或线条调整目标区域的内容。 - **局部重绘**:仅重新生成指定部分的图像内容,保留其他区域不变。 - **蒙版引导的编辑**:可以使用黑白掩码或者自定义颜色掩码实现更精确的控制。 - **批量处理**:一次性对多张图片应用相同的变换逻辑。 - **反推提示词**:自动分析现有图像的关键特征,并尝试推测其可能对应的文本描述[^3]。 #### 实际操作指南 以下是关于如何配置环境及执行具体任务的一些指导: 1. **准备阶段** - 下载安装好最新版本的 Stable Diffusion WebUI 软件包及其依赖项。 - 加载预训练权重文件至本地运行环境中以便于即时测试不同效果。 2. **启动服务端口访问页面** 执行命令如下所示以开启图形化管理面板: ```bash python webui.py --listen --port=7860 ``` 3. **加载模型与扩展组件** 确认所使用的扩散网络架构适配当前项目需求;同时激活必要的附加脚本如 ControlNet 或者 Pose Detection 插件提升创作灵活性[^4]。 4. **设定基本参数** 用户需填写以下几个重要字段才能顺利开始渲染流程: - Prompt (正面指示语句卡) - Negative prompt (负面排除列表) - Sampling steps (采样迭代次数) - CFG scale (条件因子强度等级) 5. **导入素材源文件** 将待加工的照片拖拽上传到对应位置框内作为初始依据材料之一。 6. **启用高级选项(可选)** 如果希望进一步细化成果表现,则考虑采用下列策略优化细节呈现质量: - 利用“Denoising strength”滑竿调节去噪力度平衡真实感还原度与创意发挥空间之间的关系; - 结合特定风格迁移算法切换整体视觉基调方向; - 对某些特殊部位单独施加额外约束条件限制范围内的变动幅度不至于过大破坏原有结构比例协调性等问题发生几率降低不少哦! 7. **提交作业等待完成反馈结果展示** --- ```python from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler model_id = "runwayml/stable-diffusion-v1-5" scheduler = EulerDiscreteScheduler.from_pretrained(model_id, subfolder="scheduler") pipe = StableDiffusionPipeline.from_pretrained(model_id, scheduler=scheduler).to("cuda") prompt = "a photo of an astronaut riding a horse on mars" image = pipe(prompt).images[0] image.save("astronaut_rides_horse.png") ``` 上述代码片段展示了如何借助官方库快速搭建简易管线实例用于初步探索验证概念可行性等方面的工作效率有所提高的同时也简化了许多繁琐的手动调试环节带来的不便之处[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值