1中文 https://tensor.art/articles/894212229950384481
3中文 https://tensor.art/articles/894475285959803996
4中文 https://tensor.art/articles/894482801078873091
浅薄的从原理上和实际感受解释一下,训练lora实际上类似是完成一个概念置换,例如“1boy,A,black hair,red eyes”(后面用“A”“B”“C”等简单替代人物触发词),lora中这些标签所代表的内容,在使用时会“替换”掉原本检查点内的相同标签,意味着ai实际不懂得A是一个黑发红眼的男孩,而是将这些标签的组合当成一个整体概念,“1boy=A=black hair=red eyes”,那么用这些触发词生成“A”时,那出来的必然是“A”,即使去掉其中“A,black hair”只用“1boy”,那生成内容也会包含“A”的特征。
当训练双人时“2boys,A,black hair,red eyes,B,blue hair,grey eyes”同样不意味着ai懂得这是两个男孩,其中一人有着黑发红眼,另一人是蓝发灰眼,依然是把它当成一个整体概念,这就意味着如果训练集只有“AB”双人图,那么是无法生成单独的“A”或“B”,因为“A”或“B”被所有特征影响,生成“1boy,A”时会融合所有特征。而训练集中只有两人的单人图,也是无法生成“2boys”的,类似同时加载两个单人lora的结果,特征混合。即使是我用母语写这些也觉得绕口,翻译成英文时我不保证能表达出想表达的逻辑,再次说声抱歉,文章中若有哪些异义有误解请不吝赐教留言。
这就引出一个问题,一个双人lora,如果希望能生成“1boy”和“2boys”,同时需要双人和单人图,如前文所述,对于人尽皆知的角色用检查点本身就可以了,不需要lora,而要制作冷门cp们可能就没有多少图,更没有质量较高的双人同框,甚至单人的素材都不够。对于一些有些年代的老作品素材质量较差,影响做出来的效果。为了应对这种素材匮乏的局面,我想到一个点子,并进行实验,还真的成功了,你可以看到我上传的所有模型都是来自原素材匮乏的作品,都可以生成多个男孩。
那就介绍一下这种方法,请注意,后文可能用语比较啰嗦,逻辑较为混乱,我缺少用更精炼的语言描绘清楚这种复杂流程的能力,翻译成英文可能更容易产生歧义,请见谅。
首先可以参考第一篇文章中的方法制作两个单人lora,素材充足且质量好时一次基本就够,素材比较久远、又少、分辨率又模糊,可以用lora生成调整后的质量更好图作为训练素材多次训练。

然后将这些单人图拼接成双人,是的,这种“拼接”在danbooru上也有对应标签,不用担心会造成混乱的影响,这种人工“2boys”经过测试要比直接使用动画截图或是插画更容易区别角色。简单分析一下,动画截图往往人物不一定处于同样景深,可能一前一后等,这种图片在学习中就更容易造成人物相对体型不对,若是都处于中景、远景的话,动画往往不会描绘清晰,若是近景或同人图之类,人物之间更加贴近,则学习中更容易将人物和对应特征混淆。当然这种先做单人lora、再生成图像、再拼接图像的方式比较繁琐,不过对于缺乏素材的角色来说,是我试过的比较合适的提升质量的方法。如果你想制作的角色总是成双成对出现,有充足的的素材,随便就能超过100张,那么完全不需要遵循本文的思路,只要加入少量单人图正常训练就好。素材越多越丰富,ai学到的不同场景下的信息更多,带来的结果就是人物更容易区别开,错误几率大幅减小。本文旨在介绍两个单人,缺少双人同框甚至单人素材也匮乏时不得已而为之的一种思路。


如图所示,可以手动修改人物之间的比例以增加正确概率,但是经过测试,这种比例修改只在人物体型差异较大或接近(到额头)时更有效,身高到脖子、到胸口等往往效果不好。同时这种方法虽然能提高生成质量,但是也会更容易造成过拟合,人物表情和动作比较生硬,除非制作出大量多镜头多动作的图片,可以和原图一起加入训练集来减少过于生硬的情况。
用这种方法也可以完全使用黑白漫画来作为训练集,只需要准确打标签,也可以手工擦除一些多余的线条、边框、文字等减少多余信息。
如果有彩图一定要一起使用,这样的话对应的颜色可以被正确学习到,否则完全是对应颜色框架下随机的。

使用黑白漫画为素材时,一定要注意相应标签,“greyscale, monochrome, comic, halftone,”一般情况下是必须的,可以在使用标签器时将阈值调至0.1,看看能识别出哪些标签,一些黑白漫画中的绘画技法一定要标注,可以查询danbooru的标签库来准确定位画面元素。发色等特征可以正常描述比如“brown hair”“brown eyes”等,只要准确标注了黑白漫画中的“greyscale”“comic”等图像种类,性能更强社区模型可以在生成时将其排除,如果最终生成效果较差,可以使用提示词或负面提示词来进行一定的修正后再作为训练集重新训练。

接下来介绍下这种思路下的训练集图片数量的需求。之前的单人lora中原素材集尽可能的丰富,毕竟生图过程中可以改善,而用在“2boys lora”的训练集中,一定要仔细挑选原素材中质量最好的,去掉那些模糊的,原素材和再次ai生成的图放在同一文件夹中,如果想要更偏向原素材的画风,可以增加原素材数量的占比,如果找不到更多的图,可以直接复制“最佳图片”和对应的txt标签文档,在windos操作系统中会自动给副本用系统语言命名,不用担心,不需要更改成英文,lora训练器可以识别“UTF-8”编码支持的所有字符。
由于ai生成时的特性,近景特写的效果要好于远景的全身,在“全身”下眼睛的细节可能用adetailer也无法很好修复,而“全身”是让ai尽可能学会正确身材比例的关键,所以可以在生图时用“closed eyes”甚至“faceless”或是其他提示词将眼睛部分省去,头发细节较差也可以加上“bald”,来生成一个除了身体没有任何其他角色特征的无脸人,不用担心,因为头发和眼睛的特征已经由别的图片学到了,而“faceless”等因为被明确标记所以不使用时是不会出现的。如果正常生图可以通过高清修复和adetailer等做到“full body”下的脸部细节,尽量就别用这种方法,测试中虽然99%的情况下都不会被faceless影响,但是就那么偶尔一下会被吓到的。
同理手和脚也是这样思路,通过动作或袜子等隐去手部或者脚,或是专门生成正确的手。强调一下,这种方法不是为了提高生成质量,而是为了确保ai不会学到更差的。我想你在使用很多角色lora时都会遇到,手部畸形或是模糊不清,这个不仅是检查点本身的随机性带来的,更大的原因是动画大多数情况不会仔细画手的,而lora把原素材中非常粗糙的那部分经由过拟合的训练学会了。

以上是准备训练集的大致思路,那么到底需要多少图片,需要设置怎样的训练参数呢?以下是我按此思路测试制作了几十个试制品lora得出的结果:
A、B单人图每人最少20张,AB双人图最少15张。
步数相同的情况下,更多的图片数量+更少的repeat值的训练效果要好于更少的图片数量+更多repeat。偷懒的话可以用复制的方法来减少工作量,但不同的图的数量要尽可能大于刚才提到的最小数值:
“A、B单人图每人最少20张,AB双人图最少15张”。
个人测试结果表明,训练“2boys”的前提下,数量不嫌多,但是低于这个数量时,人物学不会或是特征混合的几率大幅提高。
具体多少张,按实际素材数量,根据计算步数来决定。计算方式如下,
在“batch size = 1”的情况下,A repeats epoch 和 B repeats epoch相等,
其中repeat相等,而epoch基本在10 - 16(绝大多数情况下10足够了),
控制在800 - 1200步左右,
比如A、B都是60张,repeat = 2,epoch = 10,则60 2 10 =1200,B同理1200步。
在单人图步数的基础上,双人图的步数控制在20% - 40%左右,尽可能从40%开始尝试(这不是上限,可以略超过)。
比如1200 40% = 480步,epoch = 10,则480 / 10 = 48,
也就是说AB文件夹单epoch的步数在48左右,
图片数量就可以是48张 1 repeat,可以是24张 2 repeat,可以是15张 3 repeat。
简单解释一下为什么,如前文所述,ai其实不懂得A是一个男孩、B是一个男孩,AB的概念更像是一个连体婴,AB的拟合程度跟A或B单人的拟合程度几乎没有关系,都是单独的概念,但是因为共用触发词所以会相互影响,生图时使用A + B的触发词实际上是叠加了AB,就像是触发词的权重翻倍,经过实验,A+B的步数和AB的步数越接近时,人物混合几率越大,可能就是因为相互叠加的权重影响越来越大。
这又引出来一个问题,因为人物本身特征的差异,训练时的拟合程度,或者说ai学习的进度是不同的,可能A在600步就完全学会了,而B在600步依然缺少特征,这在服装上表现更甚,这个例子中这种差异就会导致在800步时,A已经过拟合,B可能刚刚好,此时A和B特征混合几率会加大,加到1000步也不会改善。暂时的解决方法就是AB的双人图一定要大于15张,尽可能用更少的repeat和更多AB图,而B的文件夹中可以适当增加几张单人图数量,repeat依然和“A”相等。
为了解决双人时的服装尽可能的不混合,可以尝试增加batch size,进行一定的过拟合。
此时依然保持单人步数在800-1200左右,再计算repeat。
比如A、B都是60张,目标1000步,batch size = 4,epoch = 10,
1000/10*4 = 400, 400/60 ≈ 6.66,取整数6就是repeat,
此时60*6/4*10 = 900,在目标步数范围内。
AB有30张,那么900*0.4=360, 360/10*4 = 144, 144/30 = 4.8,取整数5就是repeat,
30*5/4*10 = 375, 375/900 ≈ 0.417,符合单人图和双人图步数所需的百分比。
接着介绍一下训练参数,当图片准备好之后,建议进行手动裁剪和缩放,并开启训练参数中的“启用 arb 桶”“arb 桶不放大图片”,将分辨率设置为2048,2048,这样训练集中的所有图片都不会被自动缩放、裁剪,否则你不知道低于设置分辨率时自动放大后的效果,也不知道高于设置分辨率时被裁剪掉的地方。
请注意,分辨率的大小会影响显存的占用,这里大致讲一下显存的占用和哪些参数有关,在训练器的设置中,只要不开启“lowram”将 U-net、文本编码器、VAE 直接加载到显存中,且开启缓存图像到磁盘等选项,那么显存的占用几乎只和训练集中的最大分辨率和network_dim有关,和图片数量没有关系,batch size的影响甚至也不大。超出显存会让训练速度大幅降低并不是不能进行,当然如果你使用在线训练比如tensor那不需要考虑这个问题。
在dim=32下,1024*1024的分辨率基本上就用到8G了,我想如果你使用本地部署,应该已经淘汰8G的显卡了。
在dim=64下,1024*1024以上到1536*1536,基本会用满16G显存。
在dim=128下,显存占用会大幅提高,任何分辨率都会超过16g,1024*1024可能会超过20g,1536*1536将接近40g,这已经不是游戏卡所能承受的了。
简单的说这个dim值实际决定了lora的细节程度,越大学到的细节越多,越小越少。越高的分辨率和越多的内容需要更大的dim值,单人的二次元lora,基本上32是足够的,双人建议32或64,双人以上比较微妙,可以64,可以128,根据你设备的现实情况。
而分辨率的情况很微妙,理论上越大的分辨率效果应该越好,但经过实测,训练集使用2048*2048的分辨率并不会让生成768*1152或是1024*1536等图像质量变好,也基本不影响各种分辨率下原本生成的体型差异,同时因为各种检查点本身不能很好的支持高分辨率,在直接生成诸如2048*2048,1536*2048等图片时会出现各种畸形,然而细节上确实要比低分辨率要好的多的多,也不是完全都是畸形,在某些分辨率下比如1200*1600,1280*1920等等分辨率下能产生正确的图像,同时质量好的惊人,远比低分辨率+高清修复的效果好。但是用2048*2048来训练付出的代价实在太大了。
综合一下,dim=64,分辨率采用1280*1280或1344*1344,可以在16g显存下取得一个折中的效果。
推荐使用1344*1344,且arb桶上限设置1536,此时开启自动放大,
常见的2:3比例将被放大到1024*1536, 3:4比例将被放大到1152*1536,这样保证了最常用的长宽比,非常方便生成图像和截图。