可変感情可変予定制御

街歩きブログになりつつあるなにか

Optimized Stable DiffusionでNegative promptを使う

ローカル環境でStable Diffusionを動かすためにOptimized Stable Diffusion GUI Toolを導入してみた。Optimized Stable DiffusionはVRAMが少ないGPUに最適化されたフォークで、VRAMが4GBしかないGTX 1050 Tiでも十分に動作した。

また、Stable Diffusion web UIにはNegative promptという機能が実装されている。Promptとは逆に排除したい要素を指定することができ、特に繊細な人物のイラストを生成する際に有用だそうだ。

仕組みや実装方法は上のページに書かれているので、詳しくはそちらを参照してほしい。Optimized Stable DiffusionでもNegative promptを使用するため、適当に自分で実装してみた。結論から言ってしまえば一箇所の引数を置き換えるだけでOKである。

実装

既存のGUIを使用するため、Promptの「--」以降をNegative promptとして認識するような設計とした。

optimized_txt2img.py

batch_size = opt.n_samples
n_rows = opt.n_rows if opt.n_rows > 0 else batch_size
if not opt.from_file:
    assert opt.prompt is not None
    prompt = opt.prompt

    # promptを分割
    negative_prompts = batch_size * [""]
    negative_prompt_delimiter = "--"
    if negative_prompt_delimiter in prompt:
        splited_prompt = prompt.split(negative_prompt_delimiter)
        prompt = splited_prompt[0].rstrip()
        negative_prompts = [splited_prompt[1]]

    data = [batch_size * [prompt]]

modelCS.get_learned_conditioning()に渡す引数を、negative_promptsに変更。

if opt.scale != 1.0:
    #uc = modelCS.get_learned_conditioning(batch_size * [""])
    uc = modelCS.get_learned_conditioning(negative_prompts)

サンプル


Negative prompt: なし

 


Negative prompt: purple

 


Negative prompt: purple, red