【AI绘画】完整tags书写思路,从人工智能理论来了解如何绘画

摘要
本文希望通过研究Stable diffusion模型来理解我们使用过程中发现的种种神奇的语法和现象。为什么顺序公式会有顺序?为什么屎山出图很漂亮?为什么ai画不好手?为什么短句描述比较好?为什么ai is sb?
文章介绍了novel ai所使用的stable diffusion模型的具体运行过程。这能够帮助我们理解一些使用过程的发现的有趣现象。甚至更近一步获得一种通行的、模板化的tags书写流程。
第一部分为AI的运作过程科普,如果看不懂可以直接看第二部分
一、AI是怎么运作的
novel ai作为一款人工智能生成软件,不管是根据描述生成文章还是根据描述生成图片,其人工智能的核心要点都包含两个部分:蓝色的用于理解描述的自然语言处理器和红色的用于生成结果的生成器。

对输入表述的解析,就是处于自然语言解析阶段。在这一阶段,它将文本信息转换为数字表示,从而捕捉文本中的想法。对于不同的文本,其转换为的数字量也有区别,这就是显示在我们输入框右下角的输入量。

在训练embedding的时候,我们也被要求选择embedding词所代表的向量数,这个向量数,就是我们要训练的词会被解析成的数字量。之后我们统一使用输入量来称呼这个数量。
被蓝色的自然语言处理器解析后的输入表述会通过CLIP网络结合图像,以数组的形式保存下来,即下图中蓝色方格的token embedding。

CLIP网络就是理解tags如何被写入模型的关键点。下图就是CLIP网络在训练过程中是如何将tags与图像进行结合的。

输入描述和图片在分别经过两个神经网络(Encoder)变成了计算机更容易理解的数字编码后,进行了一个对比训练,从而将描述词和图片一一对应上。这个过程中就训练这两个Encoder。这两encoder就会在之后的txt2img或者img2img中发挥作用。
我们拿到手里模型都是训练好的,实际使用的时候其实就是一个直接获得结果的过程,

在CLIP里面即第一部分里,encoder会有顺序的一个一个编码输入的tags,然后在诸多的可能性里面,计算出最接近的token。
每一组输入词会形成一个token集合,这个集合可以看住是一个数组。这个数组会与高斯噪声结合输入到红色图像生成器中,即上图的第二部分。这一组词就会同时去生成图块。如果tags过长就会有多个这样的分组,每一组词生成完成后,就会立刻生成下一组词,然后将它们的图块结合在一起。
这就是为什么我们说tags的输入一定要讲求顺序的原因的。
数组里面的数,完整输入进图像生成器后,并生成了一副模糊的图像时,这就是一个step。
下一个step的时候,数组里的数会和上一轮生成的图像一起输入红色生成器,来生成一个更接近需求的图像。这样的反复过程就是迭代。
最后黄色的图像放大器了,帮助我们把一副小的图像放大成我们想要的图像大小,并在过程丰富细节。
AI工作流程的总结
总结一下我们的输入是怎么变成图像的。
第一步,我们输入的词句,会被蓝色的自然语言处理器解析成一个个数字,存进蓝色的数组中。
第二步,这个输入数组会按顺序结合高斯噪声输入到红色的生成器中,生成粗糙的图像。
第三步,将粗糙的图与输入数组重复第二步,对生成的图像进行迭代
第四步,将迭代完的输入黄色的放大器,扩大图像分辨率,使图像细致。
我们知道了什么:
通过这个过程,首先我们可以看到,为什么ai画不好手脚,因为ai在生成图像的过程中,图像都是以一个小尺寸在进行迭代,最后再进行放大。像手,脚趾这类细小的物体,一开始占据的原始像素就少,所以放大后效果也不好。
另一点就是,ai读取的文本是有顺序性的。而且这点是写入他DNA的。
最后就是,我们手动写的单词性的tags,其实就是帮ai做了蓝色自然语言处理里的词句分割工作。
另一方面,在webui里,虽然现在能写入超量的输入量,但是webui会自动把过长的输入量按照最长75个输入量一组的形式放入CLIP。也就是说,如果很有可能写一个长句或者说独立单词组时,你所给出的形容词和名词却被分到了两个不同的组。这就会照成污染。
这个分组的长度可以在设置里面调整(默认是20)

基于以上这些结论,我们可以推断出:
1、为什么长句和强短句,比零碎的单词污染少?因为零碎的单词缺少了元素间的联系,而ai也没办法自己去联想到这个联系。而长句和强短句,ai可以通过自己进行自然语言处理,收集到一些元素间的联系。
2、为什么长句联系好却不够稳定?因为ai是sb,有时候进自然语言处理时句子分析得不好。
3、为什么ai画不好细节的东西,因为ai一开始只在很小分辨率的图上画,而小东西分配到的像素太少了。
4、为什么ai画不好长的有连续性的东西?理由基本同上,长的东西在小图上可能是连续的,但是放大后就不一定了。

二、用写作的思想来书写tags
由此我们可以试图构建出一个通用的书写的tags的方法。
我们可以思考一个大概的画面,然后通过广义三段式的思想来丰富场景的内容。
通过对一个主体进行三段式拆分,然后将每个小短句拆分到整个tags中,利用多次描述的强化叠加效果来强化主体的表现。同时因为对主体的完整描述进行了拆分,这个方法可以把几个颜色组隔离到几个段落中,从而减少污染。
最后再根据需求,使用分步渲染等进阶技术,来调整部分语句的内容或者顺序,使画面更接近所需要的情况。
例如:
一副油画风格的女孩坐在森林的水边。
先按基本三段式写一个:前缀+主体+背景
masterpiece, best quality, best 8k wallpaper,realistic oil painting, 1beautiful girl sitting near the water in a forest.

用广义三段式扩充一下细节:
一副画,写实的油画,油画画的女孩在森林里,女孩是一个穿着华丽的魔法师,她有着精美的面庞和美丽的眼睛,她有着一头金色的长发,她佩戴着大檐帽、金色的发饰和星星耳环,她穿着一身蓝色的华丽礼服,礼服上装饰着金色的纹路和蕾丝边。她静静坐在森林里。森林里有花丛树木和河流。阳光穿过树丛撒下一片片亮斑。整个森林都在闪闪发光。
masterpiece, best quality, best 8k wallpaper,
realistic oil painting,
1 girl, beautiful face, beautiful shining eyes, long blonde hair with wide brim hat, gold hair ornaments and star earrings, gorgeous blue dress, gold patterns and lace, solo, sit down near water in the forest,
flowers, sunlight, bright spots, shine

基于广义三段式的思想:目标,定义,细节,我们对人物的描写进行拆分。分为了女孩的总体概况,女孩的面貌,女孩的装饰,女孩的衣着。并将环境描写以女孩与环境的关系的方式,穿插进女孩的人物描写中:
一副画,很棒的写实的油画,油画画的女孩在森林里
masterpiece, best quality, best 8k wallpaper, realistic oil painting,1girl sitting inside forest,
女孩是一个人静静坐在森林里的河流边。
1 girl, solo, the girl sitting near a water,
她有着精美的面庞和美丽的大眼睛,她有着一头金色的长发,头戴大檐帽,
The girl has a beautiful and detailed cute face and beautiful detailed eyes, long blonde hair with a wide brim hat,
她佩戴者蓝色的发饰和星星耳环,她坐在一片繁花草甸中,树木环绕着她。她微笑着看着森林中的色彩鲜艳的小花。
The girl has blue Headdress, star earrings,sitting on Flowery meadow, upper body, trees and colorful (wildflowers) bloom surround the girl, she smiled at the colorful flowers in the forest
她穿着一身蓝色的华丽礼服,礼服上装饰着金色的纹路和蕾丝边。
the girl wears gorgeous blue dress, the dress has gold patterns and lace,
今天天气很好,阳光穿过树丛撒下一片片亮斑。她与森林都在闪闪发光。
clear sky, Cumulus, sunlight, bright spots, glowing, the girl and forest are shining

当然我们要理解,ai的自然语言处理功能没有想象中那么好使,我们还是得帮ai简单处理一下句子,把关键词提取出来,尽量减少逻辑主语的变化。
细分化后,就能很方便的调整权重和其他高级语法设置了。这里按照人物,背景的涂色,方法大家理解多次描述叠加强化。
多次描述叠加强化也被叫多重渲染,一方面就像是传统写作中对同一目标的多侧面描写丰富细节从而起到强调的作用,另一方面也是利用这个多段的方式,方便穿插背景或占位词用于隔断污染。
(((masterpiece))), (extremely detailed 8k wallpaper),(((best quality))), ((ultra-detailed)),(best illumination, best shadow), ((an extremely delicate and beautiful)),(best illustration), dynamic angle,floating,realistic oil painting,
1beautifully and detailed girl sitting near water, solo, mid shot,
(the girl has a [+++beautifully detailed cute face+++]:1.4), (beautiful and detailed red eyes:1.2), (long blonde hair with a wide brim hat),[[:✋,:0.5]::0.8] [smile],the girl sitting near a river, beautiful and delicate water,
ai is sb, the girl has a blue ribbon,[: star earrings, : 0.5 ] ai is sb, standing in a Flowery meadow, trees and colourful (wildflowers) blooming surround,
(the girl wearing a gorgeous white and light blue dress:1.1), with gold patterns and lace, upper body, (clear sky, Cumulus:1.2), sunlight, bright spots, glowing, the girl and forest are shining,
前缀懒得想,直接绚丽术开道,
可以看到第一段人物描述只是简单的描述了整个画面的场景,并且给出了镜头注释。
为了更好的画出一个可爱美丽的女孩,第二段使用了大量的语法来具体描述这个女孩的面貌。
我们用[+++tags+++] (符号占位词)的语法来提升女孩脸的渲染程度,并且增强女孩面貌描写的权重以获得更清晰,更靠近镜头的人物。这个语法大概是来自一个bug或者也可以当做是占位词的延伸应用。
做占位的只是+++, tags是我们要写的词比如【+++ hands +++】,占位词会增加输入量的大小,但是几乎不影响意思,原本hands就占一个输入量,现在这么写了就占了7个输入量(6个+和1个hands)这样变相的增加了hands的受关注度。文中使用【+++tags+++】不是那么推荐,[] 会影响权重。所以直接用中文的【】来包裹吧233
接下来我们对小的物件使用分步渲染,在图像整体成型后再进行绘制。ai is sb是一个占位词,他的作用就用来隔断前后,避免污染,所以我将其使用在了另一组颜色词上,减少金发或者彩色花朵对装饰的影响。当然,使用多次描述叠加强化本来就能起到隔离污染的效果,将多组色彩分散到不同自然段中,就降低了色彩的间的关联性,从而降低了污染。这两者原理是一样的,都是将容易污染的元素分开,使他们在被读成token embedding时离得远,从而在生成图像时减少混淆。
多次描述叠加强化的对污染的隔离大概就是利用了第一章提到的webui对输入词的分组功能。占位词可能也会是这样的原理,但是实际跑图时却明显获得了强化之类的提升,很神奇,可能需要进一步对源代码进行解读才能解释。
对难度较大的东西,例如手,我们可以用emoji加强绘制。Emoji经过了独特的训练,具有很强的指向性。我们可以理解为emoji就像是单独训练过的embedding一样,可以很强的改变图像。正常情况下,手通常在50%左右开始进行绘制,所以我们在这个阶段把手的强化加入,避免过早加入而产生很多个手的问题。[[:✋,:0.5]::0.8]这个词条意思就是从50%开始启用到80%截止。分布渲染的具体过程可以参照我的另一个专栏
另外,我们观察了前面几个例子,发现描述时只写了树林花草,这导致了画面被深色的树木充满,显得非常压抑,我们可以添加一点天空来平衡画面。
最后再对负面词条按照重要性顺序进行一波调整:将比较重要的负面词提到前面,在开始渲染细节后,增加细节的负面词组。清理负面词组中的重复、错误单词。
精简版强化负面tags
ugly,lowres, bad anatomy,worst quality, low quality, normal quality,
[:((No more than one thumb, index finger, middle finger, ring finger and little finger on one hand),(mutated hands and fingers:1.5 ), fused ears, one hand with more than 5 fingers, one hand with less than 5 fingers,):0.5]
bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, jpeg artifacts, signature, watermark, username, blurry, Missing limbs, three arms, bad feet, text font ui, signature, blurry, malformed hands, long neck, mutated hands and fingers :1.5).(long body :1.3),(mutation ,poorly drawn :1.2), disfigured, malformed, mutated, multiple breasts, futa, yaoi, three legs, huge breasts,

Steps: 70, Sampler: DPM++ 2S a Karras, CFG scale: 7, Seed: 1036849954, Size: 1024x576, Model hash: e6e8e1fc, Eta: 0.667, Clip skip: 2, ENSD: 31337
最终我们可以得到一个几乎稳定出图的咒语。再根据需求简单调整背景元素,或者人物修饰,就可以得到更多风格的同类图像




其他细分教程:
[NovelAI]标准三段术式及绚丽术入门与解析[AI绘图的tag书写规范] - 哔哩哔哩 (bilibili.com)
[NovelAI]标准术式中的权重 - 哔哩哔哩 (bilibili.com)
广义的三段术式构造 - 哔哩哔哩 (bilibili.com)
[AI绘画]分步渲染及循环迭代 - 哔哩哔哩 (bilibili.com)
[AI绘画]如何画两人贴贴,双子贴贴tags解读-分步渲染与循环迭代的运用
多层叠加强化的具体实现 https://www.kdocs.cn/l/ccq39UcdjCHe
元素同典:确实不完全科学的魔导书 奏咒术一章,有完整的占位词使用理论:
https://docs.qq.com/doc/DWFdSTHJtQWRzYk9k
webui基本指南,从代码端解读了webui的功能:
https://draw.dianas.cyou/paint/WebUi/base