見出し画像

『AUTOMATIC1111版Stable Diffusion WEB UIにおけるネガティブプロンプトの基礎考察』

1.概要

 Stable Diffusionにおいて、当たり前のように使用しているネガティブプロンプト。しかしながらこの意味や効果は情報が乏しく、お守り的に入れている方も少なくないのではないでしょうか。
 あるいは除去したい要素を入れるという認識の方も多いと思います。

 この『除去したい要素』を入れるというのは結論から言うと『半分正しく、半分不正解』です。
 おい、この下り、以前の記事『AUTOMATIC1111版Stable Diffusion WEB UIでの75トークン内プロンプトの効力とBREAKの意味』の時にも見たぞという方、ご安心ください。今回は筋肉女子は筋肉痛のため、欠席しております。

 なお、分かりやすいように努めますが、今回の検証は技術的な要素が強く絡むため、技術部分は文字を追うより画像を見て感覚的に汲み取っていただいたほうが良いように思います。
 いずれ、より言語化できるようになったらリライトする可能性があります。ご了承ください。

2.ネガティブプロンプトの効果を視覚化する

 まずは下記の生成画像を見てください。

model:dexmia_demi02にてbatch size:2で生成

Breathtakingly beautiful Image,(Clear rendering),Hires, (high detailed:1.5),clear tone,Vivid color, (miniature:1.2),Fantastic aquarium castle, detailed aquarium architecture,detailed aquarium plant,

Negative prompt: (worst quality:2),(low quality:2),monochrome,flat color,flat shading,text,
Steps: 40, Sampler: DDIM, CFG scale: 7, Seed: 592998742, Face restoration: GFPGAN, Size: 512x512, Model hash: b71963863a, Model: dexmia_demi02, Denoising strength: 0.6, Clip skip: 2, Hires upscale: 1.8, Hires upscaler: Latent

上記の生成プロンプト

 上記ではネガティブプロンプト内のmonochromeの強度だけを変化させています。その結果、不思議なことに彩度が上がっていますね。
 ネガティブプロンプトの一般的な認識ではmonochrome=学習データ内の白黒画像を選択肢から除外するというイメージを持たれている方が少なくないと感じています。

しかし処理的には
(プロンプトで生成された画像ベクトル) 引くことの (ネガティブプロンプトで生成された画像ベクトル) = 出力される画像なのです。

下記の式は簡略化された仕組みです。

prompt'=negative + cfg_scale * (prompt - negative)

 これにより、CFGにてプロンプトの影響力の強弱を制御し、CFGが低いほどネガティブプロンプトの影響力が大きく、高いほどプロンプトが優位に働きます。

 つまり学習データ内の白黒画像を除外というよりは、生成されたプロンプト画像ベクトルからネガティブプロンプトによって生成されためっちゃクオリティの低い白黒画像ベクトルの要素を引くことで情報を持つ空間(潜在空間)の新たな座標を導き出して、それを生成しているというのが画像生成の仕組みなのです。彩度が低い白黒画像のベクトルから離れるので結果的に彩度の高い画像が生成されるわけです。

 この潜在空間で計算された新たな座標は、潜在空間が持っている学習情報空間の外側には出ない為、イラスト系で、色数の少ないべた塗り絵や昔のゲームの絵柄のような画像が学習されていた場合、その情報が出る一方、フォトリアル系では花などがかなり鮮明になる場合はあっても、人物の彩度は一定の範囲で留まることが多いようです。

 下記のようにフォトリアル系では(monochrome:0)から(monochrome:2)までは人物の造形がほぼ変わっておらず、僅かに色合いが変わっているだけというのが見て取れます。
 潜在空間の彩度高い人物画像の学習部分に移動するわけではなく、線形的に要素だけを持ってこれているということです。なお、(monochrome:3)ではかなり無理やりデータを生成してる感覚がありますね。

model:chilled_remix_v1Fp16vae

(Focused face:1.3),A beautiful (girl) in a white ((inner T-shirt)), wearing a black heavy jacket with the front closed and denim shorts, stands by the ((Various flower garden)). Her artistic pose and captivating beauty are enchanting. Her gentle curves and soft small breasts mesmerize anyone who lays eyes on her, creating a serene and alluring atmosphere reminiscent of a photoshoot,
BREAK
(Symmetrical clear eyes), (fair skin:1.3),(happy smile),(beautiful straight hair),(natural make:1.3),

Negative prompt: [(bad-hands-5:0.8):25],(manicure:1.2),(worst quality:2),(low quality:2),(long neck:2),(undressing:1.5),(monochrome:0),

Steps: 30, Sampler: UniPC, CFG scale: 7, Seed: 1945808916, Face restoration: GFPGAN, Size: 512x768, Model hash: 573e338acc, Model: chilled_remix_v1Fp16vae, Denoising strength: 0.54, Clip skip: 2, Hires upscale: 1.8, Hires upscaler: Latent

 chilled_remix_v1Fp16vaeが元々彩度が低くないモデルなので、効果は少なめです。最初から彩度が低いモデルだと効果は強く発揮されるものの、顔立ちがその分だけ少し遠のく可能性はあります。


 さて、では本当にこのネガティブプロンプトは画像ベクトルを生成する時に、差を引いているのでしょうか?
 例えばプロンプトやネガティブプロンプトのテキストでの差だけを計算していたり、プロンプトで画像を生成する際に、ネガティブプロンプトの潜在情報部分だけを避ける処理を行っているとは考えられないでしょうか?

 確認の為、U-NETでのノイズ除去の段階で差を取っていることを視覚化してみましょう。prompt editing(呪文の途中変更)を用います。
 これは[A:B:20]のように記載することで、AのプロンプトからBのプロンプトへサンプリングステップ20回目で変更するというような処理を行える記述方法です。
 微調整が必要で扱いが中々難しい記述方式なのですが、経過を確認するのには最適です。
 では今回もmonochromeを用いて、prompt editing(呪文の途中変更)を行ってみましょう。

Breathtakingly beautiful Image,(Clear rendering),Hires, (high detailed:1.5),clear tone,Vivid color, (miniature:1.2),Fantastic aquarium castle, detailed aquarium architecture,detailed aquarium plant,

Negative prompt: (worst quality:2),(low quality:2),[:(monochrome:2):0],flat color,flat shading,text,

Steps: 40, Sampler: DDIM, CFG scale: 7, Seed: 592998742, Face restoration: GFPGAN, Size: 512x512, Model hash: b71963863a, Model: dexmia_demi02, Denoising strength: 0.6, Clip skip: 2, Hires upscale: 1.8, Hires upscaler: Latent

 このようにネガティブプロンプトをどのサンプリングステップで発動させるかで結果が変わるわけです。
 つまりプロンプトとネガティブプロンプトとの差の処理は毎ステップ単位で行われていることが確認できました。


3.長いネガティブプロンプトはあまり意味をなさない?


 海外の方が生成した画像のプロンプトを見ると膨大な数のネガティブプロンプトが書かれている時があります。
 これは果たして意味をなすのでしょうか? そもそも75トークン以降も有効なのでしょうか?

 これも結論から言うと、75トークン以降も効果は確認できています
 ただし、長いネガティブプロンプトは全体的なネガティブプロンプトの効果を薄める可能性があるので注意が必要です。

 どういうことかと言うと、やはりネガティブプロンプトもCLIP処理されるので主語的な要素と副次的な要素に分けられます。
 なお、この主語的な要素などに関する説明は下記をご参照ください。

 さて、プロンプト側は比較的一貫性のある記述を行うと思いますが、ネガティブプロンプトには基本一貫性がありません。画像ベクトルで考えれば相反する要素などもありますし、あまり変わらない細かい要素の指定は、自然言語処理的に判断できず、主要なネガティブ部分を薄める可能性があります。また漠然とした情報は対応できない傾向があります。(代表格はネガティブにNSFWを入れる)。
 
 その為、主軸ネガティブプロンプトの選別は重要と言えるでしょう。

 またTI(embeddings)はCLIP Text encoderを通過せず、U-NETでの処理の手前にあるベクトル表現化したテキスト(embeddings)そのものの為、処理が異なります。TI(embeddings)を入力する際は、先頭に記入するのが一番望ましいようです。
 特に75token手前での処理に関して問題があることは前述の75トークン内プロンプト記事の末尾記載の注釈にリンクがある実装に関する論議に記載があるため、TI(embeddings)先頭は現状無難と言えます。

4.常用ネガティブプロンプト


 さて、理論はそろそろ終わりにして、実践的に価値があるネガティブプロンプトを少しだけ紹介しましょう。
 フォトリアル系で一番悩みが服を着ないことです。
 正確にはポロりすることです。
 長年、私はこの問題に頭を悩ませてきました。
 3月上旬から4月末頃までずっとです!
 え、たった1か月半じゃないかって?…….あれ?

 take2

 長時間、私はこの問題に頭を悩ませてきました。
 最近までNSFW,nude,topless,nippleあたりを私は入れていました。しかし見事に無効化されていました。
 でも考えてみれば当たり前なのです。
 NSFWと言われても具体性がないのですから。
 プロンプトの場合『NSFW=これからの単語は全部グロテスクだったりセンシティブなものとして捉えてね』という意思表示であり、関連させますが、ネガティブプロンプトでNSFW出さないでと言われても具体性がなく困惑されるのは仕方ありません。
 nudeは全裸を防ぐ効果はあってもポロりは防げません。toplessも上半身に少しだけ布が付着してれば『付着物確認、よし通れ』と通過してきます。nippleは乳首だけ何か無理やり修正されて出力されます。
 
 しかしネガティブプロンプトの仕組みを考察することで上記全てを抜いても、これ一つでほぼ賄えるネガティブプロンプトを見出しました。

 (undressing:1.5)

 これをネガティブプロンプトに入れると魔乳でultra-micro bikiniやultra-sexy negligeeだとしてもchilled_remixでは300枚以上生成して無敗でした。もちろん記述の順番やモデル次第でもありますが、かなりの有用性を感じました。またこのネガティブプロンプトは服を着せる効果があるので、パジャマやシャツ、ジャケット等を中途半端に着ている状態を防ぐ効果も一定あり、汎用性は高いです。
 非常に単純な理屈なのですが長年(1か月半)思いつきませんでした。無念です。

30枚連続生成、無敗

This (highly detailed), (photorealistic) fullbody shot captures the stunning features of a (20-year-old), (beautiful) woman Attractive posing solo in an (island beach background),
BREAK
(focused face:1.3), (symmetrical clear eyes:1.2), (narrow waist:1.4), and (gigantic breasts:1.6),(gigantic breasts:1.6) in an (ultra-micro bikini:1.4),while she flaunts her (model style body). The (glamorous) subject's (slim face:1.2) and (natural make:1.2) give the photo a mesmerizing allure,

Negative prompt: [:(bad-hands-5:0.8):20],(covered nipple:1.2),(manicure:1.2),(worst quality:2),(low quality:2),(long neck:2),(undressing:1.5),

Steps: 30, Sampler: DDIM, CFG scale: 7, Seed: 1035906849, Face restoration: GFPGAN, Size: 512x768, Model hash: 573e338acc, Model: chilled_remix_v1Fp16vae, Clip skip: 2

単語プロンプトをGPT-4で自然言語的に配置する試みの出力結果

 また指の形状そのものは改善しませんが、先端の黒ずみ等を出さなくするには、(manicure:1.2)が有効です。指の先端だけ黒っぽくなるのはマニキュアを学習しその一部だけが反映されている結果なので、意図的にマニキュアが塗られた爪を出したい時以外は記述しておくと良いでしょう。(黒ずみ以外にも1本だけ塗られてたりすると見た目が悪い)。

 なお、AIイラスト界隈を中心に、ネガティブTI(embeddings)prompt editing(呪文の途中変更)で使用する例が散見されます。

例えば、
[:(bad-hands-5:0.8):20][:EasyNegative:25]
などで使用する例です。

 多くはステップの後半、残り30%~10%程度のところで動き出すようにしている方が多いようです。
 これは絵柄への影響を抑えたり、過剰な効き方で悪化させている場合に有効な手法だと考えられます。
 今後は絵柄への影響力の薄いネガティブTI(embeddings)を最初に使用し、似た効果を持つ絵柄への影響力が強いネガティブTI(embeddings)へ多段的に切り替えて、効果の調整を行う等も用途としては考えられるでしょう。


5.最後に(マイナスLORAも含めて)


 先週、Twitterで話題となったflat2という-適用するLORAがあります。元々は某掲示板で、LORAを作成されている有志の方が発見し、概ね2日遅れてTwitterを賑わせたこのLORAは、-の数字でLORAを適用すると描きこみ量が増加するというLORAでした。

flat2:-1は屋根が露骨に描きこまれている


 LORAはTIと違ってU-NETの出力(アテンション層Q, K, V, Oだけを学習状態にさせる)に直接影響を与える効果を持ちます。
 そして毎サンプリングステップごとにネガティブプロンプトの差を取るのならば、ネガティブプロンプトへのLORA適用も可能そうに思えるのですが、少なくともAUTOMATIC1111ではネガティブプロンプト欄にLORAを記述しても効果はありません。そもそもLORAを読み込みません。
 その為、利用としてはあくまでプロンプトでの-適用やモデルへの-LORAマージ。あるいはLORA同士の-マージ等での活用となるでしょう。

 また既に負のマージを行い、正の適用で同じ方向性の効果を持つLORA『Detail Tweaker LoRA』もcivitaiで配布されています。

 ただ個人的にはflat2のほうが、『LORAマージして余分な要素を抜いた差分LORA』とのことで手間がかかっているだけに他への悪影響が少なく描きこみ量だけをあげる感覚があります。

 ともあれ、今後もこういうLORAの活用法は増え、ネガティブプロンプトではない方向で悪い要素を消すLORA等も現れるでしょう。
 ネガティブプロンプトも含め、可能性は無限大。
 コンテストなどの影響もあり、次第に単なる遊び出力から、作品として生み出す方向にシフトし始めている昨今。
 あらゆる要素で、個性を生み出す人たちが現れる日も遠くないように感じます。技術の波と創意工夫の中で、どういう世界観が生まれていくのか、大変楽しみです。



 追記:『Detail Tweaker LoRA』作者の別LORA『Anime Screenshot-like Style Mix LoRA』をリアルモデルに-適用すると…。

自動的に布面積や服の厚さ等も消え、薄着化されるLORAになります。
とっても不思議。(追記で台無しにするスタイル)


この記事が気に入ったらサポートをしてみませんか?