文章目录
- (零)前言
- (一)绘图
- (1.1)模型
- (1.1.1)基础模型(Stable-diffusion模型)
- (1.1.2)人物模型(LoRA模型)
- (1.2)绘图方式
- (1.2.1)文生图(Text to Image)
- (1.2.1.1)提示词/模板风格
- (1.2.1.2)采样
- (1.2.1.3)插件:可选附加网络(LoRA插件)
- (1.2.1.4)插件:ControlNet
- (1.2.1.5)脚本
- (1.2.2)图生图(Image to Image)
- (1.2.3)图片处理(附件功能:放大/抠图等)
- (1.2.3.1)处理对象
- (1.2.3.2)缩放
- (1.2.3.3)缩放模型等
- (1.2.3.4)插件:抠图(Remove background)
- (二)训练
- (2.1)数据准备
- (2.1.1)筛选照片
- (2.1.2)预处理照片
- (2.1.3)提示词(tags)处理
- (2.1.4)目录命名
- (2.2)训练工具
- (2.2.1)选你喜欢的
- (2.2.2)训练参数
- (2.2.3)训练过程(例)
- (2.2.4)训练结果
(零)前言
在:🔗https://blog.csdn.net/ddrfan/article/details/130052762 里面我写了最基本的应该怎么弄。
然后我发现网上各种教程真的很多,写得很好很详细的也不少,读了感觉真的很厉害,比我写的好多了。
所以准备记录下Stable-Diffusion WEB UI的方方面面,以及哪里去看相关的资料。
这篇应该需要不断的补充,某些插件可能导致界面有变化。
(一)绘图
(1.1)模型
(1.1.1)基础模型(Stable-diffusion模型)
根据你绘图的目标,需要选择一种基础模型,人物/风景/建筑/宇宙/动漫/仿真?
参考:🔗xiaolxl的国风3@抱脸,请自行了解huggingface.co上的模型。比如但不局限于:
- 原始基础:SD v1.5
- 常见动漫:OpenJourney,Anything,NovalAI(就那整合包啊),RedShift ……
- 仿真风格:Dreamlike-Photoreal,BasilMix(融合亚洲脸),ChilloutMix(清凉组合/亚洲),URPM(注意NSFW) ……
(1.1.2)人物模型(LoRA模型)
注意版权,比如各地girllikeness模型……
- 参考:https://openai.wiki/lora-model-part-1.html,以及part2,3。
- 参考:https://www.bilibili.com/read/cv20039815。
- 参考:https://aigallery.design/chinese-diffusion-models.html,呃,明星?
(1.2)绘图方式
(1.2.1)文生图(Text to Image)
(1.2.1.1)提示词/模板风格
-
正向提示词:描述希望图片生成为什么样子的词语(highres, beautiful, masterpiece)。
-
反向提示词:不希望图片出现的内容(lowres, ugly, blurry…)。
-
模板风格:比较完美的一组正反提示词,可以保存成一个“模板风格”,今后重复调用。
用模板风格可以存储别人的提示词配置用来生成同样的效果。
参考:https://tags.novelai.dev/ ,或比如:http://www.ppmy.cn/news/37991.html -
(强调) / [弱化]:权重:提示词中出现:
(photorealistic:1.4)
是强调photorealistic
,并且权重是1.4
(光标放单词上后,就可以Ctrl+上/下箭头快速调节呢)。圆括号越多越强调——而方括号则是弱化,越多方括号越弱。 -
LoRA模型提示词:提示词中出现:
<lora:xxxxx:1.0>
就是LoRA模型的提示词,后面1.0
也是权重,调节同上。
(1.2.1.2)采样
-
采样方法(Sampler) :通常:DPM++ SDE karras ,参考Stable diffusion webui如何工作以及采样方法的对比
-
采样迭代步数(Steps) :通常至少20起步。
-
生成批次/每批数量 :重复生成多少次 x 每次生成几张 = 本次最后生成的图片数量,都设为1就是单张。
-
提示词相关性(CFG Scale):图像与你的提示的匹配程度。参考Stable Diffusion 新手入门手册
-
随机种子(seed):这怎么解释,后面的骰子图标是填入-1(随机),回收站图标是填入上次用过的值。
💡到这里就可以生成图片了。
(1.2.1.3)插件:可选附加网络(LoRA插件)
需要自己安装插件。
用于对比各种参数生成图的不同效果(测试模型)
正常使用时不用,参考:Stable diffusion打造自己专属的LORA模型
(1.2.1.4)插件:ControlNet
需要自己安装插件。
用模型进一步控制生成的图片内容。
比如从输入图片多种算法描边,深度检测,姿态手部检测和控制等等。
需要精确控制图片输出时使用,参考:ControlNet|使用教程
(1.2.1.5)脚本
我只用过【x/y/z图表】,就是配合上面的可选附加网络,来测试模型。
(1.2.2)图生图(Image to Image)
和上面文生图一样,只是多了从某一张已有的图片出发。
也引入了 局部重绘 等功能。
(1.2.3)图片处理(附件功能:放大/抠图等)
(1.2.3.1)处理对象
单张/批量处理:相应的选项卡里,拖入单张或多张图片。
从目录批量处理:不打开图片,选择目录所在位置,处理目录下的全部图片。
(1.2.3.2)缩放
等比/指定分辨率缩放,不需要解释。
生成图片其实分辨率需要在一定范围,否则非常容易乱。
而且生成大图开销太大,不如生成完了正常尺寸,再用算法放大,放大后如下(能点开吧):
(1.2.3.3)缩放模型等
不同的模型(算法)有不同的效果。
需要下载算法模型(手动下载放入目录也行)
具体可以自己对比不同算法的效果,感觉上面这样比较真实。
可以选择首要算法(Upscaler 1),和次要算法(Upscaler 2)和它的权重(当然也可不选2)。
(1.2.3.4)插件:抠图(Remove background)
需要自己安装插件。
需要下载算法模型(手动下载放入目录也行)
作用是移除背景。
(二)训练
基础模型(大模型)没有条件,这里提到的仅是LoRA模型。
(2.1)数据准备
(2.1.1)筛选照片
这部分感觉比深度伪造(deep fake)要轻松多了。
- 假设训练的是人物,准备自己的人像图片,20 - 40 张就可以了,当然我看模型也有100多张的。
- 尽量简单背景,或进行人像抠图后填充简单颜色背景。
- 处理成同样的分辨率,避免后续自动处理。
- 最好是半身照片,少用大头照,不要全身带腿脚的照片(可以剪切)。
(2.1.2)预处理照片
用WEB UI的 训练 -> 预处理 标签页的功能,
- 将刚才准备好的照片目录作为输入目录。
- 将某个类似命名
.\xxxxx\100_xxxxx
的目录作为输出目录。 - 调整到上一步用的同样的分辨率。
- 勾选使用 deepbooru 生成说明文字(tags)
- 点击【预处理】按钮后,等待图片预处理完成,检查图片和提示词文本。
(2.1.3)提示词(tags)处理
如果背景并不是很乱,发型配饰上没有个人特色,那么可以不处理:)哈哈。
(2.1.4)目录命名
刚才提到预处理后的目录叫 .\xxxxx\100_xxxxx
。
xxxxx
:是具体的人物简称。100
:是里面每张图片训练的次数,这里我看到两种说法,一种是设为6-8,一种是根据图片数量至少设置100。
这个次数会乘以后面设置的训练参数的epoch数,最后会训练大概几千次吧。
(2.2)训练工具
(2.2.1)选你喜欢的
- https://github.com/bmaltais/kohya_ss (WEB UI)
- https://github.com/Akegarasu/lora-scripts (脚本)
实际上都是调用的kohya_ss的sd-scripts。
我比较倾向用脚本那个项目来训练。写配置文件反而比较简单,WEB UI在训练这块用处不大。
两个建议:
- 用别人做好的整合包和教程,比如脚本训练用:https://www.bilibili.com/video/BV1fs4y1x7p2
- Python下载依赖时一定要换国内源,比如清华大学的:
-i https://pypi.tuna.tsinghua.edu.cn/simple
。当然整合包的话已经换好了,否则可以参考我吐槽下载速度这块,实在慢到吐血(习惯了,Linux,Go,Python哪个不换国内源呢)。
(2.2.2)训练参数
必须得改的几个参数:
- $pretrained_model :基础模型路径(最好填入WEB UI下的绝对路径,避免拷贝几个GB的数据)
- $train_data_dir :训练数据集路径(预处理完成的图片和提示词存放目录)
- $resolution :分辨率(需要多少预处理成多少,填写一致)
- $max_train_epoches :最大训练 epoch (1个epoch是一个完整的数据集通过神经网络一次并且返回一次的过程)
- $save_every_n_epochs :每几个 epoch 保存一次
- $output_name :模型保存名称
完整如下(参数可能改动和变化,和项目版本有关):
# LoRA train script by @Akegarasu
# Train data path | 设置训练用模型、图片
$pretrained_model = "./sd-models/model.ckpt" # base model path | 底模路径
$is_v2_model = 0 # SD2.0 model | SD2.0模型 2.0模型下 clip_skip 默认无效
$parameterization = 0 # parameterization | 参数化 本参数需要和 V2 参数同步使用 实验性功能
$train_data_dir = "./train/aki" # train dataset path | 训练数据集路径
$reg_data_dir = "" # directory for regularization images | 正则化数据集路径,默认不使用正则化图像。
# Network settings | 网络设置
$network_module = "networks.lora" # 在这里将会设置训练的网络种类,默认为 networks.lora 也就是 LoRA 训练。如果你想训练 LyCORIS(LoCon、LoHa) 等,则修改这个值为 lycoris.kohya
$network_weights = "" # pretrained weights for LoRA network | 若需要从已有的 LoRA 模型上继续训练,请填写 LoRA 模型路径。
$network_dim = 32 # network dim | 常用 4~128,不是越大越好
$network_alpha = 32 # network alpha | 常用与 network_dim 相同的值或者采用较小的值,如 network_dim的一半 防止下溢。默认值为 1,使用较小的 alpha 需要提升学习率。
# Train related params | 训练相关参数
$resolution = "512,512" # image resolution w,h. 图片分辨率,宽,高。支持非正方形,但必须是 64 倍数。
$batch_size = 1 # batch size
$max_train_epoches = 10 # max train epoches | 最大训练 epoch
$save_every_n_epochs = 2 # save every n epochs | 每 N 个 epoch 保存一次
$train_unet_only = 0 # train U-Net only | 仅训练 U-Net,开启这个会牺牲效果大幅减少显存使用。6G显存可以开启
$train_text_encoder_only = 0 # train Text Encoder only | 仅训练 文本编码器
$stop_text_encoder_training = 0 # stop text encoder training | 在第N步时停止训练文本编码器
$noise_offset = 0 # noise offset | 在训练中添加噪声偏移来改良生成非常暗或者非常亮的图像,如果启用,推荐参数为 0.1
$keep_tokens = 0 # keep heading N tokens when shuffling caption tokens | 在随机打乱 tokens 时,保留前 N 个不变。
$min_snr_gamma = 0 # minimum signal-to-noise ratio (SNR) value for gamma-ray | 伽马射线事件的最小信噪比(SNR)值 默认为 0
# Learning rate | 学习率
$lr = "1e-4"
$unet_lr = "1e-4"
$text_encoder_lr = "1e-5"
$lr_scheduler = "cosine_with_restarts" # "linear", "cosine", "cosine_with_restarts", "polynomial", "constant", "constant_with_warmup"
$lr_warmup_steps = 0 # warmup steps | 学习率预热步数,lr_scheduler 为 constant 或 adafactor 时该值需要设为0。
$lr_restart_cycles = 1 # cosine_with_restarts restart cycles | 余弦退火重启次数,仅在 lr_scheduler 为 cosine_with_restarts 时起效。
# Output settings | 输出设置
$output_name = "aki" # output model name | 模型保存名称
$save_model_as = "safetensors" # model save ext | 模型保存格式 ckpt, pt, safetensors
# Resume training state | 恢复训练设置
$save_state = 0 # save training state | 保存训练状态 名称类似于 <output_name>-??????-state ?????? 表示 epoch 数
$resume = "" # resume from state | 从某个状态文件夹中恢复训练 需配合上方参数同时使用 由于规范文件限制 epoch 数和全局步数不会保存 即使恢复时它们也从 1 开始 与 network_weights 的具体实现操作并不一致
# 其他设置
$min_bucket_reso = 256 # arb min resolution | arb 最小分辨率
$max_bucket_reso = 1024 # arb max resolution | arb 最大分辨率
$persistent_data_loader_workers = 0 # persistent dataloader workers | 容易爆内存,保留加载训练集的worker,减少每个 epoch 之间的停顿
$clip_skip = 2 # clip skip | 玄学 一般用 2
$multi_gpu = 0 # multi gpu | 多显卡训练 该参数仅限在显卡数 >= 2 使用
$lowram = 0 # lowram mode | 低内存模式 该模式下会将 U-net 文本编码器 VAE 转移到 GPU 显存中 启用该模式可能会对显存有一定影响
# 优化器设置
$optimizer_type = "AdamW8bit" # Optimizer type | 优化器类型 默认为 8bitadam,可选:AdamW AdamW8bit Lion SGDNesterov SGDNesterov8bit DAdaptation AdaFactor
# LyCORIS 训练设置
$algo = "lora" # LyCORIS network algo | LyCORIS 网络算法 可选 lora、loha、lokr、ia3、dylora。lora即为locon
$conv_dim = 4 # conv dim | 类似于 network_dim,推荐为 4
$conv_alpha = 4 # conv alpha | 类似于 network_alpha,可以采用与 conv_dim 一致或者更小的值
$dropout = "0" # dropout | dropout 概率, 0 为不使用 dropout, 越大则 dropout 越多,推荐 0~0.5, LoHa/LoKr/(IA)^3暂时不支持
(2.2.3)训练过程(例)
prepare tokenizer
update token length: 225
Use DreamBooth method.
prepare images.
found directory train\xxxxx\10_xxxxx contains 40 image files
400 train images with repeating.
0 reg images.
no regularization images / 正則化画像が見つかりませんでした
[Dataset 0]
batch_size: 1
resolution: (576, 768)
enable_bucket: True
min_bucket_reso: 256
max_bucket_reso: 1024
bucket_reso_steps: 64
bucket_no_upscale: False
[Subset 0 of Dataset 0]
image_dir: "train\xxxxx\10_xxxxx"
image_count: 40
num_repeats: 10
shuffle_caption: True
keep_tokens: 0
caption_dropout_rate: 0.0
caption_dropout_every_n_epoches: 0
caption_tag_dropout_rate: 0.0
color_aug: False
flip_aug: False
face_crop_aug_range: None
random_crop: False
token_warmup_min: 1,
token_warmup_step: 0,
is_reg: False
class_tokens: xxxxx
caption_extension: .txt
[Dataset 0]
loading image sizes.
100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:00<00:00, 5000.66it/s]
make buckets
number of images (including repeats) / 各bucketの画像枚数(繰り返し回数を含む)
bucket 0: resolution (576, 768), count: 400
mean ar error (without repeats): 0.0
prepare accelerator
Using accelerator 0.15.0 or above.
loading model for process 0/1
load StableDiffusion checkpoint
loading u-net: <All keys matched successfully>
loading vae: <All keys matched successfully>
loading text encoder: <All keys matched successfully>
Replace CrossAttention.forward to use xformers
[Dataset 0]
caching latents.
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 40/40 [00:13<00:00, 2.99it/s]
import network module: networks.lora
create LoRA network. base dim (rank): 32, alpha: 32.0
create LoRA for Text Encoder: 72 modules.
create LoRA for U-Net: 192 modules.
enable LoRA for text encoder
enable LoRA for U-Net
prepare optimizer, data loader etc.
===================================BUG REPORT===================================
Welcome to bitsandbytes. For bug reports, please submit your error trace to: https://github.com/TimDettmers/bitsandbytes/issues
For effortless bug reporting copy-paste your error into this form: https://docs.google.com/forms/d/e/1FAIpQLScPB8emS3Thkp66nvqwmjTEgxp8Y9ufuWTzFyr9kJ5AoI47dQ/viewform?usp=sf_link
================================================================================
CUDA SETUP: Loading binary D:\xxxx\lora-scripts\venv\lib\site-packages\bitsandbytes\libbitsandbytes_cuda116.dll...
use 8-bit AdamW optimizer | {}
override steps. steps for 10 epochs is / 指定エポックまでのステップ数: 4000
running training / 学習開始
num train images * repeats / 学習画像の数×繰り返し回数: 400
num reg images / 正則化画像の数: 0
num batches per epoch / 1epochのバッチ数: 400
num epochs / epoch数: 10
batch size per device / バッチサイズ: 1
gradient accumulation steps / 勾配を合計するステップ数 = 1
total optimization steps / 学習ステップ数: 4000
steps: 0%| | 0/4000 [00:00<?, ?it/s]epoch 1/10
steps: 10%|███████████████ | 400/4000 [05:33<50:00, 1.20it/s, loss=0.126]epoch 2/10
steps: 20%|██████████████████████████████▏ | 800/4000 [11:11<44:47, 1.19it/s, loss=0.105]saving checkpoint: ./output\xxxxx-000002.safetensors
epoch 3/10
steps: 30%|█████████████████████████████████████████████ | 1200/4000 [16:51<39:19, 1.19it/s, loss=0.123]epoch 4/10
steps: 40%|████████████████████████████████████████████████████████████ | 1600/4000 [22:20<33:30, 1.19it/s, loss=0.128]saving checkpoint: ./output\xxxxx-000004.safetensors
epoch 5/10
steps: 50%|███████████████████████████████████████████████████████████████████████████ | 2000/4000 [27:48<27:48, 1.20it/s, loss=0.117]epoch 6/10
steps: 60%|██████████████████████████████████████████████████████████████████████████████████████████▌ | 2400/4000 [33:17<22:11, 1.20it/s, loss=0.11]saving checkpoint: ./output\xxxxx-000006.safetensors
epoch 7/10
steps: 70%|█████████████████████████████████████████████████████████████████████████████████████████████████████████ | 2800/4000 [38:52<16:39, 1.20it/s, loss=0.112]epoch 8/10
steps: 80%|████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3200/4000 [44:30<11:07, 1.20it/s, loss=0.124]saving checkpoint: ./output\xxxxx-000008.safetensors
epoch 9/10
steps: 90%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████ | 3600/4000 [50:08<05:34, 1.20it/s, loss=0.117]epoch 10/10
steps: 92%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████▋ | 3673/4000 [51:48<04:36, 1.18it/s, loss=0.112]
(2.2.4)训练结果
只看loss是不行的,最好用这个章节:
(1.2.1.3)插件:可选附加网络(LoRA插件)
提到的方法看看,不同训练程度模型+不同权重参数生成的图像对比。
但是我感觉和实际生成不太一样,并不是很靠谱。