在上一篇的文章中,我们讲解了Stable Diffusion提示词的基本用法,不了解的到可以去学习一下———Stable Diffusion之提示词指南(一)。这章我们再详细讲解一下其他高级用法和负提示词。
注意:部分语法只是适用于AUTOMATIC1111 Web UI(以下简称Web UI),而有些不适用于ComfyUI。
高阶语法技巧
在上次的文章中,我们已经提到过部分使用方法,我们再回顾一下。可能你还有印象,如下的提示词权重提示。
提示词权重
该语法只适用于Web UI。
- 英文圆括号(tag):每套一层权重增加1.1 倍
- 英文大括号{tag}:每套一层权重增加1.05 倍
- 英文方括号[tag]:每套一层权重减少0.9 倍(减权重)
- 英文圆括号(tag:N):指定权重 x N倍
- 多层括号就是叠加计算:
[[tag]]
将权重调整为原来的0.81倍(0.9 x 0.9),((tag))
则将权重提高到1.21倍(1.1 x 1.1)
提示词注释
该语法只适用于Web UI。
有时候,我们就算通过提高或削弱权重,也不能阻止部分提示词污染其他提示词的现象,尤其是带有颜色描述的提示词,很容易相互影响。
那么还有什么办法可以让我们的描述更加精确呢?这里可以考虑采用“注释”这一种提示词的用法。
注释写法是:主体描述\(注释内容1,注释内容2\)
比如:
BestQuality\(extremely detailed CG unity 8k wallpaper\)
这个最佳质量(BestQuality),通过后面括号的内容“极其细致的CG统一8k壁纸”(extremely detailed CG unity 8k wallpape)进行了补充。
比如我们下面的画面:
1girl,(purple hair),black eyes,smile,yellow hat,white skin,(pink Sweaters:1.3),open hands,highres,looking at viewer,upper_body,
我们可以看到帽子没有渲染成我们想要的颜色。我们添加注释后再试试。
1girl\(purple hair\),black eyes,smile,yellow hat,white skin,(pink Sweaters:1.3),open hands,highres,looking at viewer,upper_body,
关键词混合
该语法只适用于Web UI。
官方也把这个称为关键词编辑,也有些人叫分步描绘。
你可以混合使用两个关键字,专有术语是Prompt Scheduling。语法是:
[关键字1:关键字2:数字]
此外还有两种:
[关键字1:数字]
[关键字1::数字]
即:
[from:to:when] 意思是:在经过指定数量的步骤后,将位于 from 处的提示词替换为 to 处的提示词。
[to:when] 意思是:在经过指定数量的步骤后,将位于 to 处的提示词添加到提示中。
[from::when] 意思是:在经过指定数量的步骤后,从提示中删除位于 from 处的提示词。
注意:如果when小于1,比如为0.4就代表整体绘制步数的40%,以[from:to:when]为例,就代表前40%使用from的提示词,后60%使用to的提示词。
我们来添加一下背景:a [green forests:river:0.5] landscape background,如下,同时我们迭代步数设置为30。
1 girl\(purple hair\),black eyes,smile,(yellow hat:1.1),white skin,(pink Sweaters:1.3),open hands,highres,looking at viewer,upper_body,a [green forests:river:0.5] landscape background,
由此可知在前面1-15迭代步数,提示词为:
1 girl\(purple hair\),black eyes,smile,(yellow hat:1.1),white skin,(pink Sweaters:1.3),open hands,highres,looking at viewer,upper_body,a green forests landscape background,
由此可知在前面15-30迭代步数,提示词为:
1 girl\(purple hair\),black eyes,smile,(yellow hat:1.1),white skin,(pink Sweaters:1.3),open hands,highres,looking at viewer,upper_body,a river landscape background,
结果如下:
我们可以看到在后面其实也明显没出现河流,这个因为在Stable Diffusion 中模型绘制图像内容并非按照完美百分比的步骤进行绘制,画面内容在前面 20 步左右时已基本定型,后续的迭代步数更多是丰富细节,基本不会再添加或减少主体内容。
为验证,我们可以改为a [green forests:river:8] landscape background,在前面8步骤是森林的绘制,后面的8-30是河流的绘制,在绘图定型之前介入修改。结果如下:
我们能看到明显的河流出现在画面中。
[to:when]和[from:to:when]类似,但它只能设置在指定的位置放入to关键词。
[to::when]也称为停止绘制,这个和分步绘制的原理相同,都是控制模型运行时绘制特定内容的步数占比。两者的区别在于:停止绘制只针对画面中单个关键词,并且是先绘制特定元素再移除。注意中间是双冒号。
1 girl\(purple hair\),black eyes,smile,(yellow hat:1.1),white skin,(pink Sweaters:1.3),open hands,highres,looking at viewer,upper_body,a [green forests::0.3] landscape background,
在前面30%添加森林,后面30%-70%删除该提示词的影响。
使用关键字混合,就可以实现类似于prompt-to-prompt的效果,通过编辑生成高度相似的图像对。
地址:https://prompt-to-prompt.github.io/
总结一下:
[from:to:when]
- when:代表迭代步数或比例。
- 当 0 < when < 1,假设迭代步数为N,则step = when * N
- 当 when >= 1,则step = when
- from:是(prompt)提示词,表示在when前的步骤数渲染from提示词
- to: 是(prompt)提示词,表示在when后的步骤数渲染to提示词
[to:when]
- when:代表迭代步数或比例。
- 当 0 < when < 1,假设迭代步数为N,则step = when * N
- 当 when >= 1,则step = when
- to: 是(prompt)提示词,表示在when后的步骤数渲染to提示词
[from::when]
- when:代表迭代步数或比例。
- 当 0 < when < 1,假设迭代步数为N,则step = when * N
- 当 when >= 1,则step = when
- from: 是(prompt)提示词,表示在when后的步骤删除from提示词
打断提示词
该语法只适用于Web UI。
打断的语法非常简单,也很好理解,就是在提示词之间加上关键词【BREAK】,它的作用时打断前后提示词的联系,在一定程度上减少提示词污染的情况。
我们知道Web UI中没有token限制。但如果提示词包含超过 75 个token(CLIP token生成器的限制),它将启动另外 75 个token的新块,因此新的“限制”变为 150。该过程可以永远继续,或者直到你的计算机内存不足…
每个 75 个token块都经过独立处理,生成的表示在输入到 Stable Diffusion 的 U-Net 之前会被连接起来。
打断语法(Break)的用法,BREAK是一个特殊提示,插入后它会强制将Token数凑齐调整为75。这样我们就能够控制不同层次提示词的打断效果了。这个语法指令相当于手动分组,确保每组都能描述完整的画面特征。使用BREAK可以切断不同组之间的上下文关联,防止元素相互干扰。
比如我们调整一下上面的提示词,去掉upper_body上半身限制,然后添加blue pants蓝色的裤子。
1 girl\(purple hair\),black eyes,smile,(yellow hat:1.1),white skin,(pink Sweaters:1.3),open hands,highres,looking at viewer,a [green forests::0.3] landscape background blue pants,
裤子并没有展示我们需要的颜色,我们尝试添加BREAK分开,防止相互影响。
1 girl\(purple hair\),black eyes,smile,(yellow hat:1.1),white skin,(pink Sweaters:1.3),open hands,highres,looking at viewer,a [green forests::0.3] landscape background BREAK blue pants,
可以看到效果不错,朝着我们设置的方向绘制了。
融合提示词
融合语法和打断正好相反,是将前后提示词的内容联系起来,模型在绘制时就会关联前后的元素特征,最终呈现出具备融合图像的特征。它的关键词是「AND」。
模型本身就是将一段提示词结合起来理解,为什么要额外加上「AND」呢?看完下面这个例子就很好理解了,可以发现如果只是通过逗号分隔,模型绘制时只是简单将黄色和绿色进行填充拼接,而加上「AND」后,模型会将黄色和绿色当作一个词来理解,最终绘制出草绿色。
1 girl\(green hair, yellow hair\),black eyes,smile,(yellow hat:1.1),white skin,(pink Sweaters:1.3),open hands,highres,looking at viewer,a [green forests::0.3] landscape background BREAK blue pants,
在提示词中green hair,yellow hair,使用逗号,则生成的头发是黄色的。如下:
而使用AND替换逗号,如下:
1 girl\(yellow hair AND green hair\),black eyes,smile,(yellow hat:1.1),white skin,(pink Sweaters:1.3),open hands,highres,full_shot,looking at viewer,a [green forests::0.3] landscape background BREAK blue pants,
可以看到通过AND替换明显结果不同,同时也支持权重如:yellow hair AND green:1.2 hair
。
总结一下:
[tag1 AND tag2 AND tag3 AND …]
- AND 必须大写,且 AND 的提示词越多,需要的迭代步数越高设置权重,可以写为 tag1:w1 AND tag2:w2 AND tag3:w3,不需要加(),但是这个权重单纯只是指 AND 中的权重,并非全局权重。
提示词交替
除了融合外,还有一种语法也可以实现关键词融合的效果,那就是提示词交替。即提示词也可以进行轮转来进行提示,采用的格式如下:
[提示词一|提示词二]
比如我们添加[clouds|flower|cthulhu mythos] in background
到提示词中。
1 girl\(yellow hair AND green hair\),black eyes,smile,(yellow hat:1.1),white skin,(pink Sweaters:1.3),open hands,highres,full_shot,looking at viewer,a [green forests::0.3] landscape background BREAK blue pants,[clouds|flower|cthulhu mythos] in background,
虽然同样是融合元素特征,但在原理上交替绘制和融合有本质区别:「交替」每步绘制时只理解单独的关键词,而「融合」是将前后的关键词一起来理解,因此交替最终呈现的效果更多是融合主体内容的画面特征,而无法像融合一样深度理解关键词之间的联系。我们平时在使用时一般主要也是使用融合语法「AND」居多,交替绘制更多是用于绘制比较猎奇的克苏鲁风格(cthulhu mythos)图像等。
总结一下:
[tag1|tag2|tag3|…]
- 第一步画tag1,第二步画tag2,第三步画tag3,…,第一轮循环结束后又从tag1重新开始画。
提示矩阵
提示矩阵排列的语法,该语法主要用于实现批量出图的效果,提高绘图效果。
提示词1|提示词2|....
需要注意的是,该语法需要配合提示词矩阵 Prompt matrix 来使用,开启后按语法输入,模型会将关键词进行矩阵排列,每个组合的提示词都会生成一张对应的图像,若没有开启则会随机生成其中一张。
我们在提示词中加入:(yellow hat:1.1) | glasses
来测试一下。
1 girl\(yellow hair AND green hair\),black eyes,smile,(yellow hat:1.1) | glasses,white skin,(pink Sweaters:1.3),open hands,highres,full_shot,looking at viewer,a [green forests::0.3] landscape background BREAK blue pants,[clouds|flower|cthulhu mythos] in background,
该语法使用|字符,系统将为它们的每种组合生成一个图像。例如,a busy city street in a modern city|illustration|cinematic lighting
这个提示词,则有四种可能的组合(始终保留提示的第一部分):
- a busy city street in a modern city
- a busy city street in a modern city, illustration
- a busy city street in a modern city, cinematic lighting
- a busy city street in a modern city, illustration, cinematic lighting
总结一下:
tag1|tag2|tag3|…
- 使用【|】分隔多个提示词,模型会自动将提示词进行交叉组合(第一段提示词默认保留),每个组合的提示词都会生成一张对应的图像。
- 该语法需要配合提示词矩阵Prompt matrix来使用(脚本中开启),开启后按语法输入,模型会将关键词进行矩阵排列,每个组合的提示词都会生成一张对应的图像,若没有开启则会随机生成其中一张。
使用Lora
LoRA模型,全称Low-Rank Adaptation of Large Language Models,大语言模型的低阶适应。可以理解为基础模型打的补丁,你需要什么样的风格和特定的需要,通过自训练模型Lora来实现绘图内容或风格的定制。
在提示词中使用Lora模型来调整生成图像的内容或风格时,使用Lora的语法为<lora:文件名:权重>
。其中“文件名”即是Lora模型文件的名字,不包含扩展名;权重是一个不小于0的数字,默认值为1,设为0表示不使用该Lora,也可以设为比1大的数字来表示更大的权重,不过权重过大时可能会对画面起到反效果,用户可根据自己的需求以及具体Lora的表现来调整权重值以获得最佳效果。也可以同时使用多个Lora,它们的效果将会叠加。
一些Lora只需在提示词中包含<lora:文件名:权重>
语法即可,也有一些Lora带有触发词,除了Lora调用语法外还必须在提示词中包含指定的触发词方能生效。在Lora的下载页面或者描述文档中一般可以看到关于触发词的说明。
即使记不住已安装的Lora的文件名也没关系,只需单击界面右上角“生成”按钮下方的“显示/隐藏额外网络”(Show/hide extra networks)按钮,在提示词下方就可以显示或隐藏额外网络面板,单击其中的“Lora”选项卡,即可看到当前所有安装的Lora,如下图所示:
在这个界面,单击一个Lora卡片,即可在提示词输入框自动添加对该Lora的引用。例如<lora:add_detail:1>
,表示使用“add_detail”这个Lora,权重为1。之后可以根据需要手动调整权重值数字。
1 girl\(yellow hair AND green hair\),black eyes,smile,(yellow hat:1.1) | glasses,white skin,(pink Sweaters:1.3),open hands,highres,full_shot,looking at viewer,a [green forests::0.3] landscape background BREAK blue pants,[clouds|flower|cthulhu mythos] in background,<lora:add_detail:1>,
结果如下:
当使用基础模型总是得不到理想效果时,不妨试一试各种Lora,合适的Lora可能会给图像效果带来惊人的提升。
如下面都是配合Lora生成的高清图片:
关于Lora的更多知识后面会再继续介绍,这里只是简单介绍一下使用方法。
最后再推荐一个不错的Prompt生成网址:
欢迎大家关注微信公众号"壁虎说技术",更多AI新技术,新点子在公众号第一时间更新。
参考
Features
prompt-guide
stable-diffusion-guide-3
Stable Diffusion 进阶指南-1
商用级AIGC绘画创作与技巧(Midjourney+Stable Diffusion)