在SD中,如何通过cutoff插件控制latent来给指定部分颜色(给人换衣服)

AI画图  收藏
0 / 2789

过去,很难通过 Stable Diffusion 等图像生成 AI 指定详细的颜色。

因此,不可能在提示中包含太多颜色名称。

这似乎是因为指定颜色的词也会影响其他词。例如,即使你指定“Pink skirt, blue hair”,似乎Pink这个词不仅限于裙子,还会影响到头发的颜色。

如何指定偏色?

使用 CutOff(切断提示效果)。

新的WebUI扩展CutOff(Cutting Off Prompt Effect),提高了部分颜色指定的成功率。

什么是CutOff(切断提示效果)?

Cutoff 似乎已经成功地使用一种称为填充标记的机制将颜色影响范围限制在特定单词上。

技术机制在 Cutoff 的自述文件中的工作原理中进行了描述。

image.png

参考:CutOff(切断提示效果)库

如何安装CutOff(切断提示效果)?

通过 [如何指定 URL ]从 WebUI 安装 CutOff 。

以下是 Cutoff 的 Github 存储库 URL。

https://github.com/hnmr293/sd-webui-cutoff.git

请在 WebUI 的扩展选项卡中的“从 URL 安装”中输入此 URL进行安装。

[初学者] 如何安装和卸载 WebUI 扩展![如何安装WebUI 扩展] Stable diffusion 创建的图像 安装方法主要有两种。如何从 WebUI 存储库的扩展列表安装...

安装完成后,重新加载WebUI以启用扩展“切断提示效果”。

如何使用CutOff(切断提示效果)

Cutoff 的基本用法是以下四个步骤。

  1. 启用截止
  2. 指定目标令牌
  3. 截止选项设置
  4. 产生

1. 启用截止

如何使用 WebUI 截断▲启动WebUI后,点击Txt2img标签画面下方的“Cutoff”,展开Cutoff设置区域。

然后,有一个名为 Enable 的复选框,因此选中它以启用 Cutoff。

2. 输入目标词。

如何使用 WebUI 截断如果你这样写你的提示:

cute girl, white shirt with green tie, red shoes, blue hair, yellow eyes, pink skirt, simple simple background,

将提示中出现的颜色词写成如下:

white,green,red,blue,yellow,pink,

目标令牌是您想要限制影响范围的词。

通常,您指定提示中使用的颜色名称,以逗号分隔。

3. 设置截止选项。

基本上,
似乎您可以在不触摸选项设置的情况下运行并通过查看结果来调整 Weight 和 Interpolation 方法。

设置 设置
启用 启用截止
目标标记(逗号分隔) 列出你想限制影响范围的词。在许多情况下,它似乎是一个颜色名称。示例:红色、蓝色、白色
重量 截止强度(值越高越强)
禁用否定提示 是否将 CutOff 应用于否定提示。默认开启
强烈截止 强截止
填充令牌(ID 或单个令牌) 我认为这里的值通常是空白的。使用哪个令牌代替目标令牌。默认为 _(下划线)
插值法 Lerp/SLerp(默认:Lerp)如果它不起作用,请尝试 SLerp。
调试日志 是否将调试日志输出到命令提示符。如果在效果不佳时打开它,您可能会看到提示。

截止选项#### 什么是强烈截止?

Cutoff 强烈在 Cutoff 的自述文件中有以下描述。

顺便说一句,我觉得一个可爱的女孩可能会或可能不会受到粉发和红鞋的影响。所以在这个扩展中,对于这种中立的提示,

一个可爱的女孩,粉红色的头发,红色的鞋子
一个可爱的女孩,_头发,_鞋子

您可以选择应用哪一个。Details中的Cutoff strong设置为关闭时选择1,打开时选择2。关闭时会显示最接近原始图片的内容。默认值也在这里。

https://github.com/hnmr293/sd-webui-cutoff

4. 输入提示执行图像生成

设置好Cutoff后,照常输入提示符和否定提示符即可生成图像。

实验

white shirt with green tie, red shoes, blue hair, yellow eyes, pink skirt


←无截断 有截断→

对于那些没有剪裁的人,领带的颜色绿色延伸到裙子。我的头发变红了。

启用 Cutoff 后,我几乎可以将所有头发颜色绘制为蓝色,将领带绘制为绿色,将裙子绘制为粉红色。

cute girl, white shirt with green tie, red shoes, blue hair, yellow eyes, pink skirt, simple simple background, 
Negative prompt: (EasyNegative:1.1), extra fingers,fewer fingers, cat, animal, bad anatomy, two shot, hands, two shot
Steps: 20, Sampler: DPM++ SDE Karras, CFG scale: 7, Seed: 2083118349, Size: 504x756, Model hash: f6957e654e, Model: 1anime_7th_anime_v3_C, Script: X/Y/Z plot, X Type: Cutoff Enabled, X Values: "false, true", Y Type: Seed, Y Values: -1, Fixed Y Values: 2083118349

您可以使用 PNGInfo 检查 Cutoff 设置。

您可以使用 PNGInfo 检查 Cutoff 设置。

您可以通过简短的提示感受到效果。

简短的提示成功的概率很高。

但是,我的印象是,当提示很长时,成功的可能性很低。

如果 Cutoff 不起作用怎么办?

如果 Cutoff 不起作用怎么办?

作为 Cutoff 无法正常工作的解决方法,Github 的 ReadMe 中有以下描述。

如果生成的图像损坏或类似情况,请尝试更改权重值或将插值方法更改为 SLerp。

如果生成的图像损坏等,请尝试更改 Weight 值或将插值方法更改为 SLerp。请参阅插值方法的详细信息。

https://github.com/hnmr293/sd-webui-cutoff

作为一种方法,似乎可以通过尝试以下方法来改进,

  • 更改权重值
  • 切换完成方法(SLERP)

除此之外,如果打开日志输出并查看日志,您可能会找到原因。

已知错误:使用超过 75 个标记的否定提示可能会失败

根据否定提示中的令牌数量,截止似乎无法正常工作。

请检查以下内容。

https://github.com/hnmr293/sd-webui-cutoff/issues/11

通过球面线性插值(slerp)在潜在空间中进行噪声插值

稳定扩散 python PyTorch

备忘录.sugyan.com

写完文章后,我很后悔自己没有对以前的案例做足够的研究。我写的,我不认为有很多人在 Latent Seed 的高斯噪声之间进行变形,但是当我搜索它时,它是正常的。

这是在 Stable Diffusion 发布之前......

并且进行这种变形的代码也发布在 gist 中

slerp正如我所读,该函数用作获取两个噪声之间的值的方法。

对于i, t in  enumerate (np.linspace( 0 , 1 , num_steps)):
            init = slerp(浮点数(t), init1, init2)

https://gist.github.com/karpathy/00103b0037c5aaea32fe1da1af553355#file-stablediffusionwalk-py-L179-L180

这个定义如下。

def  slerp (t, v0, v1, DOT_THRESHOLD= 0.9995 ):
     """ helper function to spherically interpolate two arrays v1 v2 """

    如果 不是 isinstance(v0,np.ndarray):
        inputs_are_torch = True
        input_device = v0.device
        v0 = v0.cpu().numpy()
        v1 = v1.cpu().numpy()

    点 = np.sum(v0 * v1 / (np.linalg.norm(v0) * np.linalg.norm(v1)))
    如果np.abs(点)> DOT_THRESHOLD:
        v2 = ( 1 - t) * v0 + t * v1
    其他:
        theta_0 = np.arccos(点)
        sin_theta_0 = np.sin(theta_0)
        theta_t = theta_0 * t
        sin_theta_t = np.sin(theta_t)
        s0 = np.sin(theta_0 - theta_t) / sin_theta_0
        s1 = sin_theta_t / sin_theta_0
        v2 = s0 * v0 + s1 * v1

    如果inputs_are_torch:
        v2 = torch.from_numpy(v2).to(输入设备)

    返回v2

[