32 张图的标签体检:151 个标签、唯一 9 个、单图最少 1 个最多 8 个。 最要命的是带触发词的只有 29 张,漏了 3 张。 漏触发词的图,训完喊它没反应,而且全程不报错。
上一节把图整理干净了。 这一节给每张图配文本——标签的质量,直接决定这个 LoRA 能不能被「叫出来」。
一、标签是 LoRA 的说明书
训练时模型学的不是「这张图好看」,而是「这张图 ↔ 这串标签」的对应关系。
标签就是你给模型写的说明书。
写多了会抢概念:
每张图都写 1girl, portrait, long hair, blue eyes, smile, outdoors, tree, sky,
模型会把注意力分散到这些词上,你真正想让它学的那个风格反而学不进去。
写少了学不到:只写 portrait,模型不知道这张图和别的肖像有什么区别。
经验区间:单图 5 到 15 个标签。
画风 LoRA 取下限,人物 LoRA 取中上限(因为人物要区分发型、瞳色、服装这些具体属性)。
二、触发词:一个词的开关
触发词(trigger word)是你自己起的、词表里原本没有的词,比如 mystyle、ohwx、zkz_style。
它的作用是当开关:调图时写这个词,才唤起你训的这个东西。
规则只有一条,但是硬的:每张图的标签里都必须包含触发词。
漏一张会怎样?那张图在训练时学到的信号是「这个风格和触发词无关」——它在反向拆你的开关。
漏得越多,开关越弱。漏到三成,触发词基本就失效了。
Demo 里 32 张漏了 3 张(9%),已经足以让触发词的效果明显打折。
而这件事不会有任何报错:文件都在、训练也跑完了、样图也出了,只是你调用的时候喊不动它。
三、密度与长尾
把 32 张图的标签统计出来:
| 标签 | 出现次数 | 占比 |
|---|---|---|
| portrait | 32 | 21.2% |
| 1girl | 31 | 20.5% |
| simple background | 30 | 19.9% |
| mystyle(触发词) | 29 | 19.2% |
| long hair | 10 | 6.6% |
| blue eyes | 7 | 4.6% |
| hat | 6 | 4.0% |
| car | 4 | 2.6% |
| Car | 2 | 1.3% |
| 前四行是「底座标签」:几乎每张都有,它们描述的是「这是个什么类型的图」, | ||
| 不是「这个 LoRA 有什么特色」。这四个占了全部标签的八成,但它们几乎不携带风格信息。 | ||
后两行是长尾:car 和 Car 加起来 6 次,还被拆成了两个词。 |
||
| 出现不到 3 次的标签,模型学不会,还会稀释别的概念。处理办法是删掉, | ||
| 或者合并到一个更通用的词上。 | ||
car 和 Car 那条特别值得看: |
||
| SD 的词表对大小写不敏感,但你的统计脚本敏感。 于是统计上它们算两个, | ||
| 你会误判「这是两个长尾标签」,实际上是一个中间频次的标签。 |
四、WD 标签器的用法,和生成之后必做的一件事
WD 标签器(WD14 Tagger)是一个多标签图像分类器,输出 danbooru 风格的英文标签。
它替代的是「一张张手打标签」这件苦活。
📋 实操清单:
在训练器的「WD 标签器」页填图片目录 → 选模型(wd14-convnextv2-v2 是常用档)→ 阈值填 0.35
→ 勾上「追加触发词」并填入你的触发词 → 点开始。
阈值是唯一的旋钮:调高标签变少(漏标),调低标签变多(噪声)。0.35 是社区常用起点,
然后看结果再调。
🐍 沙箱等价物:这一节没法装 WD 标签器(要下模型),
所以 Demo 做的是「生成之后的那一步」——体检。真实流程里,标签器跑完立刻就接着跑这段脚本。
体检四件事,缺一不可:① 每张图必含触发词;② 单图标签数落在 3 到 15;
③ 唯一标签数别太少(少于 20 个说明区分度不够);④ 出现不到 3 次的长尾清掉。
五、动手 Demo:标签体检:32 张图 151 个标签,触发词漏了 3 张
造 32 张图的标签集(大部分带触发词,故意让 3 张漏掉、1 张只剩一个标签,
并混入 car 与 Car 两种写法),统计标签总数、唯一标签数、单图标签数的分布、每个标签的出现次数,
以及带触发词的张数和长尾标签的个数。
TRIG = u"mystyle"
for i in range(32):
tags = [TRIG, u"1girl", u"portrait", u"simple background"]
if i == 9:
tags = [u"1girl", u"portrait"] # 漏了触发词
if i == 21:
tags = [t for t in tags if t != TRIG] # 漏了触发词
if i == 28:
tags = [u"portrait"] # 只剩一个标签
raw.append(tags)
for tags in raw:
per.append(len(tags))
for t in tags:
cnt[t] = cnt.get(t, 0) + 1
tail = [k for k, v in cnt.items() if v < 3]
实跑输出:
--------------------------------------------------------------------
标签体检:32 张图 151 个标签,触发词漏了 3 张
--------------------------------------------------------------------
图片数 32 张
标签总数 151 个
唯一标签 9 个
单图标签数 1 / 5 / 8
带触发词 29 张
标签 出现次数 占全部标签
----------------------------------------
portrait 32 21.2%
1girl 31 20.5%
simple background 30 19.9%
mystyle 29 19.2%
long hair 10 6.6%
blue eyes 7 4.6%
hat 6 4.0%
car 4 2.6%
Car 2 1.3%
几个要看的数:**单图标签数最少 1 个、中位 5 个、最多 8 个**。
中位数是数据集的「密度」。SD 训练一般 5 到 15 个标签比较舒服。
**少于 3 个标签的图,模型学不到东西,还容易被当成噪声。**
长尾标签(出现不到 3 次)有 1 个:Car。
**它们每个只出现一两次,模型学不会,还会稀释别的概念。**
注意 `car` 和 `Car` 被算成两个标签——**SD 的词表对大小写不敏感,但你的统计脚本敏感。**
最重要的一个数:**带触发词的只有 29 张,也就是漏了 3 张。**
触发词是 LoRA 的「开关」。**哪张图没写,训练时就会学到「这个风格和那个词无关」。**
结果是你调用时喊它没反应。**这个错最难查,因为文件都能训完。**
校验规则只有一条:**每张图的标签里必须包含触发词。**一行代码,能省掉一整轮返工。
done -> _out_39j.txt
先看单图标签数那一行:1 / 5 / 8,也就是最少 1 个、中位 5 个、最多 8 个。
中位 5 落在「5 到 15」的下沿——这份数据偏稀,还勉强及格。
那个「最少 1 个」就是第 29 张(i == 28),只写了 portrait。
只有一个标签的图,模型基本学不到东西,还容易被当成噪声。
长尾只有一个 Car(出现 2 次)。
注意 car 出现 4 次不算长尾,Car 出现 2 次算——同一个概念被大小写劈成了两半,
统计脚本认为是两个,训练时的词表认为是同一个。
最下面是结论:带触发词的 29 张,漏了 3 张。这三张里两张是「漏写」,
一张是「整段标签只剩一个」。它们都能训完,都不会报错。
所以打标签这件事的验收标准应该只有一条:
每张图的标签里必须包含触发词,用一行代码断言。assert all(TRIG in t for t in raw) —— 一行,
省掉一整轮返工。
30 秒实验
- 把「每张随机丢 30% 标签」模拟成标签器的低阈值,看单图标签数掉到多少、有多少张低于 3 个。 阈值调低不是更全,是更脏。
- 把
car和Car统一成小写再统计,看唯一标签数和长尾各变多少。 唯一数从 9 掉到 8,长尾从 1 个变 0 个——一次归一化就清干净了。 - 给漏触发词的那 3 张补上
mystyle重跑,看表格哪一行变了。 只有「带触发词」那一行从 29 变 32,其余全不动。
常见误区
- 「标签越多越好」。标签会抢概念,单图 5 到 15 个,画风取下限。
- 「触发词写不写都行」。漏一张,那张图就在反向拆开关。漏到三成,触发词基本失效。
- 「大小写不影响统计」。训练词表不敏感,统计脚本敏感,会误判出多余的长尾标签。
自测三问(点开对答案)
1. 触发词的作用是什么? —— 它是词表里原本没有的一个词,当作开关用。每张图都带,调图时写它才唤起这个 LoRA。 2. 单图标签多少个合适? —— 5 到 15 个。画风 LoRA 取下限,人物 LoRA 取中上限。少于 3 个基本学不到东西。 3. WD 标签器生成完还要做什么? —— 体检:每张必含触发词、单图标签数在 3 到 15、唯一标签数别太少、出现不到 3 次的长尾清掉。图和标签都齐了,最后一步是把这些路径填进配置。而配置里最难发现的错,是那些「不报错」的错。
- ☐ (本节完,下一节 7.1.5 设置底模文件和数据集路径)