43 张图、6 种分辨率、合计 17.5 百万像素。 最长宽比 0.60 到 1.50 跨了 2.5 倍,有两张最短边只有 384。这些数字决定要不要先裁、要不要建桶。
上一节算清了 LoRA 的账。这一节是动手前的准备:装什么、数据怎么整。 这一节有一部分我跑不了,会明确标出来。
一、要装三样东西
- 训练器。书里用的是 Kohya 那一套(sd-scripts 的图形界面版),也有人用秋叶的整合包。 它们做的事一样:读图、读标签、跑训练循环、存 LoRA 文件。
- 底座模型。训练是「在某个模型的基础上加旁路」,所以得先有一个底座。常见的是 SD 1.5 或 SDXL。 底座选错,后面全白搭——用 SDXL 的数据训出来的 LoRA,加载到 SD 1.5 上会直接报维度不匹配。
- 一张能跑的卡。SD 1.5 的 LoRA 在 6 到 8 GB 显存上能跑,SDXL 的建议 12 GB 起。 显存不够可以用梯度检查点换时间。 这三样里最容易出错的是第 2 样。 很多人从网上随便下个模型就开始训,训完发现加载不上,或者效果全歪——因为底座和预期的不一样。
二、数据集先体检,别急着训
Demo 读了 43 张图(我造的模拟数据,尺寸和体积是按真实场景的分布给的),算出 6 种不同分辨率。 主流的 512×512 有 20 张(46.5%),768×768 有 8 张,还有 512×768、768×512、1024×1024、 384×640 各几张。 分辨率先不统一,训练时的缩放就不一致。建议先统一裁到 512×512 或 768×768,再喂给训练器。 长宽比也要看:0.60 到 1.50 跨了 2.5 倍。差得多的图硬拉成正方形,人脸会变形。 解决办法是建桶(bucket)——按长宽比分几组,每组单独一个尺寸。
三、两张图会拖后腿
最短边小于 512 的有 2 张(就是那两张 384×640)。 它们不会被拒绝,但训练时会被放大到目标尺寸,放大之后是糊的。模型会把这些糊的细节也学进去。 处理办法有两个:直接删掉,或者单独放一个低分辨率桶。前者干净,后者保留多样性。 数据少于 20 张时建议前者——本来就不多,别让两张坏图占权重。 还有一个更隐蔽的问题:内容重复但文件名不同。脚本查不出这个,得靠感知哈希去重。 重复图等于给那几张加权,模型会过拟合到它们身上。
四、界面上的清单(我没有跑)
沙箱里没有显卡、没有浏览器、也装不了 Stable Diffusion,这一段我给不了截图,也不假装跑过。
下面是我按常规流程整理的清单。
1. 下载训练器整合包,解压到一个路径不含中文和空格的目录。
这一步看着无关紧要,实际上是最常见的失败点——很多 Python 库处理不了中文路径。
2. 把底座模型(.safetensors)放进指定的 models 目录。
3. 新建数据集目录,按「主题_重复次数」命名,比如 mygirl_10。
这个 10 就是 8.3.4 里那个「重复次数」。
4. 把图放进去,同名同目录放一份 .txt 标签文件(8.3.3 讲怎么生成)。
5. 打开图形界面,先不训,用「预检」或日志看一眼它读到了多少张图、多少个标签。
第 5 步很值:训练器读到的数量和你以为的数量不一致时,后面所有参数都是错的。
五、沙箱里能跑的那一半
Demo 不做图形界面,直接对一个图片清单做体检:算张数、合计体积、平均单张、分辨率种类、 每种分辨率的占比、最短边不足 512 的个数、总像素。 这些数是真算出来的,不是编的。所以这个实例能给的是:体检脚本怎么写、该看哪几个指标。 给不了的是:训练器装没装上、图形界面长什么样、点哪个按钮。这部分得在你自己的机器上做。 体检脚本很好写,但它能挡住的问题很实际——分辨率不一致、图太少、有超小图, 这三样是 LoRA 训不出效果最常被忽略的原因。
六、动手 Demo:数据集体检:张数、分辨率、长宽比、最小边
造一份 43 张图的清单(6 种分辨率、体积从 120 KB 到 2.4 MB),按分辨率分组统计张数和占比, 算合计体积、平均单张、长宽比,再筛出最短边小于 512 的图和总像素量。
for (w, h), c in sorted(by_size.items(), key=lambda kv: -kv[1]):
ar = float(w) / h
print(w, h, c, ar, 100.0 * c / len(files))
small = sum(1 for w, h, _ in files if min(w, h) < 512)
实跑输出:
--------------------------------------------------------------------
数据集先体检:张数、分辨率、长宽比、重名
--------------------------------------------------------------------
目录里读到的图片 43 张
合计体积 49.0 MB
平均单张 1166 KB
不同的分辨率种类 6 种
分辨率 张数 长宽比 占比
----------------------------------
512 × 512 20 1.00 46.5%
768 × 768 8 1.00 18.6%
512 × 768 6 0.67 14.0%
768 × 512 4 1.50 9.3%
1024 × 1024 3 1.00 7.0%
384 × 640 2 0.60 4.7%
体检要看的四件事,一件一件过:
第一,张数。低于 15 张基本练不出稳定效果,20~50 张是一张 LoRA 的常见量。这次 43 张,够用。
第二,分辨率。种类越多,训练时的缩放越不一致。上表 6 种,建议统一裁到 512 × 512 或 768 × 768 再喂。
第三,长宽比。0.67 和 1.50 这两档需要单独建桶(bucket),否则会被硬拉成正方形,人脸就变形了。
第四,重名和重复图。这一步脚本只能查文件名,查不出「内容一样但名字不同」,那得靠感知哈希去重。
再补两个容易被忽略的检查:
最短边小于 512 的 2 张(放大训练会糊)
总像素 17.5 百万像素
6 种分辨率、43 张、合计 17.5 百万像素。 这三个数应该记下来——后面算训练步数、算显存都要用。 长宽比那一列从 0.60 到 1.50。 跨度超过 2 倍就该建桶,否则中间那些0.67 和 1.50 的图会被压扁或拉长。 最短边小于 512 的有 2 张。 这两张是我的模拟数据里故意留的——真实数据集里也总会有那么几张从聊天记录里存下来的小图。 这份清单是我造的,所以「平均单张 1166 KB」这种数只是演示。 真跑的时候把清单换成 os.listdir 加 PIL 读尺寸就行,逻辑完全一样。
30 秒实验
- 把阈值从 512 改成 768,看有多少张不合格。
- 加一段逻辑:按长宽比把图分到 1:1、3:4、4:3 三个桶,统计每桶张数。
- 想一想:为什么训练器目录要避开中文路径?
常见误区
- 「随便下个模型当底座」——底座版本不匹配,训出来的 LoRA 加载不上。
- 「图越多越好」——张数过了 50 收益就小,重复图反而会让模型过拟合。
- 「分辨率不一样没关系」——缩放不一致会让模型学不到稳定的构图。
自测三问(点开对答案)
1. LoRA 训练需要哪三样东西? —— 训练器、底座模型、足够显存的显卡。 2. 数据集体检要看哪四件事? —— 张数、分辨率是否统一、长宽比跨度、有没有过小的图和重复图。 3. 短边不足 512 的图为什么要处理? —— 训练时会被放大,放大后是糊的,模型会把这些糊的细节也学进去。数据整好了,下一步是给每张图配文字:打标。这决定了模型到底学到什么。
- ☐ (本节完,下一节 8.3.3 数据标注:图像预处理和打标优化)