40 张图查出 13 处毛病:尺寸过小 4、文件名不规范 3、非 RGB 3、近乎纯色 1、不是方图 1、 重复 1。但真正会被拒收或把模型带坏的只有 8 张(20%)。 「处」说的是毛病有多少,「张」说的是要动几次手,两个口径别混着看。
上一节把环境装好了。这一节准备数据——训练 LoRA 的成败,八成在这一步就定了。
一、一个 LoRA 数据集长什么样
结构极简:一个文件夹,里面一对一对的「图 + 同名 txt」。img_001.png 配 img_001.txt,
txt 里就是这张图的标签,用逗号隔开。
张数:一个画风 LoRA 15 到 30 张就够,人物 LoRA 常 20 到 50 张。
再多收益递减,反而更容易过拟合。
规格:边长 512 或 768、方图、RGB 模式。训练时会被裁到目标分辨率,不是方图就会把主体裁掉一块。
命名:全小写字母数字加下划线。理由不是审美,
是很多启动脚本按 img_*.png 这种模式匹配文件——
名字不合规的图会被静默跳过,不报错,只是少了几张。
二、六项质检,逐项说为什么
① 尺寸过小。 小于 512 会被放大,放大就是糊,模型学到的是「糊的画风」。 ② 非 RGB。 RGBA(带透明通道)、P(调色板)、L(灰度)这三种模式,训练脚本有的直接报错, 有的静默转成灰度。后者更坑——你以为在训彩色的。 ③ 不是方图。 裁切位置是随机的,主体在边上就被切掉了。 ④ 近乎纯色。 一张纯灰图没有信息量,模型会把它学成「背景色」,结果是出图永远偏灰。 ⑤ 重复。 同一张图出现两次等于给它双倍权重。 这种错在几百张的集子里几乎必犯(截图存了两次、微信重发过)。 ⑥ 文件名不规范。 中文、空格、大写扩展名——这三类会被模式匹配漏掉,而且训练器一声不吭。
三、「处」和「张」是两个口径
Demo 里 40 张图查出 13 处问题,但只有 8 张需要动手。 差别在于一张图可能有好几个毛病(一张 256 的灰度图同时算「尺寸过小」和「非 RGB」)。 为什么两个都要算: 处数说的是「这个数据集有多脏」,张数说的是「我要动几次手」。报给别人的时候要写清是哪一个, 不然会被追问。 Demo 里那 8 张的口径是「会被拒收或学坏」——只算非 RGB、尺寸过小、近乎纯色这三项。 「不是方图」和「重复」不算在里面,它们不会让训练失败,只会让结果差一点。
四、处理顺序:先粗后细
第一步改名。 统一成 img_%03d.png,这一步最便宜、收益最大,因为后面所有脚本都靠名字找文件。
第二步转 RGB 并裁成方图。 一次批量处理,裁的时候用「居中裁」而不是「左上角裁」,
主体一般都在中间。
第三步查重复。 按文件哈希查,
别按文件名——img_001.png 和 copy_of_001.png 内容一样但名字不同。
第四步看纯色。 放在最后,因为它是唯一「可能是正样本」的毛病:白底产品图的标准差也很低,
不能无脑删。
最后一条:
把命名规则写下来,下一次采集就按规则命名。这样这一整轮检查就可以省掉——
质检的成本,远高于一开始就按规范拍。
五、动手 Demo:数据集质检:40 张图查出 13 处毛病,8 张得动手改
用 Pillow 造 40 张图,故意混进六类问题:尺寸过小、非 RGB、近乎纯色、不是方图、内容重复、 文件名不规范。逐张检查并统计每类毛病的张数,再按「严格会被拒收」的口径数一遍张数。
tags = []
if im.mode != "RGB": tags.append(u"非 RGB")
if wd < 512 or ht < 512: tags.append(u"尺寸过小")
if abs(wd - ht) > 8: tags.append(u"不是方图")
arr = np.asarray(im.convert("RGB"), dtype=np.float32)
if arr.std() < 6.0: tags.append(u"近乎纯色")
if md5 in seen: tags.append(u"重复")
if not re.match(r"^[a-z0-9_]+\.png$", f):
tags.append(u"文件名不规范")
for t in tags:
prob[t] = prob.get(t, 0) + 1
实跑输出:
--------------------------------------------------------------------
数据集质检:40 张图查出 13 处毛病,8 张得动手改
--------------------------------------------------------------------
图片总数 40 张
问题类型 张数
------------------
尺寸过小 4
文件名不规范 3
非 RGB 3
近乎纯色 1
不是方图 1
重复 1
会被训练器拒收或学坏 8 张(20%)
第一张表是**全部问题**:一共 **13 处**。
第二行是真正要处理的:**8 张会被拒收或把模型带坏。**
「文件名不规范」看起来无害——但如果启动脚本按 `img_*.png` 匹配,
**那 3 张(大写的、带空格的、中文的)会直接被漏掉**,而且训练器不会报错,只是少了几张图。
所以质检要按「处」和「张」各算一遍:**处数说的是毛病有多少,张数说的是要动几次手。**
处理顺序建议:**先改名统一 → 再转 RGB 并裁成方图 → 再查重复 → 最后看纯色。**
纯色图放最后,因为它可能是正样本(比如白底产品图),不能无脑删。
第一张表最上面两行就是「尺寸过小 4、
文件名不规范 3」——这两个数在这份数据里并列第一,但性质完全不同。前者影响画质,
后者影响「能不能被读到」。
「近乎纯色」只查出 1 张,因为我只造了一张纯灰图。
真实数据集里这一类往往比想象中多(白底产品图、纯色背景照)。
第二行那个 8 张(20%) 才是要动手的数量。
注意它把「不是方图」和「重复」排除在外了——那两项不会让训练失败。
「文件名不规范」那句提醒最实用:
那 3 张会直接被 img_*.png 漏掉,而且不报错。所以这条检查不是「强迫症」,
是「防止静默丢数据」。
说明:这 40 张图是 Pillow 生成的随机噪点,不是真的画。
判据(模式不等于 RGB、边长小于 512、标准差小于 6、哈希重复)都是真判。
换成真图,代码一行不用改。
30 秒实验
- 把目标尺寸从 512 改成 768,重跑,看「尺寸过小」那行怎么变。 26 张 512 的图会全部变成过小——分辨率标准一变,全集的合格线都变。
- 把纯色阈值从 6.0 改到 15.0,看那一行涨到几张。 阈值每抬一点,误伤的正常图就多几张——所以它只能当提示,不能当删除依据。
- 把命名正则改成
^.*\.png$,看「文件名不规范」归零。 归零了,但漏检风险也回来了——这就是「先改名」的意义。
常见误区
- 「图越多越好」。30 张干净图胜过 300 张杂图。杂图会让模型学到互相矛盾的信号。
- 「文件名无所谓」。按模式匹配的脚本会静默漏掉,你只会觉得「怎么少训了几张」。
- 「PNG 都是一样的」。RGBA、P、L 三种模式要么报错,要么被转成灰度,后者最难发现。
自测三问(点开对答案)
1. 一个画风 LoRA 大概要多少张图? —— 15 到 30 张。人物 LoRA 常 20 到 50 张。质量远比数量重要。 2. 为什么「文件名不规范」是硬伤? —— 因为启动脚本常按 `img_*.png` 这类模式匹配文件,不合规的会被静默跳过,不报错, 只是少训了几张。 3. 处理顺序为什么把「纯色」放最后? —— 因为纯色图可能是正样本——白底产品图的标准差也很低。它是唯一不能自动删的毛病,要人看一眼。图干净了,但每张图还缺一样东西:标签。下一节就是打标签,而打标签里最容易漏的是那个「开关词」。
- ☐ (本节完,下一节 7.1.4 使用WD标签器标注数据)